From 70187af25ce3f56f85ddd703f982caa82f685605 Mon Sep 17 00:00:00 2001 From: Graciela Wissen Putri Date: Tue, 2 May 2023 15:32:24 +0000 Subject: [PATCH] Send update config change when letterbox is moved When letterbox is repositioned, window configuration bounds are changed. Because we currently only report public config changes in diffPublicOnly, the client doesn't report changes in window configuration. We should always report window configuration bounds change to notify that the position of window has changed. Bug: 262900133 Test: atest FrameworksCoreTests:android.app.activity.ActivityThreadTest Manual test with app in bug Change-Id: I9fc10876c03933ac8aac05205d56ad6537df72a8 --- core/java/android/app/ActivityThread.java | 6 ++++++ core/java/android/window/ConfigurationHelper.java | 2 +- .../src/android/app/activity/ActivityThreadTest.java | 6 ++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 29e135f8b0e97..4c90d7b225a5d 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -34,6 +34,7 @@ import static android.view.Display.INVALID_DISPLAY; import static android.window.ConfigurationHelper.freeTextLayoutCachesIfNeeded; import static android.window.ConfigurationHelper.isDifferentDisplay; import static android.window.ConfigurationHelper.shouldUpdateResources; +import static android.window.ConfigurationHelper.shouldUpdateWindowMetricsBounds; import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE; import static com.android.internal.os.SafeZipPathValidatorCallback.VALIDATE_ZIP_PATH_FOR_PATH_TRAVERSAL; @@ -6116,6 +6117,11 @@ public final class ActivityThread extends ClientTransactionHandler public static boolean shouldReportChange(@Nullable Configuration currentConfig, @NonNull Configuration newConfig, @Nullable SizeConfigurationBuckets sizeBuckets, int handledConfigChanges, boolean alwaysReportChange) { + // Always report changes in window configuration bounds + if (shouldUpdateWindowMetricsBounds(currentConfig, newConfig)) { + return true; + } + final int publicDiff = currentConfig.diffPublicOnly(newConfig); // Don't report the change if there's no public diff between current and new config. if (publicDiff == 0) { diff --git a/core/java/android/window/ConfigurationHelper.java b/core/java/android/window/ConfigurationHelper.java index e32adcf23a3b8..269ce083d2059 100644 --- a/core/java/android/window/ConfigurationHelper.java +++ b/core/java/android/window/ConfigurationHelper.java @@ -106,7 +106,7 @@ public class ConfigurationHelper { * @see WindowManager#getCurrentWindowMetrics() * @see WindowManager#getMaximumWindowMetrics() */ - private static boolean shouldUpdateWindowMetricsBounds(@NonNull Configuration currentConfig, + public static boolean shouldUpdateWindowMetricsBounds(@NonNull Configuration currentConfig, @NonNull Configuration newConfig) { final Rect currentBounds = currentConfig.windowConfiguration.getBounds(); final Rect newBounds = newConfig.windowConfiguration.getBounds(); diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index af81957d1e031..b73a87c8f0d96 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -451,10 +451,8 @@ public class ActivityThreadTest { final Rect bounds = activity.getWindowManager().getCurrentWindowMetrics().getBounds(); assertEquals(activityConfigPortrait.windowConfiguration.getBounds(), bounds); - // Ensure that Activity#onConfigurationChanged() not be called because the changes in - // WindowConfiguration shouldn't be reported, and we only apply the latest Configuration - // update in transaction. - assertEquals(numOfConfig, activity.mNumOfConfigChanges); + // Ensure changes in window configuration bounds are reported + assertEquals(numOfConfig + 1, activity.mNumOfConfigChanges); } @Test