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