• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.app.list;
17 
18 import static android.Manifest.permission.CALL_PHONE;
19 
20 import android.app.Activity;
21 import android.content.BroadcastReceiver;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.content.IntentFilter;
25 import android.content.Loader;
26 import android.database.Cursor;
27 import android.os.Bundle;
28 import android.support.v13.app.FragmentCompat;
29 import com.android.contacts.common.list.ContactEntryListAdapter;
30 import com.android.dialer.app.R;
31 import com.android.dialer.callintent.CallInitiationType;
32 import com.android.dialer.common.LogUtil;
33 import com.android.dialer.database.DialerDatabaseHelper;
34 import com.android.dialer.smartdial.SmartDialCursorLoader;
35 import com.android.dialer.util.PermissionsUtil;
36 import com.android.dialer.widget.EmptyContentView;
37 import java.util.Arrays;
38 
39 /** Implements a fragment to load and display SmartDial search results. */
40 public class SmartDialSearchFragment extends SearchFragment
41     implements EmptyContentView.OnEmptyViewActionButtonClickedListener,
42         FragmentCompat.OnRequestPermissionsResultCallback {
43 
44   private static final int CALL_PHONE_PERMISSION_REQUEST_CODE = 1;
45 
46   private final BroadcastReceiver smartDialUpdatedReceiver =
47       new BroadcastReceiver() {
48         @Override
49         public void onReceive(Context context, Intent intent) {
50           LogUtil.i("SmartDialSearchFragment.onReceive", "smart dial update broadcast received");
51           reloadData();
52         }
53       };
54 
55   /** Creates a SmartDialListAdapter to display and operate on search results. */
56   @Override
createListAdapter()57   protected ContactEntryListAdapter createListAdapter() {
58     SmartDialNumberListAdapter adapter = new SmartDialNumberListAdapter(getActivity());
59     adapter.setUseCallableUri(super.usesCallableUri());
60     adapter.setQuickContactEnabled(true);
61     adapter.setShowEmptyListForNullQuery(getShowEmptyListForNullQuery());
62     // Set adapter's query string to restore previous instance state.
63     adapter.setQueryString(getQueryString());
64     adapter.setListener(this);
65     return adapter;
66   }
67 
68   /** Creates a SmartDialCursorLoader object to load query results. */
69   @Override
onCreateLoader(int id, Bundle args)70   public Loader<Cursor> onCreateLoader(int id, Bundle args) {
71     // Smart dialing does not support Directory Load, falls back to normal search instead.
72     if (id == getDirectoryLoaderId()) {
73       return super.onCreateLoader(id, args);
74     } else {
75       final SmartDialNumberListAdapter adapter = (SmartDialNumberListAdapter) getAdapter();
76       SmartDialCursorLoader loader = new SmartDialCursorLoader(super.getContext());
77       loader.setShowEmptyListForNullQuery(getShowEmptyListForNullQuery());
78       adapter.configureLoader(loader);
79       return loader;
80     }
81   }
82 
83   @Override
getShowEmptyListForNullQuery()84   public boolean getShowEmptyListForNullQuery() {
85     return true;
86   }
87 
88   @Override
setupEmptyView()89   protected void setupEmptyView() {
90     if (emptyView != null && getActivity() != null) {
91       if (!PermissionsUtil.hasPermission(getActivity(), CALL_PHONE)) {
92         emptyView.setImage(R.drawable.empty_contacts);
93         emptyView.setActionLabel(R.string.permission_single_turn_on);
94         emptyView.setDescription(R.string.permission_place_call);
95         emptyView.setActionClickedListener(this);
96       } else {
97         emptyView.setImage(EmptyContentView.NO_IMAGE);
98         emptyView.setActionLabel(EmptyContentView.NO_LABEL);
99         emptyView.setDescription(EmptyContentView.NO_LABEL);
100       }
101     }
102   }
103 
104   @Override
onStart()105   public void onStart() {
106     super.onStart();
107 
108     LogUtil.i("SmartDialSearchFragment.onStart", "registering smart dial update receiver");
109 
110     getActivity()
111         .registerReceiver(
112             smartDialUpdatedReceiver,
113             new IntentFilter(DialerDatabaseHelper.ACTION_SMART_DIAL_UPDATED));
114   }
115 
116   @Override
onStop()117   public void onStop() {
118     super.onStop();
119 
120     LogUtil.i("SmartDialSearchFragment.onStop", "unregistering smart dial update receiver");
121 
122     getActivity().unregisterReceiver(smartDialUpdatedReceiver);
123   }
124 
125   @Override
onEmptyViewActionButtonClicked()126   public void onEmptyViewActionButtonClicked() {
127     final Activity activity = getActivity();
128     if (activity == null) {
129       return;
130     }
131 
132     String[] deniedPermissions =
133         PermissionsUtil.getPermissionsCurrentlyDenied(
134             getContext(), PermissionsUtil.allPhoneGroupPermissionsUsedInDialer);
135     if (deniedPermissions.length > 0) {
136       LogUtil.i(
137           "SmartDialSearchFragment.onEmptyViewActionButtonClicked",
138           "Requesting permissions: " + Arrays.toString(deniedPermissions));
139       FragmentCompat.requestPermissions(
140           this, deniedPermissions, CALL_PHONE_PERMISSION_REQUEST_CODE);
141     }
142   }
143 
144   @Override
onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults)145   public void onRequestPermissionsResult(
146       int requestCode, String[] permissions, int[] grantResults) {
147     if (requestCode == CALL_PHONE_PERMISSION_REQUEST_CODE) {
148       setupEmptyView();
149     }
150   }
151 
152   @Override
getCallInitiationType(boolean isRemoteDirectory)153   protected CallInitiationType.Type getCallInitiationType(boolean isRemoteDirectory) {
154     return CallInitiationType.Type.SMART_DIAL;
155   }
156 
isShowingPermissionRequest()157   public boolean isShowingPermissionRequest() {
158     return emptyView != null && emptyView.isShowingContent();
159   }
160 
161   @Override
setShowEmptyListForNullQuery(boolean show)162   public void setShowEmptyListForNullQuery(boolean show) {
163     if (getAdapter() != null) {
164       ((SmartDialNumberListAdapter) getAdapter()).setShowEmptyListForNullQuery(show);
165     }
166     super.setShowEmptyListForNullQuery(show);
167   }
168 }
169