diff options
author | Yorke Lee <yorkelee@google.com> | 2015-07-17 19:09:03 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-07-17 19:09:03 +0000 |
commit | 7c5ca721664ff4c37a2e4cd754e8ac5283cde04d (patch) | |
tree | 8fd49a18f3639e71fdd69353737e4efc18856964 | |
parent | d30106bce1552f9f094dd1d104bbab91191c8d10 (diff) | |
parent | 7e7e2bc0cdea48ab6f5b07ec00c68227007d4e29 (diff) |
am 7e7e2bc0: am 7e03db72: am 91ecb136: Merge "Add permission prompts for contacts and dialpad search" into mnc-dev
* commit '7e7e2bc0cdea48ab6f5b07ec00c68227007d4e29':
Add permission prompts for contacts and dialpad search
-rw-r--r-- | res/layout/empty_content_view.xml | 1 | ||||
-rw-r--r-- | res/values/strings.xml | 4 | ||||
-rw-r--r-- | src/com/android/dialer/DialtactsActivity.java | 25 | ||||
-rw-r--r-- | src/com/android/dialer/calllog/CallLogFragment.java | 2 | ||||
-rw-r--r-- | src/com/android/dialer/dialpad/DialpadFragment.java | 13 | ||||
-rw-r--r-- | src/com/android/dialer/list/AllContactsFragment.java | 2 | ||||
-rw-r--r-- | src/com/android/dialer/list/RegularSearchFragment.java | 49 | ||||
-rw-r--r-- | src/com/android/dialer/list/SearchFragment.java | 18 | ||||
-rw-r--r-- | src/com/android/dialer/list/SmartDialSearchFragment.java | 52 | ||||
-rw-r--r-- | src/com/android/dialer/list/SpeedDialFragment.java | 2 | ||||
-rw-r--r-- | src/com/android/dialer/widget/EmptyContentView.java | 31 |
11 files changed, 165 insertions, 34 deletions
diff --git a/res/layout/empty_content_view.xml b/res/layout/empty_content_view.xml index d8f27aad8..97ac4c79c 100644 --- a/res/layout/empty_content_view.xml +++ b/res/layout/empty_content_view.xml @@ -43,7 +43,6 @@ android:paddingLeft="16dp" android:paddingTop="8dp" android:paddingBottom="8dp" - android:text="@string/permission_single_turn_on" android:background="?android:attr/selectableItemBackground" android:clickable="true" style="@style/TextActionStyle" /> diff --git a/res/values/strings.xml b/res/values/strings.xml index 38b33bd7c..eec9b0ca7 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -808,8 +808,8 @@ <!-- Shown as a prompt to turn on the phone permission to show voicemails --> <string name="permission_no_voicemail">To access your voicemail,\n turn on the Phone permission.</string> - <!-- Shown as a prompt to turn on contacts and location permissions to allow contact and nearby places search --> - <string name="permission_no_search">To search your contacts and nearby locations, turn on the Contacts and Location permissions.</string> + <!-- Shown as a prompt to turn on contacts permissions to allow contact search --> + <string name="permission_no_search">To search your contacts, turn on the Contacts permissions.</string> <!-- Shown as a prompt to turn on the phone permission to allow a call to be placed --> <string name="permission_place_call">To place a call,\n turn on the Phone permission.</string> diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java index 85197a530..98f34b57d 100644 --- a/src/com/android/dialer/DialtactsActivity.java +++ b/src/com/android/dialer/DialtactsActivity.java @@ -103,6 +103,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O DialpadFragment.OnDialpadQueryChangedListener, OnListFragmentScrolledListener, CallLogFragment.HostInterface, + DialpadFragment.HostInterface, ListsFragment.HostInterface, SpeedDialFragment.HostInterface, SearchFragment.HostInterface, @@ -486,8 +487,6 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O } }); - setupActivityOverlay(); - Trace.endSection(); Trace.beginSection(TAG + " initialize smart dialing"); @@ -497,19 +496,6 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O Trace.endSection(); } - private void setupActivityOverlay() { - final View activityOverlay = findViewById(R.id.activity_overlay); - activityOverlay.setOnTouchListener(new OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - if (!mIsDialpadShown) { - maybeExitSearchUi(); - } - return false; - } - }); - } - @Override protected void onResume() { Trace.beginSection(TAG + " onResume"); @@ -1147,7 +1133,16 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O } catch (Exception ignored) { // Skip any exceptions for this piece of code } + } + @Override + public boolean onDialpadSpacerTouchWithEmptyQuery() { + if (mInDialpadSearch && mSmartDialSearchFragment != null + && !mSmartDialSearchFragment.isShowingPermissionRequest()) { + hideDialpadFragment(true /* animate */, true /* clearDialpad */); + return true; + } + return false; } @Override diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java index d1a9827eb..59e2c7f38 100644 --- a/src/com/android/dialer/calllog/CallLogFragment.java +++ b/src/com/android/dialer/calllog/CallLogFragment.java @@ -486,7 +486,7 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis } @Override - public void onEmptyViewActionButtonClicked(String[] permissions) { + public void onEmptyViewActionButtonClicked() { final Activity activity = getActivity(); if (activity == null) { return; diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java index b18069fdd..d35abd75b 100644 --- a/src/com/android/dialer/dialpad/DialpadFragment.java +++ b/src/com/android/dialer/dialpad/DialpadFragment.java @@ -135,6 +135,15 @@ public class DialpadFragment extends Fragment void onDialpadQueryChanged(String query); } + public interface HostInterface { + /** + * Notifies the parent activity that the space above the dialpad has been tapped with + * no query in the dialpad present. In most situations this will cause the dialpad to + * be dismissed, unless there happens to be content showing. + */ + boolean onDialpadSpacerTouchWithEmptyQuery(); + } + private static final boolean DEBUG = DialtactsActivity.DEBUG; // This is the amount of screen the dialpad fragment takes up when fully displayed @@ -385,7 +394,9 @@ public class DialpadFragment extends Fragment @Override public boolean onTouch(View v, MotionEvent event) { if (isDigitsEmpty()) { - hideAndClearDialpad(true); + if (getActivity() != null) { + return ((HostInterface) getActivity()).onDialpadSpacerTouchWithEmptyQuery(); + } return true; } return false; diff --git a/src/com/android/dialer/list/AllContactsFragment.java b/src/com/android/dialer/list/AllContactsFragment.java index 19d8a438a..0de84347e 100644 --- a/src/com/android/dialer/list/AllContactsFragment.java +++ b/src/com/android/dialer/list/AllContactsFragment.java @@ -133,7 +133,7 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi } @Override - public void onEmptyViewActionButtonClicked(String[] permissions) { + public void onEmptyViewActionButtonClicked() { final Activity activity = getActivity(); if (activity == null) { return; diff --git a/src/com/android/dialer/list/RegularSearchFragment.java b/src/com/android/dialer/list/RegularSearchFragment.java index 19c7321a1..b7e26d690 100644 --- a/src/com/android/dialer/list/RegularSearchFragment.java +++ b/src/com/android/dialer/list/RegularSearchFragment.java @@ -15,16 +15,29 @@ */ package com.android.dialer.list; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.Manifest.permission.READ_CONTACTS; + +import android.app.Activity; +import android.content.pm.PackageManager; import android.view.LayoutInflater; import android.view.ViewGroup; import com.android.contacts.common.list.ContactEntryListAdapter; import com.android.contacts.common.list.PinnedHeaderListView; +import com.android.contacts.common.util.PermissionsUtil; import com.android.contacts.commonbind.analytics.AnalyticsUtil; import com.android.dialerbind.ObjectFactory; + +import com.android.dialer.R; import com.android.dialer.service.CachedNumberLookupService; +import com.android.dialer.widget.EmptyContentView; +import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; -public class RegularSearchFragment extends SearchFragment { +public class RegularSearchFragment extends SearchFragment + implements OnEmptyViewActionButtonClickedListener { + + private static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1; private static final int SEARCH_DIRECTORY_RESULT_LIMIT = 5; @@ -68,4 +81,38 @@ public class RegularSearchFragment extends SearchFragment { adapter.getContactInfo(mCachedNumberLookupService, position)); } } + + @Override + protected void setupEmptyView() { + if (mEmptyView != null && getActivity() != null) { + if (!PermissionsUtil.hasPermission(getActivity(), READ_CONTACTS)) { + mEmptyView.setImage(R.drawable.empty_contacts); + mEmptyView.setActionLabel(R.string.permission_single_turn_on); + mEmptyView.setDescription(R.string.permission_no_search); + mEmptyView.setActionClickedListener(this); + } else { + mEmptyView.setImage(EmptyContentView.NO_IMAGE); + mEmptyView.setActionLabel(EmptyContentView.NO_LABEL); + mEmptyView.setDescription(EmptyContentView.NO_LABEL); + } + } + } + + @Override + public void onEmptyViewActionButtonClicked() { + final Activity activity = getActivity(); + if (activity == null) { + return; + } + + requestPermissions(new String[] {READ_CONTACTS}, READ_CONTACTS_PERMISSION_REQUEST_CODE); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + if (requestCode == READ_CONTACTS_PERMISSION_REQUEST_CODE) { + setupEmptyView(); + } + } } diff --git a/src/com/android/dialer/list/SearchFragment.java b/src/com/android/dialer/list/SearchFragment.java index 77ab29198..315cfb914 100644 --- a/src/com/android/dialer/list/SearchFragment.java +++ b/src/com/android/dialer/list/SearchFragment.java @@ -15,6 +15,8 @@ */ package com.android.dialer.list; +import static android.Manifest.permission.READ_CONTACTS; + import android.animation.Animator; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; @@ -50,6 +52,7 @@ import com.android.dialer.dialpad.DialpadFragment.ErrorDialogFragment; 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.phone.common.animation.AnimUtils; public class SearchFragment extends PhoneNumberPickerFragment { @@ -79,6 +82,8 @@ public class SearchFragment extends PhoneNumberPickerFragment { private HostInterface mActivity; + protected EmptyContentView mEmptyView; + public interface HostInterface { public boolean isActionBarShowing(); public boolean isDialpadShown(); @@ -125,6 +130,13 @@ public class SearchFragment extends PhoneNumberPickerFragment { final ListView listView = getListView(); + if (mEmptyView == null) { + mEmptyView = new EmptyContentView(getActivity()); + ((ViewGroup) getListView().getParent()).addView(mEmptyView); + getListView().setEmptyView(mEmptyView); + setupEmptyView(); + } + listView.setBackgroundColor(res.getColor(R.color.background_dialer_results)); listView.setClipToPadding(false); setVisibleScrollbarEnabled(false); @@ -341,7 +353,7 @@ public class SearchFragment extends PhoneNumberPickerFragment { @Override protected void startLoading() { - if (PermissionsUtil.hasContactsPermissions(getActivity())) { + if (PermissionsUtil.hasPermission(getActivity(), READ_CONTACTS)) { super.startLoading(); } else if (TextUtils.isEmpty(getQueryString())) { // Clear out any existing call shortcuts. @@ -354,6 +366,8 @@ public class SearchFragment extends PhoneNumberPickerFragment { // list. getAdapter().notifyDataSetChanged(); } + + setupEmptyView(); } public void setOnTouchListener(View.OnTouchListener onTouchListener) { @@ -371,4 +385,6 @@ public class SearchFragment extends PhoneNumberPickerFragment { } return parent; } + + protected void setupEmptyView() {} } diff --git a/src/com/android/dialer/list/SmartDialSearchFragment.java b/src/com/android/dialer/list/SmartDialSearchFragment.java index 082bc4360..72d3abf68 100644 --- a/src/com/android/dialer/list/SmartDialSearchFragment.java +++ b/src/com/android/dialer/list/SmartDialSearchFragment.java @@ -15,21 +15,33 @@ */ package com.android.dialer.list; +import static android.Manifest.permission.CALL_PHONE; + +import android.app.Activity; import android.content.Loader; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.util.Log; +import android.view.View; import com.android.contacts.common.list.ContactEntryListAdapter; +import com.android.contacts.common.util.PermissionsUtil; import com.android.dialer.dialpad.SmartDialCursorLoader; +import com.android.dialer.R; +import com.android.dialer.widget.EmptyContentView; + +import java.util.ArrayList; /** * Implements a fragment to load and display SmartDial search results. */ -public class SmartDialSearchFragment extends SearchFragment { +public class SmartDialSearchFragment extends SearchFragment + implements EmptyContentView.OnEmptyViewActionButtonClickedListener { private static final String TAG = SmartDialSearchFragment.class.getSimpleName(); + private static final int CALL_PHONE_PERMISSION_REQUEST_CODE = 1; + /** * Creates a SmartDialListAdapter to display and operate on search results. */ @@ -69,4 +81,42 @@ public class SmartDialSearchFragment extends SearchFragment { final SmartDialNumberListAdapter adapter = (SmartDialNumberListAdapter) getAdapter(); return adapter.getDataUri(position); } + + @Override + protected void setupEmptyView() { + if (mEmptyView != null && getActivity() != null) { + if (!PermissionsUtil.hasPermission(getActivity(), CALL_PHONE)) { + mEmptyView.setImage(R.drawable.empty_contacts); + mEmptyView.setActionLabel(R.string.permission_single_turn_on); + mEmptyView.setDescription(R.string.permission_place_call); + mEmptyView.setActionClickedListener(this); + } else { + mEmptyView.setImage(EmptyContentView.NO_IMAGE); + mEmptyView.setActionLabel(EmptyContentView.NO_LABEL); + mEmptyView.setDescription(EmptyContentView.NO_LABEL); + } + } + } + + @Override + public void onEmptyViewActionButtonClicked() { + final Activity activity = getActivity(); + if (activity == null) { + return; + } + + requestPermissions(new String[] {CALL_PHONE}, CALL_PHONE_PERMISSION_REQUEST_CODE); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + if (requestCode == CALL_PHONE_PERMISSION_REQUEST_CODE) { + setupEmptyView(); + } + } + + public boolean isShowingPermissionRequest() { + return mEmptyView != null && mEmptyView.isShowingContent(); + } } diff --git a/src/com/android/dialer/list/SpeedDialFragment.java b/src/com/android/dialer/list/SpeedDialFragment.java index aead1c81b..ebfc72da0 100644 --- a/src/com/android/dialer/list/SpeedDialFragment.java +++ b/src/com/android/dialer/list/SpeedDialFragment.java @@ -463,7 +463,7 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener, } @Override - public void onEmptyViewActionButtonClicked(String[] permissions) { + public void onEmptyViewActionButtonClicked() { final Activity activity = getActivity(); if (activity == null) { return; diff --git a/src/com/android/dialer/widget/EmptyContentView.java b/src/com/android/dialer/widget/EmptyContentView.java index 67c9ce15f..2f5e0d9d7 100644 --- a/src/com/android/dialer/widget/EmptyContentView.java +++ b/src/com/android/dialer/widget/EmptyContentView.java @@ -18,6 +18,7 @@ package com.android.dialer.widget; import android.content.Context; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; @@ -29,15 +30,15 @@ import com.android.dialer.R; public class EmptyContentView extends LinearLayout implements View.OnClickListener { public static final int NO_LABEL = 0; + public static final int NO_IMAGE = 0; private ImageView mImageView; private TextView mDescriptionView; private TextView mActionView; - private String[] mPermissions = new String[] {}; private OnEmptyViewActionButtonClickedListener mOnActionButtonClickedListener; public interface OnEmptyViewActionButtonClickedListener { - public void onEmptyViewActionButtonClicked(String[] permissions); + public void onEmptyViewActionButtonClicked(); } public EmptyContentView(Context context) { @@ -60,11 +61,6 @@ public class EmptyContentView extends LinearLayout implements View.OnClickListen final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.empty_content_view, this); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); mImageView = (ImageView) findViewById(R.id.emptyListViewImage); mDescriptionView = (TextView) findViewById(R.id.emptyListViewMessage); mActionView = (TextView) findViewById(R.id.emptyListViewAction); @@ -72,11 +68,22 @@ public class EmptyContentView extends LinearLayout implements View.OnClickListen } public void setDescription(int resourceId) { - mDescriptionView.setText(resourceId); + if (resourceId == NO_LABEL) { + mDescriptionView.setText(null); + mDescriptionView.setVisibility(View.GONE); + } else { + mDescriptionView.setText(resourceId); + mDescriptionView.setVisibility(View.VISIBLE); + } } public void setImage(int resourceId) { mImageView.setImageResource(resourceId); + if (resourceId == NO_LABEL) { + mImageView.setVisibility(View.GONE); + } else { + mImageView.setVisibility(View.VISIBLE); + } } public void setActionLabel(int resourceId) { @@ -89,6 +96,12 @@ public class EmptyContentView extends LinearLayout implements View.OnClickListen } } + public boolean isShowingContent() { + return mImageView.getVisibility() == View.VISIBLE + || mDescriptionView.getVisibility() == View.VISIBLE + || mActionView.getVisibility() == View.VISIBLE; + } + public void setActionClickedListener(OnEmptyViewActionButtonClickedListener listener) { mOnActionButtonClickedListener = listener; } @@ -96,7 +109,7 @@ public class EmptyContentView extends LinearLayout implements View.OnClickListen @Override public void onClick(View v) { if (mOnActionButtonClickedListener != null) { - mOnActionButtonClickedListener.onEmptyViewActionButtonClicked(mPermissions); + mOnActionButtonClickedListener.onEmptyViewActionButtonClicked(); } } } |