Add shadows needed for cross profile settings page am: 36213bd738

Change-Id: I45b82ae611fb69c2870988ecbd393f9907520cec
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java
index dd908a6..e05b8f8 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 @@
   }
 
   @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 7eb7388..66ebe84 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.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.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.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 @@
     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 2d8bfee..3223c3c 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.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.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.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 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 @@
   /** 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 @@
     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() {