summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/util/MergedConfiguration.java46
-rw-r--r--services/core/java/com/android/server/am/ActivityRecord.java83
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java16
3 files changed, 89 insertions, 56 deletions
diff --git a/core/java/android/util/MergedConfiguration.java b/core/java/android/util/MergedConfiguration.java
index d94af8a68fc1..68d0309cfc9e 100644
--- a/core/java/android/util/MergedConfiguration.java
+++ b/core/java/android/util/MergedConfiguration.java
@@ -21,6 +21,8 @@ import android.content.res.Configuration;
import android.os.Parcel;
import android.os.Parcelable;
+import java.io.PrintWriter;
+
/**
* Container that holds global and override config and their merge product.
* Merged configuration updates automatically whenever global or override configs are updated via
@@ -41,6 +43,10 @@ public class MergedConfiguration implements Parcelable {
setConfiguration(globalConfig, overrideConfig);
}
+ public MergedConfiguration(Configuration globalConfig) {
+ setGlobalConfiguration(globalConfig);
+ }
+
public MergedConfiguration(MergedConfiguration mergedConfiguration) {
setConfiguration(mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration());
@@ -93,6 +99,36 @@ public class MergedConfiguration implements Parcelable {
}
/**
+ * Update global configurations.
+ * Merged configuration will automatically be updated.
+ * @param globalConfig New global configuration.
+ */
+ public void setGlobalConfiguration(Configuration globalConfig) {
+ mGlobalConfig.setTo(globalConfig);
+ updateMergedConfig();
+ }
+
+ /**
+ * Update override configurations.
+ * Merged configuration will automatically be updated.
+ * @param overrideConfig New override configuration.
+ */
+ public void setOverrideConfiguration(Configuration overrideConfig) {
+ mOverrideConfig.setTo(overrideConfig);
+ updateMergedConfig();
+ }
+
+ public void setTo(MergedConfiguration config) {
+ setConfiguration(config.mGlobalConfig, config.mOverrideConfig);
+ }
+
+ public void unset() {
+ mGlobalConfig.unset();
+ mOverrideConfig.unset();
+ updateMergedConfig();
+ }
+
+ /**
* @return Stored global configuration value.
*/
@NonNull
@@ -119,4 +155,14 @@ public class MergedConfiguration implements Parcelable {
mMergedConfig.setTo(mGlobalConfig);
mMergedConfig.updateFrom(mOverrideConfig);
}
+
+ @Override
+ public String toString() {
+ return "{mGlobalConfig=" + mGlobalConfig + " mOverrideConfig=" + mOverrideConfig + "}";
+ }
+
+ public void dump(PrintWriter pw, String prefix) {
+ pw.println(prefix + "mGlobalConfig=" + mGlobalConfig);
+ pw.println(prefix + "mOverrideConfig=" + mOverrideConfig);
+ }
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 3e0734f07059..5f554114f717 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -62,6 +62,8 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.res.Configuration.EMPTY;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.content.res.Configuration.UI_MODE_TYPE_MASK;
import static android.content.res.Configuration.UI_MODE_TYPE_VR_HEADSET;
import static android.os.Build.VERSION_CODES.HONEYCOMB;
@@ -139,6 +141,7 @@ import android.os.UserHandle;
import android.service.voice.IVoiceInteractionSession;
import android.util.EventLog;
import android.util.Log;
+import android.util.MergedConfiguration;
import android.util.Slog;
import android.util.TimeUtils;
import android.view.AppTransitionAnimationSpec;
@@ -240,13 +243,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
long cpuTimeAtResume; // the cpu time of host process at the time of resuming activity
long pauseTime; // last time we started pausing the activity
long launchTickTime; // base time for launch tick messages
- // TODO: Refactor mLastReportedConfiguration and mLastReportedOverrideConfiguration to use a
- // MergedConfiguration object for clarity.
- private Configuration mLastReportedConfiguration; // configuration activity was last running in
- // Overridden configuration by the activity task
- // WARNING: Reference points to {@link TaskRecord#getMergedOverrideConfig}, so its internal
- // state should never be altered directly.
- private Configuration mLastReportedOverrideConfiguration;
+ // Last configuration reported to the activity in the client process.
+ private MergedConfiguration mLastReportedConfiguration;
private int mLastReportedDisplayId;
CompatibilityInfo compat;// last used compatibility mode
ActivityRecord resultTo; // who started this entry, so will get our reply
@@ -346,10 +344,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
/**
* Temp configs used in {@link #ensureActivityConfigurationLocked(int, boolean)}
*/
- private final Configuration mTmpConfig1 = new Configuration();
- private final Configuration mTmpConfig2 = new Configuration();
- private final Configuration mTmpConfig3 = new Configuration();
- private final Point mTmpPoint = new Point();
+ private final Configuration mTmpConfig = new Configuration();
private final Rect mTmpBounds = new Rect();
private static String startingWindowStateToString(int state) {
@@ -400,10 +395,9 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
pw.print(" labelRes=0x"); pw.print(Integer.toHexString(labelRes));
pw.print(" icon=0x"); pw.print(Integer.toHexString(icon));
pw.print(" theme=0x"); pw.println(Integer.toHexString(theme));
- pw.print(prefix); pw.print("mLastReportedConfiguration=");
- pw.println(mLastReportedConfiguration);
- pw.print(prefix); pw.print("mLastReportedOverrideConfiguration=");
- pw.println(mLastReportedOverrideConfiguration);
+ pw.println(prefix + "mLastReportedConfigurations:");
+ mLastReportedConfiguration.dump(pw, prefix + " ");
+
pw.print(prefix); pw.print("CurrentConfiguration="); pw.println(getConfiguration());
if (!getOverrideConfiguration().equals(EMPTY)) {
pw.println(prefix + "OverrideConfiguration=" + getOverrideConfiguration());
@@ -804,8 +798,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
resolvedType = _resolvedType;
componentSpecified = _componentSpecified;
rootVoiceInteraction = _rootVoiceInteraction;
- mLastReportedConfiguration = new Configuration(_configuration);
- mLastReportedOverrideConfiguration = new Configuration();
+ mLastReportedConfiguration = new MergedConfiguration(_configuration);
resultTo = _resultTo;
resultWho = _resultWho;
requestCode = _reqCode;
@@ -2209,15 +2202,15 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
* global configuration is sent to the client for this activity.
*/
void setLastReportedGlobalConfiguration(@NonNull Configuration config) {
- mLastReportedConfiguration.setTo(config);
+ mLastReportedConfiguration.setGlobalConfiguration(config);
}
/**
- * Set the last reported merged override configuration to the client. Should be called whenever
+ * Set the last reported configuration to the client. Should be called whenever
* a new merged configuration is sent to the client for this activity.
*/
- void setLastReportedMergedOverrideConfiguration(@NonNull Configuration config) {
- mLastReportedOverrideConfiguration.setTo(config);
+ void setLastReportedConfiguration(@NonNull MergedConfiguration config) {
+ mLastReportedConfiguration.setTo(config);
}
/** Call when override config was sent to the Window Manager to update internal records. */
@@ -2225,7 +2218,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
// we should only set this when we actually report to the activity which is what the method
// setLastReportedMergedOverrideConfiguration() does. Investigate if this is really needed.
void onOverrideConfigurationSent() {
- mLastReportedOverrideConfiguration.setTo(getMergedOverrideConfiguration());
+ mLastReportedConfiguration.setOverrideConfiguration(getMergedOverrideConfiguration());
}
@Override
@@ -2241,18 +2234,20 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.
- private boolean updateOverrideConfiguration() {
+ private void updateOverrideConfiguration() {
+ mTmpConfig.unset();
computeBounds(mTmpBounds);
if (mTmpBounds.equals(mBounds)) {
- return false;
+ return;
}
+
mBounds.set(mTmpBounds);
// Bounds changed...update configuration to match.
- mTmpConfig1.unset();
- task.computeOverrideConfiguration(mTmpConfig1, mBounds, null /* insetBounds */,
- false /* overrideWidth */, false /* overrideHeight */);
- onOverrideConfigurationChanged(mTmpConfig1);
- return true;
+ if (!mBounds.isEmpty()) {
+ task.computeOverrideConfiguration(mTmpConfig, mBounds, null /* insetBounds */,
+ false /* overrideWidth */, false /* overrideHeight */);
+ }
+ onOverrideConfigurationChanged(mTmpConfig);
}
/**
@@ -2280,12 +2275,12 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
int maxActivityHeight = containingAppHeight;
if (containingAppWidth < containingAppHeight) {
- // Width is the shorter side, so we use that to figure-out what the max. height should
- // be given the aspect ratio.
+ // Width is the shorter side, so we use that to figure-out what the max. height
+ // should be given the aspect ratio.
maxActivityHeight = (int) ((maxActivityWidth * maxAspectRatio) + 0.5f);
} else {
- // Height is the shorter side, so we use that to figure-out what the max. width should
- // be given the aspect ratio.
+ // Height is the shorter side, so we use that to figure-out what the max. width
+ // should be given the aspect ratio.
maxActivityWidth = (int) ((maxActivityHeight * maxAspectRatio) + 0.5f);
}
@@ -2355,9 +2350,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
// nothing to do. We test the full configuration instead of the global and merged override
// configurations because there are cases (like moving a task to the pinned stack) where
// the combine configurations are equal, but would otherwise differ in the override config
- mTmpConfig1.setTo(mLastReportedConfiguration);
- mTmpConfig1.updateFrom(mLastReportedOverrideConfiguration);
- if (getConfiguration().equals(mTmpConfig1) && !forceNewConfig && !displayChanged) {
+ mTmpConfig.setTo(mLastReportedConfiguration.getMergedConfiguration());
+ if (getConfiguration().equals(mTmpConfig) && !forceNewConfig && !displayChanged) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
"Configuration & display unchanged in " + this);
return true;
@@ -2368,18 +2362,12 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
// 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 = getConfigurationChanges(mTmpConfig1);
-
- // Preserve configuration used to generate this set of configuration changes.
- mTmpConfig3.setTo(mTmpConfig1);
+ final int changes = getConfigurationChanges(mTmpConfig);
// Update last reported values.
- final Configuration newGlobalConfig = service.getGlobalConfiguration();
final Configuration newMergedOverrideConfig = getMergedOverrideConfiguration();
- mTmpConfig1.setTo(mLastReportedConfiguration);
- mTmpConfig2.setTo(mLastReportedOverrideConfiguration);
- mLastReportedConfiguration.setTo(newGlobalConfig);
- mLastReportedOverrideConfiguration.setTo(newMergedOverrideConfig);
+ mLastReportedConfiguration.setConfiguration(service.getGlobalConfiguration(),
+ newMergedOverrideConfig);
if (changes == 0 && !forceNewConfig) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
@@ -2413,10 +2401,9 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
"Checking to restart " + info.name + ": changed=0x"
+ Integer.toHexString(changes) + ", handles=0x"
+ Integer.toHexString(info.getRealConfigChanged())
- + ", newGlobalConfig=" + newGlobalConfig
- + ", newMergedOverrideConfig=" + newMergedOverrideConfig);
+ + ", mLastReportedConfiguration=" + mLastReportedConfiguration);
- if (shouldRelaunchLocked(changes, mTmpConfig3) || forceNewConfig) {
+ if (shouldRelaunchLocked(changes, mTmpConfig) || forceNewConfig) {
// Aha, the activity isn't handling the change, so DIE DIE DIE.
configChangeFlags |= changes;
startFreezingScreenLocked(app, globalChanges);
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index fb8c161ea35d..bff3ce3a3885 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -162,6 +162,7 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.EventLog;
import android.util.IntArray;
+import android.util.MergedConfiguration;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -1443,17 +1444,16 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// a Binder interface which would create a new Configuration. Consequently we have to
// always create a new Configuration here.
- final Configuration globalConfiguration =
- new Configuration(mService.getGlobalConfiguration());
- r.setLastReportedGlobalConfiguration(globalConfiguration);
- final Configuration mergedOverrideConfiguration =
- new Configuration(r.getMergedOverrideConfiguration());
- r.setLastReportedMergedOverrideConfiguration(mergedOverrideConfiguration);
+ final MergedConfiguration mergedConfiguration = new MergedConfiguration(
+ mService.getGlobalConfiguration(), r.getMergedOverrideConfiguration());
+ r.setLastReportedConfiguration(mergedConfiguration);
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info,
- globalConfiguration,
- mergedOverrideConfiguration, r.compat,
+ // TODO: Have this take the merged configuration instead of separate global and
+ // override configs.
+ mergedConfiguration.getGlobalConfiguration(),
+ mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, !andResume,
mService.isNextTransitionForward(), profilerInfo);