Loading core/java/com/android/internal/compat/CompatibilityChangeInfo.java +9 −1 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,7 @@ public class CompatibilityChangeInfo implements Parcelable { private final @Nullable String mName; private final @Nullable String mName; private final int mEnableAfterTargetSdk; private final int mEnableAfterTargetSdk; private final boolean mDisabled; private final boolean mDisabled; private final boolean mLoggingOnly; private final @Nullable String mDescription; private final @Nullable String mDescription; public long getId() { public long getId() { Loading @@ -49,17 +50,22 @@ public class CompatibilityChangeInfo implements Parcelable { return mDisabled; return mDisabled; } } public boolean getLoggingOnly() { return mLoggingOnly; } public String getDescription() { public String getDescription() { return mDescription; return mDescription; } } public CompatibilityChangeInfo( public CompatibilityChangeInfo( Long changeId, String name, int enableAfterTargetSdk, boolean disabled, Long changeId, String name, int enableAfterTargetSdk, boolean disabled, String description) { boolean loggingOnly, String description) { this.mChangeId = changeId; this.mChangeId = changeId; this.mName = name; this.mName = name; this.mEnableAfterTargetSdk = enableAfterTargetSdk; this.mEnableAfterTargetSdk = enableAfterTargetSdk; this.mDisabled = disabled; this.mDisabled = disabled; this.mLoggingOnly = loggingOnly; this.mDescription = description; this.mDescription = description; } } Loading @@ -68,6 +74,7 @@ public class CompatibilityChangeInfo implements Parcelable { mName = in.readString(); mName = in.readString(); mEnableAfterTargetSdk = in.readInt(); mEnableAfterTargetSdk = in.readInt(); mDisabled = in.readBoolean(); mDisabled = in.readBoolean(); mLoggingOnly = in.readBoolean(); mDescription = in.readString(); mDescription = in.readString(); } } Loading @@ -82,6 +89,7 @@ public class CompatibilityChangeInfo implements Parcelable { dest.writeString(mName); dest.writeString(mName); dest.writeInt(mEnableAfterTargetSdk); dest.writeInt(mEnableAfterTargetSdk); dest.writeBoolean(mDisabled); dest.writeBoolean(mDisabled); dest.writeBoolean(mLoggingOnly); dest.writeString(mDescription); dest.writeString(mDescription); } } Loading core/java/com/android/internal/compat/OverrideAllowedState.java +10 −1 Original line number Original line Diff line number Diff line Loading @@ -33,7 +33,8 @@ public final class OverrideAllowedState implements Parcelable { DISABLED_NOT_DEBUGGABLE, DISABLED_NOT_DEBUGGABLE, DISABLED_NON_TARGET_SDK, DISABLED_NON_TARGET_SDK, DISABLED_TARGET_SDK_TOO_HIGH, DISABLED_TARGET_SDK_TOO_HIGH, PACKAGE_DOES_NOT_EXIST PACKAGE_DOES_NOT_EXIST, LOGGING_ONLY_CHANGE }) }) @Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE) public @interface State { public @interface State { Loading @@ -60,6 +61,10 @@ public final class OverrideAllowedState implements Parcelable { * Package does not exist. * Package does not exist. */ */ public static final int PACKAGE_DOES_NOT_EXIST = 4; public static final int PACKAGE_DOES_NOT_EXIST = 4; /** * Change is marked as logging only, and cannot be toggled. */ public static final int LOGGING_ONLY_CHANGE = 5; @State @State public final int state; public final int state; Loading Loading @@ -118,6 +123,10 @@ public final class OverrideAllowedState implements Parcelable { "Cannot override %1$d for %2$s because the package does not exist, and " "Cannot override %1$d for %2$s because the package does not exist, and " + "the change is targetSdk gated.", + "the change is targetSdk gated.", changeId, packageName)); changeId, packageName)); case LOGGING_ONLY_CHANGE: throw new SecurityException(String.format( "Cannot override %1$d because it is marked as a logging-only change.", changeId)); } } } } Loading services/core/java/com/android/server/compat/CompatChange.java +11 −4 Original line number Original line Diff line number Diff line Loading @@ -63,7 +63,7 @@ public final class CompatChange extends CompatibilityChangeInfo { private Map<String, Boolean> mPackageOverrides; private Map<String, Boolean> mPackageOverrides; public CompatChange(long changeId) { public CompatChange(long changeId) { this(changeId, null, -1, false, null); this(changeId, null, -1, false, false, null); } } /** /** Loading @@ -74,8 +74,8 @@ public final class CompatChange extends CompatibilityChangeInfo { * @param disabled If {@code true}, overrides any {@code enableAfterTargetSdk} set. * @param disabled If {@code true}, overrides any {@code enableAfterTargetSdk} set. */ */ public CompatChange(long changeId, @Nullable String name, int enableAfterTargetSdk, public CompatChange(long changeId, @Nullable String name, int enableAfterTargetSdk, boolean disabled, String description) { boolean disabled, boolean loggingOnly, String description) { super(changeId, name, enableAfterTargetSdk, disabled, description); super(changeId, name, enableAfterTargetSdk, disabled, loggingOnly, description); } } /** /** Loading @@ -83,7 +83,7 @@ public final class CompatChange extends CompatibilityChangeInfo { */ */ public CompatChange(Change change) { public CompatChange(Change change) { super(change.getId(), change.getName(), change.getEnableAfterTargetSdk(), super(change.getId(), change.getName(), change.getEnableAfterTargetSdk(), change.getDisabled(), change.getDescription()); change.getDisabled(), change.getLoggingOnly(), change.getDescription()); } } void registerListener(ChangeListener listener) { void registerListener(ChangeListener listener) { Loading @@ -105,6 +105,10 @@ public final class CompatChange extends CompatibilityChangeInfo { * @param enabled Whether or not to enable the change. * @param enabled Whether or not to enable the change. */ */ void addPackageOverride(String pname, boolean enabled) { void addPackageOverride(String pname, boolean enabled) { if (getLoggingOnly()) { throw new IllegalArgumentException( "Can't add overrides for a logging only change " + toString()); } if (mPackageOverrides == null) { if (mPackageOverrides == null) { mPackageOverrides = new HashMap<>(); mPackageOverrides = new HashMap<>(); } } Loading Loading @@ -160,6 +164,9 @@ public final class CompatChange extends CompatibilityChangeInfo { if (getDisabled()) { if (getDisabled()) { sb.append("; disabled"); sb.append("; disabled"); } } if (getLoggingOnly()) { sb.append("; loggingOnly"); } if (mPackageOverrides != null && mPackageOverrides.size() > 0) { if (mPackageOverrides != null && mPackageOverrides.size() > 0) { sb.append("; packageOverrides=").append(mPackageOverrides); sb.append("; packageOverrides=").append(mPackageOverrides); } } Loading services/core/java/com/android/server/compat/CompatConfig.java +14 −0 Original line number Original line Diff line number Diff line Loading @@ -205,6 +205,19 @@ final class CompatConfig { } } } } /** * Returns whether the change is marked as logging only. */ boolean isLoggingOnly(long changeId) { synchronized (mChanges) { CompatChange c = mChanges.get(changeId); if (c == null) { return false; } return c.getLoggingOnly(); } } /** /** * Removes an override previously added via {@link #addOverride(long, String, boolean)}. This * Removes an override previously added via {@link #addOverride(long, String, boolean)}. This * restores the default behaviour for the given change and app, once any app processes have been * restores the default behaviour for the given change and app, once any app processes have been Loading Loading @@ -365,6 +378,7 @@ final class CompatConfig { change.getName(), change.getName(), change.getEnableAfterTargetSdk(), change.getEnableAfterTargetSdk(), change.getDisabled(), change.getDisabled(), change.getLoggingOnly(), change.getDescription()); change.getDescription()); } } return changeInfos; return changeInfos; Loading services/core/java/com/android/server/compat/OverrideValidatorImpl.java +7 −5 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static com.android.internal.compat.OverrideAllowedState.ALLOWED; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NON_TARGET_SDK; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NON_TARGET_SDK; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NOT_DEBUGGABLE; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NOT_DEBUGGABLE; import static com.android.internal.compat.OverrideAllowedState.DISABLED_TARGET_SDK_TOO_HIGH; import static com.android.internal.compat.OverrideAllowedState.DISABLED_TARGET_SDK_TOO_HIGH; import static com.android.internal.compat.OverrideAllowedState.LOGGING_ONLY_CHANGE; import static com.android.internal.compat.OverrideAllowedState.PACKAGE_DOES_NOT_EXIST; import static com.android.internal.compat.OverrideAllowedState.PACKAGE_DOES_NOT_EXIST; import android.content.Context; import android.content.Context; Loading Loading @@ -51,12 +52,13 @@ public class OverrideValidatorImpl extends IOverrideValidator.Stub { @Override @Override public OverrideAllowedState getOverrideAllowedState(long changeId, String packageName) { public OverrideAllowedState getOverrideAllowedState(long changeId, String packageName) { boolean debuggableBuild = false; if (mCompatConfig.isLoggingOnly(changeId)) { boolean finalBuild = false; return new OverrideAllowedState(LOGGING_ONLY_CHANGE, -1, -1); int minTargetSdk = mCompatConfig.minTargetSdkForChangeId(changeId); } debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild(); boolean debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild(); finalBuild = mAndroidBuildClassifier.isFinalBuild(); boolean finalBuild = mAndroidBuildClassifier.isFinalBuild(); int minTargetSdk = mCompatConfig.minTargetSdkForChangeId(changeId); // Allow any override for userdebug or eng builds. // Allow any override for userdebug or eng builds. if (debuggableBuild) { if (debuggableBuild) { Loading Loading
core/java/com/android/internal/compat/CompatibilityChangeInfo.java +9 −1 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,7 @@ public class CompatibilityChangeInfo implements Parcelable { private final @Nullable String mName; private final @Nullable String mName; private final int mEnableAfterTargetSdk; private final int mEnableAfterTargetSdk; private final boolean mDisabled; private final boolean mDisabled; private final boolean mLoggingOnly; private final @Nullable String mDescription; private final @Nullable String mDescription; public long getId() { public long getId() { Loading @@ -49,17 +50,22 @@ public class CompatibilityChangeInfo implements Parcelable { return mDisabled; return mDisabled; } } public boolean getLoggingOnly() { return mLoggingOnly; } public String getDescription() { public String getDescription() { return mDescription; return mDescription; } } public CompatibilityChangeInfo( public CompatibilityChangeInfo( Long changeId, String name, int enableAfterTargetSdk, boolean disabled, Long changeId, String name, int enableAfterTargetSdk, boolean disabled, String description) { boolean loggingOnly, String description) { this.mChangeId = changeId; this.mChangeId = changeId; this.mName = name; this.mName = name; this.mEnableAfterTargetSdk = enableAfterTargetSdk; this.mEnableAfterTargetSdk = enableAfterTargetSdk; this.mDisabled = disabled; this.mDisabled = disabled; this.mLoggingOnly = loggingOnly; this.mDescription = description; this.mDescription = description; } } Loading @@ -68,6 +74,7 @@ public class CompatibilityChangeInfo implements Parcelable { mName = in.readString(); mName = in.readString(); mEnableAfterTargetSdk = in.readInt(); mEnableAfterTargetSdk = in.readInt(); mDisabled = in.readBoolean(); mDisabled = in.readBoolean(); mLoggingOnly = in.readBoolean(); mDescription = in.readString(); mDescription = in.readString(); } } Loading @@ -82,6 +89,7 @@ public class CompatibilityChangeInfo implements Parcelable { dest.writeString(mName); dest.writeString(mName); dest.writeInt(mEnableAfterTargetSdk); dest.writeInt(mEnableAfterTargetSdk); dest.writeBoolean(mDisabled); dest.writeBoolean(mDisabled); dest.writeBoolean(mLoggingOnly); dest.writeString(mDescription); dest.writeString(mDescription); } } Loading
core/java/com/android/internal/compat/OverrideAllowedState.java +10 −1 Original line number Original line Diff line number Diff line Loading @@ -33,7 +33,8 @@ public final class OverrideAllowedState implements Parcelable { DISABLED_NOT_DEBUGGABLE, DISABLED_NOT_DEBUGGABLE, DISABLED_NON_TARGET_SDK, DISABLED_NON_TARGET_SDK, DISABLED_TARGET_SDK_TOO_HIGH, DISABLED_TARGET_SDK_TOO_HIGH, PACKAGE_DOES_NOT_EXIST PACKAGE_DOES_NOT_EXIST, LOGGING_ONLY_CHANGE }) }) @Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE) public @interface State { public @interface State { Loading @@ -60,6 +61,10 @@ public final class OverrideAllowedState implements Parcelable { * Package does not exist. * Package does not exist. */ */ public static final int PACKAGE_DOES_NOT_EXIST = 4; public static final int PACKAGE_DOES_NOT_EXIST = 4; /** * Change is marked as logging only, and cannot be toggled. */ public static final int LOGGING_ONLY_CHANGE = 5; @State @State public final int state; public final int state; Loading Loading @@ -118,6 +123,10 @@ public final class OverrideAllowedState implements Parcelable { "Cannot override %1$d for %2$s because the package does not exist, and " "Cannot override %1$d for %2$s because the package does not exist, and " + "the change is targetSdk gated.", + "the change is targetSdk gated.", changeId, packageName)); changeId, packageName)); case LOGGING_ONLY_CHANGE: throw new SecurityException(String.format( "Cannot override %1$d because it is marked as a logging-only change.", changeId)); } } } } Loading
services/core/java/com/android/server/compat/CompatChange.java +11 −4 Original line number Original line Diff line number Diff line Loading @@ -63,7 +63,7 @@ public final class CompatChange extends CompatibilityChangeInfo { private Map<String, Boolean> mPackageOverrides; private Map<String, Boolean> mPackageOverrides; public CompatChange(long changeId) { public CompatChange(long changeId) { this(changeId, null, -1, false, null); this(changeId, null, -1, false, false, null); } } /** /** Loading @@ -74,8 +74,8 @@ public final class CompatChange extends CompatibilityChangeInfo { * @param disabled If {@code true}, overrides any {@code enableAfterTargetSdk} set. * @param disabled If {@code true}, overrides any {@code enableAfterTargetSdk} set. */ */ public CompatChange(long changeId, @Nullable String name, int enableAfterTargetSdk, public CompatChange(long changeId, @Nullable String name, int enableAfterTargetSdk, boolean disabled, String description) { boolean disabled, boolean loggingOnly, String description) { super(changeId, name, enableAfterTargetSdk, disabled, description); super(changeId, name, enableAfterTargetSdk, disabled, loggingOnly, description); } } /** /** Loading @@ -83,7 +83,7 @@ public final class CompatChange extends CompatibilityChangeInfo { */ */ public CompatChange(Change change) { public CompatChange(Change change) { super(change.getId(), change.getName(), change.getEnableAfterTargetSdk(), super(change.getId(), change.getName(), change.getEnableAfterTargetSdk(), change.getDisabled(), change.getDescription()); change.getDisabled(), change.getLoggingOnly(), change.getDescription()); } } void registerListener(ChangeListener listener) { void registerListener(ChangeListener listener) { Loading @@ -105,6 +105,10 @@ public final class CompatChange extends CompatibilityChangeInfo { * @param enabled Whether or not to enable the change. * @param enabled Whether or not to enable the change. */ */ void addPackageOverride(String pname, boolean enabled) { void addPackageOverride(String pname, boolean enabled) { if (getLoggingOnly()) { throw new IllegalArgumentException( "Can't add overrides for a logging only change " + toString()); } if (mPackageOverrides == null) { if (mPackageOverrides == null) { mPackageOverrides = new HashMap<>(); mPackageOverrides = new HashMap<>(); } } Loading Loading @@ -160,6 +164,9 @@ public final class CompatChange extends CompatibilityChangeInfo { if (getDisabled()) { if (getDisabled()) { sb.append("; disabled"); sb.append("; disabled"); } } if (getLoggingOnly()) { sb.append("; loggingOnly"); } if (mPackageOverrides != null && mPackageOverrides.size() > 0) { if (mPackageOverrides != null && mPackageOverrides.size() > 0) { sb.append("; packageOverrides=").append(mPackageOverrides); sb.append("; packageOverrides=").append(mPackageOverrides); } } Loading
services/core/java/com/android/server/compat/CompatConfig.java +14 −0 Original line number Original line Diff line number Diff line Loading @@ -205,6 +205,19 @@ final class CompatConfig { } } } } /** * Returns whether the change is marked as logging only. */ boolean isLoggingOnly(long changeId) { synchronized (mChanges) { CompatChange c = mChanges.get(changeId); if (c == null) { return false; } return c.getLoggingOnly(); } } /** /** * Removes an override previously added via {@link #addOverride(long, String, boolean)}. This * Removes an override previously added via {@link #addOverride(long, String, boolean)}. This * restores the default behaviour for the given change and app, once any app processes have been * restores the default behaviour for the given change and app, once any app processes have been Loading Loading @@ -365,6 +378,7 @@ final class CompatConfig { change.getName(), change.getName(), change.getEnableAfterTargetSdk(), change.getEnableAfterTargetSdk(), change.getDisabled(), change.getDisabled(), change.getLoggingOnly(), change.getDescription()); change.getDescription()); } } return changeInfos; return changeInfos; Loading
services/core/java/com/android/server/compat/OverrideValidatorImpl.java +7 −5 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static com.android.internal.compat.OverrideAllowedState.ALLOWED; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NON_TARGET_SDK; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NON_TARGET_SDK; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NOT_DEBUGGABLE; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NOT_DEBUGGABLE; import static com.android.internal.compat.OverrideAllowedState.DISABLED_TARGET_SDK_TOO_HIGH; import static com.android.internal.compat.OverrideAllowedState.DISABLED_TARGET_SDK_TOO_HIGH; import static com.android.internal.compat.OverrideAllowedState.LOGGING_ONLY_CHANGE; import static com.android.internal.compat.OverrideAllowedState.PACKAGE_DOES_NOT_EXIST; import static com.android.internal.compat.OverrideAllowedState.PACKAGE_DOES_NOT_EXIST; import android.content.Context; import android.content.Context; Loading Loading @@ -51,12 +52,13 @@ public class OverrideValidatorImpl extends IOverrideValidator.Stub { @Override @Override public OverrideAllowedState getOverrideAllowedState(long changeId, String packageName) { public OverrideAllowedState getOverrideAllowedState(long changeId, String packageName) { boolean debuggableBuild = false; if (mCompatConfig.isLoggingOnly(changeId)) { boolean finalBuild = false; return new OverrideAllowedState(LOGGING_ONLY_CHANGE, -1, -1); int minTargetSdk = mCompatConfig.minTargetSdkForChangeId(changeId); } debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild(); boolean debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild(); finalBuild = mAndroidBuildClassifier.isFinalBuild(); boolean finalBuild = mAndroidBuildClassifier.isFinalBuild(); int minTargetSdk = mCompatConfig.minTargetSdkForChangeId(changeId); // Allow any override for userdebug or eng builds. // Allow any override for userdebug or eng builds. if (debuggableBuild) { if (debuggableBuild) { Loading