diff options
7 files changed, 61 insertions, 1 deletions
diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index f34f9e6d5ce8..4b872d3ad758 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -73,6 +73,14 @@ oneway interface IWindow { */ void insetsControlChanged(in InsetsState insetsState, in InsetsSourceControl[] activeControls); + /** + * Called when a set of insets source window should be shown by policy. + * + * @param types internal inset types (WindowInsets.Type.InsetType) to show + * @param fromIme true if this request originated from IME (InputMethodService). + */ + void showInsets(int types, boolean fromIme); + void moved(int newX, int newY); void dispatchAppVisibility(boolean visible); void dispatchGetNewSurface(); diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index c798d85f0fea..5a8636d85a08 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -224,7 +224,7 @@ public class InsetsController implements WindowInsetsController { show(types, false /* fromIme */); } - private void show(@InsetType int types, boolean fromIme) { + void show(@InsetType int types, boolean fromIme) { // TODO: Support a ResultReceiver for IME. // TODO(b/123718661): Make show() work for multi-session IME. int typesReady = 0; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 3756a7de47c0..fedd6fbe56ed 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -91,6 +91,7 @@ import android.view.SurfaceControl.Transaction; import android.view.View.AttachInfo; import android.view.View.FocusDirection; import android.view.View.MeasureSpec; +import android.view.WindowInsets.Type.InsetType; import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; @@ -4528,6 +4529,8 @@ public final class ViewRootImpl implements ViewParent, private static final int MSG_INSETS_CONTROL_CHANGED = 31; private static final int MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED = 32; private static final int MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED = 33; + private static final int MSG_SHOW_INSETS = 34; + final class ViewRootHandler extends Handler { @Override @@ -4591,6 +4594,8 @@ public final class ViewRootImpl implements ViewParent, return "MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED"; case MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED: return "MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED"; + case MSG_SHOW_INSETS: + return "MSG_SHOW_INSETS"; } return super.getMessageName(message); } @@ -4705,6 +4710,10 @@ public final class ViewRootImpl implements ViewParent, mInsetsController.onStateChanged((InsetsState) args.arg1); break; } + case MSG_SHOW_INSETS: { + mInsetsController.show(msg.arg1, msg.arg2 == 1); + break; + } case MSG_WINDOW_MOVED: if (mAdded) { final int w = mWinFrame.width(); @@ -7484,6 +7493,10 @@ public final class ViewRootImpl implements ViewParent, mHandler.obtainMessage(MSG_INSETS_CONTROL_CHANGED, args).sendToTarget(); } + private void showInsets(@InsetType int types, boolean fromIme) { + mHandler.obtainMessage(MSG_SHOW_INSETS, types, fromIme ? 1 : 0).sendToTarget(); + } + public void dispatchMoved(int newX, int newY) { if (DEBUG_LAYOUT) Log.v(mTag, "Window moved " + this + ": newX=" + newX + " newY=" + newY); if (mTranslator != null) { @@ -8599,6 +8612,14 @@ public final class ViewRootImpl implements ViewParent, } @Override + public void showInsets(@InsetType int types, boolean fromIme) { + final ViewRootImpl viewAncestor = mViewAncestor.get(); + if (viewAncestor != null) { + viewAncestor.showInsets(types, fromIme); + } + } + + @Override public void moved(int newX, int newY) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index cc468f41a7f3..0e078dd3732d 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -30,6 +30,7 @@ import android.view.IWindowSession; import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.PointerIcon; +import android.view.WindowInsets.Type.InsetType; import com.android.internal.os.IResultReceiver; @@ -75,6 +76,10 @@ public class BaseIWindow extends IWindow.Stub { } @Override + public void showInsets(@InsetType int types, boolean fromIme) throws RemoteException { + } + + @Override public void moved(int newX, int newY) { } diff --git a/services/core/java/com/android/server/wm/InsetsControlTarget.java b/services/core/java/com/android/server/wm/InsetsControlTarget.java index 3db6dcf07abf..b7184a5e83d5 100644 --- a/services/core/java/com/android/server/wm/InsetsControlTarget.java +++ b/services/core/java/com/android/server/wm/InsetsControlTarget.java @@ -16,9 +16,21 @@ package com.android.server.wm; +import android.inputmethodservice.InputMethodService; +import android.view.WindowInsets.Type.InsetType; + /** * Generalization of an object that can control insets state. */ interface InsetsControlTarget { void notifyInsetsControlChanged(); + + /** + * Instructs the control target to show inset sources. + * + * @param types to specify which types of insets source window should be shown. + * @param fromIme {@code true} if IME show request originated from {@link InputMethodService}. + */ + default void showInsets(@InsetType int types, boolean fromIme) { + } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index d459f14564d0..569d248d8efb 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -197,6 +197,7 @@ import android.view.SurfaceSession; import android.view.View; import android.view.ViewTreeObserver; import android.view.WindowInfo; +import android.view.WindowInsets.Type.InsetType; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; @@ -3365,6 +3366,15 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } + @Override + public void showInsets(@InsetType int types, boolean fromIme) { + try { + mClient.showInsets(types, fromIme); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to deliver showInsets", e); + } + } + Rect getBackdropFrame(Rect frame) { // When the task is docked, we send fullscreen sized backDropFrame as soon as resizing // start even if we haven't received the relayout window, so that the client requests 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 a7586810a824..09e5027c1faa 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java @@ -111,4 +111,8 @@ public class TestIWindow extends IWindow.Stub { @Override public void dispatchPointerCaptureChanged(boolean hasCapture) { } + + @Override + public void showInsets(int types, boolean fromIme) throws RemoteException { + } } |