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

Commit 2a1376d9 authored by Svet Ganov's avatar Svet Ganov
Browse files

Expose removed permissions flag as system API

There are some permissions that were removed from the platform
and guard nothing but legacy apps may be checking them before
calling APIs. Hence, these apps should get the permissions as
expected despite them being a no-op. To address this the platform
declares removed permissions as normal permissions that are hidden
such that legacy apps can always get them. These permissions are
not shown in the UI. Play needs a way to filter out these
permissions like the platform as they have permissions UI too.

bug:23361760

Change-Id: I10f442dfc09a299ddc5480d8bf2db0bd786aec62
parent 3dbcd203
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -10277,6 +10277,7 @@ package android.content.pm {
    field public static final android.os.Parcelable.Creator<android.content.pm.PermissionInfo> CREATOR;
    field public static final int FLAG_COSTS_MONEY = 1; // 0x1
    field public static final int FLAG_INSTALLED = 1073741824; // 0x40000000
    field public static final int FLAG_REMOVED = 2; // 0x2
    field public static final int PROTECTION_DANGEROUS = 1; // 0x1
    field public static final int PROTECTION_FLAG_APPOP = 64; // 0x40
    field public static final int PROTECTION_FLAG_DEVELOPMENT = 32; // 0x20
+4 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.content.pm;

import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -145,11 +146,12 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
    public static final int FLAG_COSTS_MONEY = 1<<0;

    /**
     * Flag for {@link #flags}, corresponding to <code>hidden</code>
     * Flag for {@link #flags}, corresponding to <code>removed</code>
     * value of {@link android.R.attr#permissionFlags}.
     * @hide
     */
    public static final int FLAG_HIDDEN = 1<<1;
    @SystemApi
    public static final int FLAG_REMOVED = 1<<1;

    /**
     * Flag for {@link #flags}, indicating that this permission has been
+15 −15
Original line number Diff line number Diff line
@@ -866,77 +866,77 @@
    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.READ_PROFILE"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.WRITE_PROFILE"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.READ_SOCIAL_STREAM"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.WRITE_SOCIAL_STREAM"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.READ_USER_DICTIONARY"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.WRITE_USER_DICTIONARY"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.WRITE_SMS"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.MANAGE_ACCOUNTS"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.USE_CREDENTIALS"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.SUBSCRIBED_FEEDS_READ"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- @hide We need to keep this around for backwards compatibility -->
    <permission android:name="android.permission.FLASHLIGHT"
        android:protectionLevel="normal"
        android:permissionFlags="hidden"/>
        android:permissionFlags="removed"/>

    <!-- ====================================================================== -->
    <!-- INSTALL PERMISSIONS                                                    -->
+6 −3
Original line number Diff line number Diff line
@@ -248,9 +248,12 @@
             may cost the user money.  Such permissions may be highlighted
             when shown to the user with this additional information.  -->
        <flag name="costsMoney" value="0x0001" />
        <!-- Additional flag from base permission type: this permission is hidden
             and should not show in the UI. -->
        <flag name="hidden" value="0x2" />
        <!-- Additional flag from base permission type: this permission has been
             removed and it is no longer enforced. It shouldn't be shown in the
             UI. Removed permissions are kept as normal permissions for backwards
             compatibility as apps may be checking them before calling an API.
        -->
        <flag name="removed" value="0x2" />
    </attr>

    <!-- Specified the name of a group that this permission is associated
+2 −10
Original line number Diff line number Diff line
@@ -19,8 +19,6 @@ package com.android.server.pm;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED;
@@ -28,11 +26,6 @@ import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRAD
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
import static android.content.pm.PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE;
import static android.content.pm.PackageManager.MATCH_ENCRYPTION_UNAWARE;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import static android.os.Process.PACKAGE_INFO_GID;
import static android.os.Process.SYSTEM_UID;
import static com.android.server.pm.PackageManagerService.DEBUG_DOMAIN_VERIFICATION;
@@ -88,7 +81,6 @@ import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.JournaledFile;
import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import com.android.server.backup.PreferredActivityBackupHelper;
import com.android.server.pm.PackageManagerService.DumpState;
@@ -4378,7 +4370,7 @@ final class Settings {
                if ((perm.info.flags&PermissionInfo.FLAG_COSTS_MONEY) != 0) {
                    pw.print(", COSTS_MONEY");
                }
                if ((perm.info.flags&PermissionInfo.FLAG_HIDDEN) != 0) {
                if ((perm.info.flags&PermissionInfo.FLAG_REMOVED) != 0) {
                    pw.print(", HIDDEN");
                }
                if ((perm.info.flags&PermissionInfo.FLAG_INSTALLED) != 0) {
@@ -4555,7 +4547,7 @@ final class Settings {
            if (p.perm != null) {
                pw.print("    perm="); pw.println(p.perm);
                if ((p.perm.info.flags & PermissionInfo.FLAG_INSTALLED) == 0
                        || (p.perm.info.flags & PermissionInfo.FLAG_HIDDEN) != 0) {
                        || (p.perm.info.flags & PermissionInfo.FLAG_REMOVED) != 0) {
                    pw.print("    flags=0x"); pw.println(Integer.toHexString(p.perm.info.flags));
                }
            }