diff options
4 files changed, 137 insertions, 173 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index cee6740c8fd5..5460e36a5f1b 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -67,7 +67,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE; -import static android.view.WindowManager.LayoutParams.TYPE_POINTER; import static android.view.WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL; @@ -241,7 +240,7 @@ public class DisplayPolicy { } } - private SystemGesturesPointerEventListener mSystemGestures; + private final SystemGesturesPointerEventListener mSystemGestures; private volatile int mLidState = LID_ABSENT; private volatile int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED; @@ -383,7 +382,7 @@ public class DisplayPolicy { private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1; - private GestureNavigationSettingsObserver mGestureNavigationSettingsObserver; + private final GestureNavigationSettingsObserver mGestureNavigationSettingsObserver; private final WindowManagerInternal.AppTransitionListener mAppTransitionListener; @@ -447,6 +446,119 @@ public class DisplayPolicy { final Looper looper = UiThread.getHandler().getLooper(); mHandler = new PolicyHandler(looper); + mSystemGestures = new SystemGesturesPointerEventListener(mContext, mHandler, + new SystemGesturesPointerEventListener.Callbacks() { + @Override + public void onSwipeFromTop() { + synchronized (mLock) { + if (mStatusBar != null) { + requestTransientBars(mStatusBar); + } + checkAltBarSwipeForTransientBars(ALT_BAR_TOP); + } + } + + @Override + public void onSwipeFromBottom() { + synchronized (mLock) { + if (mNavigationBar != null + && mNavigationBarPosition == NAV_BAR_BOTTOM) { + requestTransientBars(mNavigationBar); + } + checkAltBarSwipeForTransientBars(ALT_BAR_BOTTOM); + } + } + + @Override + public void onSwipeFromRight() { + final Region excludedRegion = Region.obtain(); + synchronized (mLock) { + mDisplayContent.calculateSystemGestureExclusion( + excludedRegion, null /* outUnrestricted */); + final boolean excluded = + mSystemGestures.currentGestureStartedInRegion(excludedRegion); + if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_RIGHT + || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { + requestTransientBars(mNavigationBar); + } + checkAltBarSwipeForTransientBars(ALT_BAR_RIGHT); + } + excludedRegion.recycle(); + } + + @Override + public void onSwipeFromLeft() { + final Region excludedRegion = Region.obtain(); + synchronized (mLock) { + mDisplayContent.calculateSystemGestureExclusion( + excludedRegion, null /* outUnrestricted */); + final boolean excluded = + mSystemGestures.currentGestureStartedInRegion(excludedRegion); + if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_LEFT + || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { + requestTransientBars(mNavigationBar); + } + checkAltBarSwipeForTransientBars(ALT_BAR_LEFT); + } + excludedRegion.recycle(); + } + + @Override + public void onFling(int duration) { + if (mService.mPowerManagerInternal != null) { + mService.mPowerManagerInternal.setPowerBoost( + Boost.INTERACTION, duration); + } + } + + @Override + public void onDebug() { + // no-op + } + + private WindowOrientationListener getOrientationListener() { + final DisplayRotation rotation = mDisplayContent.getDisplayRotation(); + return rotation != null ? rotation.getOrientationListener() : null; + } + + @Override + public void onDown() { + final WindowOrientationListener listener = getOrientationListener(); + if (listener != null) { + listener.onTouchStart(); + } + } + + @Override + public void onUpOrCancel() { + final WindowOrientationListener listener = getOrientationListener(); + if (listener != null) { + listener.onTouchEnd(); + } + } + + @Override + public void onMouseHoverAtTop() { + mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); + Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS); + msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS; + mHandler.sendMessageDelayed(msg, 500 /* delayMillis */); + } + + @Override + public void onMouseHoverAtBottom() { + mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); + Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS); + msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION; + mHandler.sendMessageDelayed(msg, 500 /* delayMillis */); + } + + @Override + public void onMouseLeaveFromEdge() { + mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); + } + }); + displayContent.registerPointerEventListener(mSystemGestures); mAppTransitionListener = new WindowManagerInternal.AppTransitionListener() { private Runnable mAppTransitionPending = () -> { @@ -502,7 +614,7 @@ public class DisplayPolicy { mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext, looper, mService.mVrModeEnabled); - // TODO(b/180986447): Make it can take screenshot on external display + // TODO: Make it can take screenshot on external display mScreenshotHelper = displayContent.isDefaultDisplay ? new ScreenshotHelper(mContext) : null; @@ -526,6 +638,16 @@ public class DisplayPolicy { mRefreshRatePolicy = new RefreshRatePolicy(mService, mDisplayContent.getDisplayInfo(), mService.mHighRefreshRateDenylist); + + mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(mHandler, + mContext, () -> { + synchronized (mLock) { + onConfigurationChanged(); + mSystemGestures.onConfigurationChanged(); + mDisplayContent.updateSystemGestureExclusion(); + } + }); + mHandler.post(mGestureNavigationSettingsObserver::register); } private void checkAltBarSwipeForTransientBars(@WindowManagerPolicy.AltBarPosition int pos) { @@ -544,154 +666,12 @@ public class DisplayPolicy { } void systemReady() { + mSystemGestures.systemReady(); if (mService.mPointerLocationEnabled) { setPointerLocationEnabled(true); } } - @NonNull - private GestureNavigationSettingsObserver getGestureNavigationSettingsObserver() { - if (mGestureNavigationSettingsObserver == null) { - mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(mHandler, - mContext, () -> { - synchronized (mLock) { - onConfigurationChanged(); - getSystemGestures().onConfigurationChanged(); - mDisplayContent.updateSystemGestureExclusion(); - } - }); - mHandler.post(mGestureNavigationSettingsObserver::register); - } - return mGestureNavigationSettingsObserver; - } - - @NonNull - private SystemGesturesPointerEventListener getSystemGestures() { - if (mSystemGestures == null) { - final Context gestureContext = mUiContext.createWindowContext( - mDisplayContent.getDisplay(), TYPE_POINTER, null /* options */); - mSystemGestures = new SystemGesturesPointerEventListener(gestureContext, mHandler, - new SystemGesturesPointerEventListener.Callbacks() { - @Override - public void onSwipeFromTop() { - synchronized (mLock) { - if (mStatusBar != null) { - requestTransientBars(mStatusBar); - } - checkAltBarSwipeForTransientBars(ALT_BAR_TOP); - } - } - - @Override - public void onSwipeFromBottom() { - synchronized (mLock) { - if (mNavigationBar != null - && mNavigationBarPosition == NAV_BAR_BOTTOM) { - requestTransientBars(mNavigationBar); - } - checkAltBarSwipeForTransientBars(ALT_BAR_BOTTOM); - } - } - - @Override - public void onSwipeFromRight() { - final Region excludedRegion = Region.obtain(); - synchronized (mLock) { - mDisplayContent.calculateSystemGestureExclusion( - excludedRegion, null /* outUnrestricted */); - final boolean excluded = mSystemGestures - .currentGestureStartedInRegion(excludedRegion); - if (mNavigationBar != null - && (mNavigationBarPosition == NAV_BAR_RIGHT - || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { - requestTransientBars(mNavigationBar); - } - checkAltBarSwipeForTransientBars(ALT_BAR_RIGHT); - } - excludedRegion.recycle(); - } - - @Override - public void onSwipeFromLeft() { - final Region excludedRegion = Region.obtain(); - synchronized (mLock) { - mDisplayContent.calculateSystemGestureExclusion( - excludedRegion, null /* outUnrestricted */); - final boolean excluded = mSystemGestures - .currentGestureStartedInRegion(excludedRegion); - if (mNavigationBar != null - && (mNavigationBarPosition == NAV_BAR_LEFT - || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { - requestTransientBars(mNavigationBar); - } - checkAltBarSwipeForTransientBars(ALT_BAR_LEFT); - } - excludedRegion.recycle(); - } - - @Override - public void onFling(int duration) { - if (mService.mPowerManagerInternal != null) { - mService.mPowerManagerInternal.setPowerBoost( - Boost.INTERACTION, duration); - } - } - - @Override - public void onDebug() { - // no-op - } - - private WindowOrientationListener getOrientationListener() { - final DisplayRotation rotation = mDisplayContent.getDisplayRotation(); - return rotation != null ? rotation.getOrientationListener() : null; - } - - @Override - public void onDown() { - final WindowOrientationListener listener = getOrientationListener(); - if (listener != null) { - listener.onTouchStart(); - } - } - - @Override - public void onUpOrCancel() { - final WindowOrientationListener listener = getOrientationListener(); - if (listener != null) { - listener.onTouchEnd(); - } - } - - @Override - public void onMouseHoverAtTop() { - mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); - Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS); - msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS; - mHandler.sendMessageDelayed(msg, 500 /* delayMillis */); - } - - @Override - public void onMouseHoverAtBottom() { - mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); - Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS); - msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION; - mHandler.sendMessageDelayed(msg, 500 /* delayMillis */); - } - - @Override - public void onMouseLeaveFromEdge() { - mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); - } - }); - mDisplayContent.registerPointerEventListener(getSystemGestures()); - if (mService.mSystemReady) { - mSystemGestures.systemReady(); - } - } - return mSystemGestures; - } - private int getDisplayId() { return mDisplayContent.getDisplayId(); } @@ -1467,7 +1447,8 @@ public class DisplayPolicy { } void onDisplayInfoChanged(DisplayInfo info) { - getSystemGestures().onDisplayInfoChanged(info); + mSystemGestures.screenWidth = info.logicalWidth; + mSystemGestures.screenHeight = info.logicalHeight; } private void layoutStatusBar(DisplayFrames displayFrames, Rect contentFrame) { @@ -1980,7 +1961,7 @@ public class DisplayPolicy { public void onOverlayChangedLw() { updateCurrentUserResources(); onConfigurationChanged(); - getSystemGestures().onConfigurationChanged(); + mSystemGestures.onConfigurationChanged(); } /** @@ -2051,10 +2032,10 @@ public class DisplayPolicy { } mNavBarOpacityMode = res.getInteger(R.integer.config_navBarOpacityMode); - final GestureNavigationSettingsObserver observer = getGestureNavigationSettingsObserver(); - mLeftGestureInset = observer.getLeftSensitivity(res); - mRightGestureInset = observer.getRightSensitivity(res); - mNavButtonForcedVisible = observer.areNavigationButtonForcedVisible(); + mLeftGestureInset = mGestureNavigationSettingsObserver.getLeftSensitivity(res); + mRightGestureInset = mGestureNavigationSettingsObserver.getRightSensitivity(res); + mNavButtonForcedVisible = + mGestureNavigationSettingsObserver.areNavigationButtonForcedVisible(); mNavigationBarLetsThroughTaps = res.getBoolean(R.bool.config_navBarTapThrough); mNavigationBarAlwaysShowOnSideGesture = res.getBoolean(R.bool.config_navBarAlwaysShowOnSideEdgeGesture); @@ -3066,7 +3047,7 @@ public class DisplayPolicy { } void release() { - mHandler.post(getGestureNavigationSettingsObserver()::unregister); + mHandler.post(mGestureNavigationSettingsObserver::unregister); } @VisibleForTesting diff --git a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java index a98a47802914..f3859b41b6fd 100644 --- a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java +++ b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java @@ -126,17 +126,11 @@ class SystemGesturesPointerEventListener implements PointerEventListener { Slog.w(TAG, "Cannot create GestureDetector, display removed:" + displayId); return; } - onDisplayInfoChanged(info); mGestureDetector = new GestureDetector(mContext, new FlingGestureDetector(), mHandler) { }; }); } - void onDisplayInfoChanged(DisplayInfo info) { - screenWidth = info.logicalWidth; - screenHeight = info.logicalHeight; - } - @Override public void onPointerEvent(MotionEvent event) { if (mGestureDetector != null && event.isTouchEvent()) { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java index db7054d58590..2163661b7506 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java @@ -321,16 +321,4 @@ public class DisplayPolicyTests extends WindowTestsBase { assertFalse(navBarSource.getFrame().isEmpty()); assertTrue(imeSource.getFrame().contains(navBarSource.getFrame())); } - - @UseTestDisplay - @Test - public void testDisplayPolicyNotCrash() { - final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); - - // Verify if modules initialized after DisplayContent ctr throws NPE. - displayPolicy.onDisplayInfoChanged(mDisplayInfo); - displayPolicy.onConfigurationChanged(); - displayPolicy.onOverlayChangedLw(); - displayPolicy.release(); - } } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index ebc5c4ff280a..c13d6b19bf1d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -538,8 +538,9 @@ class WindowTestsBase extends SystemServiceTestsBase { /** Creates a {@link DisplayContent} and adds it to the system. */ private DisplayContent createNewDisplay(DisplayInfo info, @DisplayImePolicy int imePolicy) { - final DisplayContent dc = + final DisplayContent display = new TestDisplayContent.Builder(mAtm, info).build(); + final DisplayContent dc = display.mDisplayContent; // this display can show IME. dc.mWmService.mDisplayWindowSettings.setDisplayImePolicy(dc, imePolicy); return dc; |