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 
     17 package com.android.dialer.app.list;
     18 
     19 import static android.Manifest.permission.READ_CONTACTS;
     20 
     21 import android.app.Activity;
     22 import android.content.BroadcastReceiver;
     23 import android.content.Context;
     24 import android.content.Intent;
     25 import android.content.Loader;
     26 import android.content.pm.PackageManager;
     27 import android.database.Cursor;
     28 import android.net.Uri;
     29 import android.provider.ContactsContract.CommonDataKinds.Phone;
     30 import android.provider.ContactsContract.QuickContact;
     31 import android.support.v13.app.FragmentCompat;
     32 import android.view.LayoutInflater;
     33 import android.view.View;
     34 import android.view.ViewGroup;
     35 import android.widget.AdapterView;
     36 import com.android.contacts.common.list.ContactEntryListAdapter;
     37 import com.android.contacts.common.list.ContactEntryListFragment;
     38 import com.android.contacts.common.list.ContactListFilter;
     39 import com.android.contacts.common.list.DefaultContactListAdapter;
     40 import com.android.dialer.app.R;
     41 import com.android.dialer.app.widget.EmptyContentView;
     42 import com.android.dialer.app.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
     43 import com.android.dialer.compat.CompatUtils;
     44 import com.android.dialer.util.DialerUtils;
     45 import com.android.dialer.util.IntentUtil;
     46 import com.android.dialer.util.PermissionsUtil;
     47 
     48 /** Fragments to show all contacts with phone numbers. */
     49 public class AllContactsFragment extends ContactEntryListFragment<ContactEntryListAdapter>
     50     implements OnEmptyViewActionButtonClickedListener,
     51         FragmentCompat.OnRequestPermissionsResultCallback {
     52 
     53   private static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1;
     54 
     55   private EmptyContentView mEmptyListView;
     56 
     57   /**
     58    * Listen to broadcast events about permissions in order to be notified if the READ_CONTACTS
     59    * permission is granted via the UI in another fragment.
     60    */
     61   private BroadcastReceiver mReadContactsPermissionGrantedReceiver =
     62       new BroadcastReceiver() {
     63         @Override
     64         public void onReceive(Context context, Intent intent) {
     65           reloadData();
     66         }
     67       };
     68 
     69   public AllContactsFragment() {
     70     setQuickContactEnabled(false);
     71     setAdjustSelectionBoundsEnabled(true);
     72     setPhotoLoaderEnabled(true);
     73     setSectionHeaderDisplayEnabled(true);
     74     setDarkTheme(false);
     75     setVisibleScrollbarEnabled(true);
     76   }
     77 
     78   @Override
     79   public void onViewCreated(View view, android.os.Bundle savedInstanceState) {
     80     super.onViewCreated(view, savedInstanceState);
     81 
     82     mEmptyListView = (EmptyContentView) view.findViewById(R.id.empty_list_view);
     83     mEmptyListView.setImage(R.drawable.empty_contacts);
     84     mEmptyListView.setDescription(R.string.all_contacts_empty);
     85     mEmptyListView.setActionClickedListener(this);
     86     getListView().setEmptyView(mEmptyListView);
     87     mEmptyListView.setVisibility(View.GONE);
     88   }
     89 
     90   @Override
     91   public void onStart() {
     92     super.onStart();
     93     PermissionsUtil.registerPermissionReceiver(
     94         getActivity(), mReadContactsPermissionGrantedReceiver, READ_CONTACTS);
     95   }
     96 
     97   @Override
     98   public void onStop() {
     99     PermissionsUtil.unregisterPermissionReceiver(
    100         getActivity(), mReadContactsPermissionGrantedReceiver);
    101     super.onStop();
    102   }
    103 
    104   @Override
    105   protected void startLoading() {
    106     if (PermissionsUtil.hasPermission(getActivity(), READ_CONTACTS)) {
    107       super.startLoading();
    108       mEmptyListView.setDescription(R.string.all_contacts_empty);
    109       mEmptyListView.setActionLabel(R.string.all_contacts_empty_add_contact_action);
    110     } else {
    111       mEmptyListView.setDescription(R.string.permission_no_contacts);
    112       mEmptyListView.setActionLabel(R.string.permission_single_turn_on);
    113       mEmptyListView.setVisibility(View.VISIBLE);
    114     }
    115   }
    116 
    117   @Override
    118   public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    119     super.onLoadFinished(loader, data);
    120 
    121     if (data == null || data.getCount() == 0) {
    122       mEmptyListView.setVisibility(View.VISIBLE);
    123     }
    124   }
    125 
    126   @Override
    127   protected ContactEntryListAdapter createListAdapter() {
    128     final DefaultContactListAdapter adapter =
    129         new DefaultContactListAdapter(getActivity()) {
    130           @Override
    131           protected void bindView(View itemView, int partition, Cursor cursor, int position) {
    132             super.bindView(itemView, partition, cursor, position);
    133             itemView.setTag(this.getContactUri(partition, cursor));
    134           }
    135         };
    136     adapter.setDisplayPhotos(true);
    137     adapter.setFilter(
    138         ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_DEFAULT));
    139     adapter.setSectionHeaderDisplayEnabled(isSectionHeaderDisplayEnabled());
    140     return adapter;
    141   }
    142 
    143   @Override
    144   protected View inflateView(LayoutInflater inflater, ViewGroup container) {
    145     return inflater.inflate(R.layout.all_contacts_fragment, null);
    146   }
    147 
    148   @Override
    149   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    150     final Uri uri = (Uri) view.getTag();
    151     if (uri != null) {
    152       if (CompatUtils.hasPrioritizedMimeType()) {
    153         QuickContact.showQuickContact(getContext(), view, uri, null, Phone.CONTENT_ITEM_TYPE);
    154       } else {
    155         QuickContact.showQuickContact(getActivity(), view, uri, QuickContact.MODE_LARGE, null);
    156       }
    157     }
    158   }
    159 
    160   @Override
    161   protected void onItemClick(int position, long id) {
    162     // Do nothing. Implemented to satisfy ContactEntryListFragment.
    163   }
    164 
    165   @Override
    166   public void onEmptyViewActionButtonClicked() {
    167     final Activity activity = getActivity();
    168     if (activity == null) {
    169       return;
    170     }
    171 
    172     if (!PermissionsUtil.hasPermission(activity, READ_CONTACTS)) {
    173       FragmentCompat.requestPermissions(
    174           this, new String[] {READ_CONTACTS}, READ_CONTACTS_PERMISSION_REQUEST_CODE);
    175     } else {
    176       // Add new contact
    177       DialerUtils.startActivityWithErrorToast(
    178           activity, IntentUtil.getNewContactIntent(), R.string.add_contact_not_available);
    179     }
    180   }
    181 
    182   @Override
    183   public void onRequestPermissionsResult(
    184       int requestCode, String[] permissions, int[] grantResults) {
    185     if (requestCode == READ_CONTACTS_PERMISSION_REQUEST_CODE) {
    186       if (grantResults.length >= 1 && PackageManager.PERMISSION_GRANTED == grantResults[0]) {
    187         // Force a refresh of the data since we were missing the permission before this.
    188         reloadData();
    189       }
    190     }
    191   }
    192 }
    193