1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.dialer.app.list;
17
18import static android.Manifest.permission.READ_CONTACTS;
19
20import android.app.Activity;
21import android.content.pm.PackageManager;
22import android.support.v13.app.FragmentCompat;
23import android.view.LayoutInflater;
24import android.view.ViewGroup;
25import com.android.contacts.common.list.ContactEntryListAdapter;
26import com.android.contacts.common.list.PinnedHeaderListView;
27import com.android.dialer.app.R;
28import com.android.dialer.callintent.CallInitiationType;
29import com.android.dialer.common.LogUtil;
30import com.android.dialer.phonenumbercache.CachedNumberLookupService;
31import com.android.dialer.phonenumbercache.PhoneNumberCache;
32import com.android.dialer.util.PermissionsUtil;
33import com.android.dialer.widget.EmptyContentView;
34import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
35import java.util.Arrays;
36
37public class RegularSearchFragment extends SearchFragment
38    implements OnEmptyViewActionButtonClickedListener,
39        FragmentCompat.OnRequestPermissionsResultCallback {
40
41  public static final int PERMISSION_REQUEST_CODE = 1;
42
43  private static final int SEARCH_DIRECTORY_RESULT_LIMIT = 5;
44  protected String mPermissionToRequest;
45
46  public RegularSearchFragment() {
47    configureDirectorySearch();
48  }
49
50  public void configureDirectorySearch() {
51    setDirectorySearchEnabled(true);
52    setDirectoryResultLimit(SEARCH_DIRECTORY_RESULT_LIMIT);
53  }
54
55  @Override
56  protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
57    super.onCreateView(inflater, container);
58    ((PinnedHeaderListView) getListView()).setScrollToSectionOnHeaderTouch(true);
59  }
60
61  @Override
62  protected ContactEntryListAdapter createListAdapter() {
63    RegularSearchListAdapter adapter = new RegularSearchListAdapter(getActivity());
64    adapter.setDisplayPhotos(true);
65    adapter.setUseCallableUri(usesCallableUri());
66    adapter.setListener(this);
67    return adapter;
68  }
69
70  @Override
71  protected void cacheContactInfo(int position) {
72    CachedNumberLookupService cachedNumberLookupService =
73        PhoneNumberCache.get(getContext()).getCachedNumberLookupService();
74    if (cachedNumberLookupService != null) {
75      final RegularSearchListAdapter adapter = (RegularSearchListAdapter) getAdapter();
76      cachedNumberLookupService.addContact(
77          getContext(), adapter.getContactInfo(cachedNumberLookupService, position));
78    }
79  }
80
81  @Override
82  protected void setupEmptyView() {
83    if (mEmptyView != null && getActivity() != null) {
84      final int imageResource;
85      final int actionLabelResource;
86      final int descriptionResource;
87      final OnEmptyViewActionButtonClickedListener listener;
88      if (!PermissionsUtil.hasPermission(getActivity(), READ_CONTACTS)) {
89        imageResource = R.drawable.empty_contacts;
90        actionLabelResource = R.string.permission_single_turn_on;
91        descriptionResource = R.string.permission_no_search;
92        listener = this;
93        mPermissionToRequest = READ_CONTACTS;
94      } else {
95        imageResource = EmptyContentView.NO_IMAGE;
96        actionLabelResource = EmptyContentView.NO_LABEL;
97        descriptionResource = EmptyContentView.NO_LABEL;
98        listener = null;
99        mPermissionToRequest = null;
100      }
101
102      mEmptyView.setImage(imageResource);
103      mEmptyView.setActionLabel(actionLabelResource);
104      mEmptyView.setDescription(descriptionResource);
105      if (listener != null) {
106        mEmptyView.setActionClickedListener(listener);
107      }
108    }
109  }
110
111  @Override
112  public void onEmptyViewActionButtonClicked() {
113    final Activity activity = getActivity();
114    if (activity == null) {
115      return;
116    }
117
118    if (READ_CONTACTS.equals(mPermissionToRequest)) {
119      String[] deniedPermissions =
120          PermissionsUtil.getPermissionsCurrentlyDenied(
121              getContext(), PermissionsUtil.allContactsGroupPermissionsUsedInDialer);
122      if (deniedPermissions.length > 0) {
123        LogUtil.i(
124            "RegularSearchFragment.onEmptyViewActionButtonClicked",
125            "Requesting permissions: " + Arrays.toString(deniedPermissions));
126        FragmentCompat.requestPermissions(this, deniedPermissions, PERMISSION_REQUEST_CODE);
127      }
128    }
129  }
130
131  @Override
132  public void onRequestPermissionsResult(
133      int requestCode, String[] permissions, int[] grantResults) {
134    if (requestCode == PERMISSION_REQUEST_CODE) {
135      setupEmptyView();
136      if (grantResults != null
137          && grantResults.length == 1
138          && PackageManager.PERMISSION_GRANTED == grantResults[0]) {
139        PermissionsUtil.notifyPermissionGranted(getActivity(), permissions[0]);
140      }
141    }
142  }
143
144  @Override
145  protected CallInitiationType.Type getCallInitiationType(boolean isRemoteDirectory) {
146    return isRemoteDirectory
147        ? CallInitiationType.Type.REMOTE_DIRECTORY
148        : CallInitiationType.Type.REGULAR_SEARCH;
149  }
150
151  public interface CapabilityChecker {
152
153    boolean isNearbyPlacesSearchEnabled();
154  }
155}
156