diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 7b1e353bf36..a06efb73529 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -1277,4 +1277,16 @@ public final class Utils extends com.android.settingslib.Utils { } return -1; } + + /** + * Returns if the current user is able to use Dreams. + */ + public static boolean canCurrentUserDream(Context context) { + final UserHandle mainUser = context.getSystemService(UserManager.class).getMainUser(); + if (mainUser == null) { + return false; + } + return context.createContextAsUser(mainUser, 0).getSystemService(UserManager.class) + .isUserForeground(); + } } diff --git a/src/com/android/settings/communal/CommunalPreferenceController.java b/src/com/android/settings/communal/CommunalPreferenceController.java index 5cfedc45de6..67fd389e42c 100644 --- a/src/com/android/settings/communal/CommunalPreferenceController.java +++ b/src/com/android/settings/communal/CommunalPreferenceController.java @@ -17,9 +17,9 @@ package com.android.settings.communal; import android.content.Context; -import android.os.UserManager; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; /** @@ -32,14 +32,8 @@ public class CommunalPreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - // TODO(b/257333623): Allow the communal user to be non-SystemUser user in HSUM. return (mContext.getResources().getBoolean(R.bool.config_show_communal_settings) - && isSystemUser()) + && Utils.canCurrentUserDream(mContext)) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } - - private boolean isSystemUser() { - final UserManager userManager = mContext.getSystemService(UserManager.class); - return userManager != null && userManager.isSystemUser(); - } } diff --git a/src/com/android/settings/display/ScreenSaverPreferenceController.java b/src/com/android/settings/display/ScreenSaverPreferenceController.java index ca027f45d28..8d732409946 100644 --- a/src/com/android/settings/display/ScreenSaverPreferenceController.java +++ b/src/com/android/settings/display/ScreenSaverPreferenceController.java @@ -14,9 +14,9 @@ package com.android.settings.display; import android.content.Context; -import android.os.UserManager; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.dream.DreamSettings; @@ -39,9 +39,8 @@ public class ScreenSaverPreferenceController extends BasePreferenceController im com.android.internal.R.bool.config_dreamsSupported); final boolean dreamsOnlyEnabledForDockUser = mContext.getResources().getBoolean( com.android.internal.R.bool.config_dreamsOnlyEnabledForDockUser); - final UserManager userManager = mContext.getSystemService(UserManager.class); - // TODO(b/257333623): Allow the Dock User to be non-SystemUser user in HSUM. - return (dreamsSupported && (!dreamsOnlyEnabledForDockUser || userManager.isMainUser())) + return (dreamsSupported && (!dreamsOnlyEnabledForDockUser + || Utils.canCurrentUserDream(mContext))) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/src/com/android/settings/users/TimeoutToDockUserPreferenceController.java b/src/com/android/settings/users/TimeoutToDockUserPreferenceController.java index 98dca2a9ade..57e8d402825 100644 --- a/src/com/android/settings/users/TimeoutToDockUserPreferenceController.java +++ b/src/com/android/settings/users/TimeoutToDockUserPreferenceController.java @@ -24,6 +24,7 @@ import android.provider.Settings; import androidx.preference.PreferenceScreen; +import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; import java.util.Arrays; @@ -67,9 +68,7 @@ public class TimeoutToDockUserPreferenceController extends BasePreferenceControl return CONDITIONALLY_UNAVAILABLE; } - // Is currently user zero. Only non user zero can have this setting. - // TODO(b/257333623): Allow the Dock User to be non-SystemUser user in HSUM. - if (UserHandle.myUserId() == UserHandle.USER_SYSTEM) { + if (Utils.canCurrentUserDream(mContext)) { return DISABLED_FOR_USER; } diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java index 2aa8418227f..0ef1f3aa18a 100644 --- a/tests/robotests/src/com/android/settings/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/UtilsTest.java @@ -46,6 +46,7 @@ import android.net.LinkProperties; import android.net.Network; import android.net.wifi.WifiManager; import android.os.Bundle; +import android.os.UserHandle; import android.os.UserManager; import android.os.storage.DiskInfo; import android.os.storage.StorageManager; @@ -299,4 +300,43 @@ public class UtilsTest { assertThat(Utils.isSettingsIntelligence(mContext)).isFalse(); } + + @Test + public void canCurrentUserDream_isMainUser_returnTrue() { + Context mockContext = mock(Context.class); + UserManager mockUserManager = mock(UserManager.class); + + when(mockContext.getSystemService(UserManager.class)).thenReturn(mockUserManager); + + // mock MainUser + UserHandle mainUser = new UserHandle(10); + when(mockUserManager.getMainUser()).thenReturn(mainUser); + when(mockUserManager.isUserForeground()).thenReturn(true); + + when(mockContext.createContextAsUser(mainUser, 0)).thenReturn(mockContext); + + assertThat(Utils.canCurrentUserDream(mockContext)).isTrue(); + } + + @Test + public void canCurrentUserDream_nullMainUser_returnFalse() { + Context mockContext = mock(Context.class); + UserManager mockUserManager = mock(UserManager.class); + + when(mockContext.getSystemService(UserManager.class)).thenReturn(mockUserManager); + when(mockUserManager.getMainUser()).thenReturn(null); + + assertThat(Utils.canCurrentUserDream(mockContext)).isFalse(); + } + + @Test + public void canCurrentUserDream_notMainUser_returnFalse() { + Context mockContext = mock(Context.class); + UserManager mockUserManager = mock(UserManager.class); + + when(mockContext.getSystemService(UserManager.class)).thenReturn(mockUserManager); + when(mockUserManager.isUserForeground()).thenReturn(false); + + assertThat(Utils.canCurrentUserDream(mockContext)).isFalse(); + } } diff --git a/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java index 774117f86e0..2e7e2d797be 100644 --- a/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java @@ -32,6 +32,7 @@ import android.provider.Settings; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settings.fuelgauge.BatteryBackupHelperTest.ShadowUserHandle; import com.android.settings.testutils.shadow.ShadowSecureSettings; @@ -106,15 +107,17 @@ public class TimeoutToDockUserPreferenceControllerTest { } @Test - public void getAvailabilityStatus_isCurrentlyUserZero_returnDisabledForUser() { - ShadowUserHandle.setUid(UserHandle.USER_SYSTEM); + public void getAvailabilityStatus_isCurrentlyMainUser_returnDisabledForUser() { + when(Utils.canCurrentUserDream(mContext)).thenReturn(true); assertThat(mController.getAvailabilityStatus()).isEqualTo( BasePreferenceController.DISABLED_FOR_USER); } @Test - public void getAvailabilityStatus_featureAndMultiUserEnabledAndNonUserZero_returnAvailable() { + public void getAvailabilityStatus_featureAndMultiUserEnabledAndNonMainUser_returnAvailable() { + when(Utils.canCurrentUserDream(mContext)).thenReturn(false); + assertThat(mController.getAvailabilityStatus()).isEqualTo( BasePreferenceController.AVAILABLE); } diff --git a/tests/unit/src/com/android/settings/communal/CommunalPreferenceControllerTest.java b/tests/unit/src/com/android/settings/communal/CommunalPreferenceControllerTest.java index e8421d0b826..4d84765e188 100644 --- a/tests/unit/src/com/android/settings/communal/CommunalPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/communal/CommunalPreferenceControllerTest.java @@ -28,6 +28,7 @@ import android.os.UserManager; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.android.settings.Utils; import com.android.settings.testutils.ResourcesUtils; import org.junit.Before; @@ -41,6 +42,7 @@ public class CommunalPreferenceControllerTest { @Mock private UserManager mUserManager; + private Context mContext; private Resources mResources; private CommunalPreferenceController mController; @@ -49,33 +51,33 @@ public class CommunalPreferenceControllerTest { @Before public void setup() { MockitoAnnotations.initMocks(this); - final Context context = spy(ApplicationProvider.getApplicationContext()); - mResources = spy(context.getResources()); + mContext = spy(ApplicationProvider.getApplicationContext()); + mResources = spy(mContext.getResources()); - mController = new CommunalPreferenceController(context, PREF_KEY); + mController = new CommunalPreferenceController(mContext, PREF_KEY); - when(context.getResources()).thenReturn(mResources); - when(context.getSystemService(UserManager.class)).thenReturn(mUserManager); + when(mContext.getResources()).thenReturn(mResources); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); } @Test - public void isAvailable_communalEnabled_shouldBeTrueForSystemUser() { + public void isAvailable_communalEnabled_shouldBeTrueForDockUser() { setCommunalEnabled(true); - when(mUserManager.isSystemUser()).thenReturn(true); + when(Utils.canCurrentUserDream(mContext)).thenReturn(true); assertTrue(mController.isAvailable()); } @Test - public void isAvailable_communalEnabled_shouldBeFalseForNonSystemUser() { + public void isAvailable_communalEnabled_shouldBeFalseForNonDockUser() { setCommunalEnabled(true); - when(mUserManager.isSystemUser()).thenReturn(false); + when(Utils.canCurrentUserDream(mContext)).thenReturn(false); assertFalse(mController.isAvailable()); } @Test - public void isAvailable_communalDisabled_shouldBeFalseForSystemUser() { + public void isAvailable_communalDisabled_shouldBeFalseForDockUser() { setCommunalEnabled(false); - when(mUserManager.isSystemUser()).thenReturn(true); + when(Utils.canCurrentUserDream(mContext)).thenReturn(true); assertFalse(mController.isAvailable()); }