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

Commit a2cec1c8 authored by Chad Brubaker's avatar Chad Brubaker Committed by android-build-merger
Browse files

Merge "Allow permissions to be runtime-only." into oc-dev

am: 5b3de255

Change-Id: I85f0db16ca7ae96bdafda158cd694c2b4e91c18b
parents dd077009 5b3de255
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -59,6 +59,7 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
    private final boolean mAppSupportsRuntimePermissions;
    private final boolean mAppSupportsRuntimePermissions;
    private final boolean mIsEphemeralApp;
    private final boolean mIsEphemeralApp;
    private boolean mContainsEphemeralPermission;
    private boolean mContainsEphemeralPermission;
    private boolean mContainsPreRuntimePermission;


    public static AppPermissionGroup create(Context context, PackageInfo packageInfo,
    public static AppPermissionGroup create(Context context, PackageInfo packageInfo,
            String permissionName) {
            String permissionName) {
@@ -216,7 +217,8 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
    }
    }


    public boolean isGrantingAllowed() {
    public boolean isGrantingAllowed() {
        return !mIsEphemeralApp || mContainsEphemeralPermission;
        return (!mIsEphemeralApp || mContainsEphemeralPermission)
                && (mAppSupportsRuntimePermissions || mContainsPreRuntimePermission);
    }
    }


    public boolean isReviewRequired() {
    public boolean isReviewRequired() {
@@ -337,7 +339,7 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
                continue;
                continue;
            }
            }


            if (!permission.isGrantingAllowed(mIsEphemeralApp)) {
            if (!permission.isGrantingAllowed(mIsEphemeralApp, mAppSupportsRuntimePermissions)) {
                // Skip unallowed permissions.
                // Skip unallowed permissions.
                continue;
                continue;
            }
            }
@@ -655,5 +657,8 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
        if (permission.isEphemeral()) {
        if (permission.isEphemeral()) {
            mContainsEphemeralPermission = true;
            mContainsEphemeralPermission = true;
        }
        }
        if (!permission.isRuntimeOnly()) {
            mContainsPreRuntimePermission = true;
        }
    }
    }
}
}
+9 −2
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ public final class Permission {
    private boolean mAppOpAllowed;
    private boolean mAppOpAllowed;
    private int mFlags;
    private int mFlags;
    private boolean mIsEphemeral;
    private boolean mIsEphemeral;
    private boolean mIsRuntimeOnly;


    public Permission(String name, boolean granted,
    public Permission(String name, boolean granted,
            String appOp, boolean appOpAllowed, int flags, int protectionLevel) {
            String appOp, boolean appOpAllowed, int flags, int protectionLevel) {
@@ -36,6 +37,7 @@ public final class Permission {
        mAppOpAllowed = appOpAllowed;
        mAppOpAllowed = appOpAllowed;
        mFlags = flags;
        mFlags = flags;
        mIsEphemeral = (protectionLevel & PermissionInfo.PROTECTION_FLAG_EPHEMERAL) != 0;
        mIsEphemeral = (protectionLevel & PermissionInfo.PROTECTION_FLAG_EPHEMERAL) != 0;
        mIsRuntimeOnly = (protectionLevel & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) != 0;
    }
    }


    public String getName() {
    public String getName() {
@@ -138,7 +140,12 @@ public final class Permission {
        return mIsEphemeral;
        return mIsEphemeral;
    }
    }


    public boolean isGrantingAllowed(boolean isEphemeralApp) {
    public boolean isRuntimeOnly() {
        return !isEphemeralApp || isEphemeral();
        return mIsRuntimeOnly;
    }

    public boolean isGrantingAllowed(boolean isEphemeralApp, boolean supportsRuntimePermissions) {
        return (!isEphemeralApp || isEphemeral())
                && (supportsRuntimePermissions || !isRuntimeOnly());
    }
    }
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -385,6 +385,11 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
                    && callingPackageInfo.applicationInfo.isInstantApp()) {
                    && callingPackageInfo.applicationInfo.isInstantApp()) {
                return PERMISSION_DENIED;
                return PERMISSION_DENIED;
            }
            }
            if ((pInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) != 0
                    && callingPackageInfo.applicationInfo.targetSdkVersion
                    < Build.VERSION_CODES.M) {
                return PERMISSION_DENIED;
            }
        } catch (NameNotFoundException e) {
        } catch (NameNotFoundException e) {
            return PERMISSION_DENIED;
            return PERMISSION_DENIED;
        }
        }
+6 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.PermissionInfo;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceCategory;
@@ -154,6 +155,11 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader {
                                == 0) {
                                == 0) {
                        continue;
                        continue;
                    }
                    }
                    if (appInfo.targetSdkVersion < Build.VERSION_CODES.M
                            && (perm.protectionLevel & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY)
                                != 0) {
                        continue;
                    }


                    if ((perm.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
                    if ((perm.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
                            == PermissionInfo.PROTECTION_DANGEROUS) {
                            == PermissionInfo.PROTECTION_DANGEROUS) {
+7 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.PermissionInfo;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Bundle;
import android.provider.Settings;
import android.provider.Settings;
import android.support.v14.preference.SwitchPreference;
import android.support.v14.preference.SwitchPreference;
@@ -159,6 +160,12 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader {
                        && (perm.protectionLevel & PermissionInfo.PROTECTION_FLAG_EPHEMERAL) == 0) {
                        && (perm.protectionLevel & PermissionInfo.PROTECTION_FLAG_EPHEMERAL) == 0) {
                    continue;
                    continue;
                }
                }
                if (appInfo.targetSdkVersion < Build.VERSION_CODES.M
                        && (perm.protectionLevel & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY)
                        != 0) {
                    continue;
                }



                PermissionGroupInfo group = getGroup(perm.group, pm);
                PermissionGroupInfo group = getGroup(perm.group, pm);
                if ((perm.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
                if ((perm.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)