Loading res/drawable/ic_history_24dp.xml 0 → 100644 +26 −0 Original line number Diff line number Diff line <?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 res/layout/quickcontact_content.xml +6 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,12 @@ android:visibility="gone" cardview:cardCornerRadius="@dimen/expanding_entry_card_card_corner_radius" /> <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" Loading res/values/strings.xml +17 −1 Original line number Diff line number Diff line Loading @@ -923,4 +923,20 @@ <!-- Menu section title of "accounts" [CHAR LIMIT=20] --> <string name="menu_title_filters">Accounts</string> <!-- 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 src/com/android/contacts/quickcontact/ExpandingEntryCardView.java +13 −0 Original line number Diff line number Diff line Loading @@ -638,6 +638,19 @@ public class ExpandingEntryCardView extends CardView { } } 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. Loading src/com/android/contacts/quickcontact/QuickContactActivity.java +95 −2 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import android.provider.ContactsContract.DataUsageFeedback; 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; Loading Loading @@ -148,6 +149,7 @@ import com.android.contacts.common.util.ImplicitIntentsUtil; 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; Loading Loading @@ -259,6 +261,7 @@ public class QuickContactActivity extends ContactsActivity private ExpandingEntryCardView mNoContactDetailsCard; private ExpandingEntryCardView mRecentCard; private ExpandingEntryCardView mAboutCard; private ExpandingEntryCardView mPermissionExplanationCard; // Suggestion card. private CardView mCollapsedSuggestionCardView; Loading @@ -276,6 +279,10 @@ public class QuickContactActivity extends ContactsActivity 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; Loading Loading @@ -363,6 +370,7 @@ public class QuickContactActivity extends ContactsActivity 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 = Loading Loading @@ -399,6 +407,13 @@ public class QuickContactActivity extends ContactsActivity 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()) { Loading Loading @@ -926,11 +941,43 @@ public class QuickContactActivity extends ContactsActivity 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); Loading @@ -955,6 +1002,8 @@ public class QuickContactActivity extends ContactsActivity 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); Loading Loading @@ -1006,6 +1055,7 @@ public class QuickContactActivity extends ContactsActivity } }); mPermissionExplanationCard.setOnClickListener(mEntryClickHandler); mNoContactDetailsCard.setOnClickListener(mEntryClickHandler); mContactCard.setOnClickListener(mEntryClickHandler); mContactCard.setExpandButtonText( Loading Loading @@ -2611,6 +2661,49 @@ public class QuickContactActivity extends ContactsActivity mRecentCard.setVisibility(View.VISIBLE); } 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 Loading Loading
res/drawable/ic_history_24dp.xml 0 → 100644 +26 −0 Original line number Diff line number Diff line <?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
res/layout/quickcontact_content.xml +6 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,12 @@ android:visibility="gone" cardview:cardCornerRadius="@dimen/expanding_entry_card_card_corner_radius" /> <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" Loading
res/values/strings.xml +17 −1 Original line number Diff line number Diff line Loading @@ -923,4 +923,20 @@ <!-- Menu section title of "accounts" [CHAR LIMIT=20] --> <string name="menu_title_filters">Accounts</string> <!-- 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
src/com/android/contacts/quickcontact/ExpandingEntryCardView.java +13 −0 Original line number Diff line number Diff line Loading @@ -638,6 +638,19 @@ public class ExpandingEntryCardView extends CardView { } } 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. Loading
src/com/android/contacts/quickcontact/QuickContactActivity.java +95 −2 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import android.provider.ContactsContract.DataUsageFeedback; 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; Loading Loading @@ -148,6 +149,7 @@ import com.android.contacts.common.util.ImplicitIntentsUtil; 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; Loading Loading @@ -259,6 +261,7 @@ public class QuickContactActivity extends ContactsActivity private ExpandingEntryCardView mNoContactDetailsCard; private ExpandingEntryCardView mRecentCard; private ExpandingEntryCardView mAboutCard; private ExpandingEntryCardView mPermissionExplanationCard; // Suggestion card. private CardView mCollapsedSuggestionCardView; Loading @@ -276,6 +279,10 @@ public class QuickContactActivity extends ContactsActivity 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; Loading Loading @@ -363,6 +370,7 @@ public class QuickContactActivity extends ContactsActivity 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 = Loading Loading @@ -399,6 +407,13 @@ public class QuickContactActivity extends ContactsActivity 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()) { Loading Loading @@ -926,11 +941,43 @@ public class QuickContactActivity extends ContactsActivity 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); Loading @@ -955,6 +1002,8 @@ public class QuickContactActivity extends ContactsActivity 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); Loading Loading @@ -1006,6 +1055,7 @@ public class QuickContactActivity extends ContactsActivity } }); mPermissionExplanationCard.setOnClickListener(mEntryClickHandler); mNoContactDetailsCard.setOnClickListener(mEntryClickHandler); mContactCard.setOnClickListener(mEntryClickHandler); mContactCard.setExpandButtonText( Loading Loading @@ -2611,6 +2661,49 @@ public class QuickContactActivity extends ContactsActivity mRecentCard.setVisibility(View.VISIBLE); } 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 Loading