diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 35007aec01856..3a1961a1c741a 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -5961,6 +5961,20 @@ public final class ActivityThread extends ClientTransactionHandler // Update all affected Resources objects to use new ResourcesImpl mResourcesManager.applyNewResourceDirsLocked(ai, oldResDirs); } + + ApplicationPackageManager.configurationChanged(); + + // Trigger a regular Configuration change event, only with a different assetsSeq number + // so that we actually call through to all components. + // TODO(adamlesinski): Change this to make use of ActivityManager's upcoming ability to + // store configurations per-process. + final Configuration config = mConfigurationController.getConfiguration(); + Configuration newConfig = new Configuration(); + newConfig.assetsSeq = (config != null ? config.assetsSeq : 0) + 1; + mConfigurationController.handleConfigurationChanged(newConfig, null /* compat */); + + // Preserve windows to avoid black flickers when overlays change. + relaunchAllActivities(true /* preserveWindows */, "handleApplicationInfoChanged"); } /** diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index 6f17ea9946998..2e2e6bd075395 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -184,6 +184,15 @@ public class ActivityThreadTest { }); } + @Test + public void testHandleActivity_assetsChanged() { + relaunchActivityAndAssertPreserveWindow(activity -> { + // Relaunches all activities. + activity.getActivityThread().handleApplicationInfoChanged( + activity.getApplicationInfo()); + }); + } + @Test public void testRecreateActivity() { relaunchActivityAndAssertPreserveWindow(Activity::recreate); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 774825ee885ca..fae941d172a21 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -77,7 +77,6 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManagerInternal; -import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Point; import android.net.LocalSocket; @@ -4644,12 +4643,6 @@ public final class ProcessList { } }); } - - // Update the global configuration and increase the assets sequence number. - Configuration currentConfig = mService.mActivityTaskManager.getConfiguration(); - Configuration newConfig = new Configuration(); - newConfig.assetsSeq = (currentConfig != null ? currentConfig.assetsSeq : 0) + 1; - mService.mActivityTaskManager.updateConfiguration(newConfig); } @GuardedBy("mService")