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

Commit dcc39fe4 authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

Respect past user choices in permisson review UI

In a permission review mode we show UI for the user to review
new permissions for apps that do not support the new runtime
permission model. The review is shown on an app launch. It is
possible for the user to modify permissions in the settings
UI before launching an app.

This change ensures that the default value in the review UI
reflects the user choice in settings. Specifically, the review
UI shows the permission toggle in a granted state if the user
expressed no opinion or granted the pemrission in settings
(initially permissions are shown as revoked in settings as a
review is pending - granting a permission from settings doesn't
void the pending review). However, if the user grants and then
revokes a permission in settings, (expresses an opinion the
pemrission should be revoked) the default state of the
permission
toggle is off.

bug:26741436

Change-Id: I021175df00e334e73aa01363d2c5645e2fe16b90
parent 8842534e
Loading
Loading
Loading
Loading
+5 −14
Original line number Diff line number Diff line
@@ -215,6 +215,9 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
    }

    public boolean isReviewRequired() {
        if (mAppSupportsRuntimePermissions) {
            return false;
        }
        final int permissionCount = mPermissions.size();
        for (int i = 0; i < permissionCount; i++) {
            Permission permission = mPermissions.valueAt(i);
@@ -250,17 +253,6 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
        return false;
    }

    public boolean hasAppOpPermission() {
        final int permissionCount = mPermissions.size();
        for (int i = 0; i < permissionCount; i++) {
            Permission permission = mPermissions.valueAt(i);
            if (permission.getAppOp() != AppOpsManager.OP_NONE) {
                return true;
            }
        }
        return false;
    }

    public PackageInfo getApp() {
        return mPackageInfo;
    }
@@ -316,9 +308,8 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
                if (permission.isGranted()) {
                    return true;
                }
            } else if (permission.isGranted() && ((permission.getAppOp()
                    == AppOpsManager.OP_NONE || permission.isAppOpAllowed()))
                    && !permission.isReviewRequired()) {
            } else if (permission.isGranted() && (permission.getAppOp()
                    == AppOpsManager.OP_NONE || permission.isAppOpAllowed())) {
                return true;
            }
        }
+18 −13
Original line number Diff line number Diff line
@@ -166,6 +166,7 @@ public final class ReviewPermissionsActivity extends Activity
        @Override
        public void onResume() {
            super.onResume();
            mAppPermissions.refresh();
            loadPreferences();
        }

@@ -240,6 +241,9 @@ public final class ReviewPermissionsActivity extends Activity

        private void bindUi() {
            Activity activity = getActivity();
            if (activity == null) {
                return;
            }

            // Set icon
            Drawable icon = mAppPermissions.getPackageInfo().applicationInfo.loadIcon(
@@ -279,6 +283,11 @@ public final class ReviewPermissionsActivity extends Activity
        }

        private void loadPreferences() {
            Activity activity = getActivity();
            if (activity == null) {
                return;
            }

            PreferenceScreen screen = getPreferenceScreen();
            if (screen == null) {
                screen = getPreferenceManager().createPreferenceScreen(getActivity());
@@ -309,17 +318,8 @@ public final class ReviewPermissionsActivity extends Activity
                } else {
                    preference = new SwitchPreference(getActivity());

                    // We update permission grants based on the final preference states
                    if (group.isReviewRequired()) {
                        // If review is required use granted as default
                        preference.setChecked(true);
                    } else {
                        // If review not required use the current grant state as default
                        preference.setChecked(group.areRuntimePermissionsGranted());
                    }

                    preference.setKey(group.getName());
                    Drawable icon = Utils.loadDrawable(getActivity().getPackageManager(),
                    Drawable icon = Utils.loadDrawable(activity.getPackageManager(),
                            group.getIconPkg(), group.getIconResId());
                    preference.setIcon(Utils.applyTint(getContext(), icon,
                            android.R.attr.colorControlNormal));
@@ -330,6 +330,8 @@ public final class ReviewPermissionsActivity extends Activity
                    preference.setOnPreferenceChangeListener(this);
                }

                preference.setChecked(group.areRuntimePermissionsGranted());

                // Mutable state
                if (group.isPolicyFixed()) {
                    preference.setEnabled(false);
@@ -344,7 +346,7 @@ public final class ReviewPermissionsActivity extends Activity
                        screen.addPreference(preference);
                    } else {
                        if (mNewPermissionsCategory == null) {
                            mNewPermissionsCategory = new PreferenceCategory(getActivity());
                            mNewPermissionsCategory = new PreferenceCategory(activity);
                            mNewPermissionsCategory.setTitle(R.string.new_permissions_category);
                            mNewPermissionsCategory.setOrder(1);
                            screen.addPreference(mNewPermissionsCategory);
@@ -353,7 +355,7 @@ public final class ReviewPermissionsActivity extends Activity
                    }
                } else {
                    if (currentPermissionsCategory == null) {
                        currentPermissionsCategory = new PreferenceCategory(getActivity());
                        currentPermissionsCategory = new PreferenceCategory(activity);
                        currentPermissionsCategory.setTitle(R.string.current_permissions_category);
                        currentPermissionsCategory.setOrder(2);
                        screen.addPreference(currentPermissionsCategory);
@@ -377,6 +379,9 @@ public final class ReviewPermissionsActivity extends Activity

        private void executeCallback(boolean success) {
            Activity activity = getActivity();
            if (activity == null) {
                return;
            }
            if (success) {
                IntentSender intent = activity.getIntent().getParcelableExtra(Intent.EXTRA_INTENT);
                if (intent != null) {