diff options
| author | Yorke Lee <yorkelee@google.com> | 2015-07-14 17:05:38 -0700 |
|---|---|---|
| committer | Yorke Lee <yorkelee@google.com> | 2015-07-15 11:36:54 -0700 |
| commit | 38019af70eb1ca084d36291390bbc54dc81027de (patch) | |
| tree | 36753e132aa81fda9c61244e1882ce63e9a52a94 /src/com/android/dialer/list | |
| parent | 5a6204880d2fd98a0f887741186ca5f3d16526f7 (diff) | |
| download | packages_apps_Dialer-38019af70eb1ca084d36291390bbc54dc81027de.tar.gz packages_apps_Dialer-38019af70eb1ca084d36291390bbc54dc81027de.tar.bz2 packages_apps_Dialer-38019af70eb1ca084d36291390bbc54dc81027de.zip | |
Update Dialer UI to prompt for permissions
First pass at adding functionality to Dialer to prompt for
permissions. Also updates the UI for various fragments when
there are no contacts/calls available to unify the UI with the
new UI for the permissions denied state.
* Refactor existing empty view functionality and encapsulate
into a new custom view class
* Add action buttons to existing empty views in various fragments
-> Speed Dial (Add to favorites) - scrolls to all contacts fragment
-> Recents (Make a call) - shows dialpad
-> All contacts (Add a contact) - Launches add contact dialog
* Add functionality to various fragments to detect if permissions
are denied, and request the permission when the action button
is pressed.
-> Speed Dial (request for contacts permission)
-> Call Log (request for phone permission)
-> All contacts (request for contacts permission)
* Remove now unneeded EmptyContactsListAdapter
Remaining issues (to be addressed in a follow up CL to avoid bloating
this CL):
UI alignment tweaks for empty view to match mocks
If the read contacts permission is requested from the
speed dial screen, the all contacts fragment doesn't update with
the list of contacts until restarted.
Bug: 22174668
Change-Id: I70721914bb9b32910d746de288ccac049749e42e
Diffstat (limited to 'src/com/android/dialer/list')
| -rw-r--r-- | src/com/android/dialer/list/AllContactsFragment.java | 60 | ||||
| -rw-r--r-- | src/com/android/dialer/list/EmptyContactsListAdapter.java | 47 | ||||
| -rw-r--r-- | src/com/android/dialer/list/SpeedDialFragment.java | 37 |
3 files changed, 82 insertions, 62 deletions
diff --git a/src/com/android/dialer/list/AllContactsFragment.java b/src/com/android/dialer/list/AllContactsFragment.java index d34250b48..00b629c2b 100644 --- a/src/com/android/dialer/list/AllContactsFragment.java +++ b/src/com/android/dialer/list/AllContactsFragment.java @@ -16,7 +16,11 @@ package com.android.dialer.list; +import static android.Manifest.permission.READ_CONTACTS; + +import android.app.Activity; import android.content.Loader; +import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract.CommonDataKinds.Phone; @@ -34,13 +38,19 @@ import com.android.contacts.common.util.PermissionsUtil; import com.android.contacts.common.util.ViewUtil; import com.android.dialer.R; import com.android.dialer.util.DialerUtils; +import com.android.dialer.util.IntentUtil; +import com.android.dialer.widget.EmptyContentView; +import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; /** * Fragments to show all contacts with phone numbers. */ -public class AllContactsFragment extends ContactEntryListFragment<ContactEntryListAdapter> { +public class AllContactsFragment extends ContactEntryListFragment<ContactEntryListAdapter> + implements OnEmptyViewActionButtonClickedListener { + + private static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1; - private View mEmptyListView; + private EmptyContentView mEmptyListView; public AllContactsFragment() { setQuickContactEnabled(false); @@ -55,9 +65,10 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi public void onViewCreated(View view, android.os.Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mEmptyListView = view.findViewById(R.id.empty_list_view); - DialerUtils.configureEmptyListView(mEmptyListView, R.drawable.empty_contacts, - R.string.all_contacts_empty, getResources()); + mEmptyListView = (EmptyContentView) view.findViewById(R.id.empty_list_view); + mEmptyListView.setImage(R.drawable.empty_contacts); + mEmptyListView.setDescription(R.string.all_contacts_empty); + mEmptyListView.setActionClickedListener(this); getListView().setEmptyView(mEmptyListView); mEmptyListView.setVisibility(View.GONE); @@ -66,8 +77,14 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi @Override protected void startLoading() { - if (PermissionsUtil.hasContactsPermissions(getActivity())) { + if (PermissionsUtil.hasPermission(getActivity(), READ_CONTACTS)) { super.startLoading(); + mEmptyListView.setDescription(R.string.all_contacts_empty); + mEmptyListView.setActionLabel(R.string.all_contacts_empty_add_contact_action); + } else { + mEmptyListView.setDescription(R.string.permission_no_contacts); + mEmptyListView.setActionLabel(R.string.permission_single_turn_on); + mEmptyListView.setVisibility(View.VISIBLE); } } @@ -82,10 +99,6 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi @Override protected ContactEntryListAdapter createListAdapter() { - if (!PermissionsUtil.hasContactsPermissions(getActivity())) { - return new EmptyContactsListAdapter(getActivity()); - } - final DefaultContactListAdapter adapter = new DefaultContactListAdapter(getActivity()) { @Override protected void bindView(View itemView, int partition, Cursor cursor, int position) { @@ -118,4 +131,31 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi protected void onItemClick(int position, long id) { // Do nothing. Implemented to satisfy ContactEntryListFragment. } + + @Override + public void onEmptyViewActionButtonClicked(String[] permissions) { + final Activity activity = getActivity(); + if (activity == null) { + return; + } + + if (!PermissionsUtil.hasPermission(activity, READ_CONTACTS)) { + requestPermissions(new String[] {READ_CONTACTS}, READ_CONTACTS_PERMISSION_REQUEST_CODE); + } else { + // Add new contact + DialerUtils.startActivityWithErrorToast(activity, IntentUtil.getNewContactIntent(), + R.string.add_contact_not_available); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + if (requestCode == READ_CONTACTS_PERMISSION_REQUEST_CODE) { + if (grantResults.length >= 1 && PackageManager.PERMISSION_GRANTED == grantResults[0]) { + // Force a refresh of the data since we were missing the permission before this. + reloadData(); + } + } + } } diff --git a/src/com/android/dialer/list/EmptyContactsListAdapter.java b/src/com/android/dialer/list/EmptyContactsListAdapter.java deleted file mode 100644 index 54bd4771f..000000000 --- a/src/com/android/dialer/list/EmptyContactsListAdapter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.list; - -import android.content.Context; -import android.content.CursorLoader; - -import com.android.contacts.common.list.ContactEntryListAdapter; - -/** - * Used to display an empty contact list when we don't have the permissions to read contacts. - */ -public class EmptyContactsListAdapter extends ContactEntryListAdapter { - - public EmptyContactsListAdapter(Context context) { - super(context); - } - - @Override - public String getContactDisplayName(int position) { - return null; - } - - @Override - public void configureLoader(CursorLoader loader, long directoryId) { - loader.setUri(null); - } - - @Override - public int getCount() { - return 0; - } -} diff --git a/src/com/android/dialer/list/SpeedDialFragment.java b/src/com/android/dialer/list/SpeedDialFragment.java index bf9575858..aead1c81b 100644 --- a/src/com/android/dialer/list/SpeedDialFragment.java +++ b/src/com/android/dialer/list/SpeedDialFragment.java @@ -15,6 +15,8 @@ */ package com.android.dialer.list; +import static android.Manifest.permission.READ_CONTACTS; + import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; @@ -50,6 +52,7 @@ import com.android.contacts.common.list.OnPhoneNumberPickerActionListener; import com.android.contacts.common.util.PermissionsUtil; import com.android.dialer.R; import com.android.dialer.util.DialerUtils; +import com.android.dialer.widget.EmptyContentView; import java.util.ArrayList; import java.util.HashMap; @@ -58,7 +61,8 @@ import java.util.HashMap; * This fragment displays the user's favorite/frequent contacts in a grid. */ public class SpeedDialFragment extends Fragment implements OnItemClickListener, - PhoneFavoritesTileAdapter.OnDataSetChangedForAnimationListener { + PhoneFavoritesTileAdapter.OnDataSetChangedForAnimationListener, + EmptyContentView.OnEmptyViewActionButtonClickedListener { /** * By default, the animation code assumes that all items in a list view are of the same height @@ -81,6 +85,7 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener, public interface HostInterface { public void setDragDropController(DragDropController controller); + public void showAllContactsTab(); } private class ContactTileLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> { @@ -157,7 +162,7 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener, /** * Layout used when there are no favorites. */ - private View mEmptyView; + private EmptyContentView mEmptyView; private final ContactTileView.Listener mContactTileAdapterListener = new ContactTileAdapterListener(); @@ -197,9 +202,16 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener, if (getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE) == null) { getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null, mContactTileLoaderListener); + } else { getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE).forceLoad(); } + + mEmptyView.setDescription(R.string.speed_dial_empty); + mEmptyView.setActionLabel(R.string.speed_dial_empty_add_favorite_action); + } else { + mEmptyView.setDescription(R.string.permission_no_speeddial); + mEmptyView.setActionLabel(R.string.permission_single_turn_on); } Trace.endSection(); } @@ -221,9 +233,9 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener, (ImageView) getActivity().findViewById(R.id.contact_tile_drag_shadow_overlay); mListView.setDragShadowOverlay(dragShadowOverlay); - mEmptyView = mParentView.findViewById(R.id.empty_list_view); - DialerUtils.configureEmptyListView( - mEmptyView, R.drawable.empty_speed_dial, R.string.speed_dial_empty, getResources()); + mEmptyView = (EmptyContentView) mParentView.findViewById(R.id.empty_list_view); + mEmptyView.setImage(R.drawable.empty_speed_dial); + mEmptyView.setActionClickedListener(this); mContactTileFrame = mParentView.findViewById(R.id.contact_tile_frame); @@ -449,4 +461,19 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener, public AbsListView getListView() { return mListView; } + + @Override + public void onEmptyViewActionButtonClicked(String[] permissions) { + final Activity activity = getActivity(); + if (activity == null) { + return; + } + + if (!PermissionsUtil.hasPermission(activity, READ_CONTACTS)) { + requestPermissions(new String[] {READ_CONTACTS}, 0); + } else { + // Switch tabs + ((HostInterface) activity).showAllContactsTab(); + } + } } |
