Loading services/core/java/com/android/server/statusbar/StatusBarManagerService.java +46 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.app.StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS; import static android.app.StatusBarManager.NAV_BAR_MODE_OVERRIDE_NONE; import static android.app.StatusBarManager.NavBarModeOverride; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY; import android.Manifest; import android.annotation.NonNull; Loading @@ -38,6 +39,7 @@ import android.compat.annotation.EnabledSince; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.om.IOverlayManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; Loading @@ -60,6 +62,7 @@ import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; import android.os.ShellCallback; import android.os.UserHandle; import android.provider.Settings; Loading @@ -79,6 +82,7 @@ import android.view.WindowInsetsController.Behavior; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.inputmethod.SoftInputShowHideReason; import com.android.internal.os.TransferPipe; import com.android.internal.statusbar.IAddTileResultCallback; Loading Loading @@ -154,6 +158,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private final ArrayMap<String, Long> mCurrentRequestAddTilePackages = new ArrayMap<>(); private static final long REQUEST_TIME_OUT = TimeUnit.MINUTES.toNanos(5); private IOverlayManager mOverlayManager; private class DeathRecipient implements IBinder.DeathRecipient { public void binderDied() { mBar.asBinder().unlinkToDeath(this,0); Loading Loading @@ -256,6 +262,18 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D mTileRequestTracker = new TileRequestTracker(mContext); } private IOverlayManager getOverlayManager() { // No need to synchronize; worst-case scenario it will be fetched twice. if (mOverlayManager == null) { mOverlayManager = IOverlayManager.Stub.asInterface( ServiceManager.getService(Context.OVERLAY_SERVICE)); if (mOverlayManager == null) { Slog.w("StatusBarManager", "warning: no OVERLAY_SERVICE"); } } return mOverlayManager; } @Override public void onDisplayAdded(int displayId) {} Loading Loading @@ -1296,6 +1314,11 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D }); } @VisibleForTesting void registerOverlayManager(IOverlayManager overlayManager) { mOverlayManager = overlayManager; } /** * @param clearNotificationEffects whether to consider notifications as "shown" and stop * LED, vibration, and ringing Loading Loading @@ -1869,6 +1892,14 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D try { Settings.Secure.putIntForUser(mContext.getContentResolver(), Settings.Secure.NAV_BAR_KIDS_MODE, navBarModeOverride, userId); IOverlayManager overlayManager = getOverlayManager(); if (overlayManager != null && navBarModeOverride == NAV_BAR_MODE_OVERRIDE_KIDS && isPackageSupported(NAV_BAR_MODE_3BUTTON_OVERLAY)) { overlayManager.setEnabledExclusiveInCategory(NAV_BAR_MODE_3BUTTON_OVERLAY, userId); } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } finally { Binder.restoreCallingIdentity(userIdentity); } Loading Loading @@ -1896,6 +1927,21 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D return navBarKidsMode; } private boolean isPackageSupported(String packageName) { if (packageName == null) { return false; } try { return mContext.getPackageManager().getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0)) != null; } catch (PackageManager.NameNotFoundException ignored) { if (SPEW) { Slog.d(TAG, "Package not found: " + packageName); } } return false; } /** @hide */ public void passThroughShellCommand(String[] args, FileDescriptor fd) { enforceStatusBarOrShell(); Loading services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java +39 −3 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.argThat; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading @@ -38,6 +39,7 @@ import android.app.ActivityManagerInternal; import android.app.StatusBarManager; import android.content.ComponentName; import android.content.Intent; import android.content.om.IOverlayManager; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; Loading Loading @@ -96,6 +98,10 @@ public class StatusBarManagerServiceTest { private ApplicationInfo mApplicationInfo; @Mock private IStatusBar.Stub mMockStatusBar; @Mock private IOverlayManager mOverlayManager; @Mock private PackageManager mPackageManager; @Captor private ArgumentCaptor<IAddTileResultCallback> mAddTileResultCallbackCaptor; Loading Loading @@ -130,6 +136,7 @@ public class StatusBarManagerServiceTest { mStatusBarManagerService); mStatusBarManagerService.registerStatusBar(mMockStatusBar); mStatusBarManagerService.registerOverlayManager(mOverlayManager); mIcon = Icon.createWithResource(mContext, android.R.drawable.btn_plus); } Loading Loading @@ -577,27 +584,56 @@ public class StatusBarManagerServiceTest { } @Test public void testSetNavBarModeOverride_setsOverrideModeKids() { public void testSetNavBarModeOverride_setsOverrideModeKids() throws RemoteException { int navBarModeOverrideKids = StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS; mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideKids); assertEquals(navBarModeOverrideKids, mStatusBarManagerService.getNavBarModeOverride()); verify(mOverlayManager).setEnabledExclusiveInCategory(anyString(), anyInt()); } @Test public void testSetNavBarModeOverride_setsOverrideModeNone() { public void testSetNavBarModeOverride_setsOverrideModeNone() throws RemoteException { int navBarModeOverrideNone = StatusBarManager.NAV_BAR_MODE_OVERRIDE_NONE; mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideNone); assertEquals(navBarModeOverrideNone, mStatusBarManagerService.getNavBarModeOverride()); verify(mOverlayManager, never()).setEnabledExclusiveInCategory(anyString(), anyInt()); } @Test public void testSetNavBarModeOverride_invalidInputThrowsError() { public void testSetNavBarModeOverride_invalidInputThrowsError() throws RemoteException { int navBarModeOverrideInvalid = -1; assertThrows(UnsupportedOperationException.class, () -> mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideInvalid)); verify(mOverlayManager, never()).setEnabledExclusiveInCategory(anyString(), anyInt()); } @Test public void testSetNavBarModeOverride_noOverlayManagerDoesNotEnable() throws RemoteException { mOverlayManager = null; int navBarModeOverrideKids = StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS; mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideKids); assertEquals(navBarModeOverrideKids, mStatusBarManagerService.getNavBarModeOverride()); verify(mOverlayManager, never()).setEnabledExclusiveInCategory(anyString(), anyInt()); } @Test public void testSetNavBarModeOverride_noPackageDoesNotEnable() throws Exception { mContext.setMockPackageManager(mPackageManager); when(mPackageManager.getPackageInfo(anyString(), any(PackageManager.PackageInfoFlags.class))).thenReturn(null); int navBarModeOverrideKids = StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS; mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideKids); assertEquals(navBarModeOverrideKids, mStatusBarManagerService.getNavBarModeOverride()); verify(mOverlayManager, never()).setEnabledExclusiveInCategory(anyString(), anyInt()); } private void mockUidCheck() { Loading Loading
services/core/java/com/android/server/statusbar/StatusBarManagerService.java +46 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.app.StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS; import static android.app.StatusBarManager.NAV_BAR_MODE_OVERRIDE_NONE; import static android.app.StatusBarManager.NavBarModeOverride; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY; import android.Manifest; import android.annotation.NonNull; Loading @@ -38,6 +39,7 @@ import android.compat.annotation.EnabledSince; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.om.IOverlayManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; Loading @@ -60,6 +62,7 @@ import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; import android.os.ShellCallback; import android.os.UserHandle; import android.provider.Settings; Loading @@ -79,6 +82,7 @@ import android.view.WindowInsetsController.Behavior; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.inputmethod.SoftInputShowHideReason; import com.android.internal.os.TransferPipe; import com.android.internal.statusbar.IAddTileResultCallback; Loading Loading @@ -154,6 +158,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private final ArrayMap<String, Long> mCurrentRequestAddTilePackages = new ArrayMap<>(); private static final long REQUEST_TIME_OUT = TimeUnit.MINUTES.toNanos(5); private IOverlayManager mOverlayManager; private class DeathRecipient implements IBinder.DeathRecipient { public void binderDied() { mBar.asBinder().unlinkToDeath(this,0); Loading Loading @@ -256,6 +262,18 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D mTileRequestTracker = new TileRequestTracker(mContext); } private IOverlayManager getOverlayManager() { // No need to synchronize; worst-case scenario it will be fetched twice. if (mOverlayManager == null) { mOverlayManager = IOverlayManager.Stub.asInterface( ServiceManager.getService(Context.OVERLAY_SERVICE)); if (mOverlayManager == null) { Slog.w("StatusBarManager", "warning: no OVERLAY_SERVICE"); } } return mOverlayManager; } @Override public void onDisplayAdded(int displayId) {} Loading Loading @@ -1296,6 +1314,11 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D }); } @VisibleForTesting void registerOverlayManager(IOverlayManager overlayManager) { mOverlayManager = overlayManager; } /** * @param clearNotificationEffects whether to consider notifications as "shown" and stop * LED, vibration, and ringing Loading Loading @@ -1869,6 +1892,14 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D try { Settings.Secure.putIntForUser(mContext.getContentResolver(), Settings.Secure.NAV_BAR_KIDS_MODE, navBarModeOverride, userId); IOverlayManager overlayManager = getOverlayManager(); if (overlayManager != null && navBarModeOverride == NAV_BAR_MODE_OVERRIDE_KIDS && isPackageSupported(NAV_BAR_MODE_3BUTTON_OVERLAY)) { overlayManager.setEnabledExclusiveInCategory(NAV_BAR_MODE_3BUTTON_OVERLAY, userId); } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } finally { Binder.restoreCallingIdentity(userIdentity); } Loading Loading @@ -1896,6 +1927,21 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D return navBarKidsMode; } private boolean isPackageSupported(String packageName) { if (packageName == null) { return false; } try { return mContext.getPackageManager().getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0)) != null; } catch (PackageManager.NameNotFoundException ignored) { if (SPEW) { Slog.d(TAG, "Package not found: " + packageName); } } return false; } /** @hide */ public void passThroughShellCommand(String[] args, FileDescriptor fd) { enforceStatusBarOrShell(); Loading
services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java +39 −3 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.argThat; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading @@ -38,6 +39,7 @@ import android.app.ActivityManagerInternal; import android.app.StatusBarManager; import android.content.ComponentName; import android.content.Intent; import android.content.om.IOverlayManager; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; Loading Loading @@ -96,6 +98,10 @@ public class StatusBarManagerServiceTest { private ApplicationInfo mApplicationInfo; @Mock private IStatusBar.Stub mMockStatusBar; @Mock private IOverlayManager mOverlayManager; @Mock private PackageManager mPackageManager; @Captor private ArgumentCaptor<IAddTileResultCallback> mAddTileResultCallbackCaptor; Loading Loading @@ -130,6 +136,7 @@ public class StatusBarManagerServiceTest { mStatusBarManagerService); mStatusBarManagerService.registerStatusBar(mMockStatusBar); mStatusBarManagerService.registerOverlayManager(mOverlayManager); mIcon = Icon.createWithResource(mContext, android.R.drawable.btn_plus); } Loading Loading @@ -577,27 +584,56 @@ public class StatusBarManagerServiceTest { } @Test public void testSetNavBarModeOverride_setsOverrideModeKids() { public void testSetNavBarModeOverride_setsOverrideModeKids() throws RemoteException { int navBarModeOverrideKids = StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS; mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideKids); assertEquals(navBarModeOverrideKids, mStatusBarManagerService.getNavBarModeOverride()); verify(mOverlayManager).setEnabledExclusiveInCategory(anyString(), anyInt()); } @Test public void testSetNavBarModeOverride_setsOverrideModeNone() { public void testSetNavBarModeOverride_setsOverrideModeNone() throws RemoteException { int navBarModeOverrideNone = StatusBarManager.NAV_BAR_MODE_OVERRIDE_NONE; mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideNone); assertEquals(navBarModeOverrideNone, mStatusBarManagerService.getNavBarModeOverride()); verify(mOverlayManager, never()).setEnabledExclusiveInCategory(anyString(), anyInt()); } @Test public void testSetNavBarModeOverride_invalidInputThrowsError() { public void testSetNavBarModeOverride_invalidInputThrowsError() throws RemoteException { int navBarModeOverrideInvalid = -1; assertThrows(UnsupportedOperationException.class, () -> mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideInvalid)); verify(mOverlayManager, never()).setEnabledExclusiveInCategory(anyString(), anyInt()); } @Test public void testSetNavBarModeOverride_noOverlayManagerDoesNotEnable() throws RemoteException { mOverlayManager = null; int navBarModeOverrideKids = StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS; mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideKids); assertEquals(navBarModeOverrideKids, mStatusBarManagerService.getNavBarModeOverride()); verify(mOverlayManager, never()).setEnabledExclusiveInCategory(anyString(), anyInt()); } @Test public void testSetNavBarModeOverride_noPackageDoesNotEnable() throws Exception { mContext.setMockPackageManager(mPackageManager); when(mPackageManager.getPackageInfo(anyString(), any(PackageManager.PackageInfoFlags.class))).thenReturn(null); int navBarModeOverrideKids = StatusBarManager.NAV_BAR_MODE_OVERRIDE_KIDS; mStatusBarManagerService.setNavBarModeOverride(navBarModeOverrideKids); assertEquals(navBarModeOverrideKids, mStatusBarManagerService.getNavBarModeOverride()); verify(mOverlayManager, never()).setEnabledExclusiveInCategory(anyString(), anyInt()); } private void mockUidCheck() { Loading