Only allow primary users to block numbers

+ By design, only the primary user has the capability to block
numbers.
+ This CL ensures that secondary users don't see the option to block
numbers in the call log or call details.

Change-Id: I576925510cfbef417c16910218014d9f7b7dd2a0
Fixes: 27366206
diff --git a/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java b/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
index 6c16253..a608207 100644
--- a/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
+++ b/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
@@ -16,7 +16,9 @@
 
 package com.android.dialer.compat;
 
+import android.content.Context;
 import android.net.Uri;
+import android.provider.BlockedNumberContract;
 import android.provider.BlockedNumberContract.BlockedNumbers;
 
 public class BlockedNumbersSdkCompat {
@@ -29,4 +31,7 @@
 
     public static final String E164_NUMBER = BlockedNumbers.COLUMN_E164_NUMBER;
 
+    public static boolean canCurrentUserBlockNumbers(Context context) {
+        return BlockedNumberContract.canCurrentUserBlockNumbers(context);
+    }
 }
diff --git a/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java b/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
index cbdc595..559d718 100644
--- a/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
+++ b/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.compat;
 
+import android.content.Context;
 import android.net.Uri;
 
 public class BlockedNumbersSdkCompat {
@@ -27,4 +28,8 @@
     public static final String COLUMN_ORIGINAL_NUMBER = null;
 
     public static final String E164_NUMBER = null;
+
+    public static boolean canCurrentUserBlockNumbers(Context context) {
+        return false;
+    }
 }
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 6c8d770..42bee1e 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -59,7 +59,6 @@
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
 import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
-import com.android.dialer.filterednumber.MigrateBlockedNumbersDialogFragment;
 import com.android.dialer.logging.InteractionEvent;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.util.DialerUtils;
@@ -156,7 +155,8 @@
                     PhoneNumberUtil.canPlaceCallsTo(mNumber, mDetails.numberPresentation);
             mCallButton.setVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
             mCopyNumberActionItem.setVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
-            mBlockNumberActionItem.setVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
+
+            updateBlockActionItemVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
 
             final boolean isSipNumber = PhoneNumberUtil.isSipNumber(mNumber);
             final boolean isVoicemailNumber =
@@ -277,7 +277,9 @@
             }
         });
 
+
         mBlockNumberActionItem = (TextView) findViewById(R.id.call_detail_action_block);
+        updateBlockActionItemVisibility(View.VISIBLE);
         mBlockNumberActionItem.setOnClickListener(this);
         mEditBeforeCallActionItem = findViewById(R.id.call_detail_action_edit_before_call);
         mEditBeforeCallActionItem.setOnClickListener(this);
@@ -292,6 +294,13 @@
         }
     }
 
+    private void updateBlockActionItemVisibility(int visibility) {
+        if (!FilteredNumberCompat.canAttemptBlockOperations(mContext)) {
+            visibility = View.GONE;
+        }
+        mBlockNumberActionItem.setVisibility(visibility);
+    }
+
     @Override
     public void onResume() {
         super.onResume();
@@ -468,8 +477,6 @@
             mBlockNumberActionItem.setCompoundDrawablesRelativeWithIntrinsicBounds(
                     R.drawable.ic_call_detail_unblock, 0, 0, 0);
         }
-
-        mBlockNumberActionItem.setVisibility(View.VISIBLE);
     }
 
     private void closeSystemDialogs() {
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 750914b..baf2e1a 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -55,7 +55,6 @@
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
-import com.android.dialer.filterednumber.MigrateBlockedNumbersDialogFragment;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.ScreenEvent;
 import com.android.dialer.service.ExtendedBlockingButtonRenderer;
@@ -346,7 +345,8 @@
                     .setOnMenuItemClickListener(this);
         }
 
-        if (FilteredNumbersUtil.canBlockNumber(mContext, number, countryIso)) {
+        if (FilteredNumberCompat.canAttemptBlockOperations(mContext)
+                && FilteredNumbersUtil.canBlockNumber(mContext, number, countryIso)) {
             mFilteredNumberAsyncQueryHandler.isBlockedNumber(
                     new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
                         @Override
diff --git a/src/com/android/dialer/compat/FilteredNumberCompat.java b/src/com/android/dialer/compat/FilteredNumberCompat.java
index c6c714b..532cec5 100644
--- a/src/com/android/dialer/compat/FilteredNumberCompat.java
+++ b/src/com/android/dialer/compat/FilteredNumberCompat.java
@@ -25,6 +25,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
+import android.os.UserManager;
 import android.preference.PreferenceManager;
 import android.support.annotation.Nullable;
 import android.telecom.TelecomManager;
@@ -293,4 +294,39 @@
         }
         return new Intent(context, BlockedNumbersSettingsActivity.class);
     }
+
+    /**
+     * Method used to determine if block operations are possible.
+     *
+     * @param context The {@link Context}.
+     * @return {@code true} if the app and user can block numbers, {@code false} otherwise.
+     */
+    public static boolean canAttemptBlockOperations(Context context) {
+        if (!CompatUtils.isNCompatible()) {
+            // Dialer blocking, must be primary user
+            return UserManagerCompat.isSystemUser(
+                    (UserManager) context.getSystemService(Context.USER_SERVICE));
+        }
+
+        // Great Wall blocking, must be primary user and the default or system dialer
+        // TODO(maxwelb): check that we're the default or system Dialer
+        return BlockedNumbersSdkCompat.canCurrentUserBlockNumbers(context);
+    }
+
+    /**
+     * Used to determine if the call blocking settings can be opened.
+     *
+     * @param context The {@link Context}.
+     * @return {@code true} if the current user can open the call blocking settings, {@code false}
+     * otherwise.
+     */
+    public static boolean canCurrentUserOpenBlockSettings(Context context) {
+        if (!CompatUtils.isNCompatible()) {
+            // Dialer blocking, must be primary user
+            return UserManagerCompat.isSystemUser(
+                    (UserManager) context.getSystemService(Context.USER_SERVICE));
+        }
+        // BlockedNumberContract blocking, verify through Contract API
+        return BlockedNumbersSdkCompat.canCurrentUserBlockNumbers(context);
+    }
 }
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index bbcbd49..fc689d0 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -94,22 +94,21 @@
             phoneAccountSettingsHeader.intent = phoneAccountSettingsIntent;
             target.add(phoneAccountSettingsHeader);
         }
