diff options
| author | 2022-03-23 23:25:47 +0800 | |
|---|---|---|
| committer | 2022-03-25 12:39:18 +0800 | |
| commit | bc1d8093db1e13a531530d9d32805e81c9a278eb (patch) | |
| tree | 2d79ec6054796ebd0e9750151718a1d8f8c0d080 | |
| parent | bb497479ab02a8080937ccede57ffa8af742597e (diff) | |
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
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 c20fc75a51f3..dd0ac2e4e3a2 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 5dcf3931ecd6..a8564740c0c8 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 a3e694561731..a2174e1bb138 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) { - 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) { + MergedConfiguration mergedConfiguration, InsetsState insetsState, + boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, int syncSeqId, + int resizeMode) { 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 385a80d7c32c..30ae520fdfd7 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 52f0fb578e3d..fe7723658761 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 { @@ -61,12 +61,8 @@ 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 8d1afa4a1304..d5875c03ccd2 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 0d46199bde77..2debcf296ea8 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 a307ee8802a9..1cb63032b07d 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 92864b6e3fd7..cbb39d2ce275 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 b20781fd91ec..7bf7295fd2cb 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<WindowState> 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<WindowState> 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<WindowState> 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<WindowState> 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<WindowState> 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<WindowState> 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 f9d4dffd4643..3be70114172b 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 7cf4b2ebe924..bb5acebfacd7 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 91bde7b31a48..bb0c7f7000ab 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(); |