From be40d25bb5dbf552b15a2f138c7f44fc0d758f4b Mon Sep 17 00:00:00 2001 From: Justin Koh Date: Mon, 9 May 2022 17:13:07 -0700 Subject: [PATCH] Adjust DreamTile for secondary users. Adjust DreamTile availability based on config booleans like dream supported, or dream only enabled for secondary users. Bug: 231588826 Test: Wrote new unit test for this case, verified with guest user. Change-Id: Ib261d6922b347768c7e104bb4f8dadc81b6ba15b --- .../systemui/dreams/dagger/DreamModule.java | 23 ++++++++ .../android/systemui/qs/tiles/DreamTile.java | 24 ++++++-- .../systemui/qs/tiles/DreamTileTest.java | 55 +++++++++++++++---- 3 files changed, 85 insertions(+), 17 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java index c1dff248818f1..cd23f149cf7d5 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java @@ -17,10 +17,14 @@ package com.android.systemui.dreams.dagger; import android.content.Context; +import android.content.res.Resources; import com.android.settingslib.dream.DreamBackend; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.complication.dagger.RegisteredComplicationsModule; +import javax.inject.Named; + import dagger.Module; import dagger.Provides; @@ -34,6 +38,10 @@ import dagger.Provides; DreamOverlayComponent.class, }) public interface DreamModule { + String DREAM_ONLY_ENABLED_FOR_SYSTEM_USER = "dream_only_enabled_for_system_user"; + + String DREAM_SUPPORTED = "dream_supported"; + /** * Provides an instance of the dream backend. */ @@ -41,4 +49,19 @@ public interface DreamModule { static DreamBackend providesDreamBackend(Context context) { return DreamBackend.getInstance(context); } + + /** */ + @Provides + @Named(DREAM_ONLY_ENABLED_FOR_SYSTEM_USER) + static boolean providesDreamOnlyEnabledForSystemUser(@Main Resources resources) { + return resources.getBoolean( + com.android.internal.R.bool.config_dreamsOnlyEnabledForSystemUser); + } + + /** */ + @Provides + @Named(DREAM_SUPPORTED) + static boolean providesDreamSupported(@Main Resources resources) { + return resources.getBoolean(com.android.internal.R.bool.config_dreamsSupported); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java index f24773a5da1d1..8cb7185a18b32 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java @@ -27,6 +27,7 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.RemoteException; +import android.os.UserManager; import android.provider.Settings; import android.service.dreams.IDreamManager; import android.service.quicksettings.Tile; @@ -42,6 +43,7 @@ import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.dreams.dagger.DreamModule; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QSTile; @@ -53,16 +55,19 @@ import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.util.settings.SecureSettings; import javax.inject.Inject; +import javax.inject.Named; /** Quick settings tile: Screensaver (dream) **/ public class DreamTile extends QSTileImpl { private static final String LOG_TAG = "QSDream"; private final IDreamManager mDreamManager; - private final SecureSettings mSecureSettings; private final BroadcastDispatcher mBroadcastDispatcher; private final SettingObserver mEnabledSettingObserver; private final SettingObserver mDreamSettingObserver; + private final UserManager mUserManager; + private final boolean mDreamSupported; + private final boolean mDreamOnlyEnabledForSystemUser; private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override @@ -83,12 +88,15 @@ public class DreamTile extends QSTileImpl { QSLogger qsLogger, IDreamManager dreamManager, SecureSettings secureSettings, - BroadcastDispatcher broadcastDispatcher + BroadcastDispatcher broadcastDispatcher, + UserManager userManager, + @Named(DreamModule.DREAM_SUPPORTED) boolean dreamSupported, + @Named(DreamModule.DREAM_ONLY_ENABLED_FOR_SYSTEM_USER) + boolean dreamOnlyEnabledForSystemUser ) { super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); mDreamManager = dreamManager; - mSecureSettings = secureSettings; mBroadcastDispatcher = broadcastDispatcher; mEnabledSettingObserver = new SettingObserver(secureSettings, mHandler, Settings.Secure.SCREENSAVER_ENABLED) { @@ -104,6 +112,9 @@ public class DreamTile extends QSTileImpl { refreshState(); } }; + mUserManager = userManager; + mDreamSupported = dreamSupported; + mDreamOnlyEnabledForSystemUser = dreamOnlyEnabledForSystemUser; } @Override @@ -177,8 +188,11 @@ public class DreamTile extends QSTileImpl { @Override public boolean isAvailable() { - // For now, only present on userdebug devices. - return Build.isDebuggable(); + // Only enable for devices that have dreams for the user(s) that can dream. + // For now, restrict to debug users. + return Build.isDebuggable() + && mDreamSupported + && (!mDreamOnlyEnabledForSystemUser || mUserManager.isSystemUser()); } @VisibleForTesting diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java index f4a6df860e22f..5b7af654bbb62 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java @@ -17,6 +17,8 @@ package com.android.systemui.qs.tiles; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertFalse; +import static junit.framework.TestCase.assertTrue; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -25,6 +27,7 @@ import static org.mockito.Mockito.when; import android.content.ComponentName; import android.os.Handler; import android.os.RemoteException; +import android.os.UserManager; import android.provider.Settings; import android.service.dreams.IDreamManager; import android.service.quicksettings.Tile; @@ -70,6 +73,8 @@ public class DreamTileTest extends SysuiTestCase { private IDreamManager mDreamManager; @Mock private BroadcastDispatcher mBroadcastDispatcher; + @Mock + private UserManager mUserManager; private TestableLooper mTestableLooper; @@ -94,18 +99,7 @@ public class DreamTileTest extends SysuiTestCase { when(mHost.getUserId()).thenReturn(DEFAULT_USER); when(mHost.getContext()).thenReturn(mContext); - mTile = spy(new DreamTile( - mHost, - mTestableLooper.getLooper(), - new Handler(mTestableLooper.getLooper()), - new FalsingManagerFake(), - mMetricsLogger, - mStatusBarStateController, - mActivityStarter, - mQSLogger, - mDreamManager, - mSecureSettings, - mBroadcastDispatcher)); + mTile = spy(constructTileForTest(true, false)); mTestableLooper.processAllMessages(); mTile.initialize(); @@ -195,8 +189,45 @@ public class DreamTileTest extends SysuiTestCase { mTile.getContentDescription(testDreamName)); } + @Test + public void testUserAvailability() { + DreamTile unsupportedTile = constructTileForTest(false, true); + assertFalse(unsupportedTile.isAvailable()); + + DreamTile supportedTileAllUsers = constructTileForTest(true, false); + + when(mUserManager.isSystemUser()).thenReturn(true); + assertTrue(supportedTileAllUsers.isAvailable()); + when(mUserManager.isSystemUser()).thenReturn(false); + assertTrue(supportedTileAllUsers.isAvailable()); + + DreamTile supportedTileOnlySystemUser = constructTileForTest(true, true); + when(mUserManager.isSystemUser()).thenReturn(true); + assertTrue(supportedTileOnlySystemUser.isAvailable()); + when(mUserManager.isSystemUser()).thenReturn(false); + assertFalse(supportedTileOnlySystemUser.isAvailable()); + } + private void setScreensaverEnabled(boolean enabled) { mSecureSettings.putIntForUser(Settings.Secure.SCREENSAVER_ENABLED, enabled ? 1 : 0, DEFAULT_USER); } + + private DreamTile constructTileForTest(boolean dreamSupported, + boolean dreamOnlyEnabledForSystemUser) { + return new DreamTile( + mHost, + mTestableLooper.getLooper(), + new Handler(mTestableLooper.getLooper()), + new FalsingManagerFake(), + mMetricsLogger, + mStatusBarStateController, + mActivityStarter, + mQSLogger, + mDreamManager, + mSecureSettings, + mBroadcastDispatcher, + mUserManager, + dreamSupported, dreamOnlyEnabledForSystemUser); + } }