Loading services/core/java/com/android/server/wm/DisplayPolicy.java +154 −135 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ 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; Loading Loading @@ -242,7 +243,7 @@ public class DisplayPolicy { } } private final SystemGesturesPointerEventListener mSystemGestures; private SystemGesturesPointerEventListener mSystemGestures; private volatile int mLidState = LID_ABSENT; private volatile int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED; Loading Loading @@ -384,7 +385,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 final GestureNavigationSettingsObserver mGestureNavigationSettingsObserver; private GestureNavigationSettingsObserver mGestureNavigationSettingsObserver; private final WindowManagerInternal.AppTransitionListener mAppTransitionListener; Loading Loading @@ -448,7 +449,130 @@ public class DisplayPolicy { final Looper looper = UiThread.getHandler().getLooper(); mHandler = new PolicyHandler(looper); mSystemGestures = new SystemGesturesPointerEventListener(mContext, mHandler, mAppTransitionListener = new WindowManagerInternal.AppTransitionListener() { private Runnable mAppTransitionPending = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionPending(displayId); } }; private Runnable mAppTransitionCancelled = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionCancelled(displayId); } }; private Runnable mAppTransitionFinished = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionFinished(displayId); } }; @Override public void onAppTransitionPendingLocked() { mHandler.post(mAppTransitionPending); } @Override public int onAppTransitionStartingLocked(boolean keyguardGoingAway, long duration, long statusBarAnimationStartTime, long statusBarAnimationDuration) { mHandler.post(() -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionStarting(mContext.getDisplayId(), statusBarAnimationStartTime, statusBarAnimationDuration); } }); return 0; } @Override public void onAppTransitionCancelledLocked(boolean keyguardGoingAway) { mHandler.post(mAppTransitionCancelled); } @Override public void onAppTransitionFinishedLocked(IBinder token) { mHandler.post(mAppTransitionFinished); } }; displayContent.mAppTransition.registerListenerLocked(mAppTransitionListener); mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext, looper, mService.mVrModeEnabled); // TODO(b/180986447): Make it can take screenshot on external display mScreenshotHelper = displayContent.isDefaultDisplay ? new ScreenshotHelper(mContext) : null; if (mDisplayContent.isDefaultDisplay) { mHasStatusBar = true; mHasNavigationBar = mContext.getResources().getBoolean(R.bool.config_showNavigationBar); // Allow a system property to override this. Used by the emulator. // See also hasNavigationBar(). String navBarOverride = SystemProperties.get("qemu.hw.mainkeys"); if ("1".equals(navBarOverride)) { mHasNavigationBar = false; } else if ("0".equals(navBarOverride)) { mHasNavigationBar = true; } } else { mHasStatusBar = false; mHasNavigationBar = mDisplayContent.supportsSystemDecorations(); } mRefreshRatePolicy = new RefreshRatePolicy(mService, mDisplayContent.getDisplayInfo(), mService.mHighRefreshRateDenylist); } private void checkAltBarSwipeForTransientBars(@WindowManagerPolicy.AltBarPosition int pos) { if (mStatusBarAlt != null && mStatusBarAltPosition == pos) { requestTransientBars(mStatusBarAlt); } if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { requestTransientBars(mNavigationBarAlt); } if (mClimateBarAlt != null && mClimateBarAltPosition == pos) { requestTransientBars(mClimateBarAlt); } if (mExtraNavBarAlt != null && mExtraNavBarAltPosition == pos) { requestTransientBars(mExtraNavBarAlt); } } void 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() { Loading Loading @@ -477,9 +601,10 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); final boolean excluded = mSystemGestures.currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_RIGHT final boolean excluded = mSystemGestures .currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_RIGHT || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { requestTransientBars(mNavigationBar); } Loading @@ -494,9 +619,10 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); final boolean excluded = mSystemGestures.currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_LEFT final boolean excluded = mSystemGestures .currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_LEFT || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { requestTransientBars(mNavigationBar); } Loading Loading @@ -560,119 +686,13 @@ public class DisplayPolicy { mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); } }); displayContent.registerPointerEventListener(mSystemGestures); mAppTransitionListener = new WindowManagerInternal.AppTransitionListener() { private Runnable mAppTransitionPending = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionPending(displayId); } }; private Runnable mAppTransitionCancelled = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionCancelled(displayId); } }; private Runnable mAppTransitionFinished = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionFinished(displayId); } }; @Override public void onAppTransitionPendingLocked() { mHandler.post(mAppTransitionPending); } @Override public int onAppTransitionStartingLocked(boolean keyguardGoingAway, long duration, long statusBarAnimationStartTime, long statusBarAnimationDuration) { mHandler.post(() -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionStarting(mContext.getDisplayId(), statusBarAnimationStartTime, statusBarAnimationDuration); } }); return 0; } @Override public void onAppTransitionCancelledLocked(boolean keyguardGoingAway) { mHandler.post(mAppTransitionCancelled); } @Override public void onAppTransitionFinishedLocked(IBinder token) { mHandler.post(mAppTransitionFinished); } }; displayContent.mAppTransition.registerListenerLocked(mAppTransitionListener); mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext, looper, mService.mVrModeEnabled); // TODO: Make it can take screenshot on external display mScreenshotHelper = displayContent.isDefaultDisplay ? new ScreenshotHelper(mContext) : null; if (mDisplayContent.isDefaultDisplay) { mHasStatusBar = true; mHasNavigationBar = mContext.getResources().getBoolean(R.bool.config_showNavigationBar); // Allow a system property to override this. Used by the emulator. // See also hasNavigationBar(). String navBarOverride = SystemProperties.get("qemu.hw.mainkeys"); if ("1".equals(navBarOverride)) { mHasNavigationBar = false; } else if ("0".equals(navBarOverride)) { mHasNavigationBar = true; } } else { mHasStatusBar = false; mHasNavigationBar = mDisplayContent.supportsSystemDecorations(); } 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) { if (mStatusBarAlt != null && mStatusBarAltPosition == pos) { requestTransientBars(mStatusBarAlt); } if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { requestTransientBars(mNavigationBarAlt); } if (mClimateBarAlt != null && mClimateBarAltPosition == pos) { requestTransientBars(mClimateBarAlt); } if (mExtraNavBarAlt != null && mExtraNavBarAltPosition == pos) { requestTransientBars(mExtraNavBarAlt); } } void systemReady() { mDisplayContent.registerPointerEventListener(getSystemGestures()); if (mService.mSystemReady) { mSystemGestures.systemReady(); if (mService.mPointerLocationEnabled) { setPointerLocationEnabled(true); } } return mSystemGestures; } private int getDisplayId() { return mDisplayContent.getDisplayId(); Loading Loading @@ -1455,8 +1475,7 @@ public class DisplayPolicy { } void onDisplayInfoChanged(DisplayInfo info) { mSystemGestures.screenWidth = info.logicalWidth; mSystemGestures.screenHeight = info.logicalHeight; getSystemGestures().onDisplayInfoChanged(info); } private void layoutStatusBar(DisplayFrames displayFrames, Rect contentFrame) { Loading Loading @@ -1969,7 +1988,7 @@ public class DisplayPolicy { public void onOverlayChangedLw() { updateCurrentUserResources(); onConfigurationChanged(); mSystemGestures.onConfigurationChanged(); getSystemGestures().onConfigurationChanged(); } /** Loading Loading @@ -2040,10 +2059,10 @@ public class DisplayPolicy { } mNavBarOpacityMode = res.getInteger(R.integer.config_navBarOpacityMode); mLeftGestureInset = mGestureNavigationSettingsObserver.getLeftSensitivity(res); mRightGestureInset = mGestureNavigationSettingsObserver.getRightSensitivity(res); mNavButtonForcedVisible = mGestureNavigationSettingsObserver.areNavigationButtonForcedVisible(); final GestureNavigationSettingsObserver observer = getGestureNavigationSettingsObserver(); mLeftGestureInset = observer.getLeftSensitivity(res); mRightGestureInset = observer.getRightSensitivity(res); mNavButtonForcedVisible = observer.areNavigationButtonForcedVisible(); mNavigationBarLetsThroughTaps = res.getBoolean(R.bool.config_navBarTapThrough); mNavigationBarAlwaysShowOnSideGesture = res.getBoolean(R.bool.config_navBarAlwaysShowOnSideEdgeGesture); Loading Loading @@ -3056,7 +3075,7 @@ public class DisplayPolicy { } void release() { mHandler.post(mGestureNavigationSettingsObserver::unregister); mHandler.post(getGestureNavigationSettingsObserver()::unregister); } @VisibleForTesting Loading services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java +6 −0 Original line number Diff line number Diff line Loading @@ -126,11 +126,17 @@ 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()) { Loading services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +12 −0 Original line number Diff line number Diff line Loading @@ -323,4 +323,16 @@ 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(); } } services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +1 −2 Original line number Diff line number Diff line Loading @@ -538,9 +538,8 @@ class WindowTestsBase extends SystemServiceTestsBase { /** Creates a {@link DisplayContent} and adds it to the system. */ private DisplayContent createNewDisplay(DisplayInfo info, @DisplayImePolicy int imePolicy) { final DisplayContent display = final DisplayContent dc = new TestDisplayContent.Builder(mAtm, info).build(); final DisplayContent dc = display.mDisplayContent; // this display can show IME. dc.mWmService.mDisplayWindowSettings.setDisplayImePolicy(dc, imePolicy); return dc; Loading Loading
services/core/java/com/android/server/wm/DisplayPolicy.java +154 −135 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ 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; Loading Loading @@ -242,7 +243,7 @@ public class DisplayPolicy { } } private final SystemGesturesPointerEventListener mSystemGestures; private SystemGesturesPointerEventListener mSystemGestures; private volatile int mLidState = LID_ABSENT; private volatile int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED; Loading Loading @@ -384,7 +385,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 final GestureNavigationSettingsObserver mGestureNavigationSettingsObserver; private GestureNavigationSettingsObserver mGestureNavigationSettingsObserver; private final WindowManagerInternal.AppTransitionListener mAppTransitionListener; Loading Loading @@ -448,7 +449,130 @@ public class DisplayPolicy { final Looper looper = UiThread.getHandler().getLooper(); mHandler = new PolicyHandler(looper); mSystemGestures = new SystemGesturesPointerEventListener(mContext, mHandler, mAppTransitionListener = new WindowManagerInternal.AppTransitionListener() { private Runnable mAppTransitionPending = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionPending(displayId); } }; private Runnable mAppTransitionCancelled = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionCancelled(displayId); } }; private Runnable mAppTransitionFinished = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionFinished(displayId); } }; @Override public void onAppTransitionPendingLocked() { mHandler.post(mAppTransitionPending); } @Override public int onAppTransitionStartingLocked(boolean keyguardGoingAway, long duration, long statusBarAnimationStartTime, long statusBarAnimationDuration) { mHandler.post(() -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionStarting(mContext.getDisplayId(), statusBarAnimationStartTime, statusBarAnimationDuration); } }); return 0; } @Override public void onAppTransitionCancelledLocked(boolean keyguardGoingAway) { mHandler.post(mAppTransitionCancelled); } @Override public void onAppTransitionFinishedLocked(IBinder token) { mHandler.post(mAppTransitionFinished); } }; displayContent.mAppTransition.registerListenerLocked(mAppTransitionListener); mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext, looper, mService.mVrModeEnabled); // TODO(b/180986447): Make it can take screenshot on external display mScreenshotHelper = displayContent.isDefaultDisplay ? new ScreenshotHelper(mContext) : null; if (mDisplayContent.isDefaultDisplay) { mHasStatusBar = true; mHasNavigationBar = mContext.getResources().getBoolean(R.bool.config_showNavigationBar); // Allow a system property to override this. Used by the emulator. // See also hasNavigationBar(). String navBarOverride = SystemProperties.get("qemu.hw.mainkeys"); if ("1".equals(navBarOverride)) { mHasNavigationBar = false; } else if ("0".equals(navBarOverride)) { mHasNavigationBar = true; } } else { mHasStatusBar = false; mHasNavigationBar = mDisplayContent.supportsSystemDecorations(); } mRefreshRatePolicy = new RefreshRatePolicy(mService, mDisplayContent.getDisplayInfo(), mService.mHighRefreshRateDenylist); } private void checkAltBarSwipeForTransientBars(@WindowManagerPolicy.AltBarPosition int pos) { if (mStatusBarAlt != null && mStatusBarAltPosition == pos) { requestTransientBars(mStatusBarAlt); } if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { requestTransientBars(mNavigationBarAlt); } if (mClimateBarAlt != null && mClimateBarAltPosition == pos) { requestTransientBars(mClimateBarAlt); } if (mExtraNavBarAlt != null && mExtraNavBarAltPosition == pos) { requestTransientBars(mExtraNavBarAlt); } } void 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() { Loading Loading @@ -477,9 +601,10 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); final boolean excluded = mSystemGestures.currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_RIGHT final boolean excluded = mSystemGestures .currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_RIGHT || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { requestTransientBars(mNavigationBar); } Loading @@ -494,9 +619,10 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); final boolean excluded = mSystemGestures.currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_LEFT final boolean excluded = mSystemGestures .currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_LEFT || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { requestTransientBars(mNavigationBar); } Loading Loading @@ -560,119 +686,13 @@ public class DisplayPolicy { mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); } }); displayContent.registerPointerEventListener(mSystemGestures); mAppTransitionListener = new WindowManagerInternal.AppTransitionListener() { private Runnable mAppTransitionPending = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionPending(displayId); } }; private Runnable mAppTransitionCancelled = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionCancelled(displayId); } }; private Runnable mAppTransitionFinished = () -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionFinished(displayId); } }; @Override public void onAppTransitionPendingLocked() { mHandler.post(mAppTransitionPending); } @Override public int onAppTransitionStartingLocked(boolean keyguardGoingAway, long duration, long statusBarAnimationStartTime, long statusBarAnimationDuration) { mHandler.post(() -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { statusBar.appTransitionStarting(mContext.getDisplayId(), statusBarAnimationStartTime, statusBarAnimationDuration); } }); return 0; } @Override public void onAppTransitionCancelledLocked(boolean keyguardGoingAway) { mHandler.post(mAppTransitionCancelled); } @Override public void onAppTransitionFinishedLocked(IBinder token) { mHandler.post(mAppTransitionFinished); } }; displayContent.mAppTransition.registerListenerLocked(mAppTransitionListener); mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext, looper, mService.mVrModeEnabled); // TODO: Make it can take screenshot on external display mScreenshotHelper = displayContent.isDefaultDisplay ? new ScreenshotHelper(mContext) : null; if (mDisplayContent.isDefaultDisplay) { mHasStatusBar = true; mHasNavigationBar = mContext.getResources().getBoolean(R.bool.config_showNavigationBar); // Allow a system property to override this. Used by the emulator. // See also hasNavigationBar(). String navBarOverride = SystemProperties.get("qemu.hw.mainkeys"); if ("1".equals(navBarOverride)) { mHasNavigationBar = false; } else if ("0".equals(navBarOverride)) { mHasNavigationBar = true; } } else { mHasStatusBar = false; mHasNavigationBar = mDisplayContent.supportsSystemDecorations(); } 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) { if (mStatusBarAlt != null && mStatusBarAltPosition == pos) { requestTransientBars(mStatusBarAlt); } if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { requestTransientBars(mNavigationBarAlt); } if (mClimateBarAlt != null && mClimateBarAltPosition == pos) { requestTransientBars(mClimateBarAlt); } if (mExtraNavBarAlt != null && mExtraNavBarAltPosition == pos) { requestTransientBars(mExtraNavBarAlt); } } void systemReady() { mDisplayContent.registerPointerEventListener(getSystemGestures()); if (mService.mSystemReady) { mSystemGestures.systemReady(); if (mService.mPointerLocationEnabled) { setPointerLocationEnabled(true); } } return mSystemGestures; } private int getDisplayId() { return mDisplayContent.getDisplayId(); Loading Loading @@ -1455,8 +1475,7 @@ public class DisplayPolicy { } void onDisplayInfoChanged(DisplayInfo info) { mSystemGestures.screenWidth = info.logicalWidth; mSystemGestures.screenHeight = info.logicalHeight; getSystemGestures().onDisplayInfoChanged(info); } private void layoutStatusBar(DisplayFrames displayFrames, Rect contentFrame) { Loading Loading @@ -1969,7 +1988,7 @@ public class DisplayPolicy { public void onOverlayChangedLw() { updateCurrentUserResources(); onConfigurationChanged(); mSystemGestures.onConfigurationChanged(); getSystemGestures().onConfigurationChanged(); } /** Loading Loading @@ -2040,10 +2059,10 @@ public class DisplayPolicy { } mNavBarOpacityMode = res.getInteger(R.integer.config_navBarOpacityMode); mLeftGestureInset = mGestureNavigationSettingsObserver.getLeftSensitivity(res); mRightGestureInset = mGestureNavigationSettingsObserver.getRightSensitivity(res); mNavButtonForcedVisible = mGestureNavigationSettingsObserver.areNavigationButtonForcedVisible(); final GestureNavigationSettingsObserver observer = getGestureNavigationSettingsObserver(); mLeftGestureInset = observer.getLeftSensitivity(res); mRightGestureInset = observer.getRightSensitivity(res); mNavButtonForcedVisible = observer.areNavigationButtonForcedVisible(); mNavigationBarLetsThroughTaps = res.getBoolean(R.bool.config_navBarTapThrough); mNavigationBarAlwaysShowOnSideGesture = res.getBoolean(R.bool.config_navBarAlwaysShowOnSideEdgeGesture); Loading Loading @@ -3056,7 +3075,7 @@ public class DisplayPolicy { } void release() { mHandler.post(mGestureNavigationSettingsObserver::unregister); mHandler.post(getGestureNavigationSettingsObserver()::unregister); } @VisibleForTesting Loading
services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java +6 −0 Original line number Diff line number Diff line Loading @@ -126,11 +126,17 @@ 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()) { Loading
services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +12 −0 Original line number Diff line number Diff line Loading @@ -323,4 +323,16 @@ 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(); } }
services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +1 −2 Original line number Diff line number Diff line Loading @@ -538,9 +538,8 @@ class WindowTestsBase extends SystemServiceTestsBase { /** Creates a {@link DisplayContent} and adds it to the system. */ private DisplayContent createNewDisplay(DisplayInfo info, @DisplayImePolicy int imePolicy) { final DisplayContent display = final DisplayContent dc = new TestDisplayContent.Builder(mAtm, info).build(); final DisplayContent dc = display.mDisplayContent; // this display can show IME. dc.mWmService.mDisplayWindowSettings.setDisplayImePolicy(dc, imePolicy); return dc; Loading