Loading core/java/com/android/internal/compat/CompatibilityChangeInfo.java +37 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,43 @@ public class CompatibilityChangeInfo implements Parcelable { dest.writeString(mDescription); } @Override public String toString() { StringBuilder sb = new StringBuilder("CompatibilityChangeInfo(") .append(getId()); if (getName() != null) { sb.append("; name=").append(getName()); } if (getEnableAfterTargetSdk() != -1) { sb.append("; enableAfterTargetSdk=").append(getEnableAfterTargetSdk()); } if (getDisabled()) { sb.append("; disabled"); } if (getLoggingOnly()) { sb.append("; loggingOnly"); } return sb.append(")").toString(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || !(o instanceof CompatibilityChangeInfo)) { return false; } CompatibilityChangeInfo that = (CompatibilityChangeInfo) o; return this.mChangeId == that.mChangeId && this.mName.equals(that.mName) && this.mEnableAfterTargetSdk == that.mEnableAfterTargetSdk && this.mDisabled == that.mDisabled && this.mLoggingOnly == that.mLoggingOnly && this.mDescription.equals(that.mDescription); } public static final Parcelable.Creator<CompatibilityChangeInfo> CREATOR = new Parcelable.Creator<CompatibilityChangeInfo>() { Loading core/java/com/android/internal/compat/IPlatformCompat.aidl +8 −0 Original line number Diff line number Diff line Loading @@ -221,6 +221,14 @@ interface IPlatformCompat */ CompatibilityChangeInfo[] listAllChanges(); /** * List the compatibility changes that should be present in the UI. * Filters out certain changes like e.g. logging only. * * @return An array of {@link CompatChangeInfo}. */ CompatibilityChangeInfo[] listUIChanges(); /** * Get an instance that can determine whether a changeid can be overridden for a package name. */ Loading services/core/java/com/android/server/compat/PlatformCompat.java +24 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Build; import android.os.RemoteException; import android.os.UserHandle; import android.util.Slog; Loading @@ -44,6 +45,7 @@ import com.android.server.LocalServices; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Arrays; /** * System server internal API for gating and reporting compatibility changes. Loading @@ -56,6 +58,9 @@ public class PlatformCompat extends IPlatformCompat.Stub { private final ChangeReporter mChangeReporter; private final CompatConfig mCompatConfig; private static int sMinTargetSdk = Build.VERSION_CODES.P; private static int sMaxTargetSdk = Build.VERSION_CODES.Q; public PlatformCompat(Context context) { mContext = context; mChangeReporter = new ChangeReporter( Loading Loading @@ -220,6 +225,12 @@ public class PlatformCompat extends IPlatformCompat.Stub { return mCompatConfig.dumpChanges(); } @Override public CompatibilityChangeInfo[] listUIChanges() { return Arrays.stream(listAllChanges()).filter( x -> isShownInUI(x)).toArray(CompatibilityChangeInfo[]::new); } /** * Check whether the change is known to the compat config. * Loading Loading @@ -339,4 +350,17 @@ public class PlatformCompat extends IPlatformCompat.Stub { checkCompatChangeReadPermission(); checkCompatChangeLogPermission(); } private boolean isShownInUI(CompatibilityChangeInfo change) { if (change.getLoggingOnly()) { return false; } if (change.getEnableAfterTargetSdk() != 0) { if (change.getEnableAfterTargetSdk() < sMinTargetSdk || change.getEnableAfterTargetSdk() > sMaxTargetSdk) { return false; } } return true; } } services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java +43 −0 Original line number Diff line number Diff line Loading @@ -30,10 +30,12 @@ import static org.testng.Assert.assertThrows; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Build; import androidx.test.runner.AndroidJUnit4; import com.android.internal.compat.AndroidBuildClassifier; import com.android.internal.compat.CompatibilityChangeInfo; import com.android.server.LocalServices; import org.junit.Before; Loading Loading @@ -77,6 +79,47 @@ public class PlatformCompatTest { LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal); } @Test public void testListAllChanges() { mCompatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) .addEnabledChangeWithId(1L) .addDisabledChangeWithIdAndName(2L, "change2") .addTargetSdkChangeWithIdAndDescription(Build.VERSION_CODES.O, 3L, "description") .addTargetSdkChangeWithId(Build.VERSION_CODES.P, 4L) .addTargetSdkChangeWithId(Build.VERSION_CODES.Q, 5L) .addTargetSdkChangeWithId(Build.VERSION_CODES.R, 6L) .addLoggingOnlyChangeWithId(7L) .build(); mPlatformCompat = new PlatformCompat(mContext, mCompatConfig); assertThat(mPlatformCompat.listAllChanges()).asList().containsExactly( new CompatibilityChangeInfo(1L, "", -1, false, false, ""), new CompatibilityChangeInfo(2L, "change2", -1, true, false, ""), new CompatibilityChangeInfo(3L, "", Build.VERSION_CODES.O, false, false, "description"), new CompatibilityChangeInfo(4L, "", Build.VERSION_CODES.P, false, false, ""), new CompatibilityChangeInfo(5L, "", Build.VERSION_CODES.Q, false, false, ""), new CompatibilityChangeInfo(6L, "", Build.VERSION_CODES.R, false, false, ""), new CompatibilityChangeInfo(7L, "", -1, false, true, "")); } public void testListUIChanges() { mCompatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) .addEnabledChangeWithId(1L) .addDisabledChangeWithIdAndName(2L, "change2") .addTargetSdkChangeWithIdAndDescription(Build.VERSION_CODES.O, 3L, "description") .addTargetSdkChangeWithId(Build.VERSION_CODES.P, 4L) .addTargetSdkChangeWithId(Build.VERSION_CODES.Q, 5L) .addTargetSdkChangeWithId(Build.VERSION_CODES.R, 6L) .addLoggingOnlyChangeWithId(7L) .build(); mPlatformCompat = new PlatformCompat(mContext, mCompatConfig); assertThat(mPlatformCompat.listUIChanges()).asList().containsExactly( new CompatibilityChangeInfo(1L, "", -1, false, false, ""), new CompatibilityChangeInfo(2L, "change2", -1, true, false, ""), new CompatibilityChangeInfo(4L, "", Build.VERSION_CODES.P, false, false, ""), new CompatibilityChangeInfo(5L, "", Build.VERSION_CODES.Q, false, false, "")); } @Test public void testRegisterListenerToSameIdThrows() throws Exception { // Registering a listener to change 1 is successful. Loading Loading
core/java/com/android/internal/compat/CompatibilityChangeInfo.java +37 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,43 @@ public class CompatibilityChangeInfo implements Parcelable { dest.writeString(mDescription); } @Override public String toString() { StringBuilder sb = new StringBuilder("CompatibilityChangeInfo(") .append(getId()); if (getName() != null) { sb.append("; name=").append(getName()); } if (getEnableAfterTargetSdk() != -1) { sb.append("; enableAfterTargetSdk=").append(getEnableAfterTargetSdk()); } if (getDisabled()) { sb.append("; disabled"); } if (getLoggingOnly()) { sb.append("; loggingOnly"); } return sb.append(")").toString(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || !(o instanceof CompatibilityChangeInfo)) { return false; } CompatibilityChangeInfo that = (CompatibilityChangeInfo) o; return this.mChangeId == that.mChangeId && this.mName.equals(that.mName) && this.mEnableAfterTargetSdk == that.mEnableAfterTargetSdk && this.mDisabled == that.mDisabled && this.mLoggingOnly == that.mLoggingOnly && this.mDescription.equals(that.mDescription); } public static final Parcelable.Creator<CompatibilityChangeInfo> CREATOR = new Parcelable.Creator<CompatibilityChangeInfo>() { Loading
core/java/com/android/internal/compat/IPlatformCompat.aidl +8 −0 Original line number Diff line number Diff line Loading @@ -221,6 +221,14 @@ interface IPlatformCompat */ CompatibilityChangeInfo[] listAllChanges(); /** * List the compatibility changes that should be present in the UI. * Filters out certain changes like e.g. logging only. * * @return An array of {@link CompatChangeInfo}. */ CompatibilityChangeInfo[] listUIChanges(); /** * Get an instance that can determine whether a changeid can be overridden for a package name. */ Loading
services/core/java/com/android/server/compat/PlatformCompat.java +24 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Build; import android.os.RemoteException; import android.os.UserHandle; import android.util.Slog; Loading @@ -44,6 +45,7 @@ import com.android.server.LocalServices; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Arrays; /** * System server internal API for gating and reporting compatibility changes. Loading @@ -56,6 +58,9 @@ public class PlatformCompat extends IPlatformCompat.Stub { private final ChangeReporter mChangeReporter; private final CompatConfig mCompatConfig; private static int sMinTargetSdk = Build.VERSION_CODES.P; private static int sMaxTargetSdk = Build.VERSION_CODES.Q; public PlatformCompat(Context context) { mContext = context; mChangeReporter = new ChangeReporter( Loading Loading @@ -220,6 +225,12 @@ public class PlatformCompat extends IPlatformCompat.Stub { return mCompatConfig.dumpChanges(); } @Override public CompatibilityChangeInfo[] listUIChanges() { return Arrays.stream(listAllChanges()).filter( x -> isShownInUI(x)).toArray(CompatibilityChangeInfo[]::new); } /** * Check whether the change is known to the compat config. * Loading Loading @@ -339,4 +350,17 @@ public class PlatformCompat extends IPlatformCompat.Stub { checkCompatChangeReadPermission(); checkCompatChangeLogPermission(); } private boolean isShownInUI(CompatibilityChangeInfo change) { if (change.getLoggingOnly()) { return false; } if (change.getEnableAfterTargetSdk() != 0) { if (change.getEnableAfterTargetSdk() < sMinTargetSdk || change.getEnableAfterTargetSdk() > sMaxTargetSdk) { return false; } } return true; } }
services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java +43 −0 Original line number Diff line number Diff line Loading @@ -30,10 +30,12 @@ import static org.testng.Assert.assertThrows; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Build; import androidx.test.runner.AndroidJUnit4; import com.android.internal.compat.AndroidBuildClassifier; import com.android.internal.compat.CompatibilityChangeInfo; import com.android.server.LocalServices; import org.junit.Before; Loading Loading @@ -77,6 +79,47 @@ public class PlatformCompatTest { LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal); } @Test public void testListAllChanges() { mCompatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) .addEnabledChangeWithId(1L) .addDisabledChangeWithIdAndName(2L, "change2") .addTargetSdkChangeWithIdAndDescription(Build.VERSION_CODES.O, 3L, "description") .addTargetSdkChangeWithId(Build.VERSION_CODES.P, 4L) .addTargetSdkChangeWithId(Build.VERSION_CODES.Q, 5L) .addTargetSdkChangeWithId(Build.VERSION_CODES.R, 6L) .addLoggingOnlyChangeWithId(7L) .build(); mPlatformCompat = new PlatformCompat(mContext, mCompatConfig); assertThat(mPlatformCompat.listAllChanges()).asList().containsExactly( new CompatibilityChangeInfo(1L, "", -1, false, false, ""), new CompatibilityChangeInfo(2L, "change2", -1, true, false, ""), new CompatibilityChangeInfo(3L, "", Build.VERSION_CODES.O, false, false, "description"), new CompatibilityChangeInfo(4L, "", Build.VERSION_CODES.P, false, false, ""), new CompatibilityChangeInfo(5L, "", Build.VERSION_CODES.Q, false, false, ""), new CompatibilityChangeInfo(6L, "", Build.VERSION_CODES.R, false, false, ""), new CompatibilityChangeInfo(7L, "", -1, false, true, "")); } public void testListUIChanges() { mCompatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) .addEnabledChangeWithId(1L) .addDisabledChangeWithIdAndName(2L, "change2") .addTargetSdkChangeWithIdAndDescription(Build.VERSION_CODES.O, 3L, "description") .addTargetSdkChangeWithId(Build.VERSION_CODES.P, 4L) .addTargetSdkChangeWithId(Build.VERSION_CODES.Q, 5L) .addTargetSdkChangeWithId(Build.VERSION_CODES.R, 6L) .addLoggingOnlyChangeWithId(7L) .build(); mPlatformCompat = new PlatformCompat(mContext, mCompatConfig); assertThat(mPlatformCompat.listUIChanges()).asList().containsExactly( new CompatibilityChangeInfo(1L, "", -1, false, false, ""), new CompatibilityChangeInfo(2L, "change2", -1, true, false, ""), new CompatibilityChangeInfo(4L, "", Build.VERSION_CODES.P, false, false, ""), new CompatibilityChangeInfo(5L, "", Build.VERSION_CODES.Q, false, false, "")); } @Test public void testRegisterListenerToSameIdThrows() throws Exception { // Registering a listener to change 1 is successful. Loading