Make WindowState use config from WindowContainer

Previously WindowState updated its config only when it was either
requested to relayout the window or to report resize to client.

This CL makes WindowState to use WindowContainer's configuration
handling model. Configuration can be updated any time by parent
window container or any other caller. Also we're saving last
reported to client config to be able to check if there is something
new since last report.

Test: Manual and existing tests still pass.
Change-Id: I832acdb950871b85b7c16becde16d58de392faf5
This commit is contained in:
Andrii Kulian
2016-09-29 22:28:09 -07:00
parent e87092896b
commit 9d91ca69ed

View File

@@ -226,14 +226,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
int mLayoutSeq = -1;
private final Configuration mTmpConfig = new Configuration();
// Represents the changes from our override configuration applied
// to the global configuration. This is the only form of configuration
// which is suitable for delivery to the client.
private Configuration mMergedConfiguration = new Configuration();
// Sticky answer to isConfigChanged(), remains true until new Configuration is assigned.
// Used only on {@link #TYPE_KEYGUARD}.
private boolean mConfigHasChanged;
/**
* Used to store last reported to client configuration and check if we have newer available.
* We'll send configuration to client only if it is different from the last applied one and
* client won't perform unnecessary updates.
*/
private final Configuration mLastReportedConfiguration = new Configuration();
/**
* Actual position of the surface shown on-screen (may be modified by animation). These are
@@ -1745,21 +1743,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
&& mFrame.right >= displayInfo.appWidth && mFrame.bottom >= displayInfo.appHeight;
}
/** Returns true if last applied config was not yet requested by client. */
boolean isConfigChanged() {
getMergedConfig(mTmpConfig);
// If the merged configuration is still empty, it means that we haven't issued the
// configuration to the client yet and we need to return true so the configuration updates.
boolean configChanged = mMergedConfiguration.equals(Configuration.EMPTY)
|| mTmpConfig.diff(mMergedConfiguration) != 0;
if ((mAttrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
// Retain configuration changed status until resetConfiguration called.
mConfigHasChanged |= configChanged;
configChanged = mConfigHasChanged;
}
return configChanged;
return !mLastReportedConfiguration.equals(getConfiguration());
}
boolean isAdjustedForMinimizedDock() {
@@ -2294,10 +2280,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mTurnOnScreen = true;
}
if (isConfigChanged()) {
final Configuration newConfig = updateConfiguration();
outConfig.setTo(getConfiguration());
if (DEBUG_CONFIGURATION) Slog.i(TAG, "Window " + this + " visible with new config: "
+ newConfig);
outConfig.setTo(newConfig);
+ outConfig);
mLastReportedConfiguration.setTo(outConfig);
}
}
@@ -3029,29 +3015,15 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
}
/**
* Update our current configurations, based on task configuration.
*
* @return A configuration suitable for sending to the client.
*/
private Configuration updateConfiguration() {
final boolean configChanged = isConfigChanged();
getMergedConfig(mMergedConfiguration);
mConfigHasChanged = false;
if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION) && configChanged) {
Slog.i(TAG, "Sending new config to window " + this + ": " +
" / mergedConfig=" + mMergedConfiguration);
}
return mMergedConfiguration;
}
private void getMergedConfig(Configuration outConfig) {
@Override
public Configuration getConfiguration() {
if (mAppToken != null && mAppToken.mFrozenMergedConfig.size() > 0) {
outConfig.setTo(mAppToken.mFrozenMergedConfig.peek());
return;
return mAppToken.mFrozenMergedConfig.peek();
}
outConfig.setTo(
mAppToken != null ? getConfiguration() : mDisplayContent.getConfiguration());
// TODO: Remove when all windows' hierarchies will start from same root.
return mAppToken != null
? super.getConfiguration() : getDisplayContent().getConfiguration();
}
void reportResized() {
@@ -3059,7 +3031,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
try {
if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, "Reporting new frame to " + this
+ ": " + mCompatFrame);
final Configuration newConfig = isConfigChanged() ? updateConfiguration() : null;
final Configuration newConfig;
if (isConfigChanged()) {
newConfig = new Configuration(getConfiguration());
mLastReportedConfiguration.setTo(newConfig);
} else {
newConfig = null;
}
if (DEBUG_ORIENTATION && mWinAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING)
Slog.i(TAG, "Resizing " + this + " WITH DRAW PENDING");
@@ -3381,7 +3359,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
getTouchableRegion(region);
pw.print(prefix); pw.print("touchable region="); pw.println(region);
}
pw.print(prefix); pw.print("mMergedConfiguration="); pw.println(mMergedConfiguration);
pw.print(prefix); pw.print("mFullConfiguration="); pw.println(getConfiguration());
pw.print(prefix); pw.print("mLastReportedConfiguration=");
pw.println(mLastReportedConfiguration);
}
pw.print(prefix); pw.print("mHasSurface="); pw.print(mHasSurface);
pw.print(" mShownPosition="); mShownPosition.printShortString(pw);
@@ -4086,7 +4066,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
public boolean isRtl() {
return mMergedConfiguration.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
return getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
void hideWallpaperWindow(boolean wasDeferred, String reason) {