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

Commit 1019d738 authored by Shijian Li's avatar Shijian Li
Browse files

Expand all permissions when permissions in a group are individually managed.

Test: Manually tested on sawshark_sw where WRITE_CONTACTS and
READ_CONTACTS are shown separately for Android Wear App. Also
tested on sawshark where only one "Contacts" group shown on
behalf of WRITE_CONTACTS and READ_CONTACTS.
Bug: 33856934
Change-Id: I299c54e38236d039204a01d8113f427b1fc71c43
parent da068af1
Loading
Loading
Loading
Loading
+106 −53
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.app.Fragment;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.os.Bundle;
import android.os.UserHandle;
import android.preference.Preference;
@@ -38,6 +39,7 @@ import android.widget.Toast;
import com.android.packageinstaller.R;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.AppPermissions;
import com.android.packageinstaller.permission.model.Permission;
import com.android.packageinstaller.permission.utils.LocationUtils;
import com.android.packageinstaller.permission.utils.SafetyNetLogger;
import com.android.packageinstaller.permission.utils.Utils;
@@ -63,6 +65,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {
        return fragment;
    }

    private PackageManager mPackageManager;
    private List<AppPermissionGroup> mToggledGroups;
    private AppPermissions mAppPermissions;

@@ -103,11 +106,12 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {

        String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME);
        Activity activity = getActivity();
        PackageManager pm = activity.getPackageManager();
        mPackageManager = activity.getPackageManager();

        PackageInfo packageInfo;

        try {
            packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
            packageInfo = mPackageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
        } catch (PackageManager.NameNotFoundException e) {
            Log.i(LOG_TAG, "No package:" + activity.getCallingPackage(), e);
            packageInfo = null;
@@ -149,7 +153,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {
    private void initializePermissionGroupList() {
        final String packageName = mAppPermissions.getPackageInfo().packageName;
        List<AppPermissionGroup> groups = mAppPermissions.getPermissionGroups();
        List<SwitchPreference> nonSystemGroups = new ArrayList<>();
        List<SwitchPreference> nonSystemPreferences = new ArrayList<>();

        if (!groups.isEmpty()) {
            getPreferenceScreen().removePreference(findPreference(KEY_NO_PERMISSIONS));
@@ -162,7 +166,56 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {

            boolean isPlatform = group.getDeclaringPackage().equals(Utils.OS_PKG);

            if (Utils.areGroupPermissionsIndividuallyControlled(getContext(), group.getName())) {
                // If permission is controlled individually, we show all requested permission
                // inside this group.
                for (PermissionInfo perm : getPermissionInfosFromGroup(group)) {
                    final SwitchPreference pref = createSwitchPreferenceForPermission(group, perm);
                    showOrAddToNonSystemPreferences(pref, nonSystemPreferences, isPlatform);
                }
            } else {
                final SwitchPreference pref = createSwitchPreferenceForGroup(group);
                showOrAddToNonSystemPreferences(pref, nonSystemPreferences, isPlatform);
            }
        }

        // Now add the non-system settings to the end of the list
        for (SwitchPreference nonSystemPreference : nonSystemPreferences) {
            getPreferenceScreen().addPreference(nonSystemPreference);
        }
    }

    private void showOrAddToNonSystemPreferences(SwitchPreference pref,
            List<SwitchPreference> nonSystemPreferences, // Mutate
            boolean isPlatform) {
        // The UI shows System settings first, then non-system settings
        if (isPlatform) {
            getPreferenceScreen().addPreference(pref);
        } else {
            nonSystemPreferences.add(pref);
        }
    }

    private SwitchPreference createSwitchPreferenceForPermission(AppPermissionGroup group,
            PermissionInfo perm) {
        final SwitchPreference pref = new PermissionSwitchPreference(getActivity());
        pref.setKey(perm.name);
        pref.setTitle(perm.loadLabel(mPackageManager));
        pref.setChecked(group.areRuntimePermissionsGranted(new String[]{ perm.name }));
        pref.setOnPreferenceChangeListener((p, newVal) -> {
            if((Boolean) newVal) {
                group.grantRuntimePermissions(false, new String[]{ perm.name });
            } else {
                group.revokeRuntimePermissions(true, new String[]{ perm.name });
            }
            return true;
        });
        return pref;
    }

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

        pref.setKey(group.getName());
        pref.setTitle(group.getLabel());
        pref.setChecked(group.areRuntimePermissionsGranted());
@@ -207,19 +260,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {
                return true;
            });
        }

            // The UI shows System settings first, then non-system settings
            if (isPlatform) {
                getPreferenceScreen().addPreference(pref);
            } else {
                nonSystemGroups.add(pref);
            }
        }

        // Now add the non-system settings to the end of the list
        for (SwitchPreference nonSystemGroup : nonSystemGroups) {
            getPreferenceScreen().addPreference(nonSystemGroup);
        }
        return pref;
    }

    private void setPermission(AppPermissionGroup group, SwitchPreference pref, boolean grant) {
@@ -251,4 +292,16 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment {
            mToggledGroups = null;
        }
    }

    private List<PermissionInfo> getPermissionInfosFromGroup(AppPermissionGroup group) {
        ArrayList<PermissionInfo> permInfos = new ArrayList<>(group.getPermissions().size());
        for(Permission perm : group.getPermissions()) {
            try {
                permInfos.add(mPackageManager.getPermissionInfo(perm.getName(), 0));
            } catch (PackageManager.NameNotFoundException e) {
                Log.w(LOG_TAG, "No permission:" + perm.getName());
            }
        }
        return permInfos;
    }
}
+10 −0
Original line number Diff line number Diff line
@@ -145,4 +145,14 @@ public final class Utils {
        return info.isSystemApp() && (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0
                && !launcherPkgs.contains(info.packageName);
    }

    public static boolean areGroupPermissionsIndividuallyControlled(Context context, String group) {
        if (!context.getResources().getBoolean(
                com.android.internal.R.bool.config_permissionReviewRequired)) {
            return false;
        }
        return Manifest.permission_group.SMS.equals(group)
                || Manifest.permission_group.PHONE.equals(group)
                || Manifest.permission_group.CONTACTS.equals(group);
    }
}