Loading services/core/java/com/android/server/wm/ActivityStarter.java +2 −1 Original line number Diff line number Diff line Loading @@ -872,7 +872,8 @@ class ActivityStarter { ProtoLog.v(WM_DEBUG_CONFIGURATION, "Updating to new configuration after starting activity."); mService.updateConfigurationLocked(mRequest.globalConfig, null, false); mService.updateConfigurationLocked(mRequest.globalConfig, false /* initLocale */); } // The original options may have additional info about metrics. The mOptions is not Loading services/core/java/com/android/server/wm/ActivityTaskManagerService.java +20 −52 Original line number Diff line number Diff line Loading @@ -518,16 +518,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private final WindowStyleCache<ActivityRecord.WindowStyle> mWindowStyleCache = new WindowStyleCache<>(ActivityRecord.WindowStyle::new); final UpdateConfigurationResult mTmpUpdateConfigurationResult = new UpdateConfigurationResult(); // TODO(b/258618073): Remove this and make the related methods return whether config is changed. static final class UpdateConfigurationResult { // Configuration changes that were updated. int changes; // If the activity was relaunched to match the new configuration. boolean activityRelaunched; } /** Current sequencing integer of the configuration, for skipping old configurations. */ private int mConfigurationSeq; Loading Loading @@ -991,7 +981,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mWindowManager.mRoot.onSettingsRetrieved(); // This happens before any activities are started, so we can change global configuration // in-place. updateConfigurationLocked(configuration, null, true); updateConfigurationLocked(configuration, true /* initLocale */); final Configuration globalConfig = getGlobalConfiguration(); ProtoLog.v(WM_DEBUG_CONFIGURATION, "Initial config: %s", globalConfig); Loading Loading @@ -4328,9 +4318,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { if (values != null) { Settings.System.clearConfiguration(values); } updateConfigurationLocked(values, null, false, false /* persistent */, UserHandle.USER_NULL, false /* deferResume */); return mTmpUpdateConfigurationResult.changes != 0; return updateConfigurationLocked(values, false /* initLocale */); } finally { Binder.restoreCallingIdentity(origId); } Loading Loading @@ -5014,16 +5002,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { : new Configuration(); } boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale) { return updateConfigurationLocked(values, starting, initLocale, false /* deferResume */); } boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale, boolean deferResume) { boolean updateConfigurationLocked(@NonNull Configuration values, boolean initLocale) { // pass UserHandle.USER_NULL as userId because we don't persist configuration for any user return updateConfigurationLocked(values, starting, initLocale, false /* persistent */, UserHandle.USER_NULL, deferResume); return updateConfigurationLocked(values, initLocale, false /* persistent */, UserHandle.USER_NULL); } public void updatePersistentConfiguration(Configuration values, @UserIdInt int userId) { Loading @@ -5033,8 +5015,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // Window configuration is unrelated to persistent configuration (e.g. font scale, // locale). Unset it to avoid affecting the current display configuration. values.windowConfiguration.setToDefaults(); updateConfigurationLocked(values, null, false, true, userId, false /* deferResume */); updateConfigurationLocked(values, false /* initLocale */, true /* persistent */, userId); } } finally { Binder.restoreCallingIdentity(origId); Loading @@ -5044,34 +5026,24 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { /** * Do either or both things: (1) change the current configuration, and (2) * make sure the given activity is running with the (now) current * configuration. Returns true if the activity has been left running, or * false if <var>starting</var> is being destroyed to match the new * configuration. * configuration. Returns true if the configuration is updated. * * @param userId is only used when persistent parameter is set to true to persist configuration * for that particular user */ boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale, boolean persistent, int userId, boolean deferResume) { int changes = 0; boolean kept = true; boolean updateConfigurationLocked(@NonNull Configuration values, boolean initLocale, boolean persistent, @UserIdInt int userId) { final int changes; deferWindowLayout(); try { if (values != null) { changes = updateGlobalConfigurationWithTransition( values, initLocale, persistent, userId); mTmpUpdateConfigurationResult.changes = changes; } if (!deferResume) { kept = ensureConfigAndVisibilityAfterUpdate(starting, changes); } ensureConfigAndVisibilityAfterUpdate(null /* starting */, changes); } finally { continueWindowLayout(); } mTmpUpdateConfigurationResult.activityRelaunched = !kept; return kept; return changes != 0; } /** This is mainly to handle changes in locale, font scale/weight, uiMode, asset paths. */ Loading Loading @@ -5871,11 +5843,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } /** Applies latest configuration and/or visibility updates if needed. */ boolean ensureConfigAndVisibilityAfterUpdate(ActivityRecord starting, int changes) { void ensureConfigAndVisibilityAfterUpdate(@Nullable ActivityRecord starting, int changes) { if (starting == null && mTaskSupervisor.isRootVisibilityUpdateDeferred()) { return true; return; } boolean kept = true; final Task mainRootTask = mRootWindowContainer.getTopDisplayFocusedRootTask(); // mainRootTask is null during startup. if (mainRootTask != null) { Loading @@ -5887,14 +5858,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } if (starting != null) { kept = starting.ensureActivityConfiguration(); starting.ensureActivityConfiguration(); // And we need to make sure at this point that all other activities // are made visible with the correct configuration. mRootWindowContainer.ensureActivitiesVisible(starting); } } return kept; } void scheduleAppGcsLocked() { Loading Loading @@ -7641,9 +7610,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final int currentUserId = mAmInternal.getCurrentUserId(); Settings.System.adjustConfigurationForUser(mContext.getContentResolver(), configuration, currentUserId, Settings.System.canWrite(mContext)); updateConfigurationLocked(configuration, null /* starting */, false /* initLocale */, false /* persistent */, currentUserId, false /* deferResume */); updateConfigurationLocked(configuration, false /* initLocale */, false /* persistent */, currentUserId); } } Loading services/core/java/com/android/server/wm/DisplayContent.java +3 −7 Original line number Diff line number Diff line Loading @@ -6287,9 +6287,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mDisplayId)); Settings.System.clearConfiguration(values); updateDisplayOverrideConfigurationLocked(values, null /* starting */, return updateDisplayOverrideConfigurationLocked(values, null /* starting */, false /* deferResume */); return mAtmService.mTmpUpdateConfigurationResult.changes != 0; } /** Loading @@ -6300,7 +6299,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp ActivityRecord starting, boolean deferResume) { int changes = 0; boolean kept = true; mAtmService.deferWindowLayout(); try { Loading @@ -6315,18 +6313,16 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } else { changes = performDisplayOverrideConfigUpdate(values); } mAtmService.mTmpUpdateConfigurationResult.changes = changes; } if (!deferResume) { kept = mAtmService.ensureConfigAndVisibilityAfterUpdate(starting, changes); mAtmService.ensureConfigAndVisibilityAfterUpdate(starting, changes); } } finally { mAtmService.continueWindowLayout(); } mAtmService.mTmpUpdateConfigurationResult.activityRelaunched = !kept; return kept; return changes != 0; } int performDisplayOverrideConfigUpdate(Configuration values) { Loading services/core/java/com/android/server/wm/RootWindowContainer.java +1 −2 Original line number Diff line number Diff line Loading @@ -528,8 +528,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (displayContent.isDefaultDisplay) { final Configuration newConfig = mWmService.computeNewConfiguration( displayContent.getDisplayId()); mWmService.mAtmService.updateConfigurationLocked(newConfig, null /* starting */, false /* initLocale */); mWmService.mAtmService.updateConfigurationLocked(newConfig, false /* initLocale */); } } } Loading services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +13 −3 Original line number Diff line number Diff line Loading @@ -64,7 +64,6 @@ import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.TaskDescription; import android.app.ActivityThread; import android.app.HandoffActivityData; import android.app.HandoffFailureCode; import android.app.IApplicationThread; Loading Loading @@ -988,9 +987,20 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { @Test public void testPackageConfigUpdate_locales_successfullyApplied() { Configuration config = mAtm.getGlobalConfiguration(); registerTestTransitionPlayer(); addNewDisplayContentAt(DisplayContent.POSITION_TOP); final DisplayContent dc0 = mRootWindowContainer.getChildAt(0); final DisplayContent dc1 = mRootWindowContainer.getChildAt(1); dc0.setLastHasContent(); dc1.setLastHasContent(); final Configuration config = new Configuration(); config.setLocales(LocaleList.forLanguageTags("en-XC")); mAtm.updateGlobalConfigurationLocked(config, true, true, DEFAULT_USER_ID); mAtm.updateConfigurationLocked(config, true /* initLocale */, true /* persistent */, DEFAULT_USER_ID); assertTrue(dc0.inTransition()); assertTrue(dc1.inTransition()); mAtm.mProcessMap.put(Binder.getCallingPid(), createWindowProcessController( DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID)); Loading Loading
services/core/java/com/android/server/wm/ActivityStarter.java +2 −1 Original line number Diff line number Diff line Loading @@ -872,7 +872,8 @@ class ActivityStarter { ProtoLog.v(WM_DEBUG_CONFIGURATION, "Updating to new configuration after starting activity."); mService.updateConfigurationLocked(mRequest.globalConfig, null, false); mService.updateConfigurationLocked(mRequest.globalConfig, false /* initLocale */); } // The original options may have additional info about metrics. The mOptions is not Loading
services/core/java/com/android/server/wm/ActivityTaskManagerService.java +20 −52 Original line number Diff line number Diff line Loading @@ -518,16 +518,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private final WindowStyleCache<ActivityRecord.WindowStyle> mWindowStyleCache = new WindowStyleCache<>(ActivityRecord.WindowStyle::new); final UpdateConfigurationResult mTmpUpdateConfigurationResult = new UpdateConfigurationResult(); // TODO(b/258618073): Remove this and make the related methods return whether config is changed. static final class UpdateConfigurationResult { // Configuration changes that were updated. int changes; // If the activity was relaunched to match the new configuration. boolean activityRelaunched; } /** Current sequencing integer of the configuration, for skipping old configurations. */ private int mConfigurationSeq; Loading Loading @@ -991,7 +981,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mWindowManager.mRoot.onSettingsRetrieved(); // This happens before any activities are started, so we can change global configuration // in-place. updateConfigurationLocked(configuration, null, true); updateConfigurationLocked(configuration, true /* initLocale */); final Configuration globalConfig = getGlobalConfiguration(); ProtoLog.v(WM_DEBUG_CONFIGURATION, "Initial config: %s", globalConfig); Loading Loading @@ -4328,9 +4318,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { if (values != null) { Settings.System.clearConfiguration(values); } updateConfigurationLocked(values, null, false, false /* persistent */, UserHandle.USER_NULL, false /* deferResume */); return mTmpUpdateConfigurationResult.changes != 0; return updateConfigurationLocked(values, false /* initLocale */); } finally { Binder.restoreCallingIdentity(origId); } Loading Loading @@ -5014,16 +5002,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { : new Configuration(); } boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale) { return updateConfigurationLocked(values, starting, initLocale, false /* deferResume */); } boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale, boolean deferResume) { boolean updateConfigurationLocked(@NonNull Configuration values, boolean initLocale) { // pass UserHandle.USER_NULL as userId because we don't persist configuration for any user return updateConfigurationLocked(values, starting, initLocale, false /* persistent */, UserHandle.USER_NULL, deferResume); return updateConfigurationLocked(values, initLocale, false /* persistent */, UserHandle.USER_NULL); } public void updatePersistentConfiguration(Configuration values, @UserIdInt int userId) { Loading @@ -5033,8 +5015,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // Window configuration is unrelated to persistent configuration (e.g. font scale, // locale). Unset it to avoid affecting the current display configuration. values.windowConfiguration.setToDefaults(); updateConfigurationLocked(values, null, false, true, userId, false /* deferResume */); updateConfigurationLocked(values, false /* initLocale */, true /* persistent */, userId); } } finally { Binder.restoreCallingIdentity(origId); Loading @@ -5044,34 +5026,24 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { /** * Do either or both things: (1) change the current configuration, and (2) * make sure the given activity is running with the (now) current * configuration. Returns true if the activity has been left running, or * false if <var>starting</var> is being destroyed to match the new * configuration. * configuration. Returns true if the configuration is updated. * * @param userId is only used when persistent parameter is set to true to persist configuration * for that particular user */ boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale, boolean persistent, int userId, boolean deferResume) { int changes = 0; boolean kept = true; boolean updateConfigurationLocked(@NonNull Configuration values, boolean initLocale, boolean persistent, @UserIdInt int userId) { final int changes; deferWindowLayout(); try { if (values != null) { changes = updateGlobalConfigurationWithTransition( values, initLocale, persistent, userId); mTmpUpdateConfigurationResult.changes = changes; } if (!deferResume) { kept = ensureConfigAndVisibilityAfterUpdate(starting, changes); } ensureConfigAndVisibilityAfterUpdate(null /* starting */, changes); } finally { continueWindowLayout(); } mTmpUpdateConfigurationResult.activityRelaunched = !kept; return kept; return changes != 0; } /** This is mainly to handle changes in locale, font scale/weight, uiMode, asset paths. */ Loading Loading @@ -5871,11 +5843,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } /** Applies latest configuration and/or visibility updates if needed. */ boolean ensureConfigAndVisibilityAfterUpdate(ActivityRecord starting, int changes) { void ensureConfigAndVisibilityAfterUpdate(@Nullable ActivityRecord starting, int changes) { if (starting == null && mTaskSupervisor.isRootVisibilityUpdateDeferred()) { return true; return; } boolean kept = true; final Task mainRootTask = mRootWindowContainer.getTopDisplayFocusedRootTask(); // mainRootTask is null during startup. if (mainRootTask != null) { Loading @@ -5887,14 +5858,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } if (starting != null) { kept = starting.ensureActivityConfiguration(); starting.ensureActivityConfiguration(); // And we need to make sure at this point that all other activities // are made visible with the correct configuration. mRootWindowContainer.ensureActivitiesVisible(starting); } } return kept; } void scheduleAppGcsLocked() { Loading Loading @@ -7641,9 +7610,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final int currentUserId = mAmInternal.getCurrentUserId(); Settings.System.adjustConfigurationForUser(mContext.getContentResolver(), configuration, currentUserId, Settings.System.canWrite(mContext)); updateConfigurationLocked(configuration, null /* starting */, false /* initLocale */, false /* persistent */, currentUserId, false /* deferResume */); updateConfigurationLocked(configuration, false /* initLocale */, false /* persistent */, currentUserId); } } Loading
services/core/java/com/android/server/wm/DisplayContent.java +3 −7 Original line number Diff line number Diff line Loading @@ -6287,9 +6287,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mDisplayId)); Settings.System.clearConfiguration(values); updateDisplayOverrideConfigurationLocked(values, null /* starting */, return updateDisplayOverrideConfigurationLocked(values, null /* starting */, false /* deferResume */); return mAtmService.mTmpUpdateConfigurationResult.changes != 0; } /** Loading @@ -6300,7 +6299,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp ActivityRecord starting, boolean deferResume) { int changes = 0; boolean kept = true; mAtmService.deferWindowLayout(); try { Loading @@ -6315,18 +6313,16 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } else { changes = performDisplayOverrideConfigUpdate(values); } mAtmService.mTmpUpdateConfigurationResult.changes = changes; } if (!deferResume) { kept = mAtmService.ensureConfigAndVisibilityAfterUpdate(starting, changes); mAtmService.ensureConfigAndVisibilityAfterUpdate(starting, changes); } } finally { mAtmService.continueWindowLayout(); } mAtmService.mTmpUpdateConfigurationResult.activityRelaunched = !kept; return kept; return changes != 0; } int performDisplayOverrideConfigUpdate(Configuration values) { Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +1 −2 Original line number Diff line number Diff line Loading @@ -528,8 +528,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (displayContent.isDefaultDisplay) { final Configuration newConfig = mWmService.computeNewConfiguration( displayContent.getDisplayId()); mWmService.mAtmService.updateConfigurationLocked(newConfig, null /* starting */, false /* initLocale */); mWmService.mAtmService.updateConfigurationLocked(newConfig, false /* initLocale */); } } } Loading
services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +13 −3 Original line number Diff line number Diff line Loading @@ -64,7 +64,6 @@ import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.TaskDescription; import android.app.ActivityThread; import android.app.HandoffActivityData; import android.app.HandoffFailureCode; import android.app.IApplicationThread; Loading Loading @@ -988,9 +987,20 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { @Test public void testPackageConfigUpdate_locales_successfullyApplied() { Configuration config = mAtm.getGlobalConfiguration(); registerTestTransitionPlayer(); addNewDisplayContentAt(DisplayContent.POSITION_TOP); final DisplayContent dc0 = mRootWindowContainer.getChildAt(0); final DisplayContent dc1 = mRootWindowContainer.getChildAt(1); dc0.setLastHasContent(); dc1.setLastHasContent(); final Configuration config = new Configuration(); config.setLocales(LocaleList.forLanguageTags("en-XC")); mAtm.updateGlobalConfigurationLocked(config, true, true, DEFAULT_USER_ID); mAtm.updateConfigurationLocked(config, true /* initLocale */, true /* persistent */, DEFAULT_USER_ID); assertTrue(dc0.inTransition()); assertTrue(dc1.inTransition()); mAtm.mProcessMap.put(Binder.getCallingPid(), createWindowProcessController( DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID)); Loading