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