diff options
| author | 2025-01-21 18:43:18 -0800 | |
|---|---|---|
| committer | 2025-01-21 18:43:18 -0800 | |
| commit | 142d0145824ee910d7ba9d1650647dcf61b73749 (patch) | |
| tree | 3ae6bf67aadd27a898b45abc69d93a3516cbde0e | |
| parent | 3791a5a92857d5cecf9f517024be59fe0f167099 (diff) | |
| parent | 75989f24046ecfe24668f0626d295e0cd0380b87 (diff) | |
Merge "Update hasNavigationBar when shouldShowSystemDecors changes" into main
7 files changed, 87 insertions, 1 deletions
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 9fbdf0d084bc..e9570757831e 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) { |