Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dbb45858 authored by Sean Liu's avatar Sean Liu Committed by Android (Google) Code Review
Browse files

Merge "Displaying pre-approval screen to explain why app asking for permissions"

parents 3822d54b 04a1936c
Loading
Loading
Loading
Loading
+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
+6 −0
Original line number Diff line number Diff line
@@ -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"
+17 −1
Original line number Diff line number Diff line
@@ -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
+13 −0
Original line number Diff line number Diff line
@@ -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.
+95 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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 =
@@ -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()) {
@@ -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);
@@ -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);
@@ -1006,6 +1055,7 @@ public class QuickContactActivity extends ContactsActivity
            }
        });

        mPermissionExplanationCard.setOnClickListener(mEntryClickHandler);
        mNoContactDetailsCard.setOnClickListener(mEntryClickHandler);
        mContactCard.setOnClickListener(mEntryClickHandler);
        mContactCard.setExpandButtonText(
@@ -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