Merge "Add list event clearcut logging (1/3)"
diff --git a/res/drawable/ic_history_24dp.xml b/res/drawable/ic_history_24dp.xml
new file mode 100644
index 0000000..1db190e
--- /dev/null
+++ b/res/drawable/ic_history_24dp.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+
+<!-- History icon -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/>
+</vector>
\ No newline at end of file
diff --git a/res/layout/quickcontact_content.xml b/res/layout/quickcontact_content.xml
index a6a8abb..b6cff4b 100644
--- a/res/layout/quickcontact_content.xml
+++ b/res/layout/quickcontact_content.xml
@@ -50,6 +50,12 @@
<com.android.contacts.quickcontact.ExpandingEntryCardView
style="@style/ExpandingEntryCardStyle"
+ android:id="@+id/permission_explanation_card"
+ android:visibility="gone"
+ cardview:cardCornerRadius="@dimen/expanding_entry_card_card_corner_radius"/>
+
+ <com.android.contacts.quickcontact.ExpandingEntryCardView
+ style="@style/ExpandingEntryCardStyle"
android:id="@+id/about_card"
android:visibility="gone"
cardview:cardCornerRadius="@dimen/expanding_entry_card_card_corner_radius" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6f5b122..8e7fdfd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -923,4 +923,20 @@
<!-- Menu section title of "accounts" [CHAR LIMIT=20] -->
<string name="menu_title_filters">Accounts</string>
-</resources>
+
+ <!-- Contacts app asking for permissions in QuickContact activity,
+ in order to display calendar and SMS history [CHAR LIMIT=60] -->
+ <string name="permission_explanation_header">See your history together</string>
+
+ <!-- Content displayed in QuickContact activity after Contacts app receiving
+ Calendar and SMS permissions [CHAR LIMIT=60] -->
+ <string name="permission_explanation_subheader_calendar_and_SMS">Events and Messages</string>
+
+ <!-- Content displayed in QuickContact activity after Contacts app receiving
+ Calendar permission [CHAR LIMIT=40] -->
+ <string name="permission_explanation_subheader_calendar">Events</string>
+
+ <!-- Content displayed in QuickContact activity after Contacts app receiving
+ SMS permission [CHAR LIMIT=40] -->
+ <string name="permission_explanation_subheader_SMS">Messages</string>
+</resources>
\ No newline at end of file
diff --git a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
index 762ff6c..db6d80a 100644
--- a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
+++ b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
@@ -638,6 +638,19 @@
}
}
+ public void setEntrySubHeaderColor(int color) {
+ if (mEntries != null) {
+ for (List<View> entryList : mEntryViews) {
+ for (View entryView : entryList) {
+ final TextView subHeader = (TextView) entryView.findViewById(R.id.sub_header);
+ if (subHeader != null) {
+ subHeader.setTextColor(color);
+ }
+ }
+ }
+ }
+ }
+
/**
* The ColorFilter is passed in along with the color so that a new one only needs to be created
* once for the entire activity.
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 7942eec..78de21e 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -69,6 +69,7 @@
import android.provider.ContactsContract.Intents;
import android.provider.ContactsContract.QuickContact;
import android.provider.ContactsContract.RawContacts;
+import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.CardView;
@@ -148,6 +149,7 @@
import com.android.contacts.common.util.DateUtils;
import com.android.contacts.common.util.MaterialColorMapUtils;
import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.common.util.UriUtils;
import com.android.contacts.common.util.ViewUtil;
import com.android.contacts.detail.ContactDisplayUtils;
@@ -259,6 +261,7 @@
private ExpandingEntryCardView mNoContactDetailsCard;
private ExpandingEntryCardView mRecentCard;
private ExpandingEntryCardView mAboutCard;
+ private ExpandingEntryCardView mPermissionExplanationCard;
// Suggestion card.
private CardView mCollapsedSuggestionCardView;
@@ -276,6 +279,10 @@
private boolean mSuggestionsShouldAutoSelected = true;
private long mPreviousContactId = 0;
+ // Permission explanation card.
+ private boolean mShouldShowPermissionExplanation = false;
+ private String mPermissionExplanationCardSubHeader = "";
+
private MultiShrinkScroller mScroller;
private SelectAccountDialogFragmentListener mSelectAccountFragmentListener;
private AsyncTask<Void, Void, Cp2DataCardModel> mEntriesAndActionsTask;
@@ -363,6 +370,7 @@
private static final int MIN_NUM_CONTACT_ENTRIES_SHOWN = 3;
private static final int MIN_NUM_COLLAPSED_RECENT_ENTRIES_SHOWN = 3;
private static final int CARD_ENTRY_ID_EDIT_CONTACT = -2;
+ private static final int CARD_ENTRY_ID_REQUEST_PERMISSION = -3;
private static final String KEY_LOADER_EXTRA_PHONES =
QuickContactActivity.class.getCanonicalName() + ".KEY_LOADER_EXTRA_PHONES";
private static final String KEY_LOADER_EXTRA_SIP_NUMBERS =
@@ -399,6 +407,13 @@
return;
}
+ if (dataId == CARD_ENTRY_ID_REQUEST_PERMISSION) {
+ finish();
+ RequestDesiredPermissionsActivity.startPermissionActivity(
+ QuickContactActivity.this);
+ return;
+ }
+
// Pass the touch point through the intent for use in the InCallUI
if (Intent.ACTION_CALL.equals(intent.getAction())) {
if (TouchPointManager.getInstance().hasValidPoint()) {
@@ -926,11 +941,43 @@
Trace.beginSection("onCreate()");
super.onCreate(savedInstanceState);
- if (RequestPermissionsActivity.startPermissionActivity(this) ||
- RequestDesiredPermissionsActivity.startPermissionActivity(this)) {
+ if (RequestPermissionsActivity.startPermissionActivity(this)) {
return;
}
+ // There're 3 states for each permission:
+ // 1. App doesn't have permission, not asked user yet.
+ // 2. App doesn't have permission, user denied it previously.
+ // 3. App has permission.
+ // Permission explanation card is displayed only for case 1.
+ final boolean hasCalendarPermission = PermissionsUtil.hasPermission(
+ this, RequestDesiredPermissionsActivity.DESIRED_PERMISSIONS[0]);
+ final boolean hasSMSPermission = PermissionsUtil.hasPermission(
+ this, RequestDesiredPermissionsActivity.DESIRED_PERMISSIONS[1]);
+
+ final boolean wasCalendarPermissionDenied =
+ ActivityCompat.shouldShowRequestPermissionRationale(
+ this, RequestDesiredPermissionsActivity.DESIRED_PERMISSIONS[0]);
+ final boolean wasSMSPermissionDenied =
+ ActivityCompat.shouldShowRequestPermissionRationale(
+ this, RequestDesiredPermissionsActivity.DESIRED_PERMISSIONS[1]);
+
+ final boolean shouldDisplayCalendarMessage =
+ !hasCalendarPermission && !wasCalendarPermissionDenied;
+ final boolean shouldDisplaySMSMessage = !hasSMSPermission && !wasSMSPermissionDenied;
+ mShouldShowPermissionExplanation = shouldDisplayCalendarMessage || shouldDisplaySMSMessage;
+
+ if (shouldDisplayCalendarMessage && shouldDisplaySMSMessage) {
+ mPermissionExplanationCardSubHeader =
+ getString(R.string.permission_explanation_subheader_calendar_and_SMS);
+ } else if (shouldDisplayCalendarMessage) {
+ mPermissionExplanationCardSubHeader =
+ getString(R.string.permission_explanation_subheader_calendar);
+ } else if (shouldDisplaySMSMessage) {
+ mPermissionExplanationCardSubHeader =
+ getString(R.string.permission_explanation_subheader_SMS);
+ }
+
final int previousScreenType = getIntent().getIntExtra
(EXTRA_PREVIOUS_SCREEN_TYPE, ScreenType.UNKNOWN);
Logger.logScreenView(this, ScreenType.QUICK_CONTACT, previousScreenType);
@@ -955,6 +1002,8 @@
mNoContactDetailsCard = (ExpandingEntryCardView) findViewById(R.id.no_contact_data_card);
mRecentCard = (ExpandingEntryCardView) findViewById(R.id.recent_card);
mAboutCard = (ExpandingEntryCardView) findViewById(R.id.about_card);
+ mPermissionExplanationCard =
+ (ExpandingEntryCardView) findViewById(R.id.permission_explanation_card);
mCollapsedSuggestionCardView = (CardView) findViewById(R.id.collapsed_suggestion_card);
mExpandSuggestionCardView = (CardView) findViewById(R.id.expand_suggestion_card);
@@ -1006,6 +1055,7 @@
}
});
+ mPermissionExplanationCard.setOnClickListener(mEntryClickHandler);
mNoContactDetailsCard.setOnClickListener(mEntryClickHandler);
mContactCard.setOnClickListener(mEntryClickHandler);
mContactCard.setExpandButtonText(
@@ -2612,6 +2662,49 @@
}
Trace.endSection();
+ Trace.beginSection("initialize permission explanation card");
+
+ final Drawable historyIcon = getResources().getDrawable(
+ R.drawable.ic_history_24dp).mutate();
+ final Entry permissionExplanationEntry = new Entry(CARD_ENTRY_ID_REQUEST_PERMISSION,
+ historyIcon, getString(R.string.permission_explanation_header),
+ mPermissionExplanationCardSubHeader, /* subHeaderIcon = */ null,
+ /* text = */ null, /* textIcon = */ null,
+ /* primaryContentDescription = */ null, getIntent(),
+ /* alternateIcon = */ null, /* alternateIntent = */ null,
+ /* alternateContentDescription = */ null, /* shouldApplyColor = */ true,
+ /* isEditable = */ false, /* EntryContextMenuInfo = */ null,
+ /* thirdIcon = */ null, /* thirdIntent = */ null,
+ /* thirdContentDescription = */ null, /* thirdAction = */ Entry.ACTION_NONE,
+ /* thirdExtras = */ null, R.drawable.ic_history_24dp);
+
+ final List<List<Entry>> permissionExplanationEntries = new ArrayList<>();
+ permissionExplanationEntries.add(new ArrayList<Entry>());
+ permissionExplanationEntries.get(0).add(permissionExplanationEntry);
+
+ final int subHeaderTextColor = getResources().getColor(android.R.color.white);
+ final PorterDuffColorFilter whiteColorFilter =
+ new PorterDuffColorFilter(subHeaderTextColor, PorterDuff.Mode.SRC_ATOP);
+
+ mPermissionExplanationCard.initialize(permissionExplanationEntries,
+ /* numInitialVisibleEntries = */ 1,
+ /* isExpanded = */ true,
+ /* isAlwaysExpanded = */ true,
+ /* listener = */ null,
+ mScroller);
+
+ mPermissionExplanationCard.setColorAndFilter(subHeaderTextColor, whiteColorFilter);
+ mPermissionExplanationCard.setBackgroundColor(mColorFilterColor);
+ mPermissionExplanationCard.setEntryHeaderColor(subHeaderTextColor);
+ mPermissionExplanationCard.setEntrySubHeaderColor(subHeaderTextColor);
+
+ if (mShouldShowPermissionExplanation) {
+ mPermissionExplanationCard.setVisibility(View.VISIBLE);
+ } else {
+ mPermissionExplanationCard.setVisibility(View.GONE);
+ }
+
+ Trace.endSection();
// About card is initialized along with the contact card, but since it appears after
// the recent card in the UI, we hold off until making it visible until the recent