Loading src/com/android/settings/accounts/RemoveAccountPreferenceController.java +20 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading @@ -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); } Loading src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java +8 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java +22 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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 Loading @@ -116,6 +123,18 @@ public class RemoveAccountPreferenceControllerTest { eq(TAG_REMOVE_ACCOUNT_DIALOG)); } @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() { Loading Loading
src/com/android/settings/accounts/RemoveAccountPreferenceController.java +20 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading @@ -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); } Loading
src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java +8 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); }
src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } }
tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java +22 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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 Loading @@ -116,6 +123,18 @@ public class RemoveAccountPreferenceControllerTest { eq(TAG_REMOVE_ACCOUNT_DIALOG)); } @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() { Loading