Loading core/java/com/android/internal/compat/CompatibilityChangeInfo.java +28 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -42,8 +42,8 @@ public class CompatibilityChangeInfo implements Parcelable { return mName; } public int getEnableAfterTargetSdk() { return mEnableAfterTargetSdk; public int getEnableSinceTargetSdk() { return mEnableSinceTargetSdk; } public boolean getDisabled() { Loading @@ -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(); Loading @@ -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); Loading @@ -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"); Loading @@ -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); Loading core/java/com/android/internal/compat/IPlatformCompat.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -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. * Loading services/core/java/com/android/server/compat/CompatChange.java +12 −8 Original line number Diff line number Diff line Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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) { Loading Loading @@ -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; } Loading @@ -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"); Loading services/core/java/com/android/server/compat/CompatConfig.java +14 −16 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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(); Loading @@ -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 = Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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; } Loading services/core/java/com/android/server/compat/OverrideValidatorImpl.java +7 −7 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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
core/java/com/android/internal/compat/CompatibilityChangeInfo.java +28 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -42,8 +42,8 @@ public class CompatibilityChangeInfo implements Parcelable { return mName; } public int getEnableAfterTargetSdk() { return mEnableAfterTargetSdk; public int getEnableSinceTargetSdk() { return mEnableSinceTargetSdk; } public boolean getDisabled() { Loading @@ -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(); Loading @@ -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); Loading @@ -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"); Loading @@ -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); Loading
core/java/com/android/internal/compat/IPlatformCompat.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -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. * Loading
services/core/java/com/android/server/compat/CompatChange.java +12 −8 Original line number Diff line number Diff line Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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) { Loading Loading @@ -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; } Loading @@ -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"); Loading
services/core/java/com/android/server/compat/CompatConfig.java +14 −16 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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(); Loading @@ -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 = Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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; } Loading
services/core/java/com/android/server/compat/OverrideValidatorImpl.java +7 −7 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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); } }