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