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 */ 16 package com.android.dialer.list; 17 18 import static android.Manifest.permission.READ_CONTACTS; 19 20 import android.app.Activity; 21 import android.content.pm.PackageManager; 22 import android.support.v13.app.FragmentCompat; 23 import android.view.LayoutInflater; 24 import android.view.ViewGroup; 25 26 import com.android.contacts.common.list.ContactEntryListAdapter; 27 import com.android.contacts.common.list.PinnedHeaderListView; 28 import com.android.contacts.common.util.PermissionsUtil; 29 import com.android.contacts.commonbind.analytics.AnalyticsUtil; 30 import com.android.dialerbind.ObjectFactory; 31 import com.android.incallui.Call.LogState; 32 33 import com.android.dialer.R; 34 import com.android.dialer.logging.Logger; 35 import com.android.dialer.logging.ScreenEvent; 36 import com.android.dialer.service.CachedNumberLookupService; 37 import com.android.dialer.widget.EmptyContentView; 38 import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; 39 40 public class RegularSearchFragment extends SearchFragment 41 implements OnEmptyViewActionButtonClickedListener, 42 FragmentCompat.OnRequestPermissionsResultCallback { 43 44 public static final int PERMISSION_REQUEST_CODE = 1; 45 46 private static final int SEARCH_DIRECTORY_RESULT_LIMIT = 5; 47 48 private static final CachedNumberLookupService mCachedNumberLookupService = 49 ObjectFactory.newCachedNumberLookupService(); 50 51 public interface CapabilityChecker { isNearbyPlacesSearchEnabled()52 public boolean isNearbyPlacesSearchEnabled(); 53 } 54 55 protected String mPermissionToRequest; 56 RegularSearchFragment()57 public RegularSearchFragment() { 58 configureDirectorySearch(); 59 } 60 configureDirectorySearch()61 public void configureDirectorySearch() { 62 setDirectorySearchEnabled(true); 63 setDirectoryResultLimit(SEARCH_DIRECTORY_RESULT_LIMIT); 64 } 65 66 @Override onCreateView(LayoutInflater inflater, ViewGroup container)67 protected void onCreateView(LayoutInflater inflater, ViewGroup container) { 68 super.onCreateView(inflater, container); 69 ((PinnedHeaderListView) getListView()).setScrollToSectionOnHeaderTouch(true); 70 } 71 72 @Override createListAdapter()73 protected ContactEntryListAdapter createListAdapter() { 74 RegularSearchListAdapter adapter = new RegularSearchListAdapter(getActivity()); 75 adapter.setDisplayPhotos(true); 76 adapter.setUseCallableUri(usesCallableUri()); 77 adapter.setListener(this); 78 return adapter; 79 } 80 81 @Override cacheContactInfo(int position)82 protected void cacheContactInfo(int position) { 83 if (mCachedNumberLookupService != null) { 84 final RegularSearchListAdapter adapter = 85 (RegularSearchListAdapter) getAdapter(); 86 mCachedNumberLookupService.addContact(getContext(), 87 adapter.getContactInfo(mCachedNumberLookupService, position)); 88 } 89 } 90 91 @Override setupEmptyView()92 protected void setupEmptyView() { 93 if (mEmptyView != null && getActivity() != null) { 94 final int imageResource; 95 final int actionLabelResource; 96 final int descriptionResource; 97 final OnEmptyViewActionButtonClickedListener listener; 98 if (!PermissionsUtil.hasPermission(getActivity(), READ_CONTACTS)) { 99 imageResource = R.drawable.empty_contacts; 100 actionLabelResource = R.string.permission_single_turn_on; 101 descriptionResource = R.string.permission_no_search; 102 listener = this; 103 mPermissionToRequest = READ_CONTACTS; 104 } else { 105 imageResource = EmptyContentView.NO_IMAGE; 106 actionLabelResource = EmptyContentView.NO_LABEL; 107 descriptionResource = EmptyContentView.NO_LABEL; 108 listener = null; 109 mPermissionToRequest = null; 110 } 111 112 mEmptyView.setImage(imageResource); 113 mEmptyView.setActionLabel(actionLabelResource); 114 mEmptyView.setDescription(descriptionResource); 115 if (listener != null) { 116 mEmptyView.setActionClickedListener(listener); 117 } 118 } 119 } 120 121 @Override onEmptyViewActionButtonClicked()122 public void onEmptyViewActionButtonClicked() { 123 final Activity activity = getActivity(); 124 if (activity == null) { 125 return; 126 } 127 128 if (READ_CONTACTS.equals(mPermissionToRequest)) { 129 FragmentCompat.requestPermissions(this, new String[] {mPermissionToRequest}, 130 PERMISSION_REQUEST_CODE); 131 } 132 } 133 134 @Override onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)135 public void onRequestPermissionsResult(int requestCode, String[] permissions, 136 int[] grantResults) { 137 if (requestCode == PERMISSION_REQUEST_CODE) { 138 setupEmptyView(); 139 if (grantResults != null && grantResults.length == 1 140 && PackageManager.PERMISSION_GRANTED == grantResults[0]) { 141 PermissionsUtil.notifyPermissionGranted(getActivity(), mPermissionToRequest); 142 } 143 } 144 } 145 146 @Override getCallInitiationType(boolean isRemoteDirectory)147 protected int getCallInitiationType(boolean isRemoteDirectory) { 148 return isRemoteDirectory ? LogState.INITIATION_REMOTE_DIRECTORY 149 : LogState.INITIATION_REGULAR_SEARCH; 150 } 151 } 152