Merge 10952656

Merged-In: I420776f026f2cb7bb5b1440846c281d9decabb6c
Change-Id: I64279462740e7c0e6e2df99164bbaeb5bae85ea4
diff --git a/src/com/android/providers/blockednumber/BlockedNumberProvider.java b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
index 830847c..2e84d66 100644
--- a/src/com/android/providers/blockednumber/BlockedNumberProvider.java
+++ b/src/com/android/providers/blockednumber/BlockedNumberProvider.java
@@ -40,6 +40,7 @@
 import android.os.PersistableBundle;
 import android.os.Process;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.BlockedNumberContract;
 import android.provider.BlockedNumberContract.SystemContract;
 import android.telecom.TelecomManager;
@@ -453,7 +454,11 @@
     }
 
     private boolean canCurrentUserBlockUsers() {
-        return getContext().getUserId() == UserHandle.USER_SYSTEM;
+        int currentUserId = getContext().getUserId();
+        UserManager userManager = getContext().getSystemService(UserManager.class);
+        // Allow USER_SYSTEM and managed profile to block users
+        return (currentUserId == UserHandle.USER_SYSTEM ||
+                (userManager != null && userManager.isManagedProfile(currentUserId)));
     }
 
     private void notifyEmergencyContact() {
diff --git a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
index 3a88a85..6df43dc 100644
--- a/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
+++ b/tests/src/com/android/providers/blockednumber/BlockedNumberProviderTest.java
@@ -22,6 +22,7 @@
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -41,6 +42,7 @@
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.os.SystemProperties;
+import android.os.UserManager;
 import android.provider.BlockedNumberContract;
 import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.provider.BlockedNumberContract.SystemContract;
@@ -64,6 +66,7 @@
 public class BlockedNumberProviderTest extends AndroidTestCase {
     private MyMockContext mMockContext;
     private ContentResolver mResolver;
+    private UserManager mMockUserManager;
 
     @Override
     protected void setUp() throws Exception {
@@ -73,7 +76,9 @@
         mMockContext = spy(new MyMockContext(getContext()));
         mMockContext.initializeContext();
         mResolver = mMockContext.getContentResolver();
+        mMockUserManager = mock(UserManager.class);
 
+        when(mMockContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
         doReturn(USER_SYSTEM).when(mMockContext).getUserId();
         when(mMockContext.mCountryDetector.detectCountry())
                 .thenReturn(new Country("US", Country.COUNTRY_SOURCE_LOCATION));
@@ -727,6 +732,25 @@
         }
     }
 
+    public void testCanCurrentUserBlockUsers_systemUser() {
+        doReturn(USER_SYSTEM).when(mMockContext).getUserId();
+        assertTrue(BlockedNumberContract.canCurrentUserBlockNumbers(mMockContext));
+    }
+
+    public void testCanCurrentUserBlockUsers_managedProfile() {
+        int managedProfileUserId = 10;
+        doReturn(managedProfileUserId).when(mMockContext).getUserId();
+        doReturn(true).when(mMockUserManager).isManagedProfile(eq(managedProfileUserId));
+        assertTrue(BlockedNumberContract.canCurrentUserBlockNumbers(mMockContext));
+    }
+
+    public void testCanCurrentUserBlockUsers_secondaryUser() {
+        int secondaryUserId = 11;
+        doReturn(secondaryUserId).when(mMockContext).getUserId();
+        doReturn(false).when(mMockUserManager).isManagedProfile(eq(secondaryUserId));
+        assertFalse(BlockedNumberContract.canCurrentUserBlockNumbers(mMockContext));
+    }
+
     private void assertIsBlocked(boolean expected, String phoneNumber) {
         assertEquals(expected, BlockedNumberContract.isBlocked(mMockContext, phoneNumber));
     }