diff --git a/core/api/test-current.txt b/core/api/test-current.txt index bcd099e485ed4..bdd9ec7614b4e 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2942,6 +2942,7 @@ package android.view { public interface WindowManager extends android.view.ViewManager { method public default int getDisplayImePolicy(int); method public default void holdLock(android.os.IBinder, int); + method public default boolean isGlobalKey(int); method public default boolean isTaskSnapshotSupported(); method public default void setDisplayImePolicy(int, int); method public default void setShouldShowSystemDecors(int, boolean); diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 30dc0c2aa7d67..dddbe395aef19 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -985,4 +985,12 @@ interface IWindowManager */ oneway void captureDisplay(int displayId, in @nullable ScreenCapture.CaptureArgs captureArgs, in ScreenCapture.ScreenCaptureListener listener); + + /** + * Returns {@code true} if the key will be handled globally and not forwarded to all apps. + * + * @param keyCode the key code to check + * @return {@code true} if the key will be handled globally. + */ + boolean isGlobalKey(int keyCode); } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 8656af2151d9e..e757d6a33dd1e 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -944,6 +944,18 @@ public interface WindowManager extends ViewManager { return DISPLAY_IME_POLICY_FALLBACK_DISPLAY; } + /** + * Returns {@code true} if the key will be handled globally and not forwarded to all apps. + * + * @param keyCode the key code to check + * @return {@code true} if the key will be handled globally. + * @hide + */ + @TestApi + default boolean isGlobalKey(int keyCode) { + return false; + } + /** *
* Returns whether cross-window blur is currently enabled. This affects both window blur behind diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index dc4ccbad27be7..6dc90117bf55d 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -282,6 +282,15 @@ public final class WindowManagerImpl implements WindowManager { return DISPLAY_IME_POLICY_FALLBACK_DISPLAY; } + @Override + public boolean isGlobalKey(int keyCode) { + try { + return WindowManagerGlobal.getWindowManagerService().isGlobalKey(keyCode); + } catch (RemoteException e) { + } + return false; + } + @Override public WindowMetrics getCurrentWindowMetrics() { final Context context = mParentWindow != null ? mParentWindow.getContext() : mContext; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a0748b4b515ee..4d5d607a1c893 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5493,6 +5493,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { effectId, always, reason); } + @Override + public boolean isGlobalKey(int keyCode) { + return mGlobalKeyManager.shouldHandleGlobalKey(keyCode); + } + @Override public boolean performHapticFeedback(int uid, String packageName, int effectId, boolean always, String reason) { diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 2b04050733230..f5ce461c15834 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -1188,4 +1188,12 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * A new window on default display has been focused. */ default void onDefaultDisplayFocusChangedLw(WindowState newFocus) {} + + /** + * Returns {@code true} if the key will be handled globally and not forwarded to all apps. + * + * @param keyCode the key code to check + * @return {@code true} if the key will be handled globally. + */ + boolean isGlobalKey(int keyCode); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 502b4bb695b0a..19c93d37891cd 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -9355,4 +9355,9 @@ public class WindowManagerService extends IWindowManager.Stub .setSourceCrop(mTmpRect) .build(); } + + @Override + public boolean isGlobalKey(int keyCode) { + return mPolicy.isGlobalKey(keyCode); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java index 13da1543cfb83..3344bdb24d1ec 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -338,4 +338,9 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { public boolean canDismissBootAnimation() { return true; } + + @Override + public boolean isGlobalKey(int keyCode) { + return false; + } }