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

Commit c90a797b authored by Andrei-Valentin Onea's avatar Andrei-Valentin Onea Committed by Gerrit Code Review
Browse files

Merge "Add enabledSince support for compat changes"

parents 02fe8ac1 876c40f5
Loading
Loading
Loading
Loading
+28 −11
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import android.os.Parcelable;
public class CompatibilityChangeInfo implements Parcelable {
    private final long mChangeId;
    private final @Nullable String mName;
    private final int mEnableAfterTargetSdk;
    private final int mEnableSinceTargetSdk;
    private final boolean mDisabled;
    private final boolean mLoggingOnly;
    private final @Nullable String mDescription;
@@ -42,8 +42,8 @@ public class CompatibilityChangeInfo implements Parcelable {
        return mName;
    }

    public int getEnableAfterTargetSdk() {
        return mEnableAfterTargetSdk;
    public int getEnableSinceTargetSdk() {
        return mEnableSinceTargetSdk;
    }

    public boolean getDisabled() {
@@ -59,20 +59,37 @@ public class CompatibilityChangeInfo implements Parcelable {
    }

    public CompatibilityChangeInfo(
            Long changeId, String name, int enableAfterTargetSdk, boolean disabled,
            boolean loggingOnly, String description) {
            Long changeId, String name, int enableAfterTargetSdk, int enableSinceTargetSdk,
            boolean disabled, boolean loggingOnly, String description) {
        this.mChangeId = changeId;
        this.mName = name;
        this.mEnableAfterTargetSdk = enableAfterTargetSdk;
        if (enableAfterTargetSdk > 0) {
            // Need to maintain support for @EnabledAfter(X), but make it equivalent to
            // @EnabledSince(X+1)
            this.mEnableSinceTargetSdk = enableAfterTargetSdk + 1;
        } else if (enableSinceTargetSdk > 0) {
            this.mEnableSinceTargetSdk = enableSinceTargetSdk;
        } else {
            this.mEnableSinceTargetSdk = -1;
        }
        this.mDisabled = disabled;
        this.mLoggingOnly = loggingOnly;
        this.mDescription = description;
    }

    public CompatibilityChangeInfo(CompatibilityChangeInfo other) {
        this.mChangeId = other.mChangeId;
        this.mName = other.mName;
        this.mEnableSinceTargetSdk = other.mEnableSinceTargetSdk;
        this.mDisabled = other.mDisabled;
        this.mLoggingOnly = other.mLoggingOnly;
        this.mDescription = other.mDescription;
    }

    private CompatibilityChangeInfo(Parcel in) {
        mChangeId = in.readLong();
        mName = in.readString();
        mEnableAfterTargetSdk = in.readInt();
        mEnableSinceTargetSdk = in.readInt();
        mDisabled = in.readBoolean();
        mLoggingOnly = in.readBoolean();
        mDescription = in.readString();
@@ -87,7 +104,7 @@ public class CompatibilityChangeInfo implements Parcelable {
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(mChangeId);
        dest.writeString(mName);
        dest.writeInt(mEnableAfterTargetSdk);
        dest.writeInt(mEnableSinceTargetSdk);
        dest.writeBoolean(mDisabled);
        dest.writeBoolean(mLoggingOnly);
        dest.writeString(mDescription);
@@ -100,8 +117,8 @@ public class CompatibilityChangeInfo implements Parcelable {
        if (getName() != null) {
            sb.append("; name=").append(getName());
        }
        if (getEnableAfterTargetSdk() != -1) {
            sb.append("; enableAfterTargetSdk=").append(getEnableAfterTargetSdk());
        if (getEnableSinceTargetSdk() != -1) {
            sb.append("; enableSinceTargetSdk=").append(getEnableSinceTargetSdk());
        }
        if (getDisabled()) {
            sb.append("; disabled");
@@ -123,7 +140,7 @@ public class CompatibilityChangeInfo implements Parcelable {
        CompatibilityChangeInfo that = (CompatibilityChangeInfo) o;
        return this.mChangeId == that.mChangeId
                && this.mName.equals(that.mName)
                && this.mEnableAfterTargetSdk == that.mEnableAfterTargetSdk
                && this.mEnableSinceTargetSdk == that.mEnableSinceTargetSdk
                && this.mDisabled == that.mDisabled
                && this.mLoggingOnly == that.mLoggingOnly
                && this.mDescription.equals(that.mDescription);
+1 −1
Original line number Diff line number Diff line
@@ -164,7 +164,7 @@ interface IPlatformCompat
    boolean clearOverride(long changeId, String packageName);

    /**
     * Enable all compatibility changes which have enabledAfterTargetSdk ==
     * Enable all compatibility changes which have enabledSinceTargetSdk ==
     * {@param targetSdkVersion} for an app, subject to the policy. Kills the app to allow the
     * changes to take effect.
     *
+12 −8
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ public final class CompatChange extends CompatibilityChangeInfo {
    private Map<String, Boolean> mPackageOverrides;

    public CompatChange(long changeId) {
        this(changeId, null, -1, false, false, null);
        this(changeId, null, -1, -1, false, false, null);
    }

    /**
@@ -71,11 +71,14 @@ public final class CompatChange extends CompatibilityChangeInfo {
     * @param name Short descriptive name.
     * @param enableAfterTargetSdk {@code targetSdkVersion} restriction. See {@link EnabledAfter};
     *                             -1 if the change is always enabled.
     * @param enableSinceTargetSdk {@code targetSdkVersion} restriction. See {@link EnabledSince};
     *                             -1 if the change is always enabled.
     * @param disabled If {@code true}, overrides any {@code enableAfterTargetSdk} set.
     */
    public CompatChange(long changeId, @Nullable String name, int enableAfterTargetSdk,
            boolean disabled, boolean loggingOnly, String description) {
        super(changeId, name, enableAfterTargetSdk, disabled, loggingOnly, description);
            int enableSinceTargetSdk, boolean disabled, boolean loggingOnly, String description) {
        super(changeId, name, enableAfterTargetSdk, enableSinceTargetSdk, disabled, loggingOnly,
              description);
    }

    /**
@@ -83,7 +86,8 @@ public final class CompatChange extends CompatibilityChangeInfo {
     */
    public CompatChange(Change change) {
        super(change.getId(), change.getName(), change.getEnableAfterTargetSdk(),
                change.getDisabled(), change.getLoggingOnly(), change.getDescription());
                change.getEnableSinceTargetSdk(), change.getDisabled(), change.getLoggingOnly(),
                change.getDescription());
    }

    void registerListener(ChangeListener listener) {
@@ -145,8 +149,8 @@ public final class CompatChange extends CompatibilityChangeInfo {
        if (getDisabled()) {
            return false;
        }
        if (getEnableAfterTargetSdk() != -1) {
            return app.targetSdkVersion > getEnableAfterTargetSdk();
        if (getEnableSinceTargetSdk() != -1) {
            return app.targetSdkVersion >= getEnableSinceTargetSdk();
        }
        return true;
    }
@@ -167,8 +171,8 @@ public final class CompatChange extends CompatibilityChangeInfo {
        if (getName() != null) {
            sb.append("; name=").append(getName());
        }
        if (getEnableAfterTargetSdk() != -1) {
            sb.append("; enableAfterTargetSdk=").append(getEnableAfterTargetSdk());
        if (getEnableSinceTargetSdk() != -1) {
            sb.append("; enableSinceTargetSdk=").append(getEnableSinceTargetSdk());
        }
        if (getDisabled()) {
            sb.append("; disabled");
+14 −16
Original line number Diff line number Diff line
@@ -192,16 +192,19 @@ final class CompatConfig {
    }

    /**
     * Returns the minimum sdk version for which this change should be enabled (or 0 if it is not
     * Returns the maximum sdk version for which this change can be opted in (or -1 if it is not
     * target sdk gated).
     */
    int minTargetSdkForChangeId(long changeId) {
    int maxTargetSdkForChangeIdOptIn(long changeId) {
        synchronized (mChanges) {
            CompatChange c = mChanges.get(changeId);
            if (c == null) {
                return 0;
                return -1;
            }
            if (c.getEnableSinceTargetSdk() != -1) {
                return c.getEnableSinceTargetSdk() - 1;
            }
            return c.getEnableAfterTargetSdk();
            return -1;
        }
    }

@@ -318,7 +321,7 @@ final class CompatConfig {
        }
    }

    private long[] getAllowedChangesAfterTargetSdkForPackage(String packageName,
    private long[] getAllowedChangesSinceTargetSdkForPackage(String packageName,
                                                             int targetSdkVersion)
                    throws RemoteException {
        LongArray allowed = new LongArray();
@@ -326,7 +329,7 @@ final class CompatConfig {
            for (int i = 0; i < mChanges.size(); ++i) {
                try {
                    CompatChange change = mChanges.valueAt(i);
                    if (change.getEnableAfterTargetSdk() != targetSdkVersion) {
                    if (change.getEnableSinceTargetSdk() != targetSdkVersion) {
                        continue;
                    }
                    OverrideAllowedState allowedState =
@@ -345,14 +348,14 @@ final class CompatConfig {
    }

    /**
     * Enables all changes with enabledAfterTargetSdk == {@param targetSdkVersion} for
     * Enables all changes with enabledSinceTargetSdk == {@param targetSdkVersion} for
     * {@param packageName}.
     *
     * @return The number of changes that were toggled.
     */
    int enableTargetSdkChangesForPackage(String packageName, int targetSdkVersion)
            throws RemoteException {
        long[] changes = getAllowedChangesAfterTargetSdkForPackage(packageName, targetSdkVersion);
        long[] changes = getAllowedChangesSinceTargetSdkForPackage(packageName, targetSdkVersion);
        for (long changeId : changes) {
            addOverride(changeId, packageName, true);
        }
@@ -361,14 +364,14 @@ final class CompatConfig {


    /**
     * Disables all changes with enabledAfterTargetSdk == {@param targetSdkVersion} for
     * Disables all changes with enabledSinceTargetSdk == {@param targetSdkVersion} for
     * {@param packageName}.
     *
     * @return The number of changes that were toggled.
     */
    int disableTargetSdkChangesForPackage(String packageName, int targetSdkVersion)
            throws RemoteException {
        long[] changes = getAllowedChangesAfterTargetSdkForPackage(packageName, targetSdkVersion);
        long[] changes = getAllowedChangesSinceTargetSdkForPackage(packageName, targetSdkVersion);
        for (long changeId : changes) {
            addOverride(changeId, packageName, false);
        }
@@ -448,12 +451,7 @@ final class CompatConfig {
            CompatibilityChangeInfo[] changeInfos = new CompatibilityChangeInfo[mChanges.size()];
            for (int i = 0; i < mChanges.size(); ++i) {
                CompatChange change = mChanges.valueAt(i);
                changeInfos[i] = new CompatibilityChangeInfo(change.getId(),
                        change.getName(),
                        change.getEnableAfterTargetSdk(),
                        change.getDisabled(),
                        change.getLoggingOnly(),
                        change.getDescription());
                changeInfos[i] = new CompatibilityChangeInfo(change);
            }
            return changeInfos;
        }
+7 −7
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ public class OverrideValidatorImpl extends IOverrideValidator.Stub {

        boolean debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild();
        boolean finalBuild = mAndroidBuildClassifier.isFinalBuild();
        int minTargetSdk = mCompatConfig.minTargetSdkForChangeId(changeId);
        int maxTargetSdk = mCompatConfig.maxTargetSdkForChangeIdOptIn(changeId);
        boolean disabled = mCompatConfig.isDisabled(changeId);

        // Allow any override for userdebug or eng builds.
@@ -82,16 +82,16 @@ public class OverrideValidatorImpl extends IOverrideValidator.Stub {
        }
        // Allow overriding any change for debuggable apps on non-final builds.
        if (!finalBuild) {
            return new OverrideAllowedState(ALLOWED, appTargetSdk, minTargetSdk);
            return new OverrideAllowedState(ALLOWED, appTargetSdk, maxTargetSdk);
        }
        // Do not allow overriding default enabled changes on user builds
        if (minTargetSdk == -1 && !disabled) {
            return new OverrideAllowedState(DISABLED_NON_TARGET_SDK, appTargetSdk, minTargetSdk);
        if (maxTargetSdk == -1 && !disabled) {
            return new OverrideAllowedState(DISABLED_NON_TARGET_SDK, appTargetSdk, maxTargetSdk);
        }
        // Only allow to opt-in for a targetSdk gated change.
        if (disabled || appTargetSdk <= minTargetSdk) {
            return new OverrideAllowedState(ALLOWED, appTargetSdk, minTargetSdk);
        if (disabled || appTargetSdk <= maxTargetSdk) {
            return new OverrideAllowedState(ALLOWED, appTargetSdk, maxTargetSdk);
        }
        return new OverrideAllowedState(DISABLED_TARGET_SDK_TOO_HIGH, appTargetSdk, minTargetSdk);
        return new OverrideAllowedState(DISABLED_TARGET_SDK_TOO_HIGH, appTargetSdk, maxTargetSdk);
    }
}
Loading