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.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
     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
     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
     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
     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
    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
    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
    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
    139   protected CallInitiationType.Type getCallInitiationType(boolean isRemoteDirectory) {
    140     return CallInitiationType.Type.SMART_DIAL;
    141   }
    142 
    143   public boolean isShowingPermissionRequest() {
    144     return mEmptyView != null && mEmptyView.isShowingContent();
    145   }
    146 
    147   @Override
    148   public void setShowEmptyListForNullQuery(boolean show) {
    149     if (getAdapter() != null) {
    150       ((SmartDialNumberListAdapter) getAdapter()).setShowEmptyListForNullQuery(show);
    151     }
    152     super.setShowEmptyListForNullQuery(show);
    153   }
    154 }
    155