summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Lingyu Feng <lingyufeng@google.com> 2025-01-21 18:43:18 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-21 18:43:18 -0800
commit142d0145824ee910d7ba9d1650647dcf61b73749 (patch)
tree3ae6bf67aadd27a898b45abc69d93a3516cbde0e
parent3791a5a92857d5cecf9f517024be59fe0f167099 (diff)
parent75989f24046ecfe24668f0626d295e0cd0380b87 (diff)
Merge "Update hasNavigationBar when shouldShowSystemDecors changes" into main
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl3
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java21
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java8
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java17
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java26
-rw-r--r--services/core/java/com/android/server/wm/DisplayWindowSettings.java5
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) {