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