Home | History | Annotate | Download | only in list
      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.callintent.CallInitiationType;
     33 import com.android.dialer.common.LogUtil;
     34 import com.android.dialer.database.DialerDatabaseHelper;
     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 mSmartDialUpdatedReceiver =
     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
     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
     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
     84   public boolean getShowEmptyListForNullQuery() {
     85     return true;
     86   }
     87 
     88   @Override
     89   protected void setupEmptyView() {
     90     if (mEmptyView != null && getActivity() != null) {
     91       if (!PermissionsUtil.hasPermission(getActivity(), CALL_PHONE)) {
     92         mEmptyView.setImage(R.drawable.empty_contacts);
     93         mEmptyView.setActionLabel(R.string.permission_single_turn_on);
     94         mEmptyView.setDescription(R.string.permission_place_call);
     95         mEmptyView.setActionClickedListener(this);
     96       } else {
     97         mEmptyView.setImage(EmptyContentView.NO_IMAGE);
     98         mEmptyView.setActionLabel(EmptyContentView.NO_LABEL);
     99         mEmptyView.setDescription(EmptyContentView.NO_LABEL);
    100       }
    101     }
    102   }
    103 
    104   @Override
    105   public void onStart() {
    106     super.onStart();
    107 
    108     LogUtil.i("SmartDialSearchFragment.onStart", "registering smart dial update receiver");
    109 
    110     getActivity()
    111         .registerReceiver(
    112             mSmartDialUpdatedReceiver,
    113             new IntentFilter(DialerDatabaseHelper.ACTION_SMART_DIAL_UPDATED));
    114   }
    115 
    116   @Override
    117   public void onStop() {
    118     super.onStop();
    119 
    120     LogUtil.i("SmartDialSearchFragment.onStop", "unregistering smart dial update receiver");
    121 
    122     getActivity().unregisterReceiver(mSmartDialUpdatedReceiver);
    123   }
    124 
    125   @Override
    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
    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
    153   protected CallInitiationType.Type getCallInitiationType(boolean isRemoteDirectory) {
    154     return CallInitiationType.Type.SMART_DIAL;
    155   }
    156 
    157   public boolean isShowingPermissionRequest() {
    158     return mEmptyView != null && mEmptyView.isShowingContent();
    159   }
    160 
    161   @Override
    162   public void setShowEmptyListForNullQuery(boolean show) {
    163     if (getAdapter() != null) {
    164       ((SmartDialNumberListAdapter) getAdapter()).setShowEmptyListForNullQuery(show);
    165     }
    166     super.setShowEmptyListForNullQuery(show);
    167   }
    168 }
    169