diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2020-04-01 02:14:17 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2020-04-01 02:14:17 +0000 |
commit | f096b4fa52965e5c0f30bdd4707c4c5616f18599 (patch) | |
tree | 16fab7a2f26742f9f4520bdd8761a0388da24fce | |
parent | 715d47e0cbf1821a1a72db589c59805f7ebe73fc (diff) | |
parent | 36213bd738a9f63dd79f8ae5f65eef69ccc72b29 (diff) | |
download | platform_external_robolectric-shadows-f096b4fa52965e5c0f30bdd4707c4c5616f18599.tar.gz platform_external_robolectric-shadows-f096b4fa52965e5c0f30bdd4707c4c5616f18599.tar.bz2 platform_external_robolectric-shadows-f096b4fa52965e5c0f30bdd4707c4c5616f18599.zip |
Snap for 6353066 from 36213bd738a9f63dd79f8ae5f65eef69ccc72b29 to rvc-release
Change-Id: If14058d40b70648ebbc1c2f395383a111ace1e7c
3 files changed, 70 insertions, 10 deletions
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java index dd908a6ff..e05b8f868 100644 --- a/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java +++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java @@ -136,6 +136,18 @@ public class ShadowUserManagerTest { } @Test + @Config(minSdk = N) + public void isManagedProfileWithHandle() { + shadowOf(userManager).addUser(TEST_USER_HANDLE, "secondary user", 0); + shadowOf(userManager).addProfile( + TEST_USER_HANDLE, + PROFILE_USER_HANDLE, + "another managed profile", + ShadowUserManager.FLAG_MANAGED_PROFILE); + assertThat(userManager.isManagedProfile(PROFILE_USER_HANDLE)).isTrue(); + } + + @Test @Config(minSdk = LOLLIPOP) public void enforcePermissionChecks() throws Exception { shadowOf(userManager).enforcePermissionChecks(true); diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCrossProfileApps.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCrossProfileApps.java index 7eb738839..66ebe84eb 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCrossProfileApps.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCrossProfileApps.java @@ -21,6 +21,7 @@ import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.os.Build.VERSION_CODES.P; import static android.os.Build.VERSION_CODES.Q; import static android.os.Build.VERSION_CODES.R; + import static com.google.common.base.Preconditions.checkNotNull; import android.Manifest; @@ -36,15 +37,23 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.CrossProfileApps; import android.content.pm.ICrossProfileApps; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Process; import android.os.UserHandle; import android.text.TextUtils; + import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.annotation.Resetter; + import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -57,9 +66,6 @@ import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.robolectric.annotation.Implementation; -import org.robolectric.annotation.Implements; -import org.robolectric.annotation.Resetter; /** Robolectric implementation of {@link CrossProfileApps}. */ @Implements(value = CrossProfileApps.class, minSdk = P) @@ -342,6 +348,21 @@ public class ShadowCrossProfileApps { return configurableInteractAcrossProfilePackages.contains(packageName); } + @Implementation + protected boolean canUserAttemptToConfigureInteractAcrossProfiles(@NonNull String packageName) { + PackageInfo packageInfo; + try { + packageInfo = packageManager.getPackageInfo(packageName, /* flags= */ 0); + } catch (PackageManager.NameNotFoundException e) { + return false; + } + if (packageInfo == null || packageInfo.requestedPermissions == null) { + return false; + } + return Arrays.asList(packageInfo.requestedPermissions).contains( + Manifest.permission.INTERACT_ACROSS_PROFILES); + } + @Resetter public static void reset() { configurableInteractAcrossProfilePackages.clear(); diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java index 2d8bfeedd..3223c3ca2 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java @@ -7,6 +7,7 @@ import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.N; import static android.os.Build.VERSION_CODES.N_MR1; import static android.os.Build.VERSION_CODES.R; + import static org.robolectric.shadow.api.Shadow.directlyOn; import android.Manifest.permission; @@ -20,15 +21,10 @@ import android.os.IUserManager; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; + import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.ImmutableList; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; @@ -36,6 +32,13 @@ import org.robolectric.annotation.RealObject; import org.robolectric.annotation.Resetter; import org.robolectric.util.ReflectionHelpers.ClassParameter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * Robolectric implementation of {@link android.os.UserManager}. */ @@ -51,6 +54,7 @@ public class ShadowUserManager { public static final int FLAG_ADMIN = UserInfo.FLAG_ADMIN; public static final int FLAG_GUEST = UserInfo.FLAG_GUEST; public static final int FLAG_RESTRICTED = UserInfo.FLAG_RESTRICTED; + public static final int FLAG_MANAGED_PROFILE = UserInfo.FLAG_MANAGED_PROFILE; private static Map<Integer, Integer> userPidMap = new HashMap<>(); @@ -138,8 +142,10 @@ public class ShadowUserManager { /** Add a profile to be returned by {@link #getProfiles(int)}.**/ public void addProfile( int userHandle, int profileUserHandle, String profileName, int profileFlags) { + UserInfo userInfo = new UserInfo(profileUserHandle, profileName, profileFlags); profiles.putIfAbsent(userHandle, new ArrayList<>()); - profiles.get(userHandle).add(new UserInfo(profileUserHandle, profileName, profileFlags)); + profiles.get(userHandle).add(userInfo); + userInfoMap.put(profileUserHandle, userInfo); profileToParent.put(profileUserHandle, userHandle); } @@ -185,6 +191,27 @@ public class ShadowUserManager { return managedProfile; } + /** + * If permissions are enforced (see {@link #enforcePermissionChecks(boolean)}) and the application + * doesn't have the {@link android.Manifest.permission#MANAGE_USERS} permission, throws a {@link + * SecurityManager} exception. + * + * @return true if the profile added has FLAG_MANAGED_PROFILE + * @see #enforcePermissionChecks(boolean) + * @see #addProfile(int, int, String, int) + * @see #addUser(int, String, int) + */ + @Implementation(minSdk = N) + protected boolean isManagedProfile(int userHandle) { + if (enforcePermissions && !hasManageUsersPermission()) { + throw new SecurityException( + "You need MANAGE_USERS permission to: check if specified user a " + + "managed profile outside your profile group"); + } + UserInfo info = getUserInfo(userHandle); + return info != null && ((info.flags & FLAG_MANAGED_PROFILE) == FLAG_MANAGED_PROFILE); + } + // BEGIN-INTERNAL @Implementation(minSdk = R) protected boolean isProfile() { |