diff options
9 files changed, 58 insertions, 29 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 6fa92176959e..bf54c737b7be 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -7112,14 +7112,19 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } /** + * @return an integer as the changed requested visible insets types. * @see #getRequestedVisibleTypes() */ - void updateRequestedVisibleTypes(@InsetsType int visibleTypes, @InsetsType int mask) { - int newRequestedVisibleTypes = + @InsetsType int updateRequestedVisibleTypes( + @InsetsType int visibleTypes, @InsetsType int mask) { + final int newRequestedVisibleTypes = (mRequestedVisibleTypes & ~mask) | (visibleTypes & mask); if (mRequestedVisibleTypes != newRequestedVisibleTypes) { + final int changedTypes = mRequestedVisibleTypes ^ newRequestedVisibleTypes; mRequestedVisibleTypes = newRequestedVisibleTypes; + return changedTypes; } + return 0; } } diff --git a/services/core/java/com/android/server/wm/EmbeddedWindowController.java b/services/core/java/com/android/server/wm/EmbeddedWindowController.java index 907d0dc2e183..7b6fc9e5694d 100644 --- a/services/core/java/com/android/server/wm/EmbeddedWindowController.java +++ b/services/core/java/com/android/server/wm/EmbeddedWindowController.java @@ -34,6 +34,7 @@ import android.util.proto.ProtoOutputStream; import android.view.InputApplicationHandle; import android.view.InputChannel; import android.view.WindowInsets; +import android.view.WindowInsets.Type.InsetsType; import android.window.InputTransferToken; import com.android.internal.protolog.ProtoLog; @@ -260,7 +261,7 @@ class EmbeddedWindowController { // The EmbeddedWindow can only request the IME. All other insets types are requested by // the host window. - private @WindowInsets.Type.InsetsType int mRequestedVisibleTypes = 0; + private @InsetsType int mRequestedVisibleTypes = 0; /** Whether the gesture is transferred to embedded window. */ boolean mGestureToEmbedded = false; @@ -354,24 +355,28 @@ class EmbeddedWindowController { } @Override - public boolean isRequestedVisible(@WindowInsets.Type.InsetsType int types) { + public boolean isRequestedVisible(@InsetsType int types) { return (mRequestedVisibleTypes & types) != 0; } @Override - public @WindowInsets.Type.InsetsType int getRequestedVisibleTypes() { + public @InsetsType int getRequestedVisibleTypes() { return mRequestedVisibleTypes; } /** * Only the IME can be requested from the EmbeddedWindow. - * @param requestedVisibleTypes other types than {@link WindowInsets.Type.IME} are + * @param requestedVisibleTypes other types than {@link WindowInsets.Type#ime()} are * not sent to system server via WindowlessWindowManager. + * @return an integer as the changed requested visible insets types. */ - void setRequestedVisibleTypes(@WindowInsets.Type.InsetsType int requestedVisibleTypes) { + @InsetsType int setRequestedVisibleTypes(@InsetsType int requestedVisibleTypes) { if (mRequestedVisibleTypes != requestedVisibleTypes) { + final int changedTypes = mRequestedVisibleTypes ^ requestedVisibleTypes; mRequestedVisibleTypes = requestedVisibleTypes; + return changedTypes; } + return 0; } @Override diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index ef1f58eafacc..b4d55a160631 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -437,9 +437,9 @@ class InsetsPolicy { return originalState; } - void onRequestedVisibleTypesChanged(InsetsTarget caller, + void onRequestedVisibleTypesChanged(InsetsTarget caller, @InsetsType int changedTypes, @Nullable ImeTracker.Token statsToken) { - mStateController.onRequestedVisibleTypesChanged(caller, statsToken); + mStateController.onRequestedVisibleTypesChanged(caller, changedTypes, statsToken); checkAbortTransient(caller); updateBarControlTarget(mFocusedWin); } diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java index 9202cf2d5792..164abab992d8 100644 --- a/services/core/java/com/android/server/wm/InsetsStateController.java +++ b/services/core/java/com/android/server/wm/InsetsStateController.java @@ -219,14 +219,20 @@ class InsetsStateController { } } - void onRequestedVisibleTypesChanged(InsetsTarget caller, + void onRequestedVisibleTypesChanged(InsetsTarget caller, @InsetsType int changedTypes, @Nullable ImeTracker.Token statsToken) { boolean changed = false; for (int i = mProviders.size() - 1; i >= 0; i--) { final InsetsSourceProvider provider = mProviders.valueAt(i); - final boolean isImeProvider = provider.getSource().getType() == WindowInsets.Type.ime(); - changed |= provider.updateClientVisibility(caller, - isImeProvider ? statsToken : null); + final @InsetsType int type = provider.getSource().getType(); + if ((type & changedTypes) != 0) { + final boolean isImeProvider = type == WindowInsets.Type.ime(); + changed |= provider.updateClientVisibility( + caller, isImeProvider ? statsToken : null) + // Fake control target cannot change the client visibility, but it should + // change the insets with its newly requested visibility. + || (caller == provider.getFakeControlTarget()); + } } if (changed) { notifyInsetsChanged(); @@ -435,7 +441,8 @@ class InsetsStateController { for (int i = newControlTargets.size() - 1; i >= 0; i--) { // TODO(b/353463205) the statsToken shouldn't be null as it is used later in the // IME provider. Check if we have to create a new request here - onRequestedVisibleTypesChanged(newControlTargets.valueAt(i), null /* statsToken */); + onRequestedVisibleTypesChanged(newControlTargets.valueAt(i), + WindowInsets.Type.all(), null /* statsToken */); } newControlTargets.clear(); if (!android.view.inputmethod.Flags.refactorInsetsController()) { diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 1ad5988e3c2e..8d198b26f396 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -704,9 +704,10 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { ImeTracker.forLogging().onProgress(imeStatsToken, ImeTracker.PHASE_WM_UPDATE_REQUESTED_VISIBLE_TYPES); } - win.setRequestedVisibleTypes(requestedVisibleTypes); + final @InsetsType int changedTypes = + win.setRequestedVisibleTypes(requestedVisibleTypes); win.getDisplayContent().getInsetsPolicy().onRequestedVisibleTypesChanged(win, - imeStatsToken); + changedTypes, imeStatsToken); final Task task = win.getTask(); if (task != null) { task.dispatchTaskInfoChangedIfNeeded(/* forced= */ true); @@ -723,10 +724,11 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { // TODO(b/353463205) Use different phase here ImeTracker.forLogging().onProgress(imeStatsToken, ImeTracker.PHASE_WM_UPDATE_REQUESTED_VISIBLE_TYPES); - embeddedWindow.setRequestedVisibleTypes( + final @InsetsType int changedTypes = embeddedWindow.setRequestedVisibleTypes( requestedVisibleTypes & WindowInsets.Type.ime()); embeddedWindow.getDisplayContent().getInsetsPolicy() - .onRequestedVisibleTypesChanged(embeddedWindow, imeStatsToken); + .onRequestedVisibleTypesChanged( + embeddedWindow, changedTypes, imeStatsToken); } else { ImeTracker.forLogging().onFailed(imeStatsToken, ImeTracker.PHASE_WM_UPDATE_REQUESTED_VISIBLE_TYPES); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d5626661725e..c54e7c15530c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4732,11 +4732,13 @@ public class WindowManagerService extends IWindowManager.Stub } ImeTracker.forLogging().onProgress(statsToken, ImeTracker.PHASE_WM_UPDATE_DISPLAY_WINDOW_REQUESTED_VISIBLE_TYPES); - dc.mRemoteInsetsControlTarget.updateRequestedVisibleTypes(visibleTypes, mask); + final @InsetsType int changedTypes = + dc.mRemoteInsetsControlTarget.updateRequestedVisibleTypes( + visibleTypes, mask); // TODO(b/353463205) the statsToken shouldn't be null as it is used later in the // IME provider. Check if we have to create a new request here, if null. dc.getInsetsStateController().onRequestedVisibleTypesChanged( - dc.mRemoteInsetsControlTarget, statsToken); + dc.mRemoteInsetsControlTarget, changedTypes, statsToken); } } finally { 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 f94bbb70befc..81895c462a63 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -822,17 +822,23 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } /** + * @return an integer as the changed requested visible insets types. * @see #getRequestedVisibleTypes() */ - void setRequestedVisibleTypes(@InsetsType int requestedVisibleTypes) { + @InsetsType int setRequestedVisibleTypes(@InsetsType int requestedVisibleTypes) { if (mRequestedVisibleTypes != requestedVisibleTypes) { + final int changedTypes = mRequestedVisibleTypes ^ requestedVisibleTypes; mRequestedVisibleTypes = requestedVisibleTypes; + return changedTypes; } + return 0; } @VisibleForTesting - void setRequestedVisibleTypes(@InsetsType int requestedVisibleTypes, @InsetsType int mask) { - setRequestedVisibleTypes(mRequestedVisibleTypes & ~mask | requestedVisibleTypes & mask); + @InsetsType int setRequestedVisibleTypes( + @InsetsType int requestedVisibleTypes, @InsetsType int mask) { + return setRequestedVisibleTypes( + mRequestedVisibleTypes & ~mask | requestedVisibleTypes & mask); } /** diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java index 6c5fe1d8551e..71e34ef220d3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java @@ -53,6 +53,7 @@ import android.view.InsetsSource; import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.WindowInsets; +import android.view.WindowInsets.Type.InsetsType; import androidx.test.filters.SmallTest; @@ -400,9 +401,9 @@ public class InsetsPolicyTest extends WindowTestsBase { assertTrue(state.isSourceOrDefaultVisible(statusBarSource.getId(), statusBars())); assertTrue(state.isSourceOrDefaultVisible(navBarSource.getId(), navigationBars())); - mAppWindow.setRequestedVisibleTypes( + final @InsetsType int changedTypes = mAppWindow.setRequestedVisibleTypes( navigationBars() | statusBars(), navigationBars() | statusBars()); - policy.onRequestedVisibleTypesChanged(mAppWindow, null /* statsToken */); + policy.onRequestedVisibleTypesChanged(mAppWindow, changedTypes, null /* statsToken */); waitUntilWindowAnimatorIdle(); controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index 973c8d0a8464..5525bae89138 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -52,6 +52,7 @@ import android.util.SparseArray; import android.view.InsetsSource; import android.view.InsetsSourceControl; import android.view.InsetsState; +import android.view.WindowInsets.Type.InsetsType; import androidx.test.filters.SmallTest; @@ -201,8 +202,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { getController().getOrCreateSourceProvider(ID_IME, ime()) .setWindowContainer(mImeWindow, null, null); getController().onImeControlTargetChanged(base); - base.setRequestedVisibleTypes(ime(), ime()); - getController().onRequestedVisibleTypesChanged(base, null /* statsToken */); + final @InsetsType int changedTypes = base.setRequestedVisibleTypes(ime(), ime()); + getController().onRequestedVisibleTypesChanged(base, changedTypes, null /* statsToken */); if (android.view.inputmethod.Flags.refactorInsetsController()) { // to set the serverVisibility, the IME needs to be drawn and onPostLayout be called. mImeWindow.mWinAnimator.mDrawState = HAS_DRAWN; @@ -509,8 +510,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { mDisplayContent.setImeLayeringTarget(app); mDisplayContent.updateImeInputAndControlTarget(app); - app.setRequestedVisibleTypes(ime(), ime()); - getController().onRequestedVisibleTypesChanged(app, null /* statsToken */); + final @InsetsType int changedTypes = app.setRequestedVisibleTypes(ime(), ime()); + getController().onRequestedVisibleTypesChanged(app, changedTypes, null /* statsToken */); assertTrue(ime.getControllableInsetProvider().getSource().isVisible()); if (android.view.inputmethod.Flags.refactorInsetsController()) { |