aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-04-01 02:14:17 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-04-01 02:14:17 +0000
commitf096b4fa52965e5c0f30bdd4707c4c5616f18599 (patch)
tree16fab7a2f26742f9f4520bdd8761a0388da24fce
parent715d47e0cbf1821a1a72db589c59805f7ebe73fc (diff)
parent36213bd738a9f63dd79f8ae5f65eef69ccc72b29 (diff)
downloadplatform_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
-rw-r--r--robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java12
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowCrossProfileApps.java27
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java41
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() {