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
This commit is contained in:
Justin Koh
2022-05-09 17:13:07 -07:00
parent 03ffb3babe
commit be40d25bb5
3 changed files with 85 additions and 17 deletions

View File

@@ -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);
}
}

View File

@@ -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<QSTile.BooleanState> {
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<QSTile.BooleanState> {
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<QSTile.BooleanState> {
refreshState();
}
};
mUserManager = userManager;
mDreamSupported = dreamSupported;
mDreamOnlyEnabledForSystemUser = dreamOnlyEnabledForSystemUser;
}
@Override
@@ -177,8 +188,11 @@ public class DreamTile extends QSTileImpl<QSTile.BooleanState> {
@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

View File

@@ -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);
}
}