diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 0142ea2ff99..7b69fe0fa03 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -602,7 +602,8 @@ public final class Utils extends com.android.settingslib.Utils { } /** - * Returns the managed profile of the current user or null if none found. + * Returns the managed profile of the current user or {@code null} if none is found or a profile + * exists but it is disabled. */ public static UserHandle getManagedProfile(UserManager userManager) { List userProfiles = userManager.getUserProfiles(); @@ -620,6 +621,29 @@ public final class Utils extends com.android.settingslib.Utils { return null; } + /** + * Returns the managed profile of the current user or {@code null} if none is found. Unlike + * {@link #getManagedProfile} this method returns enabled and disabled managed profiles. + */ + public static UserHandle getManagedProfileWithDisabled(UserManager userManager) { + // TODO: Call getManagedProfileId from here once Robolectric supports + // API level 24 and UserManager.getProfileIdsWithDisabled can be Mocked (to avoid having + // yet another implementation that loops over user profiles in this method). In the meantime + // we need to use UserManager.getProfiles that is available on API 23 (the one currently + // used for Settings Robolectric tests). + final int myUserId = UserHandle.myUserId(); + List profiles = userManager.getProfiles(myUserId); + final int count = profiles.size(); + for (int i = 0; i < count; i++) { + final UserInfo profile = profiles.get(i); + if (profile.isManagedProfile() + && profile.getUserHandle().getIdentifier() != myUserId) { + return profile.getUserHandle(); + } + } + return null; + } + /** * Retrieves the id for the given user's managed profile. * diff --git a/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceController.java b/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceController.java index 1d08968fce4..acf43aa635b 100644 --- a/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceController.java +++ b/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceController.java @@ -27,7 +27,7 @@ public class AutoSyncWorkDataPreferenceController extends AutoSyncPersonalDataPr public AutoSyncWorkDataPreferenceController(Context context, Fragment parent) { super(context, parent); - mUserHandle = Utils.getManagedProfile(mUserManager); + mUserHandle = Utils.getManagedProfileWithDisabled(mUserManager); } @Override diff --git a/tests/robotests/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceControllerTest.java index d93d3a7d47e..cd66d5e37dc 100644 --- a/tests/robotests/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceControllerTest.java @@ -21,6 +21,7 @@ import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Answers.RETURNS_DEEP_STUBS; import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; import android.app.Fragment; @@ -46,6 +47,8 @@ import java.util.List; @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class AutoSyncWorkDataPreferenceControllerTest { + private static int MANAGED_PROFILE_ID = 10; + @Mock(answer = RETURNS_DEEP_STUBS) private UserManager mUserManager; @Mock(answer = RETURNS_DEEP_STUBS) @@ -80,29 +83,30 @@ public class AutoSyncWorkDataPreferenceControllerTest { @Test public void checkIsAvailable_singleUserProfile_shouldNotDisplay() { - final List infos = new ArrayList<>(); - infos.add(new UserInfo(1, "user 1", 0)); when(mUserManager.isManagedProfile()).thenReturn(false); when(mUserManager.isLinkedUser()).thenReturn(false); - when(mUserManager.getProfiles(anyInt())).thenReturn(infos); + + final List infos = new ArrayList<>(); + infos.add(new UserInfo(UserHandle.USER_SYSTEM, "user 1", 0 /* flags */)); + when(mUserManager.getProfiles(eq(UserHandle.USER_SYSTEM))).thenReturn(infos); assertThat(mController.isAvailable()).isFalse(); } @Test public void multipleProfile_shouldInitWithWorkProfileUserHandle() { - final int id1 = 1; - final int id2 = 2; - final UserInfo managedUser = new UserInfo(id2, "user 2", FLAG_MANAGED_PROFILE); - final List infos = new ArrayList<>(); - infos.add(new UserHandle(id1)); - infos.add(new UserHandle(id2)); - when(mUserManager.getUserProfiles()).thenReturn(infos); - when(mUserManager.getUserHandle()).thenReturn(id1); - when(mUserManager.getUserInfo(id2)).thenReturn(managedUser); + when(mUserManager.isManagedProfile()).thenReturn(false); + when(mUserManager.isLinkedUser()).thenReturn(false); + + final List infos = new ArrayList<>(); + infos.add(new UserInfo(UserHandle.USER_SYSTEM, "user 1", 0 /* flags */)); + infos.add(new UserInfo( + MANAGED_PROFILE_ID, "work profile", UserInfo.FLAG_MANAGED_PROFILE)); + when(mUserManager.getProfiles(eq(UserHandle.USER_SYSTEM))).thenReturn(infos); mController = new AutoSyncWorkDataPreferenceController(mContext, mFragment); - assertThat(mController.mUserHandle.getIdentifier()).isEqualTo(id2); + assertThat(mController.mUserHandle.getIdentifier()).isEqualTo(MANAGED_PROFILE_ID); + assertThat(mController.isAvailable()).isTrue(); } }