diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 10055c8d98f7f..fa7dd28eb8567 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -2019,6 +2019,12 @@ final class ActivityRecord implements AppWindowContainerListener { // Okay we now are going to make this activity have the new config. // But then we need to figure out how it needs to deal with that. + + // Find changes between last reported merged configuration and the current one. This is used + // to decide whether to relaunch an activity or just report a configuration change. + final int changes = getTaskConfigurationChanges(mTmpConfig1); + + // Update last reported values. final Configuration newGlobalConfig = service.getGlobalConfiguration(); final Configuration newTaskMergedOverrideConfig = task.getMergedOverrideConfiguration(); mTmpConfig1.setTo(mLastReportedConfiguration); @@ -2026,9 +2032,6 @@ final class ActivityRecord implements AppWindowContainerListener { mLastReportedConfiguration.setTo(newGlobalConfig); mLastReportedOverrideConfiguration.setTo(newTaskMergedOverrideConfig); - int taskChanges = getTaskConfigurationChanges(this, newTaskMergedOverrideConfig, - mTmpConfig2); - final int changes = mTmpConfig1.diff(newGlobalConfig) | taskChanges; if (changes == 0 && !forceNewConfig) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Configuration no differences in " + this); @@ -2043,8 +2046,7 @@ final class ActivityRecord implements AppWindowContainerListener { } if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, - "Configuration changes for " + this + " ; taskChanges=" - + Configuration.configurationDiffToString(taskChanges) + ", allChanges=" + "Configuration changes for " + this + ", allChanges=" + Configuration.configurationDiffToString(changes)); // If the activity isn't currently running, just leave the new configuration and it will @@ -2142,40 +2144,27 @@ final class ActivityRecord implements AppWindowContainerListener { return (changes&(~configChanged)) != 0; } - private static int getTaskConfigurationChanges(ActivityRecord record, Configuration taskConfig, - Configuration oldTaskOverride) { - // If we went from full-screen to non-full-screen, make sure to use the correct - // configuration task diff, so the diff stays as small as possible. - if (Configuration.EMPTY.equals(oldTaskOverride) - && !Configuration.EMPTY.equals(taskConfig)) { - oldTaskOverride = record.task.extractOverrideConfig(record.mLastReportedConfiguration); - } - - // Conversely, do the same when going the other direction. - if (Configuration.EMPTY.equals(taskConfig) - && !Configuration.EMPTY.equals(oldTaskOverride)) { - taskConfig = record.task.extractOverrideConfig(record.mLastReportedConfiguration); - } - + private int getTaskConfigurationChanges(Configuration newTaskConfig) { // Determine what has changed. May be nothing, if this is a config that has come back from // the app after going idle. In that case we just want to leave the official config object // now in the activity and do nothing else. - int taskChanges = oldTaskOverride.diff(taskConfig, true /* skipUndefined */); + final Configuration oldTaskConfig = task.getConfiguration(); + int taskChanges = oldTaskConfig.diff(newTaskConfig, true /* skipUndefined */); // We don't want to use size changes if they don't cross boundaries that are important to // the app. if ((taskChanges & CONFIG_SCREEN_SIZE) != 0) { - final boolean crosses = record.crossesHorizontalSizeThreshold( - oldTaskOverride.screenWidthDp, taskConfig.screenWidthDp) - || record.crossesVerticalSizeThreshold( - oldTaskOverride.screenHeightDp, taskConfig.screenHeightDp); + final boolean crosses = crossesHorizontalSizeThreshold(oldTaskConfig.screenWidthDp, + newTaskConfig.screenWidthDp) + || crossesVerticalSizeThreshold(oldTaskConfig.screenHeightDp, + newTaskConfig.screenHeightDp); if (!crosses) { taskChanges &= ~CONFIG_SCREEN_SIZE; } } if ((taskChanges & CONFIG_SMALLEST_SCREEN_SIZE) != 0) { - final int oldSmallest = oldTaskOverride.smallestScreenWidthDp; - final int newSmallest = taskConfig.smallestScreenWidthDp; - if (!record.crossesSmallestSizeThreshold(oldSmallest, newSmallest)) { + final int oldSmallest = oldTaskConfig.smallestScreenWidthDp; + final int newSmallest = newTaskConfig.smallestScreenWidthDp; + if (!crossesSmallestSizeThreshold(oldSmallest, newSmallest)) { taskChanges &= ~CONFIG_SMALLEST_SCREEN_SIZE; } }