diff options
8 files changed, 53 insertions, 0 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 9f333315451c..ce6012ba70e5 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2937,6 +2937,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 30dc0c2aa7d6..dddbe395aef1 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 8656af2151d9..e757d6a33dd1 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -945,6 +945,18 @@ public interface WindowManager extends ViewManager { } /** + * 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; + } + + /** * <p> * Returns whether cross-window blur is currently enabled. This affects both window blur behind * (see {@link LayoutParams#setBlurBehindRadius}) and window background blur (see diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index dc4ccbad27be..6dc90117bf55 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -283,6 +283,15 @@ public final class WindowManagerImpl implements WindowManager { } @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; final Rect bounds = getCurrentBounds(context); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 41663648c98c..42a0515fd620 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5494,6 +5494,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } @Override + public boolean isGlobalKey(int keyCode) { + return mGlobalKeyManager.shouldHandleGlobalKey(keyCode); + } + + @Override public boolean performHapticFeedback(int uid, String packageName, int effectId, boolean always, String reason) { if (!mVibrator.hasVibrator()) { diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 2b0405073323..f5ce461c1583 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 1497a192ff1e..86a97f8abd74 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -9351,4 +9351,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 13da1543cfb8..3344bdb24d1e 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; + } } |