-        if (isPrimaryUser) {
+        if (FilteredNumberCompat.canCurrentUserOpenBlockSettings(this)) {
             Header blockedCallsHeader = new Header();
             blockedCallsHeader.titleRes = R.string.manage_blocked_numbers_label;
             blockedCallsHeader.intent = FilteredNumberCompat.createManageBlockedNumbersIntent(this);
             target.add(blockedCallsHeader);
-
-            if (TelephonyManagerCompat.isTtyModeSupported(telephonyManager)
-                    || TelephonyManagerCompat
-                    .isHearingAidCompatibilitySupported(telephonyManager)) {
-                Header accessibilitySettingsHeader = new Header();
-                Intent accessibilitySettingsIntent =
-                        new Intent(TelecomManager.ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS);
-                accessibilitySettingsHeader.titleRes = R.string.accessibility_settings_title;
-                accessibilitySettingsHeader.intent = accessibilitySettingsIntent;
-                target.add(accessibilitySettingsHeader);
-            }
+        }
+        if (isPrimaryUser
+                && (TelephonyManagerCompat.isTtyModeSupported(telephonyManager)
+                || TelephonyManagerCompat.isHearingAidCompatibilitySupported(telephonyManager))) {
+            Header accessibilitySettingsHeader = new Header();
+            Intent accessibilitySettingsIntent =
+                    new Intent(TelecomManager.ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS);
+            accessibilitySettingsHeader.titleRes = R.string.accessibility_settings_title;
+            accessibilitySettingsHeader.intent = accessibilitySettingsIntent;
+            target.add(accessibilitySettingsHeader);
         }
     }
 
diff --git a/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java b/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
index 5ee2f28..3572316 100644
--- a/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
+++ b/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
@@ -18,19 +18,20 @@
 
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.ComponentName;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.Intent;
 import android.content.SharedPreferences;
 import android.net.Uri;
+import android.os.UserManager;
 import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
 
 import com.android.contacts.common.compat.CompatUtils;
 import com.android.dialer.DialerApplication;
@@ -41,7 +42,6 @@
 import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
 
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
 import java.util.Arrays;
@@ -227,6 +227,54 @@
                         .getComponent()));
     }
 
+    public void testCanCurrentUserOpenBlockSettings_M_SecondaryUser() {
+        if (CompatUtils.isNCompatible()) {
+            return;
+        }
+        UserManager userManager = mock(UserManager.class);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+        when(userManager.isSystemUser()).thenReturn(false);
+        assertFalse(FilteredNumberCompat.canCurrentUserOpenBlockSettings(mContext));
+        verify(mContext).getSystemService(Context.USER_SERVICE);
+        verify(userManager).isSystemUser();
+    }
+
+    public void testCanCurrentUserOpenBlockSettings_M_PrimaryUser() {
+        if (CompatUtils.isNCompatible()) {
+            return;
+        }
+        UserManager userManager = mock(UserManager.class);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+        when(userManager.isSystemUser()).thenReturn(true);
+        assertTrue(FilteredNumberCompat.canCurrentUserOpenBlockSettings(mContext));
+        verify(mContext).getSystemService(Context.USER_SERVICE);
+        verify(userManager).isSystemUser();
+    }
+
+    public void testCanAttemptBlockOperations_M_SecondaryUser() {
+        if (CompatUtils.isNCompatible()) {
+            return;
+        }
+        UserManager userManager = mock(UserManager.class);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+        when(userManager.isSystemUser()).thenReturn(false);
+        assertFalse(FilteredNumberCompat.canAttemptBlockOperations(mContext));
+        verify(mContext).getSystemService(Context.USER_SERVICE);
+        verify(userManager).isSystemUser();
+    }
+
+    public void testCanAttemptBlockOperations_M_PrimaryUser() {
+        if (CompatUtils.isNCompatible()) {
+            return;
+        }
+        UserManager userManager = mock(UserManager.class);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+        when(userManager.isSystemUser()).thenReturn(true);
+        assertTrue(FilteredNumberCompat.canAttemptBlockOperations(mContext));
+        verify(mContext).getSystemService(Context.USER_SERVICE);
+        verify(userManager).isSystemUser();
+    }
+
     private ContentValues newExpectedContentValuesM(String number, String e164Number,
             String countryIso) {
         ContentValues contentValues = new ContentValues();