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

Commit efe804a5 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 5681426 from ca55f275 to qt-release

Change-Id: I324742a39aed80379a3b94ac683a3eb0f94bcc0c
parents c74f3ae3 ca55f275
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -39,8 +39,6 @@
    <uses-permission android:name="android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
    <uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" />
    <!-- This permission will be removed in R. -->
    <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />

    <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" />

+6 −0
Original line number Diff line number Diff line
@@ -16,10 +16,16 @@

<resources>

    <!-- TODO(evanseverson) rename this overlayable -->
    <overlayable name="PermissionControllerStyles">

        <policy type="product|system|vendor">

            <!-- START HELP LINKS -->
            <item type="string" name="help_app_permissions" />
            <item type="string" name="help_permission_usage" />
            <!-- END HELP LINKS -->

            <!-- START PERMISSION GRANT DIALOG -->
            <item type="style" name="PermissionGrantScrollView" />
            <item type="style" name="PermissionGrantSingleton" />
+37 −7
Original line number Diff line number Diff line
@@ -48,6 +48,10 @@ import static com.android.packageinstaller.Constants.LOCATION_ACCESS_CHECK_NOTIF
import static com.android.packageinstaller.Constants.PERIODIC_LOCATION_ACCESS_CHECK_JOB_ID;
import static com.android.packageinstaller.Constants.PERMISSION_REMINDER_CHANNEL_ID;
import static com.android.packageinstaller.Constants.PREFERENCES_FILE;
import static com.android.packageinstaller.PermissionControllerStatsLog.LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION;
import static com.android.packageinstaller.PermissionControllerStatsLog.LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_CLICKED;
import static com.android.packageinstaller.PermissionControllerStatsLog.LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_DECLINED;
import static com.android.packageinstaller.PermissionControllerStatsLog.LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_PRESENTED;
import static com.android.packageinstaller.permission.utils.Utils.OS_PKG;
import static com.android.packageinstaller.permission.utils.Utils.getParcelableExtraSafe;
import static com.android.packageinstaller.permission.utils.Utils.getParentUserContext;
@@ -96,6 +100,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import androidx.core.util.Preconditions;

