summaryrefslogtreecommitdiffstats
path: root/src/com/android/dialer/list
diff options
context:
space:
mode:
authorYorke Lee <yorkelee@google.com>2015-07-14 17:05:38 -0700
committerYorke Lee <yorkelee@google.com>2015-07-15 11:36:54 -0700
commit38019af70eb1ca084d36291390bbc54dc81027de (patch)
tree36753e132aa81fda9c61244e1882ce63e9a52a94 /src/com/android/dialer/list
parent5a6204880d2fd98a0f887741186ca5f3d16526f7 (diff)
downloadpackages_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.java60
-rw-r--r--src/com/android/dialer/list/EmptyContactsListAdapter.java47
-rw-r--r--src/com/android/dialer/list/SpeedDialFragment.java37
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();
+ }
+ }
}