From 75989f24046ecfe24668f0626d295e0cd0380b87 Mon Sep 17 00:00:00 2001 From: Lingyu Feng Date: Mon, 20 Jan 2025 18:03:45 -0800 Subject: Update hasNavigationBar when shouldShowSystemDecors changes This CL updates DisplayPolicy.mHasNavigationBar and NavigationBarControllerImpl.mHasNavBar when shouldShowSystemDecors changes. Bug: 352461502 Bug: 374240163 Flag: com.android.server.display.feature.flags.enable_display_content_mode_management Test: manually (adb shell settings put secure mirror_built_in_display {1|0}) Change-Id: I8700a500661aa4b5f3cb836ac0c8c9c8694bfd93 --- .../com/android/internal/statusbar/IStatusBar.aidl | 3 +++ .../navigationbar/NavigationBarControllerImpl.java | 8 +++++++ .../android/systemui/statusbar/CommandQueue.java | 21 +++++++++++++++++ .../server/statusbar/StatusBarManagerInternal.java | 8 ++++++- .../server/statusbar/StatusBarManagerService.java | 17 ++++++++++++++ .../java/com/android/server/wm/DisplayPolicy.java | 26 ++++++++++++++++++++++ .../android/server/wm/DisplayWindowSettings.java | 5 +++++ 7 files changed, 87 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 555374a05592..3f5ab2b0efec 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -395,4 +395,7 @@ oneway interface IStatusBar * @param displayId the id of the current display. */ void moveFocusedTaskToDesktop(int displayId); + + /** Set whether the display should have a navigation bar. */ + void setHasNavigationBar(int displayId, boolean hasNavigationBar); } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java index 8f04896fbb45..aa1d23c06c73 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java @@ -18,6 +18,7 @@ package com.android.systemui.navigationbar; import static com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler.DEBUG_MISSING_GESTURE_TAG; import static com.android.systemui.shared.recents.utilities.Utilities.isLargeScreen; +import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.wm.shell.Flags.enableTaskbarNavbarUnification; import static com.android.wm.shell.Flags.enableTaskbarOnPhones; @@ -309,6 +310,13 @@ public class NavigationBarControllerImpl implements navBarView.showPinningEscapeToast(); } } + + @Override + public void setHasNavigationBar(int displayId, boolean hasNavigationBar) { + if (enableDisplayContentModeManagement()) { + mHasNavBar.put(displayId, hasNavigationBar); + } + } }; /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index c6a4d15705f0..96b6548856f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -184,6 +184,7 @@ public class CommandQueue extends IStatusBar.Stub implements private static final int MSG_SET_SPLITSCREEN_FOCUS = 81 << MSG_SHIFT; private static final int MSG_TOGGLE_QUICK_SETTINGS_PANEL = 82 << MSG_SHIFT; private static final int MSG_WALLET_ACTION_LAUNCH_GESTURE = 83 << MSG_SHIFT; + private static final int MSG_SET_HAS_NAVIGATION_BAR = 84 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; public static final int FLAG_EXCLUDE_RECENTS_PANEL = 1 << 1; @@ -580,6 +581,12 @@ public class CommandQueue extends IStatusBar.Stub implements * @see IStatusBar#moveFocusedTaskToDesktop(int) */ default void moveFocusedTaskToDesktop(int displayId) {} + + /** + * @see IStatusBar#setHasNavigationBar(int, boolean) + */ + default void setHasNavigationBar(int displayId, boolean hasNavigationBar) { + } } @VisibleForTesting @@ -1510,6 +1517,15 @@ public class CommandQueue extends IStatusBar.Stub implements mHandler.obtainMessage(MSG_ENTER_DESKTOP, args).sendToTarget(); } + @Override + public void setHasNavigationBar(int displayId, boolean hasNavigationBar) { + synchronized (mLock) { + mHandler.obtainMessage(MSG_SET_HAS_NAVIGATION_BAR, displayId, + hasNavigationBar ? 1 : 0).sendToTarget(); + } + } + + private final class H extends Handler { private H(Looper l) { super(l); @@ -2036,6 +2052,11 @@ public class CommandQueue extends IStatusBar.Stub implements } break; } + case MSG_SET_HAS_NAVIGATION_BAR: + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).setHasNavigationBar(msg.arg1, msg.arg2 != 0); + } + break; } } } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index b7ce050aaadd..37f91b0fff66 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -275,7 +275,13 @@ public interface StatusBarManagerInternal { */ void moveFocusedTaskToDesktop(int displayId); - /** Passes through the given shell commands to SystemUI */ void passThroughShellCommand(String[] args, FileDescriptor fd); + + /** + * Set whether the display should have a navigation bar. + * + * TODO(b/390591772): Refactor this method + */ + void setHasNavigationBar(int displayId, boolean hasNavigationBar); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 4ece470d9b8d..8fdf8632afd1 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -996,6 +996,23 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D public void passThroughShellCommand(String[] args, FileDescriptor fd) { StatusBarManagerService.this.passThroughShellCommand(args, fd); } + + @Override + public void setHasNavigationBar(int displayId, boolean hasNavigationBar) { + if (isVisibleBackgroundUserOnDisplay(displayId)) { + if (SPEW) { + Slog.d(TAG, "Skipping setHasNavigationBar for visible background user " + + mUserManagerInternal.getUserAssignedToDisplay(displayId)); + } + return; + } + IStatusBar bar = mBar; + if (bar != null) { + try { + bar.setHasNavigationBar(displayId, hasNavigationBar); + } catch (RemoteException ex) {} + } + } }; private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() { diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 319b48a89316..9b81c6bb1345 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -67,6 +67,7 @@ import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ANIM; import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SCREEN_ON; +import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.server.policy.PhoneWindowManager.TOAST_WINDOW_TIMEOUT; import static com.android.server.policy.WindowManagerPolicy.TRANSIT_PREVIEW_DONE; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT; @@ -746,6 +747,31 @@ public class DisplayPolicy { return mHasNavigationBar; } + void updateHasNavigationBarIfNeeded() { + if (!enableDisplayContentModeManagement()) { + Slog.e(TAG, "mHasNavigationBar shouldn't be updated when the flag is off."); + } + + if (mDisplayContent.isDefaultDisplay) { + return; + } + + final boolean hasNavigationBar = mDisplayContent.isSystemDecorationsSupported(); + if (mHasNavigationBar == hasNavigationBar) { + return; + } + + mHasNavigationBar = hasNavigationBar; + mHandler.post( + () -> { + final int displayId = getDisplayId(); + StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); + if (statusBar != null) { + statusBar.setHasNavigationBar(displayId, mHasNavigationBar); + } + }); + } + public boolean hasStatusBar() { return mHasStatusBar; } diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java index 4ae100857f55..3de36bc39973 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java @@ -26,6 +26,8 @@ import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_AUTO; import static com.android.server.wm.DisplayContent.FORCE_SCALING_MODE_DISABLED; +import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; + import android.annotation.NonNull; import android.annotation.Nullable; import android.app.WindowConfiguration; @@ -249,6 +251,9 @@ class DisplayWindowSettings { mSettingsProvider.getOverrideSettings(displayInfo); overrideSettings.mShouldShowSystemDecors = shouldShow; mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); + if (enableDisplayContentModeManagement()) { + dc.getDisplayPolicy().updateHasNavigationBarIfNeeded(); + } } boolean isHomeSupportedLocked(@NonNull DisplayContent dc) { -- cgit v1.2.3-59-g8ed1b