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;
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;
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
@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);
}
import android.annotation.NonNull;
import android.content.ComponentName;
+import android.content.Intent;
import android.os.UserHandle;
import android.support.annotation.Nullable;
* @see android.app.admin.DevicePolicyManager#isUninstallInQueue
*/
boolean isUninstallInQueue(String packageName);
+
+ /**
+ * Calls {@code DevicePolicyManager.createAdminSupportIntent()}.
+ *
+ * @see android.app.admin.DevicePolicyManager#createAdminSupportIntent
+ */
+ Intent createAdminSupportIntent(String restriction);
}
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;
public boolean isUninstallInQueue(String packageName) {
return mDpm.isUninstallInQueue(packageName);
}
+
+ @Override
+ public Intent createAdminSupportIntent(@NonNull String restriction) {
+ return mDpm.createAdminSupportIntent(restriction);
+ }
}
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;
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;
@Mock(answer = RETURNS_DEEP_STUBS)
private AccountManager mAccountManager;
+ @Mock
+ private DevicePolicyManagerWrapper mDevicePolicyManager;
@Mock(answer = RETURNS_DEEP_STUBS)
private PreferenceFragment mFragment;
@Mock
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
}
@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);
verify(mAccountManager).removeAccountAsUser(eq(account), nullable(Activity.class),
nullable(AccountManagerCallback.class), nullable(Handler.class), eq(userHandle));
}
-}
\ No newline at end of file
+}