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

Commit 6b408f80 authored by Anna Trostanetski's avatar Anna Trostanetski Committed by Android (Google) Code Review
Browse files

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

parents 3a18890e 373b2a21
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -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>() {

+8 −0
Original line number Diff line number Diff line
@@ -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.
     */
+24 −0
Original line number Diff line number Diff line
@@ -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;
    }
}
+43 −0
Original line number Diff line number Diff line
@@ -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,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.