summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alina Zaidi <alinazaidi@google.com> 2024-12-12 15:24:25 +0000
committer Alina Zaidi <alinazaidi@google.com> 2025-01-15 07:40:52 -0800
commit2f28621b620290043485afbf0f3a3329b45a6000 (patch)
tree54591d0447db053e4445a8077a99b7e3ea9ff20e
parentea64be1accb87cb858628612c3759198c4a01b42 (diff)
Make StatusBarManagerService#disableForUser methods work on all
displays. This ensures DevicePolicyManager#setStatusBarDisabled works for all displays multidisplay Bug: 382031216 Test: atest com.android.server.statusbar.StatusBarManagerServiceTest Flag: com.android.systemui.shared.status_bar_connected_displays Change-Id: I6546aa8d35cc42200bf5fc43c12159972365bf13
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java85
-rw-r--r--services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java50
2 files changed, 107 insertions, 28 deletions
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index b7b4cc0b6861..48dd2ebc7044 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -87,6 +87,7 @@ import android.service.quicksettings.TileService;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.IndentingPrintWriter;
+import android.util.IntArray;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
@@ -124,6 +125,7 @@ import com.android.server.policy.GlobalActionsProvider;
import com.android.server.power.ShutdownCheckPoints;
import com.android.server.power.ShutdownThread;
import com.android.server.wm.ActivityTaskManagerInternal;
+import com.android.systemui.shared.Flags;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -341,15 +343,19 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
@Override
public void onDisplayAdded(int displayId) {
- synchronized (mLock) {
- mDisplayUiState.put(displayId, new UiState());
+ if (Flags.statusBarConnectedDisplays()) {
+ synchronized (mLock) {
+ mDisplayUiState.put(displayId, new UiState());
+ }
}
}
@Override
public void onDisplayRemoved(int displayId) {
- synchronized (mLock) {
- mDisplayUiState.remove(displayId);
+ if (Flags.statusBarConnectedDisplays()) {
+ synchronized (mLock) {
+ mDisplayUiState.remove(displayId);
+ }
}
}
@@ -1320,53 +1326,66 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
return mTracingEnabled;
}
- // TODO(b/117478341): make it aware of multi-display if needed.
@Override
public void disable(int what, IBinder token, String pkg) {
disableForUser(what, token, pkg, mCurrentUserId);
}
- // TODO(b/117478341): make it aware of multi-display if needed.
+ /**
+ * Disable additional status bar features for user for all displays. Pass the bitwise-or of the
+ * {@code #DISABLE_*} flags. To re-enable everything, pass {@code #DISABLE_NONE}.
+ *
+ * Warning: Only pass {@code #DISABLE_*} flags into this function, do not use
+ * {@code #DISABLE2_*} flags.
+ */
@Override
public void disableForUser(int what, IBinder token, String pkg, int userId) {
enforceStatusBar();
enforceValidCallingUser();
synchronized (mLock) {
- disableLocked(DEFAULT_DISPLAY, userId, what, token, pkg, 1);
+ IntArray displayIds = new IntArray();
+ for (int i = 0; i < mDisplayUiState.size(); i++) {
+ displayIds.add(mDisplayUiState.keyAt(i));
+ }
+ disableLocked(displayIds, userId, what, token, pkg, 1);
}
}
- // TODO(b/117478341): make it aware of multi-display if needed.
/**
- * Disable additional status bar features. Pass the bitwise-or of the DISABLE2_* flags.
- * To re-enable everything, pass {@link #DISABLE2_NONE}.
+ * Disable additional status bar features. Pass the bitwise-or of the {@code #DISABLE2_*} flags.
+ * To re-enable everything, pass {@code #DISABLE2_NONE}.
*
- * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags.
+ * Warning: Only pass {@code #DISABLE2_*} flags into this function, do not use
+ * {@code #DISABLE_*} flags.
*/
@Override
public void disable2(int what, IBinder token, String pkg) {
disable2ForUser(what, token, pkg, mCurrentUserId);
}
- // TODO(b/117478341): make it aware of multi-display if needed.
/**
- * Disable additional status bar features for a given user. Pass the bitwise-or of the
- * DISABLE2_* flags. To re-enable everything, pass {@link #DISABLE_NONE}.
+ * Disable additional status bar features for a given user for all displays. Pass the bitwise-or
+ * of the {@code #DISABLE2_*} flags. To re-enable everything, pass {@code #DISABLE2_NONE}.
*
- * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags.
+ * Warning: Only pass {@code #DISABLE2_*} flags into this function, do not use
+ * {@code #DISABLE_*} flags.
*/
@Override
public void disable2ForUser(int what, IBinder token, String pkg, int userId) {
enforceStatusBar();
synchronized (mLock) {
- disableLocked(DEFAULT_DISPLAY, userId, what, token, pkg, 2);
+ IntArray displayIds = new IntArray();
+ for (int i = 0; i < mDisplayUiState.size(); i++) {
+ displayIds.add(mDisplayUiState.keyAt(i));
+ }
+ disableLocked(displayIds, userId, what, token, pkg, 2);
}
}
- private void disableLocked(int displayId, int userId, int what, IBinder token, String pkg,
- int whichFlag) {
+ private void disableLocked(IntArray displayIds, int userId, int what, IBinder token,
+ String pkg, int whichFlag) {
// It's important that the the callback and the call to mBar get done
// in the same order when multiple threads are calling this function
// so they are paired correctly. The messages on the handler will be
@@ -1376,18 +1395,27 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
// Ensure state for the current user is applied, even if passed a non-current user.
final int net1 = gatherDisableActionsLocked(mCurrentUserId, 1);
final int net2 = gatherDisableActionsLocked(mCurrentUserId, 2);
- final UiState state = getUiState(displayId);
- if (!state.disableEquals(net1, net2)) {
- state.setDisabled(net1, net2);
- mHandler.post(() -> mNotificationDelegate.onSetDisabled(net1));
- IStatusBar bar = mBar;
- if (bar != null) {
- try {
- bar.disable(displayId, net1, net2);
- } catch (RemoteException ex) {
+ boolean shouldCallNotificationOnSetDisabled = false;
+ IStatusBar bar = mBar;
+ for (int displayId : displayIds.toArray()) {
+ final UiState state = getUiState(displayId);
+ if (!state.disableEquals(net1, net2)) {
+ shouldCallNotificationOnSetDisabled = true;
+ state.setDisabled(net1, net2);
+ if (bar != null) {
+ try {
+ // TODO(b/388244660): Create IStatusBar#disableForAllDisplays to avoid
+ // multiple IPC calls.
+ bar.disable(displayId, net1, net2);
+ } catch (RemoteException ex) {
+ Slog.e(TAG, "Unable to disable Status bar.", ex);
+ }
}
}
}
+ if (shouldCallNotificationOnSetDisabled) {
+ mHandler.post(() -> mNotificationDelegate.onSetDisabled(net1));
+ }
}
/**
@@ -1539,7 +1567,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
if (SPEW) Slog.d(TAG, "setDisableFlags(0x" + Integer.toHexString(flags) + ")");
synchronized (mLock) {
- disableLocked(displayId, mCurrentUserId, flags, mSysUiVisToken, cause, 1);
+ disableLocked(IntArray.wrap(new int[]{displayId}), mCurrentUserId, flags,
+ mSysUiVisToken, cause, 1);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java
index 148c96850d34..263ada8b36f6 100644
--- a/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java
@@ -69,6 +69,7 @@ import android.os.Binder;
import android.os.Looper;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.platform.test.annotations.EnableFlags;
import android.service.quicksettings.TileService;
import android.testing.TestableContext;
@@ -79,6 +80,7 @@ import com.android.internal.statusbar.IStatusBar;
import com.android.server.LocalServices;
import com.android.server.policy.GlobalActionsProvider;
import com.android.server.wm.ActivityTaskManagerInternal;
+import com.android.systemui.shared.Flags;
import libcore.junit.util.compat.CoreCompatChangeRule;
@@ -105,6 +107,7 @@ public class StatusBarManagerServiceTest {
TEST_SERVICE);
private static final CharSequence APP_NAME = "AppName";
private static final CharSequence TILE_LABEL = "Tile label";
+ private static final int SECONDARY_DISPLAY_ID = 2;
@Rule
public final TestableContext mContext =
@@ -749,6 +752,29 @@ public class StatusBarManagerServiceTest {
}
@Test
+ @EnableFlags(Flags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS)
+ public void testDisableForAllDisplays() throws Exception {
+ int user1Id = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(user1Id);
+
+ mStatusBarManagerService.onDisplayAdded(SECONDARY_DISPLAY_ID);
+
+ int expectedFlags = DISABLE_MASK & DISABLE_BACK;
+ String pkg = mContext.getPackageName();
+
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, user1Id)[0]);
+
+ // disable
+ mStatusBarManagerService.disable(expectedFlags, mMockStatusBar, pkg);
+
+ verify(mMockStatusBar).disable(0, expectedFlags, 0);
+ verify(mMockStatusBar).disable(SECONDARY_DISPLAY_ID, expectedFlags, 0);
+ }
+
+ @Test
public void testSetHomeDisabled() throws Exception {
int expectedFlags = DISABLE_MASK & DISABLE_HOME;
String pkg = mContext.getPackageName();
@@ -851,6 +877,29 @@ public class StatusBarManagerServiceTest {
}
@Test
+ @EnableFlags(Flags.FLAG_STATUS_BAR_CONNECTED_DISPLAYS)
+ public void testDisable2ForAllDisplays() throws Exception {
+ int user1Id = 0;
+ mockUidCheck();
+ mockCurrentUserCheck(user1Id);
+
+ mStatusBarManagerService.onDisplayAdded(SECONDARY_DISPLAY_ID);
+
+ int expectedFlags = DISABLE2_MASK & DISABLE2_NOTIFICATION_SHADE;
+ String pkg = mContext.getPackageName();
+
+ // before disabling
+ assertEquals(DISABLE_NONE,
+ mStatusBarManagerService.getDisableFlags(mMockStatusBar, user1Id)[0]);
+
+ // disable
+ mStatusBarManagerService.disable2(expectedFlags, mMockStatusBar, pkg);
+
+ verify(mMockStatusBar).disable(0, 0, expectedFlags);
+ verify(mMockStatusBar).disable(SECONDARY_DISPLAY_ID, 0, expectedFlags);
+ }
+
+ @Test
public void testSetQuickSettingsDisabled2() throws Exception {
int expectedFlags = DISABLE2_MASK & DISABLE2_QUICK_SETTINGS;
String pkg = mContext.getPackageName();
@@ -1092,6 +1141,7 @@ public class StatusBarManagerServiceTest {
// disable
mStatusBarManagerService.disableForUser(expectedUser1Flags, mMockStatusBar, pkg, user1Id);
mStatusBarManagerService.disableForUser(expectedUser2Flags, mMockStatusBar, pkg, user2Id);
+
// check that right flag is disabled
assertEquals(expectedUser1Flags,
mStatusBarManagerService.getDisableFlags(mMockStatusBar, user1Id)[0]);