OSDN Git Service

When Remove Account is disallowed, show dialog
authorphweiss <phweiss@google.com>
Fri, 2 Jun 2017 17:38:50 +0000 (19:38 +0200)
committerphweiss <phweiss@google.com>
Wed, 5 Jul 2017 17:32:48 +0000 (19:32 +0200)
When DISALLOW_MODIFY_ACCOUNT is set by a device admin, and
the user wants to remove an account, show the support dialog
instead of showing the confirm dialog.

To use the O-API DPM.createAdminSupportIntent(), a wrapper
needs to be used, because existing Robolectric tests otherwise
don't compile.

Bug: 37413849
Test: make RunSettingsRoboTests -j40 ROBOTEST_FILTER=*RemoveAccountPreferenceControllerTest

Change-Id: If23ea304ab8b9df1748e6acf3032310843b04780

src/com/android/settings/accounts/RemoveAccountPreferenceController.java
src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java
src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java
tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java

index dabb4ed..b5133d3 100644 (file)
@@ -21,6 +21,7 @@ import android.accounts.AccountManagerCallback;
 import android.accounts.AccountManagerFuture;
 import android.accounts.AuthenticatorException;
 import android.accounts.OperationCanceledException;
+import android.app.admin.DevicePolicyManager;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -30,16 +31,20 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.support.v7.preference.PreferenceScreen;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
+import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.io.IOException;
@@ -52,10 +57,19 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl
     private Account mAccount;
     private Fragment mParentFragment;
     private UserHandle mUserHandle;
+    private DevicePolicyManagerWrapper mDpm;
 
     public RemoveAccountPreferenceController(Context context, Fragment parent) {
+        this(context, parent, new DevicePolicyManagerWrapperImpl(
+                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE)));
+    }
+
+    @VisibleForTesting
+    RemoveAccountPreferenceController(Context context, Fragment parent,
+            DevicePolicyManagerWrapper dpm) {
         super(context);
         mParentFragment = parent;
+        mDpm = dpm;
     }
 
     @Override
@@ -79,6 +93,12 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl
 
     @Override
     public void onClick(View v) {
+        final Intent intent = mDpm.createAdminSupportIntent(UserManager.DISALLOW_MODIFY_ACCOUNTS);
+        if (intent != null) {
+            // DISALLOW_MODIFY_ACCOUNTS is active, show admin support dialog
+            mContext.startActivity(intent);
+            return;
+        }
         ConfirmRemoveAccountDialog.show(mParentFragment, mAccount, mUserHandle);
     }
 
index babf90e..1005fdf 100644 (file)
@@ -18,6 +18,7 @@ package com.android.settings.enterprise;
 
 import android.annotation.NonNull;
 import android.content.ComponentName;
+import android.content.Intent;
 import android.os.UserHandle;
 import android.support.annotation.Nullable;
 
@@ -143,4 +144,11 @@ public interface DevicePolicyManagerWrapper {
      * @see android.app.admin.DevicePolicyManager#isUninstallInQueue
      */
     boolean isUninstallInQueue(String packageName);
+
+    /**
+     * Calls {@code DevicePolicyManager.createAdminSupportIntent()}.
+     *
+     * @see android.app.admin.DevicePolicyManager#createAdminSupportIntent
+     */
+    Intent createAdminSupportIntent(String restriction);
 }
index 7906310..965ee24 100644 (file)
@@ -19,6 +19,7 @@ package com.android.settings.enterprise;
 import android.annotation.NonNull;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
+import android.content.Intent;
 import android.os.UserHandle;
 import android.support.annotation.Nullable;
 
@@ -111,4 +112,9 @@ public class DevicePolicyManagerWrapperImpl implements DevicePolicyManagerWrappe
     public boolean isUninstallInQueue(String packageName) {
         return mDpm.isUninstallInQueue(packageName);
     }
+
+    @Override
+    public Intent createAdminSupportIntent(@NonNull String restriction) {
+        return mDpm.createAdminSupportIntent(restriction);
+    }
 }
index 93b5253..a1eb2d8 100644 (file)
@@ -21,6 +21,7 @@ import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -33,17 +34,20 @@ import android.app.Activity;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
 import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.PreferenceScreen;
 import android.widget.Button;
 
 import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.applications.LayoutPreference;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.ShadowAccountManager;
 import com.android.settings.testutils.shadow.ShadowContentResolver;
 
@@ -64,6 +68,8 @@ public class RemoveAccountPreferenceControllerTest {
 
     @Mock(answer = RETURNS_DEEP_STUBS)
     private AccountManager mAccountManager;
+    @Mock
+    private DevicePolicyManagerWrapper mDevicePolicyManager;
     @Mock(answer = RETURNS_DEEP_STUBS)
     private PreferenceFragment mFragment;
     @Mock
@@ -92,7 +98,8 @@ public class RemoveAccountPreferenceControllerTest {
         when(mAccountManager.getAuthenticatorTypesAsUser(anyInt())).thenReturn(
             new AuthenticatorDescription[0]);
         when(mAccountManager.getAccountsAsUser(anyInt())).thenReturn(new Account[0]);
-        mController = new RemoveAccountPreferenceController(mContext, mFragment);
+        mController = new RemoveAccountPreferenceController(mContext, mFragment,
+            mDevicePolicyManager);
     }
 
     @Test
@@ -117,6 +124,18 @@ public class RemoveAccountPreferenceControllerTest {
     }
 
     @Test
+    public void onClick_shouldNotStartConfirmDialogWhenModifyAccountsIsDisallowed() {
+        when(mFragment.isAdded()).thenReturn(true);
+        when(mDevicePolicyManager.createAdminSupportIntent(UserManager.DISALLOW_MODIFY_ACCOUNTS))
+            .thenReturn(new Intent());
+        mController.onClick(null);
+
+        verify(mFragmentTransaction, never()).add(
+            any(RemoveAccountPreferenceController.ConfirmRemoveAccountDialog.class),
+            eq(TAG_REMOVE_ACCOUNT_DIALOG));
+    }
+
+    @Test
     @Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class})
     public void confirmRemove_shouldRemoveAccount() {
         when(mFragment.isAdded()).thenReturn(true);
@@ -134,4 +153,4 @@ public class RemoveAccountPreferenceControllerTest {
         verify(mAccountManager).removeAccountAsUser(eq(account), nullable(Activity.class),
             nullable(AccountManagerCallback.class), nullable(Handler.class), eq(userHandle));
     }
-}
\ No newline at end of file
+}