import com.android.packageinstaller.PermissionControllerStatsLog;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.ui.AppPermissionActivity;
import com.android.permissioncontroller.R;
@@ -513,21 +518,23 @@ public class LocationAccessCheck {
        NotificationManager notificationManager = getSystemServiceSafe(mContext,
                NotificationManager.class, user);

        Intent deleteIntent = new Intent(mContext, NotificationDeleteHandler.class);
        deleteIntent.putExtra(EXTRA_PACKAGE_NAME, pkgName);
        deleteIntent.putExtra(EXTRA_USER, user);
        deleteIntent.setFlags(FLAG_RECEIVER_FOREGROUND);

        long sessionId = INVALID_SESSION_ID;

        while (sessionId == INVALID_SESSION_ID) {
            sessionId = new Random().nextLong();
        }

        Intent deleteIntent = new Intent(mContext, NotificationDeleteHandler.class);
        deleteIntent.putExtra(EXTRA_PACKAGE_NAME, pkgName);
        deleteIntent.putExtra(EXTRA_SESSION_ID, sessionId);
        deleteIntent.putExtra(EXTRA_UID, pkg.applicationInfo.uid);
        deleteIntent.putExtra(EXTRA_USER, user);
        deleteIntent.setFlags(FLAG_RECEIVER_FOREGROUND);

        Intent clickIntent = new Intent(mContext, NotificationClickHandler.class);
        clickIntent.putExtra(EXTRA_PACKAGE_NAME, pkgName);
        clickIntent.putExtra(EXTRA_USER, user);
        clickIntent.putExtra(EXTRA_SESSION_ID, sessionId);
        clickIntent.putExtra(EXTRA_UID, pkg.applicationInfo.uid);
        clickIntent.putExtra(EXTRA_USER, user);
        clickIntent.setFlags(FLAG_RECEIVER_FOREGROUND);

        CharSequence appName = getNotificationAppName();
@@ -559,6 +566,12 @@ public class LocationAccessCheck {

        if (DEBUG) Log.i(LOG_TAG, "Notified " + pkgName);

        PermissionControllerStatsLog.write(LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION, sessionId,
                pkg.applicationInfo.uid, pkgName,
                LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_PRESENTED);
        Log.v(LOG_TAG, "Location access check notification shown with sessionId=" + sessionId + ""
                + " uid=" + pkg.applicationInfo.uid + " pkgName=" + pkgName);

        mSharedPrefs.edit().putLong(KEY_LAST_LOCATION_ACCESS_NOTIFICATION_SHOWN,
                currentTimeMillis()).apply();
    }
@@ -809,6 +822,15 @@ public class LocationAccessCheck {
        public void onReceive(Context context, Intent intent) {
            String pkg = getStringExtraSafe(intent, EXTRA_PACKAGE_NAME);
            UserHandle user = getParcelableExtraSafe(intent, EXTRA_USER);
            long sessionId = intent.getLongExtra(EXTRA_SESSION_ID, INVALID_SESSION_ID);
            int uid = intent.getIntExtra(EXTRA_UID, 0);

            PermissionControllerStatsLog.write(LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION, sessionId,
                    uid, pkg,
                    LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_DECLINED);
            Log.v(LOG_TAG,
                    "Location access check notification declined with sessionId=" + sessionId + ""
                            + " uid=" + uid + " pkgName=" + pkg);

            new LocationAccessCheck(context, null).markAsNotified(pkg, user);
        }
@@ -822,10 +844,18 @@ public class LocationAccessCheck {
        public void onReceive(Context context, Intent intent) {
            String pkg = getStringExtraSafe(intent, EXTRA_PACKAGE_NAME);
            UserHandle user = getParcelableExtraSafe(intent, EXTRA_USER);
            int uid = intent.getIntExtra(EXTRA_UID, 0);
            long sessionId = intent.getLongExtra(EXTRA_SESSION_ID, INVALID_SESSION_ID);

            new LocationAccessCheck(context, null).markAsNotified(pkg, user);

            PermissionControllerStatsLog.write(LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION, sessionId,
                    uid, pkg,
                    LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION__RESULT__NOTIFICATION_CLICKED);
            Log.v(LOG_TAG,
                    "Location access check notification clicked with sessionId=" + sessionId + ""
                            + " uid=" + uid + " pkgName=" + pkg);

            Intent manageAppPermission = new Intent(context, AppPermissionActivity.class);
            manageAppPermission.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK);
            manageAppPermission.putExtra(EXTRA_PERMISSION_NAME, ACCESS_FINE_LOCATION);
+2 −8
Original line number Diff line number Diff line
@@ -84,8 +84,6 @@ class RuntimePermissionsUpgradeController {
        final int appCount = apps.size();

        final boolean sdkUpgradedFromP;
        boolean isFreshInstall = false;

        if (currentVersion <= -1) {
            Log.i(LOG_TAG, "Upgrading from Android P");

@@ -97,10 +95,6 @@ class RuntimePermissionsUpgradeController {
        }

        if (currentVersion == 0) {
            if (!sdkUpgradedFromP) {
                isFreshInstall = true;
            }

            Log.i(LOG_TAG, "Grandfathering SMS and CallLog permissions");

            final List<String> smsPermissions = Utils.getPlatformPermissionNamesOfGroup(
@@ -189,7 +183,7 @@ class RuntimePermissionsUpgradeController {
        }

        if (currentVersion == 6) {
            if (!isFreshInstall || sdkUpgradedFromP) {
            if (sdkUpgradedFromP) {
                Log.i(LOG_TAG, "Expanding location permissions");

                for (int i = 0; i < appCount; i++) {
@@ -211,7 +205,7 @@ class RuntimePermissionsUpgradeController {

                        if (group.areRuntimePermissionsGranted()
                                && bgGroup != null
                                && !bgGroup.isSystemFixed()
                                && !bgGroup.isUserSet() && !bgGroup.isSystemFixed()
                                && !bgGroup.isPolicyFixed()) {
                            bgGroup.grantRuntimePermissions(group.isUserFixed());

+106 −5
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@

package com.android.packageinstaller.permission.ui.handheld;

import static com.android.packageinstaller.Constants.EXTRA_SESSION_ID;
import static com.android.packageinstaller.Constants.INVALID_SESSION_ID;
import static com.android.packageinstaller.PermissionControllerStatsLog.APP_PERMISSION_FRAGMENT_ACTION_REPORTED;
import static com.android.packageinstaller.PermissionControllerStatsLog.APP_PERMISSION_FRAGMENT_VIEWED;

import static java.lang.annotation.RetentionPolicy.SOURCE;

import android.app.ActionBar;
@@ -51,7 +56,7 @@ import androidx.core.widget.NestedScrollView;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;

import com.android.packageinstaller.Constants;
import com.android.packageinstaller.PermissionControllerStatsLog;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.Permission;
import com.android.packageinstaller.permission.ui.AppPermissionActivity;
@@ -65,7 +70,9 @@ import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.widget.ActionBarShadowController;

import java.lang.annotation.Retention;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * Show and manage a single permission group for an app.
@@ -123,7 +130,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
        }
        arguments.putParcelable(Intent.EXTRA_USER, userHandle);
        arguments.putString(AppPermissionActivity.EXTRA_CALLER_NAME, caller);
        arguments.putLong(Constants.EXTRA_SESSION_ID, sessionId);
        arguments.putLong(EXTRA_SESSION_ID, sessionId);
        fragment.setArguments(arguments);
        return fragment;
    }
@@ -145,6 +152,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
            getActivity().setTitle(
                    getPreferenceManager().getContext().getString(R.string.app_permission_title,
                            mGroup.getFullLabel()));
            logAppPermissionFragmentViewed();
        }
    }

@@ -196,7 +204,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
                context.getString(R.string.app_permission_header, mGroup.getFullLabel()));

        root.requireViewById(R.id.usage_summary).setVisibility(View.GONE);
        long sessionId = getArguments().getLong(Constants.EXTRA_SESSION_ID);
        long sessionId = getArguments().getLong(EXTRA_SESSION_ID);

        TextView footer1Link = root.requireViewById(R.id.footer_link_1);
        footer1Link.setText(context.getString(R.string.app_permission_footer_app_permissions_link,
@@ -205,7 +213,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
            UserHandle user = UserHandle.getUserHandleForUid(mGroup.getApp().applicationInfo.uid);
            Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS);
            intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mGroup.getApp().packageName);
            intent.putExtra(Constants.EXTRA_SESSION_ID, sessionId);
            intent.putExtra(EXTRA_SESSION_ID, sessionId);
            intent.putExtra(Intent.EXTRA_USER, user);
            context.startActivity(intent);
        });
@@ -215,7 +223,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
        footer2Link.setOnClickListener((v) -> {
            Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS);
            intent.putExtra(Intent.EXTRA_PERMISSION_NAME, mGroup.getName());
            intent.putExtra(Constants.EXTRA_SESSION_ID, sessionId);
            intent.putExtra(EXTRA_SESSION_ID, sessionId);
            context.startActivity(intent);
        });

@@ -295,6 +303,15 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
        updateButtons();
    }

    void logAppPermissionFragmentViewed() {
        long sessionId = getArguments().getLong(EXTRA_SESSION_ID, INVALID_SESSION_ID);
        PermissionControllerStatsLog.write(APP_PERMISSION_FRAGMENT_VIEWED, sessionId,
                mGroup.getApp().applicationInfo.uid, mGroup.getApp().packageName, mGroup.getName());
        Log.v(LOG_TAG, "AppPermission fragment viewed with sessionId=" + sessionId + " uid="
                + mGroup.getApp().applicationInfo.uid + " packageName="
                + mGroup.getApp().packageName + " permissionGroupName=" + mGroup.getName());
    }

    @Override
    public void onStop() {
        super.onStop();
@@ -320,6 +337,73 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
        return super.onOptionsItemSelected(item);
    }

    private ArrayList<PermissionState> createPermissionSnapshot() {
        ArrayList<PermissionState> permissionSnapshot = new ArrayList<>();
        ArrayList<Permission> permissions = mGroup.getPermissions();
        int numPermissions = permissions.size();

        for (int i = 0; i < numPermissions; i++) {
            Permission permission = permissions.get(i);
            permissionSnapshot.add(new PermissionState(permission.getName(),
                    permission.isGrantedIncludingAppOp()));
        }

        AppPermissionGroup permissionGroup = mGroup.getBackgroundPermissions();

        if (permissionGroup == null) {
            return permissionSnapshot;
        }

        permissions = mGroup.getPermissions();
        numPermissions = permissions.size();

        for (int i = 0; i < numPermissions; i++) {
            Permission permission = permissions.get(i);
            permissionSnapshot.add(new PermissionState(permission.getName(),
                    permission.isGrantedIncludingAppOp()));
        }

        return permissionSnapshot;
    }

    private void logPermissionChanges(ArrayList<PermissionState> previousPermissionSnapshot) {
        long changeId = new Random().nextLong();
        int numPermissions = previousPermissionSnapshot.size();
        long sessionId = getArguments().getLong(EXTRA_SESSION_ID, INVALID_SESSION_ID);

        for (int i = 0; i < numPermissions; i++) {
            PermissionState permissionState = previousPermissionSnapshot.get(i);
            boolean wasGranted = permissionState.permissionGranted;
            Permission permission = mGroup.getPermission(permissionState.permissionName);

            if (permission == null) {
                if (mGroup.getBackgroundPermissions() == null) {
                    continue;
                }
                permission = mGroup.getBackgroundPermissions().getPermission(
                        permissionState.permissionName);
            }

            boolean isGranted = permission.isGrantedIncludingAppOp();

            if (wasGranted != isGranted) {
                logAppPermissionFragmentActionReported(sessionId, changeId,
                        permissionState.permissionName, isGranted);
            }
        }
    }

    private void logAppPermissionFragmentActionReported(
            long sessionId, long changeId, String permissionName, boolean isGranted) {
        PermissionControllerStatsLog.write(APP_PERMISSION_FRAGMENT_ACTION_REPORTED, sessionId,
                changeId, mGroup.getApp().applicationInfo.uid, mGroup.getApp().packageName,
                permissionName, isGranted);
        Log.v(LOG_TAG, "Permission changed via UI with sessionId=" + sessionId + " changeId="
                + changeId + " uid=" + mGroup.getApp().applicationInfo.uid + " packageName="
                + mGroup.getApp().packageName + " permission="
                + permissionName + " isGranted=" + isGranted);
    }

    private void updateButtons() {
        Context context = getContext();
        if (context == null) {
@@ -703,6 +787,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
        }

        if (requestGrant) {
            ArrayList<PermissionState> stateBefore = createPermissionSnapshot();
            if ((changeTarget & CHANGE_FOREGROUND) != 0) {
                if (!mGroup.areRuntimePermissionsGranted()) {
                    SafetyNetLogger.logPermissionToggled(mGroup);
@@ -719,6 +804,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
                    mGroup.getBackgroundPermissions().grantRuntimePermissions(false);
                }
            }
            logPermissionChanges(stateBefore);
        } else {
            boolean showDefaultDenyDialog = false;

@@ -743,6 +829,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
                updateButtons();
                return false;
            } else {
                ArrayList<PermissionState> stateBefore = createPermissionSnapshot();
                if ((changeTarget & CHANGE_FOREGROUND) != 0
                        && mGroup.areRuntimePermissionsGranted()) {
                    if (mGroup.areRuntimePermissionsGranted()) {
@@ -761,6 +848,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
                        mGroup.getBackgroundPermissions().revokeRuntimePermissions(false);
                    }
                }
                logPermissionChanges(stateBefore);
            }
        }

@@ -817,6 +905,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
     */
    void onDenyAnyWay(@ChangeTarget int changeTarget) {
        boolean hasDefaultPermissions = false;
        ArrayList<PermissionState> stateBefore = createPermissionSnapshot();
        if ((changeTarget & CHANGE_FOREGROUND) != 0) {
            if (mGroup.areRuntimePermissionsGranted()) {
                SafetyNetLogger.logPermissionToggled(mGroup);
@@ -836,6 +925,7 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
                        mGroup.getBackgroundPermissions().hasGrantedByDefaultPermission();
            }
        }
        logPermissionChanges(stateBefore);

        if (hasDefaultPermissions || !mGroup.doesSupportRuntimePermissions()) {
            mHasConfirmedRevoke = true;
@@ -889,4 +979,15 @@ public class AppPermissionFragment extends SettingsWithLargeHeader {
            }
        }
    }

    private static class PermissionState {
        @NonNull public final String permissionName;
        public final boolean permissionGranted;

        PermissionState(@NonNull String permissionName, boolean permissionGranted) {
            this.permissionName = permissionName;
            this.permissionGranted = permissionGranted;
        }
    }

}
Loading