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