From 9b86e9c822a2b06c7a3ad0ed7f9adb9c40fe7299 Mon Sep 17 00:00:00 2001 From: Esteban Talavera Date: Tue, 30 May 2017 16:48:08 +0100 Subject: [PATCH] Include disabled managed profiles in Accounts page At the moment we include disabled profiles when deciding whether the Work section needs to be added, and then only include enabled ones when searching for the managed profile's user handle Change-Id: I96b0c36aad6b9326abc2992fa3309716f5cd1e74 Fix: 62021410 Test: m RunSettingsRoboTests --- src/com/android/settings/Utils.java | 26 +++++++++++++++- .../AutoSyncWorkDataPreferenceController.java | 2 +- ...oSyncWorkDataPreferenceControllerTest.java | 30 +++++++++++-------- 3 files changed, 43 insertions(+), 15 deletions(-) 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(); } }