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

Commit 8ee7f9a4 authored by Benjamin Franz's avatar Benjamin Franz
Browse files

Create a new permission to override Overridable change ids

With this change we allow system packages with the new permission to
override ChangeIds specifically annotated as Overridable to set
overrides even on non-debuggable builds.

Bug: 174043039
Bug: 175874108
CTS-Coverage-Bug: 180396382
Test: atest FrameworksServicesTests:CompatConfigTest
Test: atest FrameworksServicesTests:PlatformCompatTest
Change-Id: Ib8d5d83b5fd62acb5808d10f5c413616f29ee65c
parent 30b3a36e
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -187,6 +187,7 @@ package android {
    field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS";
    field public static final String OBSERVE_SENSOR_PRIVACY = "android.permission.OBSERVE_SENSOR_PRIVACY";
    field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS";
    field public static final String OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD = "android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD";
    field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
    field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT";
    field public static final String PACKET_KEEPALIVE_OFFLOAD = "android.permission.PACKET_KEEPALIVE_OFFLOAD";
@@ -1227,6 +1228,21 @@ package android.app.compat {
    method public static boolean isChangeEnabled(long);
    method @RequiresPermission(allOf={"android.permission.READ_COMPAT_CHANGE_CONFIG", "android.permission.LOG_COMPAT_CHANGE"}) public static boolean isChangeEnabled(long, @NonNull String, @NonNull android.os.UserHandle);
    method @RequiresPermission(allOf={"android.permission.READ_COMPAT_CHANGE_CONFIG", "android.permission.LOG_COMPAT_CHANGE"}) public static boolean isChangeEnabled(long, int);
    method @RequiresPermission(android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD) public static void setPackageOverride(@NonNull String, @NonNull java.util.Map<java.lang.Long,android.app.compat.PackageOverride>);
  }
  public final class PackageOverride {
    method public long getMaxVersionCode();
    method public long getMinVersionCode();
    method public boolean isEnabled();
  }
  public static final class PackageOverride.Builder {
    ctor public PackageOverride.Builder();
    method @NonNull public android.app.compat.PackageOverride build();
    method @NonNull public android.app.compat.PackageOverride.Builder setEnabled(boolean);
    method @NonNull public android.app.compat.PackageOverride.Builder setMaxVersionCode(long);
    method @NonNull public android.app.compat.PackageOverride.Builder setMinVersionCode(long);
  }
}
+4 −5
Original line number Diff line number Diff line
@@ -104,16 +104,15 @@ public final class CompatChanges {
     *
     * @param packageName The package name of the app in question.
     * @param overrides A map from changeId to the override applied for this change id.
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG)
    public static void setPackageOverride(String packageName,
            Map<Long, PackageOverride> overrides) {
    @RequiresPermission(android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD)
    public static void setPackageOverride(@NonNull String packageName,
            @NonNull Map<Long, PackageOverride> overrides) {
        IPlatformCompat platformCompat = IPlatformCompat.Stub.asInterface(
                ServiceManager.getService(Context.PLATFORM_COMPAT_SERVICE));
        CompatibilityOverrideConfig config = new CompatibilityOverrideConfig(overrides);
        try {
            platformCompat.setOverridesFromInstaller(config, packageName);
            platformCompat.setOverridesOnReleaseBuilds(config, packageName);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
+17 −32
Original line number Diff line number Diff line
@@ -17,8 +17,9 @@
package android.app.compat;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -32,15 +33,16 @@ import java.lang.annotation.RetentionPolicy;
 *
 * @hide
 */
public class PackageOverride implements Parcelable {
@SystemApi
public final class PackageOverride {

    /** @hide */
    @IntDef({
            VALUE_UNDEFINED,
            VALUE_ENABLED,
            VALUE_DISABLED
    })
    @Retention(RetentionPolicy.SOURCE)
    /** @hide */
    public @interface EvaluatedOverride {
    }

@@ -75,10 +77,6 @@ public class PackageOverride implements Parcelable {
        this.mEnabled = enabled;
    }

    private PackageOverride(Parcel in) {
        this(in.readLong(), in.readLong(), in.readBoolean());
    }

    /**
     * Evaluate the override for the given {@code versionCode}. If no override is defined for
     * the specified version code, {@link #VALUE_UNDEFINED} is returned.
@@ -114,24 +112,22 @@ public class PackageOverride implements Parcelable {
    }

    /** Returns the enabled value for the override. */
    public boolean getEnabled() {
    public boolean isEnabled() {
        return mEnabled;
    }

    /** @hide */
    @Override
    public int describeContents() {
        return 0;
    }

    /** @hide */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    public void writeToParcel(Parcel dest) {
        dest.writeLong(mMinVersionCode);
        dest.writeLong(mMaxVersionCode);
        dest.writeBoolean(mEnabled);
    }

    /** @hide */
    public static PackageOverride createFromParcel(Parcel in) {
        return new PackageOverride(in.readLong(), in.readLong(), in.readBoolean());
    }

    /** @hide */
    @Override
    public String toString() {
@@ -141,25 +137,10 @@ public class PackageOverride implements Parcelable {
        return String.format("[%d,%d,%b]", mMinVersionCode, mMaxVersionCode, mEnabled);
    }

    /** @hide */
    public static final Creator<PackageOverride> CREATOR =
            new Creator<PackageOverride>() {

                @Override
                public PackageOverride createFromParcel(Parcel in) {
                    return new PackageOverride(in);
                }

                @Override
                public PackageOverride[] newArray(int size) {
                    return new PackageOverride[size];
                }
            };

    /**
     * Builder to construct a PackageOverride.
     */
    public static class Builder {
    public static final class Builder {
        private long mMinVersionCode = Long.MIN_VALUE;
        private long mMaxVersionCode = Long.MAX_VALUE;
        private boolean mEnabled;
@@ -169,6 +150,7 @@ public class PackageOverride implements Parcelable {
         *
         * default value: {@code Long.MIN_VALUE}.
         */
        @NonNull
        public Builder setMinVersionCode(long minVersionCode) {
            mMinVersionCode = minVersionCode;
            return this;
@@ -179,6 +161,7 @@ public class PackageOverride implements Parcelable {
         *
         * default value: {@code Long.MAX_VALUE}.
         */
        @NonNull
        public Builder setMaxVersionCode(long maxVersionCode) {
            mMaxVersionCode = maxVersionCode;
            return this;
@@ -189,6 +172,7 @@ public class PackageOverride implements Parcelable {
         *
         * default value: {@code false}.
         */
        @NonNull
        public Builder setEnabled(boolean enabled) {
            mEnabled = enabled;
            return this;
@@ -200,6 +184,7 @@ public class PackageOverride implements Parcelable {
         * @throws IllegalArgumentException if {@code minVersionCode} is larger than
         *                                  {@code maxVersionCode}.
         */
        @NonNull
        public PackageOverride build() {
            if (mMinVersionCode > mMaxVersionCode) {
                throw new IllegalArgumentException("minVersionCode must not be larger than "
+2 −3
Original line number Diff line number Diff line
@@ -40,8 +40,7 @@ public final class CompatibilityOverrideConfig implements Parcelable {
        overrides = new HashMap<>();
        for (int i = 0; i < keyCount; i++) {
            long key = in.readLong();
            PackageOverride override = in.readParcelable(PackageOverride.class.getClassLoader());
            overrides.put(key, override);
            overrides.put(key, PackageOverride.createFromParcel(in));
        }
    }

@@ -55,7 +54,7 @@ public final class CompatibilityOverrideConfig implements Parcelable {
        dest.writeInt(overrides.size());
        for (Long key : overrides.keySet()) {
            dest.writeLong(key);
            dest.writeParcelable(overrides.get(key), 0);
            overrides.get(key).writeToParcel(dest);
        }
    }

+11 −3
Original line number Diff line number Diff line
@@ -151,15 +151,23 @@ interface IPlatformCompat {
    void setOverrides(in CompatibilityChangeConfig overrides, in String packageName);

    /**
     * Adds overrides to compatibility changes.
     * Adds overrides to compatibility changes on release builds.
     *
     * <p>Kills the app to allow the changes to take effect.
     * <p>The caller to this API needs to hold
     * {@code android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD} and all change ids
     * in {@code overrides} need to annotated with {@link android.compat.annotation.Overridable}.
     *
     * A release build in this definition means that {@link android.os.Build#IS_DEBUGGABLE} needs to
     * be {@code false}.
     *
     * <p>Note that this does not kill the app, and therefore overrides read from the app process
     * will not be updated. Overrides read from the system process do take effect.
     *
     * @param overrides   parcelable containing the compat change overrides to be applied
     * @param packageName the package name of the app whose changes will be overridden
     * @throws SecurityException if overriding changes is not permitted
     */
    void setOverridesFromInstaller(in CompatibilityOverrideConfig overrides, in String packageName);
    void setOverridesOnReleaseBuilds(in CompatibilityOverrideConfig overrides, in String packageName);

    /**
     * Adds overrides to compatibility changes.
Loading