From bc1d8093db1e13a531530d9d32805e81c9a278eb Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Wed, 23 Mar 2022 23:25:47 +0800 Subject: [PATCH] Send InsetsState to the client via IWindow#resized In some cases, the InsetsState and the window frame can be changed at the same time (such as orientation changed). Reporting them separately might produce incorrect insets. When the window layout is moved to the client, it uses the configuration and the InsetsState to compute the window frame. They need to be reported together as well. Bug: 161810301 Bug: 160732586 Test: atest ActivityRecordTests WindowStateTests Test: Add logs to check if we dispatch the correct insets to apps while rotating the display. Change-Id: I5c9f628eda40932def97c5caf968cb62db128e80 --- .../service/wallpaper/WallpaperService.java | 5 +- core/java/android/view/IWindow.aidl | 16 +-- core/java/android/view/ViewRootImpl.java | 101 +++++------------- .../android/view/WindowlessWindowManager.java | 14 ++- .../android/internal/view/BaseIWindow.java | 8 +- .../wm/shell/common/SystemWindows.java | 10 +- .../startingsurface/TaskSnapshotWindow.java | 5 +- .../com/android/server/wm/WindowFrames.java | 23 +++- .../server/wm/WindowManagerService.java | 15 +++ .../com/android/server/wm/WindowState.java | 40 ++++--- .../server/wm/ActivityRecordTests.java | 6 +- .../com/android/server/wm/TestIWindow.java | 11 +- .../android/server/wm/WindowStateTests.java | 5 +- 13 files changed, 124 insertions(+), 135 deletions(-) diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index c20fc75a51f36..dd0ac2e4e3a29 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -395,8 +395,9 @@ public abstract class WallpaperService extends Service { final BaseIWindow mWindow = new BaseIWindow() { @Override public void resized(ClientWindowFrames frames, boolean reportDraw, - MergedConfiguration mergedConfiguration, boolean forceLayout, - boolean alwaysConsumeSystemBars, int displayId, int syncSeqId, int resizeMode) { + MergedConfiguration mergedConfiguration, InsetsState insetsState, + boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, + int syncSeqId, int resizeMode) { Message msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED, reportDraw ? 1 : 0, mergedConfiguration); diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index 5dcf3931ecd66..a8564740c0c89 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -54,26 +54,14 @@ oneway interface IWindow { void executeCommand(String command, String parameters, in ParcelFileDescriptor descriptor); void resized(in ClientWindowFrames frames, boolean reportDraw, - in MergedConfiguration newMergedConfiguration, + in MergedConfiguration newMergedConfiguration, in InsetsState insetsState, boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, int syncSeqId, int resizeMode); - /** - * Called when the window insets configuration has changed. - * - * @param willMove The window frame will be moved soon. - * @param willResize The window frame will be resized soon. - */ - void insetsChanged(in InsetsState insetsState, in boolean willMove, in boolean willResize); - /** * Called when this window retrieved control over a specified set of insets sources. - * - * @param willMove The window frame will be moved soon. - * @param willResize The window frame will be resized soon. */ - void insetsControlChanged(in InsetsState insetsState, in InsetsSourceControl[] activeControls, - in boolean willMove, in boolean willResize); + void insetsControlChanged(in InsetsState insetsState, in InsetsSourceControl[] activeControls); /** * Called when a set of insets source window should be shown by policy. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index a3e6945617315..a2174e1bb1383 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -680,9 +680,6 @@ public final class ViewRootImpl implements ViewParent, final Rect mPendingBackDropFrame = new Rect(); - private boolean mWillMove; - private boolean mWillResize; - boolean mPendingAlwaysConsumeSystemBars; private final InsetsState mTempInsets = new InsetsState(); private final InsetsSourceControl[] mTempControls = new InsetsSourceControl[SIZE]; @@ -1872,10 +1869,6 @@ public final class ViewRootImpl implements ViewParent, void notifyInsetsChanged() { mApplyInsetsRequested = true; - if (mWillMove || mWillResize) { - // The window frame will be changed soon. The following logic will be executed then. - return; - } requestLayout(); // See comment for View.sForceLayoutWhenInsetsChanged @@ -2778,7 +2771,7 @@ public final class ViewRootImpl implements ViewParent, // Execute enqueued actions on every traversal in case a detached view enqueued an action getRunQueue().executeActions(mAttachInfo.mHandler); - if (mApplyInsetsRequested && !(mWillMove || mWillResize)) { + if (mApplyInsetsRequested) { dispatchApplyInsets(host); } @@ -5338,14 +5331,13 @@ public final class ViewRootImpl implements ViewParent, private static final int MSG_REQUEST_KEYBOARD_SHORTCUTS = 26; private static final int MSG_UPDATE_POINTER_ICON = 27; private static final int MSG_POINTER_CAPTURE_CHANGED = 28; - private static final int MSG_INSETS_CHANGED = 30; - private static final int MSG_INSETS_CONTROL_CHANGED = 31; - private static final int MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED = 32; - private static final int MSG_SHOW_INSETS = 34; - private static final int MSG_HIDE_INSETS = 35; - private static final int MSG_REQUEST_SCROLL_CAPTURE = 36; - private static final int MSG_WINDOW_TOUCH_MODE_CHANGED = 37; - private static final int MSG_KEEP_CLEAR_RECTS_CHANGED = 38; + private static final int MSG_INSETS_CONTROL_CHANGED = 29; + private static final int MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED = 30; + private static final int MSG_SHOW_INSETS = 31; + private static final int MSG_HIDE_INSETS = 32; + private static final int MSG_REQUEST_SCROLL_CAPTURE = 33; + private static final int MSG_WINDOW_TOUCH_MODE_CHANGED = 34; + private static final int MSG_KEEP_CLEAR_RECTS_CHANGED = 35; final class ViewRootHandler extends Handler { @@ -5400,8 +5392,6 @@ public final class ViewRootImpl implements ViewParent, return "MSG_UPDATE_POINTER_ICON"; case MSG_POINTER_CAPTURE_CHANGED: return "MSG_POINTER_CAPTURE_CHANGED"; - case MSG_INSETS_CHANGED: - return "MSG_INSETS_CHANGED"; case MSG_INSETS_CONTROL_CHANGED: return "MSG_INSETS_CONTROL_CHANGED"; case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: @@ -5463,25 +5453,14 @@ public final class ViewRootImpl implements ViewParent, break; case MSG_RESIZED: case MSG_RESIZED_REPORT: { - mWillMove = false; - mWillResize = false; final SomeArgs args = (SomeArgs) msg.obj; + mInsetsController.onStateChanged((InsetsState) args.arg3); handleResized(msg.what, args); args.recycle(); break; } - case MSG_INSETS_CHANGED: { - SomeArgs args = (SomeArgs) msg.obj; - mWillMove = args.argi1 == 1; - mWillResize = args.argi2 == 1; - mInsetsController.onStateChanged((InsetsState) args.arg1); - args.recycle(); - break; - } case MSG_INSETS_CONTROL_CHANGED: { SomeArgs args = (SomeArgs) msg.obj; - mWillMove = args.argi1 == 1; - mWillResize = args.argi2 == 1; // Deliver state change before control change, such that: // a) When gaining control, controller can compare with server state to evaluate @@ -5517,7 +5496,6 @@ public final class ViewRootImpl implements ViewParent, break; } case MSG_WINDOW_MOVED: - mWillMove = false; if (mAdded) { final int w = mWinFrame.width(); final int h = mWinFrame.height(); @@ -7983,8 +7961,6 @@ public final class ViewRootImpl implements ViewParent, final int requestedWidth = (int) (mView.getMeasuredWidth() * appScale + 0.5f); final int requestedHeight = (int) (mView.getMeasuredHeight() * appScale + 0.5f); - mWillMove = false; - mWillResize = false; int relayoutResult = 0; WindowConfiguration winConfig = getConfiguration().windowConfiguration; if (LOCAL_LAYOUT) { @@ -8529,15 +8505,25 @@ public final class ViewRootImpl implements ViewParent, @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private void dispatchResized(ClientWindowFrames frames, boolean reportDraw, - MergedConfiguration mergedConfiguration, boolean forceLayout, + MergedConfiguration mergedConfiguration, InsetsState insetsState, boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, int syncSeqId, int resizeMode) { - Message msg = mHandler.obtainMessage(reportDraw ? MSG_RESIZED_REPORT : MSG_RESIZED); SomeArgs args = SomeArgs.obtain(); final boolean sameProcessCall = (Binder.getCallingPid() == android.os.Process.myPid()); + if (sameProcessCall) { + insetsState = new InsetsState(insetsState, true /* copySource */); + } + if (mTranslator != null) { + mTranslator.translateInsetsStateInScreenToAppWindow(insetsState); + } + if (insetsState.getSourceOrDefaultVisibility(ITYPE_IME)) { + ImeTracing.getInstance().triggerClientDump("ViewRootImpl#dispatchResized", + getInsetsController().getHost().getInputMethodManager(), null /* icProto */); + } args.arg1 = sameProcessCall ? new ClientWindowFrames(frames) : frames; args.arg2 = sameProcessCall && mergedConfiguration != null ? new MergedConfiguration(mergedConfiguration) : mergedConfiguration; + args.arg3 = insetsState; args.argi1 = forceLayout ? 1 : 0; args.argi2 = alwaysConsumeSystemBars ? 1 : 0; args.argi3 = displayId; @@ -8548,27 +8534,8 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } - private void dispatchInsetsChanged(InsetsState insetsState, boolean willMove, - boolean willResize) { - if (Binder.getCallingPid() == android.os.Process.myPid()) { - insetsState = new InsetsState(insetsState, true /* copySource */); - } - if (mTranslator != null) { - mTranslator.translateInsetsStateInScreenToAppWindow(insetsState); - } - if (insetsState != null && insetsState.getSourceOrDefaultVisibility(ITYPE_IME)) { - ImeTracing.getInstance().triggerClientDump("ViewRootImpl#dispatchInsetsChanged", - getInsetsController().getHost().getInputMethodManager(), null /* icProto */); - } - SomeArgs args = SomeArgs.obtain(); - args.arg1 = insetsState; - args.argi1 = willMove ? 1 : 0; - args.argi2 = willResize ? 1 : 0; - mHandler.obtainMessage(MSG_INSETS_CHANGED, args).sendToTarget(); - } - private void dispatchInsetsControlChanged(InsetsState insetsState, - InsetsSourceControl[] activeControls, boolean willMove, boolean willResize) { + InsetsSourceControl[] activeControls) { if (Binder.getCallingPid() == android.os.Process.myPid()) { insetsState = new InsetsState(insetsState, true /* copySource */); if (activeControls != null) { @@ -8588,8 +8555,6 @@ public final class ViewRootImpl implements ViewParent, SomeArgs args = SomeArgs.obtain(); args.arg1 = insetsState; args.arg2 = activeControls; - args.argi1 = willMove ? 1 : 0; - args.argi2 = willResize ? 1 : 0; mHandler.obtainMessage(MSG_INSETS_CONTROL_CHANGED, args).sendToTarget(); } @@ -9932,30 +9897,22 @@ public final class ViewRootImpl implements ViewParent, @Override public void resized(ClientWindowFrames frames, boolean reportDraw, - MergedConfiguration mergedConfiguration, boolean forceLayout, - boolean alwaysConsumeSystemBars, int displayId, int syncSeqId, int resizeMode) { + MergedConfiguration mergedConfiguration, InsetsState insetsState, + boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, int syncSeqId, + int resizeMode) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { - viewAncestor.dispatchResized(frames, reportDraw, mergedConfiguration, forceLayout, - alwaysConsumeSystemBars, displayId, syncSeqId, resizeMode); - } - } - - @Override - public void insetsChanged(InsetsState insetsState, boolean willMove, boolean willResize) { - final ViewRootImpl viewAncestor = mViewAncestor.get(); - if (viewAncestor != null) { - viewAncestor.dispatchInsetsChanged(insetsState, willMove, willResize); + viewAncestor.dispatchResized(frames, reportDraw, mergedConfiguration, insetsState, + forceLayout, alwaysConsumeSystemBars, displayId, syncSeqId, resizeMode); } } @Override public void insetsControlChanged(InsetsState insetsState, - InsetsSourceControl[] activeControls, boolean willMove, boolean willResize) { + InsetsSourceControl[] activeControls) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { - viewAncestor.dispatchInsetsControlChanged( - insetsState, activeControls, willMove, willResize); + viewAncestor.dispatchInsetsControlChanged(insetsState, activeControls); } } diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index 385a80d7c32cf..30ae520fdfd74 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -16,6 +16,8 @@ package android.view; +import static android.view.WindowCallbacks.RESIZE_MODE_INVALID; + import android.annotation.Nullable; import android.content.res.Configuration; import android.graphics.PixelFormat; @@ -82,9 +84,8 @@ public class WindowlessWindowManager implements IWindowSession { private final IBinder mHostInputToken; private final IBinder mFocusGrantToken = new Binder(); private InsetsState mInsetsState; - - private int mForceHeight = -1; - private int mForceWidth = -1; + private final ClientWindowFrames mTmpFrames = new ClientWindowFrames(); + private final MergedConfiguration mTmpConfig = new MergedConfiguration(); public WindowlessWindowManager(Configuration c, SurfaceControl rootSurface, IBinder hostInputToken) { @@ -540,7 +541,12 @@ public class WindowlessWindowManager implements IWindowSession { mInsetsState = state; for (State s : mStateForWindow.values()) { try { - s.mClient.insetsChanged(state, false, false); + mTmpFrames.frame.set(0, 0, s.mParams.width, s.mParams.height); + mTmpFrames.displayFrame.set(mTmpFrames.frame); + mTmpConfig.setConfiguration(mConfiguration, mConfiguration); + s.mClient.resized(mTmpFrames, false /* reportDraw */, mTmpConfig, state, + false /* forceLayout */, false /* alwaysConsumeSystemBars */, s.mDisplayId, + Integer.MAX_VALUE, RESIZE_MODE_INVALID); } catch (RemoteException e) { // Too bad } diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index 52f0fb578e3db..fe7723658761d 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -50,7 +50,7 @@ public class BaseIWindow extends IWindow.Stub { @Override public void resized(ClientWindowFrames frames, boolean reportDraw, - MergedConfiguration mergedConfiguration, boolean forceLayout, + MergedConfiguration mergedConfiguration, InsetsState insetsState, boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, int seqId, int resizeMode) { if (reportDraw) { try { @@ -60,13 +60,9 @@ public class BaseIWindow extends IWindow.Stub { } } - @Override - public void insetsChanged(InsetsState insetsState, boolean willMove, boolean willResize) { - } - @Override public void insetsControlChanged(InsetsState insetsState, - InsetsSourceControl[] activeControls, boolean willMove, boolean willResize) { + InsetsSourceControl[] activeControls) { } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java index 8d1afa4a13046..d5875c03ccd21 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java @@ -343,15 +343,13 @@ public class SystemWindows { @Override public void resized(ClientWindowFrames frames, boolean reportDraw, - MergedConfiguration newMergedConfiguration, boolean forceLayout, - boolean alwaysConsumeSystemBars, int displayId, int syncSeqId, int resizeMode) {} - - @Override - public void insetsChanged(InsetsState insetsState, boolean willMove, boolean willResize) {} + MergedConfiguration newMergedConfiguration, InsetsState insetsState, + boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, int syncSeqId, + int resizeMode) {} @Override public void insetsControlChanged(InsetsState insetsState, - InsetsSourceControl[] activeControls, boolean willMove, boolean willResize) {} + InsetsSourceControl[] activeControls) {} @Override public void showInsets(int types, boolean fromIme) {} 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 0d46199bde776..2debcf296ea8f 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 @@ -534,8 +534,9 @@ public class TaskSnapshotWindow { @Override public void resized(ClientWindowFrames frames, boolean reportDraw, - MergedConfiguration mergedConfiguration, boolean forceLayout, - boolean alwaysConsumeSystemBars, int displayId, int seqId, int resizeMode) { + MergedConfiguration mergedConfiguration, InsetsState insetsState, + boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, int seqId, + int resizeMode) { if (mOuter != null) { mOuter.mSplashScreenExecutor.execute(() -> { if (mergedConfiguration != null diff --git a/services/core/java/com/android/server/wm/WindowFrames.java b/services/core/java/com/android/server/wm/WindowFrames.java index a307ee8802a98..1cb63032b07d9 100644 --- a/services/core/java/com/android/server/wm/WindowFrames.java +++ b/services/core/java/com/android/server/wm/WindowFrames.java @@ -81,6 +81,8 @@ public class WindowFrames { private boolean mContentChanged; + private boolean mInsetsChanged; + public void setFrames(Rect parentFrame, Rect displayFrame) { mParentFrame.set(parentFrame); mDisplayFrame.set(displayFrame); @@ -158,6 +160,20 @@ public class WindowFrames { return mContentChanged; } + /** + * Sets whether we need to report {@link android.view.InsetsState} to the client. + */ + void setInsetsChanged(boolean insetsChanged) { + mInsetsChanged = insetsChanged; + } + + /** + * @see #setInsetsChanged(boolean) + */ + boolean hasInsetsChanged() { + return mInsetsChanged; + } + public void dumpDebug(@NonNull ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); mParentFrame.dumpDebug(proto, PARENT_FRAME); @@ -169,9 +185,10 @@ public class WindowFrames { public void dump(PrintWriter pw, String prefix) { pw.println(prefix + "Frames: parent=" + mParentFrame.toShortString(sTmpSB) - + " display=" + mDisplayFrame.toShortString(sTmpSB)); - pw.println(prefix + "mFrame=" + mFrame.toShortString(sTmpSB) - + " last=" + mLastFrame.toShortString(sTmpSB)); + + " display=" + mDisplayFrame.toShortString(sTmpSB) + + " frame=" + mFrame.toShortString(sTmpSB) + + " last=" + mLastFrame.toShortString(sTmpSB) + + " insetsChanged=" + mInsetsChanged); } String getInsetsChangedInfo() { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 92864b6e3fd72..cbb39d2ce275f 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -709,6 +709,9 @@ public class WindowManagerService extends IWindowManager.Stub // State while inside of layoutAndPlaceSurfacesLocked(). boolean mFocusMayChange; + // Number of windows whose insets state have been changed. + int mWindowsInsetsChanged = 0; + // This is held as long as we have the screen frozen, to give us time to // perform a rotation animation when turning off shows the lock screen which // changes the orientation. @@ -5218,6 +5221,7 @@ public class WindowManagerService extends IWindowManager.Stub public static final int LAYOUT_AND_ASSIGN_WINDOW_LAYERS_IF_NEEDED = 63; public static final int WINDOW_STATE_BLAST_SYNC_TIMEOUT = 64; public static final int REPARENT_TASK_TO_DEFAULT_DISPLAY = 65; + public static final int INSETS_CHANGED = 66; /** * Used to denote that an integer field in a message will not be used. @@ -5544,6 +5548,17 @@ public class WindowManagerService extends IWindowManager.Stub } break; } + case INSETS_CHANGED: { + synchronized (mGlobalLock) { + if (mWindowsInsetsChanged > 0) { + mWindowsInsetsChanged = 0; + // We need to update resizing windows and dispatch the new insets state + // to them. + mRoot.performSurfacePlacement(); + } + } + break; + } } if (DEBUG_WINDOW_TRACE) { Slog.v(TAG_WM, "handleMessage: exit"); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index b20781fd91ec6..7bf7295fd2cbd 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1537,12 +1537,14 @@ class WindowState extends WindowContainer implements WindowManagerP * dimensions or insets have changed. */ void updateResizingWindowIfNeeded() { - final WindowStateAnimator winAnimator = mWinAnimator; - if (!mHasSurface || getDisplayContent().mLayoutSeq != mLayoutSeq || isGoneForLayout()) { + final boolean insetsChanged = mWindowFrames.hasInsetsChanged(); + if ((!mHasSurface || getDisplayContent().mLayoutSeq != mLayoutSeq || isGoneForLayout()) + && !insetsChanged) { return; } - boolean didFrameInsetsChange = setReportResizeHints(); + final WindowStateAnimator winAnimator = mWinAnimator; + final boolean didFrameInsetsChange = setReportResizeHints(); // The latest configuration will be returned by the out parameter of relayout, so it is // unnecessary to report resize if this window is running relayout. final boolean configChanged = !mInRelayout && !isLastConfigReportedToClient(); @@ -1567,6 +1569,7 @@ class WindowState extends WindowContainer implements WindowManagerP // already. This because the window is waiting on a finishDrawing from the client. if (didFrameInsetsChange || configChanged + || insetsChanged || dragResizingChanged || mReportOrientationChanged || shouldSendRedrawForSync()) { @@ -1576,6 +1579,14 @@ class WindowState extends WindowContainer implements WindowManagerP this, mWindowFrames.getInsetsChangedInfo(), configChanged, dragResizingChanged, mReportOrientationChanged); + if (insetsChanged) { + mWindowFrames.setInsetsChanged(false); + mWmService.mWindowsInsetsChanged--; + if (mWmService.mWindowsInsetsChanged == 0) { + mWmService.mH.removeMessages(WindowManagerService.H.INSETS_CHANGED); + } + } + // If it's a dead window left on screen, and the configuration changed, there is nothing // we can do about it. Remove the window now. if (mActivityRecord != null && mAppDied) { @@ -3962,8 +3973,8 @@ class WindowState extends WindowContainer implements WindowManagerP try { mClient.resized(mClientWindowFrames, reportDraw, mLastReportedConfiguration, - forceRelayout, alwaysConsumeSystemBars, displayId, mSyncSeqId, resizeMode); - + getCompatInsetsState(), forceRelayout, alwaysConsumeSystemBars, displayId, + mSyncSeqId, resizeMode); if (drawPending && reportOrientation && mOrientationChanging) { mOrientationChangeRedrawRequestTime = SystemClock.elapsedRealtime(); ProtoLog.v(WM_DEBUG_ORIENTATION, @@ -3992,13 +4003,14 @@ class WindowState extends WindowContainer implements WindowManagerP */ void notifyInsetsChanged() { ProtoLog.d(WM_DEBUG_WINDOW_INSETS, "notifyInsetsChanged for %s ", this); - try { - mClient.insetsChanged(getCompatInsetsState(), - hasMoved(), - mWindowFrames.isFrameSizeChangeReported()); - } catch (RemoteException e) { - Slog.w(TAG, "Failed to deliver inset state change w=" + this, e); - } + mWindowFrames.setInsetsChanged(true); + + // If the new InsetsState won't be dispatched before releasing WM lock, the following + // message will be executed. + mWmService.mWindowsInsetsChanged++; + mWmService.mH.removeMessages(WindowManagerService.H.INSETS_CHANGED); + mWmService.mH.sendEmptyMessage(WindowManagerService.H.INSETS_CHANGED); + final WindowContainer p = getParent(); if (p != null) { p.updateOverlayInsetsState(this); @@ -4015,9 +4027,7 @@ class WindowState extends WindowContainer implements WindowManagerP getDisplayContent().getInsetsStateController(); try { mClient.insetsControlChanged(getCompatInsetsState(), - stateController.getControlsForDispatch(this), - hasMoved(), - mWindowFrames.isFrameSizeChangeReported()); + stateController.getControlsForDispatch(this)); } catch (RemoteException e) { Slog.w(TAG, "Failed to deliver inset state change to w=" + this, e); } 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 f9d4dffd4643d..3be70114172bd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -3159,12 +3159,14 @@ public class ActivityRecordTests extends WindowTestsBase { doReturn(true).when(app2).isReadyToDispatchInsetsState(); mDisplayContent.setImeLayeringTarget(app2); mDisplayContent.updateImeInputAndControlTarget(app2); + mDisplayContent.mWmService.mRoot.performSurfacePlacement(); // Verify after unfreezing app2's IME insets state, we won't dispatch visible IME insets // to client if the app didn't request IME visible. assertFalse(app2.mActivityRecord.mImeInsetsFrozenUntilStartInput); - verify(app2.mClient, atLeastOnce()).insetsChanged(insetsStateCaptor.capture(), anyBoolean(), - anyBoolean()); + verify(app2.mClient, atLeastOnce()).resized(any(), anyBoolean(), any(), + insetsStateCaptor.capture(), anyBoolean(), anyBoolean(), anyInt(), anyInt(), + anyInt()); assertFalse(app2.getInsetsState().getSource(ITYPE_IME).isVisible()); } diff --git a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java index 7cf4b2ebe9245..bb5acebfacd74 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java @@ -43,17 +43,14 @@ public class TestIWindow extends IWindow.Stub { @Override public void resized(ClientWindowFrames frames, boolean reportDraw, - MergedConfiguration mergedConfig, boolean forceLayout, boolean alwaysConsumeSystemBars, - int displayId, int seqId, int resizeMode) throws RemoteException { - } - - @Override - public void insetsChanged(InsetsState insetsState, boolean willMove, boolean willResize) { + MergedConfiguration mergedConfig, InsetsState insetsState, boolean forceLayout, + boolean alwaysConsumeSystemBars, int displayId, int seqId, int resizeMode) + throws RemoteException { } @Override public void insetsControlChanged(InsetsState insetsState, - InsetsSourceControl[] activeControls, boolean willMove, boolean willResize) { + InsetsSourceControl[] activeControls) { } @Override diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 91bde7b31a48b..bb0c7f7000abf 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -692,8 +692,9 @@ public class WindowStateTests extends WindowTestsBase { try { doThrow(new RemoteException("test")).when(win.mClient).resized(any() /* frames */, anyBoolean() /* reportDraw */, any() /* mergedConfig */, - anyBoolean() /* forceLayout */, anyBoolean() /* alwaysConsumeSystemBars */, - anyInt() /* displayId */, anyInt() /* seqId */, anyInt() /* resizeMode */); + any() /* insetsState */, anyBoolean() /* forceLayout */, + anyBoolean() /* alwaysConsumeSystemBars */, anyInt() /* displayId */, + anyInt() /* seqId */, anyInt() /* resizeMode */); } catch (RemoteException ignored) { } win.reportResized();