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

Commit 65965a84 authored by Shijian Li's avatar Shijian Li Committed by android-build-merger
Browse files

Pop up a dialog when revoking a permission granted by default or 23- SDK. am: 21aa367b

am: 6922b59e

Change-Id: I1db2213485ab3b6d2d35445ec9dc4acc03065e73
parents f6f044ce 6922b59e
Loading
Loading
Loading
Loading
+61 −9
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.UserHandle;
import android.preference.Preference;
@@ -236,7 +237,63 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {
                    }
                }
            } else {
                group.revokeRuntimePermissions(true, new String[]{ perm.name });
                final Permission appPerm = getPermissionFromGroup(group, perm.name);
                if (appPerm == null) {
                    return false;
                }

                final boolean grantedByDefault = appPerm.isGrantedByDefault();
                if (grantedByDefault
                        || (!group.doesSupportRuntimePermissions() && !mHasConfirmedRevoke)) {
                    new WearableDialogHelper.DialogBuilder(getContext())
                            .setNegativeIcon(R.drawable.confirm_button)
                            .setPositiveIcon(R.drawable.cancel_button)
                            .setNegativeButton(R.string.grant_dialog_button_deny_anyway,
                                    (dialog, which) -> {
                                        revokePermissionInGroup(group, perm.name);
                                        pref.setChecked(false);
                                        if (!appPerm.isGrantedByDefault()) {
                                              mHasConfirmedRevoke = true;
                                        }
                            })
                            .setPositiveButton(R.string.cancel, null)
                            .setMessage(grantedByDefault ?
                                    R.string.system_warning : R.string.old_sdk_deny_warning)
                            .show();
                    return false;
                } else {
                    revokePermissionInGroup(group, perm.name);
                }
            }

            return true;
        });
        return pref;
    }

    private static Permission getPermissionFromGroup(AppPermissionGroup group, String permName) {
        final int permissionCount = group.getPermissions().size();

        for (int i = 0; i < permissionCount; i++) {
            Permission currentPerm = group.getPermissions().get(i);
            if(currentPerm.getName().equals(permName)) {
                return currentPerm;
            };
        }

        if ("user".equals(Build.TYPE)) {
            Log.e(LOG_TAG, String.format("The impossible happens, permission %s is not in group %s.",
                    permName, group.getName()));
            return null;
        } else {
            // This is impossible, throw a fatal error in non-user build.
            throw new IllegalArgumentException(
                    String.format("Permission %s is not in group %s", permName, group.getName()));
        }
    }

    private void revokePermissionInGroup(AppPermissionGroup group, String permName) {
        group.revokeRuntimePermissions(true, new String[]{ permName });

        if (Utils.areGroupPermissionsIndividuallyControlled(getContext(), group.getName())
                && group.doesSupportRuntimePermissions()
@@ -248,11 +305,6 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {
        }
    }

            return true;
        });
        return pref;
    }

    private SwitchPreference createSwitchPreferenceForGroup(AppPermissionGroup group) {
        final SwitchPreference pref = new PermissionSwitchPreference(getActivity());

@@ -287,7 +339,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {
                                                mHasConfirmedRevoke = true;
                                            }
                                        })
                                .setPositiveButton(R.string.cancel, (dialog, which) -> {})
                                .setPositiveButton(R.string.cancel, null)
                                .setMessage(grantedByDefault ?
                                        R.string.system_warning : R.string.old_sdk_deny_warning)
                                .show();