Extend splash screen exception list to T

Extend the support of the exception list for T and apps targeting S and
T.

Test: atest ActivityRecordTests
Test: com.android.server.wm.SplashScreenExceptionListTest
Bug: 231708538
Change-Id: I5412e81f70cbc9aac3861d13d85e199e949bedc7
This commit is contained in:
Vadim Caen
2022-05-06 12:07:58 +02:00
committed by wilsonshih
parent a688a7499d
commit ba3d92d8e6
4 changed files with 61 additions and 37 deletions

View File

@@ -2314,7 +2314,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
final int type = getStartingWindowType(newTask, taskSwitch, processRunning, final int type = getStartingWindowType(newTask, taskSwitch, processRunning,
allowTaskSnapshot, activityCreated, activityAllDrawn, snapshot); allowTaskSnapshot, activityCreated, activityAllDrawn, snapshot);
//TODO(191787740) Remove for T //TODO(191787740) Remove for T+
final boolean useLegacy = type == STARTING_WINDOW_TYPE_SPLASH_SCREEN final boolean useLegacy = type == STARTING_WINDOW_TYPE_SPLASH_SCREEN
&& mWmService.mStartingSurfaceController.isExceptionApp(packageName, mTargetSdk, && mWmService.mStartingSurfaceController.isExceptionApp(packageName, mTargetSdk,
() -> { () -> {

View File

@@ -70,7 +70,7 @@ class SplashScreenExceptionList {
} }
/** /**
* Returns true if the packageName is in the list and the target sdk is before S. * Returns true if the packageName is in the list and the target sdk is before or including T.
* *
* @param packageName The package name of the application to check * @param packageName The package name of the application to check
* @param targetSdk The target sdk of the application * @param targetSdk The target sdk of the application
@@ -82,7 +82,7 @@ class SplashScreenExceptionList {
@SuppressWarnings("AndroidFrameworkCompatChange") // Target sdk check @SuppressWarnings("AndroidFrameworkCompatChange") // Target sdk check
public boolean isException(@NonNull String packageName, int targetSdk, public boolean isException(@NonNull String packageName, int targetSdk,
@Nullable Supplier<ApplicationInfo> infoSupplier) { @Nullable Supplier<ApplicationInfo> infoSupplier) {
if (targetSdk >= Build.VERSION_CODES.S) { if (targetSdk > Build.VERSION_CODES.TIRAMISU) {
return false; return false;
} }

View File

@@ -2630,7 +2630,11 @@ public class ActivityRecordTests extends WindowTestsBase {
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_WINDOW_MANAGER, DeviceConfig.setProperty(DeviceConfig.NAMESPACE_WINDOW_MANAGER,
"splash_screen_exception_list", DEFAULT_COMPONENT_PACKAGE_NAME, false); "splash_screen_exception_list", DEFAULT_COMPONENT_PACKAGE_NAME, false);
testLegacySplashScreen(Build.VERSION_CODES.R, TYPE_PARAMETER_LEGACY_SPLASH_SCREEN); testLegacySplashScreen(Build.VERSION_CODES.R, TYPE_PARAMETER_LEGACY_SPLASH_SCREEN);
testLegacySplashScreen(Build.VERSION_CODES.S, 0); testLegacySplashScreen(Build.VERSION_CODES.S, TYPE_PARAMETER_LEGACY_SPLASH_SCREEN);
testLegacySplashScreen(Build.VERSION_CODES.TIRAMISU,
TYPE_PARAMETER_LEGACY_SPLASH_SCREEN);
// Above T
testLegacySplashScreen(Build.VERSION_CODES.TIRAMISU + 1, 0);
} finally { } finally {
try { try {
DeviceConfig.setProperties(properties); DeviceConfig.setProperties(properties);

View File

@@ -90,13 +90,50 @@ public class SplashScreenExceptionListTest {
public void packageFromDeviceConfigIgnored() { public void packageFromDeviceConfigIgnored() {
setExceptionListAndWaitForCallback("com.test.nosplashscreen1,com.test.nosplashscreen2"); setExceptionListAndWaitForCallback("com.test.nosplashscreen1,com.test.nosplashscreen2");
assertIsException("com.test.nosplashscreen1", null); // In list, up to T included
assertIsException("com.test.nosplashscreen2", null); assertIsException("com.test.nosplashscreen1", VERSION_CODES.R);
assertIsException("com.test.nosplashscreen1", VERSION_CODES.S);
assertIsException("com.test.nosplashscreen1", VERSION_CODES.TIRAMISU);
assertIsNotException("com.test.nosplashscreen1", VERSION_CODES.S, null); // In list, after T
assertIsNotException("com.test.nosplashscreen2", VERSION_CODES.S, null); assertIsNotException("com.test.nosplashscreen2", VERSION_CODES.TIRAMISU + 1);
assertIsNotException("com.test.splashscreen", VERSION_CODES.S, null); assertIsNotException("com.test.nosplashscreen2", VERSION_CODES.CUR_DEVELOPMENT);
assertIsNotException("com.test.splashscreen", VERSION_CODES.R, null);
// Not in list, up to T included
assertIsNotException("com.test.splashscreen", VERSION_CODES.S);
assertIsNotException("com.test.splashscreen", VERSION_CODES.R);
assertIsNotException("com.test.splashscreen", VERSION_CODES.TIRAMISU);
}
@Test
public void metaDataOptOut() {
String packageName = "com.test.nosplashscreen_opt_out";
setExceptionListAndWaitForCallback(packageName);
Bundle metaData = new Bundle();
ApplicationInfo activityInfo = new ApplicationInfo();
activityInfo.metaData = metaData;
// No Exceptions
metaData.putBoolean("android.splashscreen.exception_opt_out", true);
assertIsNotException(packageName, VERSION_CODES.R, activityInfo);
assertIsNotException(packageName, VERSION_CODES.S, activityInfo);
assertIsNotException(packageName, VERSION_CODES.TIRAMISU, activityInfo);
// Exception up to T
metaData.putBoolean("android.splashscreen.exception_opt_out", false);
assertIsException(packageName, VERSION_CODES.R, activityInfo);
assertIsException(packageName, VERSION_CODES.S, activityInfo);
assertIsException(packageName, VERSION_CODES.TIRAMISU, activityInfo);
// No Exception after T
assertIsNotException(packageName, VERSION_CODES.TIRAMISU + 1, activityInfo);
assertIsNotException(packageName, VERSION_CODES.CUR_DEVELOPMENT, activityInfo);
// Edge Cases
activityInfo.metaData = null;
assertIsException(packageName, VERSION_CODES.R, activityInfo);
assertIsException(packageName, VERSION_CODES.R);
} }
private void setExceptionListAndWaitForCallback(String commaSeparatedList) { private void setExceptionListAndWaitForCallback(String commaSeparatedList) {
@@ -116,42 +153,25 @@ public class SplashScreenExceptionListTest {
} }
} }
@Test private void assertIsNotException(String packageName, int targetSdk) {
public void metaDataOptOut() { assertIsNotException(packageName, targetSdk, null);
String packageName = "com.test.nosplashscreen_opt_out";
setExceptionListAndWaitForCallback(packageName);
Bundle metaData = new Bundle();
ApplicationInfo activityInfo = new ApplicationInfo();
activityInfo.metaData = metaData;
// No Exceptions
metaData.putBoolean("android.splashscreen.exception_opt_out", true);
assertIsNotException(packageName, VERSION_CODES.R, activityInfo);
assertIsNotException(packageName, VERSION_CODES.S, activityInfo);
// Exception Pre S
metaData.putBoolean("android.splashscreen.exception_opt_out", false);
assertIsException(packageName, activityInfo);
assertIsNotException(packageName, VERSION_CODES.S, activityInfo);
// Edge Cases
activityInfo.metaData = null;
assertIsException(packageName, activityInfo);
assertIsException(packageName, null);
} }
private void assertIsNotException(String packageName, int targetSdk, private void assertIsNotException(String packageName, int targetSdk,
ApplicationInfo activityInfo) { ApplicationInfo activityInfo) {
assertFalse(String.format("%s (sdk=%d) should have not been considered as an exception", assertFalse(String.format("%s (sdk=%d) should have not been considered as an exception",
packageName, targetSdk), packageName, targetSdk),
mList.isException(packageName, targetSdk, () -> activityInfo)); mList.isException(packageName, targetSdk, () -> activityInfo));
} }
private void assertIsException(String packageName, int targetSdk) {
assertIsException(packageName, targetSdk, null);
}
private void assertIsException(String packageName, private void assertIsException(String packageName,
ApplicationInfo activityInfo) { int targetSdk, ApplicationInfo activityInfo) {
assertTrue(String.format("%s (sdk=%d) should have been considered as an exception", assertTrue(String.format("%s (sdk=%d) should have been considered as an exception",
packageName, VERSION_CODES.R), packageName, targetSdk),
mList.isException(packageName, VERSION_CODES.R, () -> activityInfo)); mList.isException(packageName, targetSdk, () -> activityInfo));
} }
} }