summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tiger Huang <tigerhuang@google.com> 2022-07-29 08:56:14 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-07-29 08:56:14 +0000
commit93a238d15d027a67fae109ea0bc7f6b38df26e39 (patch)
treea4487f211bdd2fd716319e41b17fd8b8bf84f319
parente2d4dcf0e5a827231424e4fad5ac9466beff6b7a (diff)
parentc77eaf873d271082d8aa0c602c3e3f015b5db06a (diff)
Merge "Send size-compat scale to the client" into tm-qpr-dev
-rw-r--r--apct-tests/perftests/windowmanager/src/android/wm/WindowAddRemovePerfTest.java3
-rw-r--r--core/java/android/app/WindowConfiguration.java9
-rw-r--r--core/java/android/content/res/CompatibilityInfo.java7
-rw-r--r--core/java/android/service/wallpaper/WallpaperService.java2
-rw-r--r--core/java/android/view/IWindowSession.aidl7
-rw-r--r--core/java/android/view/ViewRootImpl.java31
-rw-r--r--core/java/android/view/WindowlessWindowManager.java13
-rw-r--r--core/java/android/window/ClientWindowFrames.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java2
-rw-r--r--services/core/java/com/android/server/wm/Session.java15
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java9
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java50
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java2
15 files changed, 106 insertions, 57 deletions
diff --git a/apct-tests/perftests/windowmanager/src/android/wm/WindowAddRemovePerfTest.java b/apct-tests/perftests/windowmanager/src/android/wm/WindowAddRemovePerfTest.java
index 06207215b7be..f844ba3bb0a9 100644
--- a/apct-tests/perftests/windowmanager/src/android/wm/WindowAddRemovePerfTest.java
+++ b/apct-tests/perftests/windowmanager/src/android/wm/WindowAddRemovePerfTest.java
@@ -88,6 +88,7 @@ public class WindowAddRemovePerfTest extends WindowManagerPerfTestBase
final InsetsState mOutInsetsState = new InsetsState();
final InsetsSourceControl[] mOutControls = new InsetsSourceControl[0];
final Rect mOutAttachedFrame = new Rect();
+ final float[] mOutSizeCompatScale = { 1f };
TestWindow() {
mLayoutParams.setTitle(TestWindow.class.getName());
@@ -106,7 +107,7 @@ public class WindowAddRemovePerfTest extends WindowManagerPerfTestBase
long startTime = SystemClock.elapsedRealtimeNanos();
session.addToDisplay(this, mLayoutParams, View.VISIBLE,
Display.DEFAULT_DISPLAY, mRequestedVisibilities, inputChannel,
- mOutInsetsState, mOutControls, mOutAttachedFrame);
+ mOutInsetsState, mOutControls, mOutAttachedFrame, mOutSizeCompatScale);
final long elapsedTimeNsOfAdd = SystemClock.elapsedRealtimeNanos() - startTime;
state.addExtraResult("add", elapsedTimeNsOfAdd);
diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java
index d0ea8d41d65c..397c8e010bad 100644
--- a/core/java/android/app/WindowConfiguration.java
+++ b/core/java/android/app/WindowConfiguration.java
@@ -460,6 +460,15 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
setDisplayWindowingMode(WINDOWING_MODE_UNDEFINED);
}
+ /** @hide */
+ public void scale(float scale) {
+ mBounds.scale(scale);
+ mMaxBounds.scale(scale);
+ if (mAppBounds != null) {
+ mAppBounds.scale(scale);
+ }
+ }
+
/**
* Copies the fields from delta into this Configuration object, keeping
* track of which ones have changed. Any undefined fields in {@code delta}
diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java
index 608e34bd07b4..e146bb9e20e2 100644
--- a/core/java/android/content/res/CompatibilityInfo.java
+++ b/core/java/android/content/res/CompatibilityInfo.java
@@ -551,12 +551,7 @@ public class CompatibilityInfo implements Parcelable {
if (isScalingRequired()) {
float invertedRatio = applicationInvertedScale;
inoutConfig.densityDpi = (int)((inoutConfig.densityDpi * invertedRatio) + .5f);
- inoutConfig.windowConfiguration.getMaxBounds().scale(invertedRatio);
- inoutConfig.windowConfiguration.getBounds().scale(invertedRatio);
- final Rect appBounds = inoutConfig.windowConfiguration.getAppBounds();
- if (appBounds != null) {
- appBounds.scale(invertedRatio);
- }
+ inoutConfig.windowConfiguration.scale(invertedRatio);
}
}
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 1df7dbc0cd0b..90e4e9406e53 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -1134,7 +1134,7 @@ public abstract class WallpaperService extends Service {
if (mSession.addToDisplay(mWindow, mLayout, View.VISIBLE,
mDisplay.getDisplayId(), mRequestedVisibilities, inputChannel,
- mInsetsState, mTempControls, new Rect()) < 0) {
+ mInsetsState, mTempControls, new Rect(), new float[1]) < 0) {
Log.w(TAG, "Failed to add window while updating wallpaper surface.");
return;
}
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index ef57b1ddd4b3..3016473fa040 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -50,15 +50,16 @@ interface IWindowSession {
int addToDisplay(IWindow window, in WindowManager.LayoutParams attrs,
in int viewVisibility, in int layerStackId, in InsetsVisibilities requestedVisibilities,
out InputChannel outInputChannel, out InsetsState insetsState,
- out InsetsSourceControl[] activeControls, out Rect attachedFrame);
+ out InsetsSourceControl[] activeControls, out Rect attachedFrame,
+ out float[] sizeCompatScale);
int addToDisplayAsUser(IWindow window, in WindowManager.LayoutParams attrs,
in int viewVisibility, in int layerStackId, in int userId,
in InsetsVisibilities requestedVisibilities, out InputChannel outInputChannel,
out InsetsState insetsState, out InsetsSourceControl[] activeControls,
- out Rect attachedFrame);
+ out Rect attachedFrame, out float[] sizeCompatScale);
int addToDisplayWithoutInputChannel(IWindow window, in WindowManager.LayoutParams attrs,
in int viewVisibility, in int layerStackId, out InsetsState insetsState,
- out Rect attachedFrame);
+ out Rect attachedFrame, out float[] sizeCompatScale);
@UnsupportedAppUsage
void remove(IWindow window);
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 8ec32a6d6b5b..427aa0f3914e 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -695,6 +695,8 @@ public final class ViewRootImpl implements ViewParent,
boolean mPendingAlwaysConsumeSystemBars;
private final InsetsState mTempInsets = new InsetsState();
private final InsetsSourceControl[] mTempControls = new InsetsSourceControl[SIZE];
+ private final WindowConfiguration mTempWinConfig = new WindowConfiguration();
+ private float mInvSizeCompatScale = 1f;
final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets
= new ViewTreeObserver.InternalInsetsInfo();
@@ -1094,6 +1096,16 @@ public final class ViewRootImpl implements ViewParent,
return mContext.getResources().getConfiguration();
}
+ private WindowConfiguration getCompatWindowConfiguration() {
+ final WindowConfiguration winConfig = getConfiguration().windowConfiguration;
+ if (mInvSizeCompatScale == 1f) {
+ return winConfig;
+ }
+ mTempWinConfig.setTo(winConfig);
+ mTempWinConfig.scale(mInvSizeCompatScale);
+ return mTempWinConfig;
+ }
+
/**
* We have one child
*/
@@ -1224,10 +1236,11 @@ public final class ViewRootImpl implements ViewParent,
controlInsetsForCompatibility(mWindowAttributes);
Rect attachedFrame = new Rect();
+ final float[] sizeCompatScale = { 1f };
res = mWindowSession.addToDisplayAsUser(mWindow, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(), userId,
mInsetsController.getRequestedVisibilities(), inputChannel, mTempInsets,
- mTempControls, attachedFrame);
+ mTempControls, attachedFrame, sizeCompatScale);
if (!attachedFrame.isValid()) {
attachedFrame = null;
}
@@ -1237,6 +1250,8 @@ public final class ViewRootImpl implements ViewParent,
mTranslator.translateRectInScreenToAppWindow(attachedFrame);
}
mTmpFrames.attachedFrame = attachedFrame;
+ mTmpFrames.sizeCompatScale = sizeCompatScale[0];
+ mInvSizeCompatScale = 1f / sizeCompatScale[0];
} catch (RemoteException e) {
mAdded = false;
mView = null;
@@ -1259,7 +1274,7 @@ public final class ViewRootImpl implements ViewParent,
final InsetsState state = mInsetsController.getState();
final Rect displayCutoutSafe = mTempRect;
state.getDisplayCutoutSafe(displayCutoutSafe);
- final WindowConfiguration winConfig = getConfiguration().windowConfiguration;
+ final WindowConfiguration winConfig = getCompatWindowConfiguration();
mWindowLayout.computeFrames(mWindowAttributes, state,
displayCutoutSafe, winConfig.getBounds(), winConfig.getWindowingMode(),
UNSPECIFIED_LENGTH, UNSPECIFIED_LENGTH,
@@ -1749,19 +1764,24 @@ public final class ViewRootImpl implements ViewParent,
mTranslator.translateRectInScreenToAppWindow(displayFrame);
mTranslator.translateRectInScreenToAppWindow(attachedFrame);
}
+ final float sizeCompatScale = frames.sizeCompatScale;
final boolean frameChanged = !mWinFrame.equals(frame);
final boolean configChanged = !mLastReportedMergedConfiguration.equals(mergedConfiguration);
final boolean attachedFrameChanged = LOCAL_LAYOUT
&& !Objects.equals(mTmpFrames.attachedFrame, attachedFrame);
final boolean displayChanged = mDisplay.getDisplayId() != displayId;
final boolean resizeModeChanged = mResizeMode != resizeMode;
+ final boolean sizeCompatScaleChanged = mTmpFrames.sizeCompatScale != sizeCompatScale;
if (msg == MSG_RESIZED && !frameChanged && !configChanged && !attachedFrameChanged
- && !displayChanged && !resizeModeChanged && !forceNextWindowRelayout) {
+ && !displayChanged && !resizeModeChanged && !forceNextWindowRelayout
+ && !sizeCompatScaleChanged) {
return;
}
mPendingDragResizing = resizeMode != RESIZE_MODE_INVALID;
mResizeMode = resizeMode;
+ mTmpFrames.sizeCompatScale = sizeCompatScale;
+ mInvSizeCompatScale = 1f / sizeCompatScale;
if (configChanged) {
// If configuration changed - notify about that and, maybe, about move to display.
@@ -8062,11 +8082,12 @@ public final class ViewRootImpl implements ViewParent,
if (maybeSyncSeqId > 0) {
mSyncSeqId = maybeSyncSeqId;
}
+ mInvSizeCompatScale = 1f / mTmpFrames.sizeCompatScale;
final int transformHint = SurfaceControl.rotationToBufferTransform(
(mDisplayInstallOrientation + mDisplay.getRotation()) % 4);
- final WindowConfiguration winConfig = getConfiguration().windowConfiguration;
+ final WindowConfiguration winConfig = getCompatWindowConfiguration();
WindowLayout.computeSurfaceSize(mWindowAttributes, winConfig.getMaxBounds(), requestedWidth,
requestedHeight, mTmpFrames.frame, mPendingDragResizing, mSurfaceSize);
@@ -8169,7 +8190,7 @@ public final class ViewRootImpl implements ViewParent,
private void setFrame(Rect frame) {
mWinFrame.set(frame);
- final WindowConfiguration winConfig = getConfiguration().windowConfiguration;
+ final WindowConfiguration winConfig = getCompatWindowConfiguration();
mPendingBackDropFrame.set(mPendingDragResizing && !winConfig.useWindowFrameForBackdrop()
? winConfig.getMaxBounds()
: frame);
diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java
index 94da2741f71a..d55c838c3e53 100644
--- a/core/java/android/view/WindowlessWindowManager.java
+++ b/core/java/android/view/WindowlessWindowManager.java
@@ -149,7 +149,8 @@ public class WindowlessWindowManager implements IWindowSession {
public int addToDisplay(IWindow window, WindowManager.LayoutParams attrs,
int viewVisibility, int displayId, InsetsVisibilities requestedVisibilities,
InputChannel outInputChannel, InsetsState outInsetsState,
- InsetsSourceControl[] outActiveControls, Rect outAttachedFrame) {
+ InsetsSourceControl[] outActiveControls, Rect outAttachedFrame,
+ float[] outSizeCompatScale) {
final SurfaceControl.Builder b = new SurfaceControl.Builder(mSurfaceSession)
.setFormat(attrs.format)
.setBLASTLayer()
@@ -182,6 +183,7 @@ public class WindowlessWindowManager implements IWindowSession {
mStateForWindow.put(window.asBinder(), state);
}
outAttachedFrame.set(0, 0, -1, -1);
+ outSizeCompatScale[0] = 1f;
final int res = WindowManagerGlobal.ADD_OKAY | WindowManagerGlobal.ADD_FLAG_APP_VISIBLE |
WindowManagerGlobal.ADD_FLAG_USE_BLAST;
@@ -197,15 +199,18 @@ public class WindowlessWindowManager implements IWindowSession {
public int addToDisplayAsUser(IWindow window, WindowManager.LayoutParams attrs,
int viewVisibility, int displayId, int userId, InsetsVisibilities requestedVisibilities,
InputChannel outInputChannel, InsetsState outInsetsState,
- InsetsSourceControl[] outActiveControls, Rect outAttachedFrame) {
+ InsetsSourceControl[] outActiveControls, Rect outAttachedFrame,
+ float[] outSizeCompatScale) {
return addToDisplay(window, attrs, viewVisibility, displayId, requestedVisibilities,
- outInputChannel, outInsetsState, outActiveControls, outAttachedFrame);
+ outInputChannel, outInsetsState, outActiveControls, outAttachedFrame,
+ outSizeCompatScale);
}
@Override
public int addToDisplayWithoutInputChannel(android.view.IWindow window,
android.view.WindowManager.LayoutParams attrs, int viewVisibility, int layerStackId,
- android.view.InsetsState insetsState, Rect outAttachedFrame) {
+ android.view.InsetsState insetsState, Rect outAttachedFrame,
+ float[] outSizeCompatScale) {
return 0;
}
diff --git a/core/java/android/window/ClientWindowFrames.java b/core/java/android/window/ClientWindowFrames.java
index 929e81ed9044..f274d1a15ba5 100644
--- a/core/java/android/window/ClientWindowFrames.java
+++ b/core/java/android/window/ClientWindowFrames.java
@@ -49,6 +49,8 @@ public class ClientWindowFrames implements Parcelable {
public boolean isParentFrameClippedByDisplayCutout;
+ public float sizeCompatScale = 1f;
+
public ClientWindowFrames() {
}
@@ -60,6 +62,7 @@ public class ClientWindowFrames implements Parcelable {
attachedFrame = new Rect(other.attachedFrame);
}
isParentFrameClippedByDisplayCutout = other.isParentFrameClippedByDisplayCutout;
+ sizeCompatScale = other.sizeCompatScale;
}
private ClientWindowFrames(Parcel in) {
@@ -73,6 +76,7 @@ public class ClientWindowFrames implements Parcelable {
parentFrame.readFromParcel(in);
attachedFrame = in.readTypedObject(Rect.CREATOR);
isParentFrameClippedByDisplayCutout = in.readBoolean();
+ sizeCompatScale = in.readFloat();
}
@Override
@@ -82,6 +86,7 @@ public class ClientWindowFrames implements Parcelable {
parentFrame.writeToParcel(dest, flags);
dest.writeTypedObject(attachedFrame, flags);
dest.writeBoolean(isParentFrameClippedByDisplayCutout);
+ dest.writeFloat(sizeCompatScale);
}
@Override
@@ -91,7 +96,8 @@ public class ClientWindowFrames implements Parcelable {
+ " display=" + displayFrame.toShortString(sb)
+ " parentFrame=" + parentFrame.toShortString(sb)
+ (attachedFrame != null ? " attachedFrame=" + attachedFrame.toShortString() : "")
- + " parentClippedByDisplayCutout=" + isParentFrameClippedByDisplayCutout + "}";
+ + (isParentFrameClippedByDisplayCutout ? " parentClippedByDisplayCutout" : "")
+ + (sizeCompatScale != 1f ? " sizeCompatScale=" + sizeCompatScale : "") + "}";
}
@Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
index 19d3acbf28d4..b70bde3a64ee 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java
@@ -228,12 +228,13 @@ public class TaskSnapshotWindow {
final InsetsState tmpInsetsState = new InsetsState();
final InputChannel tmpInputChannel = new InputChannel();
+ final float[] sizeCompatScale = { 1f };
try {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "TaskSnapshot#addToDisplay");
final int res = session.addToDisplay(window, layoutParams, View.GONE, displayId,
info.requestedVisibilities, tmpInputChannel, tmpInsetsState, tmpControls,
- new Rect());
+ new Rect(), sizeCompatScale);
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
if (res < 0) {
Slog.w(TAG, "Failed to add snapshot starting window res=" + res);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
index 46b040fd4325..e5ae2962e6e4 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java
@@ -251,7 +251,7 @@ public class StartingSurfaceDrawerTests extends ShellTestCase {
anyInt() /* viewVisibility */, anyInt() /* displayId */,
any() /* requestedVisibility */, any() /* outInputChannel */,
any() /* outInsetsState */, any() /* outActiveControls */,
- any() /* outAttachedFrame */);
+ any() /* outAttachedFrame */, any() /* outSizeCompatScale */);
TaskSnapshotWindow mockSnapshotWindow = TaskSnapshotWindow.create(windowInfo,
mBinder,
snapshot, mTestExecutor, () -> {
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index 3577545088e0..0128c187bbdd 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -198,28 +198,31 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
public int addToDisplay(IWindow window, WindowManager.LayoutParams attrs,
int viewVisibility, int displayId, InsetsVisibilities requestedVisibilities,
InputChannel outInputChannel, InsetsState outInsetsState,
- InsetsSourceControl[] outActiveControls, Rect outAttachedFrame) {
+ InsetsSourceControl[] outActiveControls, Rect outAttachedFrame,
+ float[] outSizeCompatScale) {
return mService.addWindow(this, window, attrs, viewVisibility, displayId,
UserHandle.getUserId(mUid), requestedVisibilities, outInputChannel, outInsetsState,
- outActiveControls, outAttachedFrame);
+ outActiveControls, outAttachedFrame, outSizeCompatScale);
}
@Override
public int addToDisplayAsUser(IWindow window, WindowManager.LayoutParams attrs,
int viewVisibility, int displayId, int userId, InsetsVisibilities requestedVisibilities,
InputChannel outInputChannel, InsetsState outInsetsState,
- InsetsSourceControl[] outActiveControls, Rect outAttachedFrame) {
+ InsetsSourceControl[] outActiveControls, Rect outAttachedFrame,
+ float[] outSizeCompatScale) {
return mService.addWindow(this, window, attrs, viewVisibility, displayId, userId,
requestedVisibilities, outInputChannel, outInsetsState, outActiveControls,
- outAttachedFrame);
+ outAttachedFrame, outSizeCompatScale);
}
@Override
public int addToDisplayWithoutInputChannel(IWindow window, WindowManager.LayoutParams attrs,
- int viewVisibility, int displayId, InsetsState outInsetsState, Rect outAttachedFrame) {
+ int viewVisibility, int displayId, InsetsState outInsetsState, Rect outAttachedFrame,
+ float[] outSizeCompatScale) {
return mService.addWindow(this, window, attrs, viewVisibility, displayId,
UserHandle.getUserId(mUid), mDummyRequestedVisibilities, null /* outInputChannel */,
- outInsetsState, mDummyControls, outAttachedFrame);
+ outInsetsState, mDummyControls, outAttachedFrame, outSizeCompatScale);
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index f31c26757b09..0015b19c1226 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -1448,7 +1448,8 @@ public class WindowManagerService extends IWindowManager.Stub
public int addWindow(Session session, IWindow client, LayoutParams attrs, int viewVisibility,
int displayId, int requestUserId, InsetsVisibilities requestedVisibilities,
InputChannel outInputChannel, InsetsState outInsetsState,
- InsetsSourceControl[] outActiveControls, Rect outAttachedFrame) {
+ InsetsSourceControl[] outActiveControls, Rect outAttachedFrame,
+ float[] outSizeCompatScale) {
Arrays.fill(outActiveControls, null);
int[] appOp = new int[1];
final boolean isRoundedCornerOverlay = (attrs.privateFlags
@@ -1865,11 +1866,15 @@ public class WindowManagerService extends IWindowManager.Stub
getInsetsSourceControls(win, outActiveControls);
if (win.mLayoutAttached) {
- outAttachedFrame.set(win.getParentWindow().getCompatFrame());
+ outAttachedFrame.set(win.getParentWindow().getFrame());
+ if (win.mInvGlobalScale != 1f) {
+ outAttachedFrame.scale(win.mInvGlobalScale);
+ }
} else {
// Make this invalid which indicates a null attached frame.
outAttachedFrame.set(0, 0, -1, -1);
}
+ outSizeCompatScale[0] = win.getSizeCompatScale();
}
Binder.restoreCallingIdentity(origId);
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 5c9cb05ee153..86e14c2faa04 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -472,11 +472,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
int mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
// Current transformation being applied.
- float mGlobalScale=1;
- float mInvGlobalScale=1;
+ float mGlobalScale = 1f;
+ float mInvGlobalScale = 1f;
+ float mSizeCompatScale = 1f;
final float mOverrideScale;
- float mHScale=1, mVScale=1;
- float mLastHScale=1, mLastVScale=1;
+ float mHScale = 1f, mVScale = 1f;
+ float mLastHScale = 1f, mLastVScale = 1f;
// An offset in pixel of the surface contents from the window position. Used for Wallpaper
// to provide the effect of scrolling within a large surface. We just use these values as
@@ -1252,18 +1253,19 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
void updateGlobalScale() {
if (hasCompatScale()) {
- if (mOverrideScale != 1f) {
- mGlobalScale = mToken.hasSizeCompatBounds()
- ? mToken.getSizeCompatScale() * mOverrideScale
- : mOverrideScale;
- } else {
- mGlobalScale = mToken.getSizeCompatScale();
- }
+ mSizeCompatScale = (mOverrideScale == 1f || mToken.hasSizeCompatBounds())
+ ? mToken.getSizeCompatScale()
+ : 1f;
+ mGlobalScale = mSizeCompatScale * mOverrideScale;
mInvGlobalScale = 1f / mGlobalScale;
return;
}
- mGlobalScale = mInvGlobalScale = 1f;
+ mGlobalScale = mInvGlobalScale = mSizeCompatScale = 1f;
+ }
+
+ float getSizeCompatScale() {
+ return mSizeCompatScale;
}
/**
@@ -1354,7 +1356,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
windowFrames.mFrame.set(clientWindowFrames.frame);
windowFrames.mDisplayFrame.set(clientWindowFrames.displayFrame);
windowFrames.mParentFrame.set(clientWindowFrames.parentFrame);
- if (hasCompatScale()) {
+ if (mGlobalScale != 1f) {
// The frames sent from the client need to be adjusted to the real coordinate space.
windowFrames.mFrame.scale(mGlobalScale);
windowFrames.mDisplayFrame.scale(mGlobalScale);
@@ -1366,7 +1368,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
windowFrames.mFrame.set(clientWindowFrames.frame);
windowFrames.mCompatFrame.set(windowFrames.mFrame);
- if (hasCompatScale()) {
+ if (mInvGlobalScale != 1f) {
// Also, the scaled frame that we report to the app needs to be adjusted to be in
// its coordinate space.
windowFrames.mCompatFrame.scale(mInvGlobalScale);
@@ -1471,10 +1473,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return mWindowFrames.mParentFrame;
}
- Rect getCompatFrame() {
- return mWindowFrames.mCompatFrame;
- }
-
WindowManager.LayoutParams getAttrs() {
return mAttrs;
}
@@ -1728,7 +1726,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
*/
InsetsState getCompatInsetsState() {
InsetsState state = getInsetsState();
- if (hasCompatScale()) {
+ if (mInvGlobalScale != 1f) {
state = new InsetsState(state, true);
state.scale(mInvGlobalScale);
}
@@ -3837,15 +3835,19 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
boolean relayoutVisible) {
outFrames.frame.set(mWindowFrames.mCompatFrame);
outFrames.displayFrame.set(mWindowFrames.mDisplayFrame);
- if (mInvGlobalScale != 1.0f && hasCompatScale()) {
+ if (mInvGlobalScale != 1f) {
outFrames.displayFrame.scale(mInvGlobalScale);
}
if (mLayoutAttached) {
if (outFrames.attachedFrame == null) {
outFrames.attachedFrame = new Rect();
}
- outFrames.attachedFrame.set(getParentWindow().getCompatFrame());
+ outFrames.attachedFrame.set(getParentWindow().getFrame());
+ if (mInvGlobalScale != 1f) {
+ outFrames.attachedFrame.scale(mInvGlobalScale);
+ }
}
+ outFrames.sizeCompatScale = mSizeCompatScale;
// Note: in the cases where the window is tied to an activity, we should not send a
// configuration update when the window has requested to be hidden. Doing so can lead to
@@ -4345,7 +4347,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
pw.println(prefix + "mHasSurface=" + mHasSurface
+ " isReadyForDisplay()=" + isReadyForDisplay()
+ " mWindowRemovalAllowed=" + mWindowRemovalAllowed);
- if (hasCompatScale()) {
+ if (mInvGlobalScale != 1f) {
pw.println(prefix + "mCompatFrame=" + mWindowFrames.mCompatFrame.toShortString(sTmpSB));
}
if (dumpAll) {
@@ -4557,7 +4559,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
float translateToWindowX(float x) {
float winX = x - mWindowFrames.mFrame.left;
- if (hasCompatScale()) {
+ if (mGlobalScale != 1f) {
winX *= mGlobalScale;
}
return winX;
@@ -4565,7 +4567,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
float translateToWindowY(float y) {
float winY = y - mWindowFrames.mFrame.top;
- if (hasCompatScale()) {
+ if (mGlobalScale != 1f) {
winY *= mGlobalScale;
}
return winY;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 0c3b270518cf..7c46fd61a834 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -2003,7 +2003,7 @@ public class ActivityRecordTests extends WindowTestsBase {
anyInt() /* viewVisibility */, anyInt() /* displayId */,
any() /* requestedVisibilities */, any() /* outInputChannel */,
any() /* outInsetsState */, any() /* outActiveControls */,
- any() /* outAttachedFrame */);
+ any() /* outAttachedFrame */, any() /* outSizeCompatScale */);
mAtm.mWindowManager.mStartingSurfaceController
.createTaskSnapshotSurface(activity, snapshot);
} catch (RemoteException ignored) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
index 1a64f5e3a356..bd575246bf14 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
@@ -283,7 +283,7 @@ public class WindowManagerServiceTests extends WindowTestsBase {
mWm.addWindow(session, new TestIWindow(), params, View.VISIBLE, DEFAULT_DISPLAY,
UserHandle.USER_SYSTEM, new InsetsVisibilities(), null, new InsetsState(),
- new InsetsSourceControl[0], new Rect());
+ new InsetsSourceControl[0], new Rect(), new float[1]);
verify(mWm.mWindowContextListenerController, never()).registerWindowContainerListener(any(),
any(), anyInt(), anyInt(), any());