1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2013 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License. 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.dialer.app.list; 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport static android.Manifest.permission.CALL_PHONE; 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.app.Activity; 21738bb09adee2b56c99063a0264f8f76de393143bEric Erfanianimport android.content.BroadcastReceiver; 22738bb09adee2b56c99063a0264f8f76de393143bEric Erfanianimport android.content.Context; 23738bb09adee2b56c99063a0264f8f76de393143bEric Erfanianimport android.content.Intent; 24738bb09adee2b56c99063a0264f8f76de393143bEric Erfanianimport android.content.IntentFilter; 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Loader; 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.database.Cursor; 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Bundle; 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.v13.app.FragmentCompat; 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.list.ContactEntryListAdapter; 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.app.R; 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.app.dialpad.SmartDialCursorLoader; 328369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanianimport com.android.dialer.callintent.CallInitiationType; 33738bb09adee2b56c99063a0264f8f76de393143bEric Erfanianimport com.android.dialer.common.LogUtil; 34738bb09adee2b56c99063a0264f8f76de393143bEric Erfanianimport com.android.dialer.database.DialerDatabaseHelper; 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.dialer.util.PermissionsUtil; 362f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.widget.EmptyContentView; 372f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport java.util.Arrays; 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** Implements a fragment to load and display SmartDial search results. */ 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class SmartDialSearchFragment extends SearchFragment 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian implements EmptyContentView.OnEmptyViewActionButtonClickedListener, 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian FragmentCompat.OnRequestPermissionsResultCallback { 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final int CALL_PHONE_PERMISSION_REQUEST_CODE = 1; 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 46738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian private final BroadcastReceiver mSmartDialUpdatedReceiver = 47738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian new BroadcastReceiver() { 48738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian @Override 49738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian public void onReceive(Context context, Intent intent) { 50738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian LogUtil.i("SmartDialSearchFragment.onReceive", "smart dial update broadcast received"); 51738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian reloadData(); 52738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian } 53738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian }; 54738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Creates a SmartDialListAdapter to display and operate on search results. */ 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected ContactEntryListAdapter createListAdapter() { 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian SmartDialNumberListAdapter adapter = new SmartDialNumberListAdapter(getActivity()); 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian adapter.setUseCallableUri(super.usesCallableUri()); 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian adapter.setQuickContactEnabled(true); 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian adapter.setShowEmptyListForNullQuery(getShowEmptyListForNullQuery()); 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // Set adapter's query string to restore previous instance state. 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian adapter.setQueryString(getQueryString()); 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian adapter.setListener(this); 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return adapter; 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Creates a SmartDialCursorLoader object to load query results. */ 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Loader<Cursor> onCreateLoader(int id, Bundle args) { 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // Smart dialing does not support Directory Load, falls back to normal search instead. 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (id == getDirectoryLoaderId()) { 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return super.onCreateLoader(id, args); 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final SmartDialNumberListAdapter adapter = (SmartDialNumberListAdapter) getAdapter(); 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian SmartDialCursorLoader loader = new SmartDialCursorLoader(super.getContext()); 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian loader.setShowEmptyListForNullQuery(getShowEmptyListForNullQuery()); 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian adapter.configureLoader(loader); 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return loader; 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 842f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian public boolean getShowEmptyListForNullQuery() { 852f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian return true; 862f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian } 872f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian 882f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian @Override 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected void setupEmptyView() { 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (mEmptyView != null && getActivity() != null) { 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (!PermissionsUtil.hasPermission(getActivity(), CALL_PHONE)) { 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mEmptyView.setImage(R.drawable.empty_contacts); 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mEmptyView.setActionLabel(R.string.permission_single_turn_on); 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mEmptyView.setDescription(R.string.permission_place_call); 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mEmptyView.setActionClickedListener(this); 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mEmptyView.setImage(EmptyContentView.NO_IMAGE); 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mEmptyView.setActionLabel(EmptyContentView.NO_LABEL); 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mEmptyView.setDescription(EmptyContentView.NO_LABEL); 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 105738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian public void onStart() { 106738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian super.onStart(); 107738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian 108738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian LogUtil.i("SmartDialSearchFragment.onStart", "registering smart dial update receiver"); 109738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian 110738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian getActivity() 111738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian .registerReceiver( 112738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian mSmartDialUpdatedReceiver, 113738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian new IntentFilter(DialerDatabaseHelper.ACTION_SMART_DIAL_UPDATED)); 114738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian } 115738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian 116738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian @Override 117738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian public void onStop() { 118738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian super.onStop(); 119738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian 120738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian LogUtil.i("SmartDialSearchFragment.onStop", "unregistering smart dial update receiver"); 121738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian 122738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian getActivity().unregisterReceiver(mSmartDialUpdatedReceiver); 123738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian } 124738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian 125738bb09adee2b56c99063a0264f8f76de393143bEric Erfanian @Override 126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onEmptyViewActionButtonClicked() { 127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final Activity activity = getActivity(); 128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (activity == null) { 129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return; 130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 1322f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian String[] deniedPermissions = 1332f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian PermissionsUtil.getPermissionsCurrentlyDenied( 1342f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian getContext(), PermissionsUtil.allPhoneGroupPermissionsUsedInDialer); 1352f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian if (deniedPermissions.length > 0) { 1362f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian LogUtil.i( 1372f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian "SmartDialSearchFragment.onEmptyViewActionButtonClicked", 1382f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian "Requesting permissions: " + Arrays.toString(deniedPermissions)); 1392f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian FragmentCompat.requestPermissions( 1402f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian this, deniedPermissions, CALL_PHONE_PERMISSION_REQUEST_CODE); 1412f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian } 142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 143ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onRequestPermissionsResult( 146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian int requestCode, String[] permissions, int[] grantResults) { 147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (requestCode == CALL_PHONE_PERMISSION_REQUEST_CODE) { 148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian setupEmptyView(); 149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 152ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 1538369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian protected CallInitiationType.Type getCallInitiationType(boolean isRemoteDirectory) { 154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return CallInitiationType.Type.SMART_DIAL; 155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean isShowingPermissionRequest() { 158ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mEmptyView != null && mEmptyView.isShowingContent(); 159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 160ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setShowEmptyListForNullQuery(boolean show) { 163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (getAdapter() != null) { 164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ((SmartDialNumberListAdapter) getAdapter()).setShowEmptyListForNullQuery(show); 165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super.setShowEmptyListForNullQuery(show); 167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 168ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 169