diff options
| -rw-r--r-- | core/java/android/app/Presentation.java | 6 | ||||
| -rw-r--r-- | core/java/android/app/ResourcesManager.java | 15 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/app/activity/ActivityThreadTest.java | 60 |
3 files changed, 68 insertions, 13 deletions
diff --git a/core/java/android/app/Presentation.java b/core/java/android/app/Presentation.java index 7a18b8120d7e..bae6ab5ea80c 100644 --- a/core/java/android/app/Presentation.java +++ b/core/java/android/app/Presentation.java @@ -236,7 +236,7 @@ public class Presentation extends Dialog { // to be rare but surprising, so we'll write a log message about it. if (!isConfigurationStillValid()) { Log.i(TAG, "Presentation is being dismissed because the " - + "display metrics have changed since it was created."); + + "display metrics have changed since it was created while onStart."); mHandler.sendEmptyMessage(MSG_CANCEL); } } @@ -296,8 +296,8 @@ public class Presentation extends Dialog { // is invalid and the application must recreate the presentation to get // a new context. if (!isConfigurationStillValid()) { - Log.i(TAG, "Presentation is being dismissed because the " - + "display metrics have changed since it was created."); + Log.i(TAG, "Presentation is being dismissed because the display metrics have changed " + + "since it was created while handleDisplayChanged."); cancel(); } } diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index 47ccc2f0badb..c2caa40ba950 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -1111,7 +1111,6 @@ public class ResourcesManager { } int displayId = key.mDisplayId; final boolean hasOverrideConfiguration = key.hasOverrideConfiguration(); - tmpConfig.setTo(config); // Get new DisplayMetrics based on the DisplayAdjustments given to the ResourcesImpl. Update // a copy if the CompatibilityInfo changed, because the ResourcesImpl object will handle the @@ -1121,17 +1120,15 @@ public class ResourcesManager { daj = new DisplayAdjustments(daj); daj.setCompatibilityInfo(compat); } - if (displayId == Display.DEFAULT_DISPLAY) { - daj.setConfiguration(config); - } - DisplayMetrics dm = getDisplayMetrics(displayId, daj); - if (displayId != Display.DEFAULT_DISPLAY) { - applyNonDefaultDisplayMetricsToConfiguration(dm, tmpConfig); - } - + tmpConfig.setTo(config); if (hasOverrideConfiguration) { tmpConfig.updateFrom(key.mOverrideConfiguration); } + // Only apply for default display + if (displayId == Display.DEFAULT_DISPLAY) { + daj.setConfiguration(tmpConfig); + } + DisplayMetrics dm = getDisplayMetrics(displayId, daj); resourcesImpl.updateConfiguration(tmpConfig, dm, compat); } diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index c328d720426d..ddb39e7e8834 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -40,7 +40,10 @@ import android.app.servertransaction.ResumeActivityItem; import android.app.servertransaction.StopActivityItem; import android.content.Intent; import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Rect; import android.os.IBinder; +import android.util.DisplayMetrics; import android.util.MergedConfiguration; import android.view.Display; import android.view.View; @@ -307,6 +310,58 @@ public class ActivityThreadTest { } @Test + public void testHandleConfigurationChangedDoesntOverrideActivityConfig() { + final TestActivity activity = mActivityTestRule.launchActivity(new Intent()); + + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + final Configuration oldActivityConfig = + new Configuration(activity.getResources().getConfiguration()); + final DisplayMetrics oldActivityMetrics = new DisplayMetrics(); + activity.getDisplay().getMetrics(oldActivityMetrics); + final Resources oldAppResources = activity.getApplication().getResources(); + final Configuration oldAppConfig = + new Configuration(oldAppResources.getConfiguration()); + final DisplayMetrics oldApplicationMetrics = new DisplayMetrics(); + oldApplicationMetrics.setTo(oldAppResources.getDisplayMetrics()); + assertEquals("Process config must match the top activity config by default", + 0, oldActivityConfig.diffPublicOnly(oldAppConfig)); + assertEquals("Process config must match the top activity config by default", + oldActivityMetrics, oldApplicationMetrics); + + // Update the application configuration separately from activity config + final Configuration newAppConfig = new Configuration(oldAppConfig); + newAppConfig.densityDpi += 100; + newAppConfig.screenHeightDp += 100; + final Rect newBounds = new Rect(newAppConfig.windowConfiguration.getAppBounds()); + newBounds.bottom += 100; + newAppConfig.windowConfiguration.setAppBounds(newBounds); + newAppConfig.windowConfiguration.setBounds(newBounds); + newAppConfig.seq++; + + final ActivityThread activityThread = activity.getActivityThread(); + activityThread.handleConfigurationChanged(newAppConfig); + + // Verify that application config update was applied, but didn't change activity config. + assertEquals("Activity config must not change if the process config changes", + oldActivityConfig, activity.getResources().getConfiguration()); + + final DisplayMetrics newActivityMetrics = new DisplayMetrics(); + activity.getDisplay().getMetrics(newActivityMetrics); + assertEquals("Activity display size must not change if the process config changes", + oldActivityMetrics, newActivityMetrics); + final Resources newAppResources = activity.getApplication().getResources(); + assertEquals("Application config must be updated", + newAppConfig, newAppResources.getConfiguration()); + final DisplayMetrics newApplicationMetrics = new DisplayMetrics(); + newApplicationMetrics.setTo(newAppResources.getDisplayMetrics()); + assertNotEquals("Application display size must be updated after config update", + oldApplicationMetrics, newApplicationMetrics); + assertNotEquals("Application display size must be updated after config update", + newActivityMetrics, newApplicationMetrics); + }); + } + + @Test public void testResumeAfterNewIntent() { final Activity activity = mActivityTestRule.launchActivity(new Intent()); final ActivityThread activityThread = activity.getActivityThread(); @@ -406,7 +461,10 @@ public class ActivityThreadTest { private static ClientTransaction newRelaunchResumeTransaction(Activity activity) { final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(null, - null, 0, new MergedConfiguration(), false /* preserveWindow */); + null, 0, new MergedConfiguration( + activity.getApplication().getResources().getConfiguration(), + new Configuration()), + false /* preserveWindow */); final ResumeActivityItem resumeStateRequest = ResumeActivityItem.obtain(true /* isForward */); |