Merge "Reduce unnecessary config propagation of default display" into sc-dev am: 00a39566bb

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13610323

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I79f47a12c1b5c408fd371212aaa394e6bf1e513a
This commit is contained in:
TreeHugger Robot
2021-02-22 09:27:34 +00:00
committed by Automerger Merge Worker
4 changed files with 29 additions and 20 deletions

View File

@@ -4015,8 +4015,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
deferWindowLayout(); deferWindowLayout();
try { try {
if (values != null) { if (values != null) {
changes = updateGlobalConfigurationLocked(values, initLocale, persistent, userId, changes = updateGlobalConfigurationLocked(values, initLocale, persistent, userId);
deferResume);
} }
if (!deferResume) { if (!deferResume) {
@@ -4035,7 +4034,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
/** Update default (global) configuration and notify listeners about changes. */ /** Update default (global) configuration and notify listeners about changes. */
int updateGlobalConfigurationLocked(@NonNull Configuration values, boolean initLocale, int updateGlobalConfigurationLocked(@NonNull Configuration values, boolean initLocale,
boolean persistent, int userId, boolean deferResume) { boolean persistent, int userId) {
final DisplayContent defaultDisplay = final DisplayContent defaultDisplay =
mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY); mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY);
@@ -4047,7 +4046,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
// setting WindowManagerService.mWaitingForConfig to true, it is important that we call // setting WindowManagerService.mWaitingForConfig to true, it is important that we call
// performDisplayOverrideConfigUpdate in order to send the new display configuration // performDisplayOverrideConfigUpdate in order to send the new display configuration
// (even if there are no actual changes) to unfreeze the window. // (even if there are no actual changes) to unfreeze the window.
defaultDisplay.performDisplayOverrideConfigUpdate(values, deferResume); defaultDisplay.performDisplayOverrideConfigUpdate(values);
return 0; return 0;
} }
@@ -4095,9 +4094,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
mTempConfig.seq = increaseConfigurationSeqLocked(); mTempConfig.seq = increaseConfigurationSeqLocked();
// Update stored global config and notify everyone about the change.
mRootWindowContainer.onConfigurationChanged(mTempConfig);
Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + mTempConfig); Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + mTempConfig);
// TODO(multi-display): Update UsageEvents#Event to include displayId. // TODO(multi-display): Update UsageEvents#Event to include displayId.
mUsageStatsInternal.reportConfigurationChange(mTempConfig, mAmInternal.getCurrentUserId()); mUsageStatsInternal.reportConfigurationChange(mTempConfig, mAmInternal.getCurrentUserId());
@@ -4116,13 +4112,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
// resources have that config before following boot code is executed. // resources have that config before following boot code is executed.
mSystemThread.applyConfigurationToResources(mTempConfig); mSystemThread.applyConfigurationToResources(mTempConfig);
// We need another copy of global config because we're scheduling some calls instead of
// running them in place. We need to be sure that object we send will be handled unchanged.
final Configuration configCopy = new Configuration(mTempConfig);
if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) { if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) {
final Message msg = PooledLambda.obtainMessage( final Message msg = PooledLambda.obtainMessage(
ActivityTaskManagerService::sendPutConfigurationForUserMsg, ActivityTaskManagerService::sendPutConfigurationForUserMsg,
this, userId, configCopy); this, userId, new Configuration(mTempConfig));
mH.sendMessage(msg); mH.sendMessage(msg);
} }
@@ -4131,8 +4124,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
final int pid = pidMap.keyAt(i); final int pid = pidMap.keyAt(i);
final WindowProcessController app = pidMap.get(pid); final WindowProcessController app = pidMap.get(pid);
ProtoLog.v(WM_DEBUG_CONFIGURATION, "Update process config of %s to new " ProtoLog.v(WM_DEBUG_CONFIGURATION, "Update process config of %s to new "
+ "config %s", app.mName, configCopy); + "config %s", app.mName, mTempConfig);
app.onConfigurationChanged(configCopy); app.onConfigurationChanged(mTempConfig);
} }
final Message msg = PooledLambda.obtainMessage( final Message msg = PooledLambda.obtainMessage(
@@ -4140,10 +4133,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
mAmInternal, changes, initLocale); mAmInternal, changes, initLocale);
mH.sendMessage(msg); mH.sendMessage(msg);
// Override configuration of the default display duplicates global config, so we need to // Update stored global config and notify everyone about the change.
// update it also. This will also notify WindowManager about changes. mRootWindowContainer.onConfigurationChanged(mTempConfig);
defaultDisplay.performDisplayOverrideConfigUpdate(mRootWindowContainer.getConfiguration(),
deferResume);
return changes; return changes;
} }

View File

@@ -141,6 +141,10 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> {
mChangeListeners.get(i).onMergedOverrideConfigurationChanged( mChangeListeners.get(i).onMergedOverrideConfigurationChanged(
mMergedOverrideConfiguration); mMergedOverrideConfiguration);
} }
dispatchConfigurationToChildren();
}
void dispatchConfigurationToChildren() {
for (int i = getChildCount() - 1; i >= 0; --i) { for (int i = getChildCount() - 1; i >= 0; --i) {
final ConfigurationContainer child = getChildAt(i); final ConfigurationContainer child = getChildAt(i);
child.onConfigurationChanged(mFullConfiguration); child.onConfigurationChanged(mFullConfiguration);

View File

@@ -5467,9 +5467,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// apply the correct override config. // apply the correct override config.
changes = mAtmService.updateGlobalConfigurationLocked(values, changes = mAtmService.updateGlobalConfigurationLocked(values,
false /* initLocale */, false /* persistent */, false /* initLocale */, false /* persistent */,
UserHandle.USER_NULL /* userId */, deferResume); UserHandle.USER_NULL /* userId */);
} else { } else {
changes = performDisplayOverrideConfigUpdate(values, deferResume); changes = performDisplayOverrideConfigUpdate(values);
} }
} }
@@ -5487,7 +5487,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
return kept; return kept;
} }
int performDisplayOverrideConfigUpdate(Configuration values, boolean deferResume) { int performDisplayOverrideConfigUpdate(Configuration values) {
mTempConfig.setTo(getRequestedOverrideConfiguration()); mTempConfig.setTo(getRequestedOverrideConfiguration());
final int changes = mTempConfig.updateFrom(values); final int changes = mTempConfig.updateFrom(values);
if (changes != 0) { if (changes != 0) {

View File

@@ -649,6 +649,20 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
onConfigurationChanged(newConfiguration); onConfigurationChanged(newConfiguration);
} }
@Override
void dispatchConfigurationToChildren() {
final Configuration configuration = getConfiguration();
for (int i = getChildCount() - 1; i >= 0; i--) {
final DisplayContent displayContent = getChildAt(i);
if (displayContent.isDefaultDisplay) {
// The global configuration is also the override configuration of default display.
displayContent.performDisplayOverrideConfigUpdate(configuration);
} else {
displayContent.onConfigurationChanged(configuration);
}
}
}
@Override @Override
public void onConfigurationChanged(Configuration newParentConfig) { public void onConfigurationChanged(Configuration newParentConfig) {
prepareFreezingTaskBounds(); prepareFreezingTaskBounds();