Merge "Introduce listUIChanges API for developer UI" into rvc-dev

This commit is contained in:
Anna Trostanetski
2020-03-19 14:52:18 +00:00
committed by Android (Google) Code Review
4 changed files with 113 additions and 0 deletions

View File

@@ -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>() {

View File

@@ -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.
*/

View File

@@ -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;
@@ -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.
@@ -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(
@@ -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.
*
@@ -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;
}
}

View File

@@ -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;
@@ -77,6 +79,48 @@ 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, ""));
}
@Test
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.