package com.android.settings;
import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.UserHandle;
import android.os.UserManager;
import android.test.AndroidTestCase;
import com.android.internal.widget.LockPatternUtils;
import org.mockito.ArgumentCaptor;
import java.util.List;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class ChooseLockSettingsHelperTest extends AndroidTestCase {
private static final String SYSTEM_PROPERTY_DEXMAKER_DEXCACHE = "dexmaker.dexcache";
@Override
protected void setUp() throws Exception {
super.setUp();
System.setProperty(SYSTEM_PROPERTY_DEXMAKER_DEXCACHE, getContext().getCacheDir().getPath());
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
System.clearProperty(SYSTEM_PROPERTY_DEXMAKER_DEXCACHE);
}
public void testlaunchConfirmationActivityWithExternalAndChallenge() {
final int userId = UserHandle.myUserId();
final int request = 100;
final long challenge = 10000L;
{
// Test external == true
final boolean external = true;
final Activity mockActivity = getMockActivity();
ChooseLockSettingsHelper helper = getChooseLockSettingsHelper(mockActivity);
helper.launchConfirmationActivityWithExternalAndChallenge(
request, // request
"title",
"header",
"description",
external,
challenge,
userId
);
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mockActivity, times(1)).startActivity(intentCaptor.capture());
Intent capturedIntent = getResultIntent(intentCaptor);
assertEquals(new ComponentName("com.android.settings",
ConfirmLockPattern.InternalActivity.class.getName()),
capturedIntent.getComponent());
assertFalse(capturedIntent.getBooleanExtra(
ChooseLockSettingsHelper.EXTRA_KEY_RETURN_CREDENTIALS, false));
assertTrue(capturedIntent.getBooleanExtra(
ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false));
assertEquals(challenge, capturedIntent.getLongExtra(
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0L));
assertEquals(external,
(capturedIntent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0);
assertEquals(external, capturedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, false));
assertEquals(external, capturedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.DARK_THEME, false));
assertEquals(external, capturedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, false));
assertEquals(external, capturedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, false));
}
{
// Test external == false
final boolean external = false;
final Activity mockActivity = getMockActivity();
ChooseLockSettingsHelper helper = getChooseLockSettingsHelper(mockActivity);
helper.launchConfirmationActivityWithExternalAndChallenge(
request, // request
"title",
"header",
"description",
external,
challenge,
userId
);
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mockActivity, times(1)).startActivityForResult(intentCaptor.capture(),
eq(request));
Intent capturedIntent = getResultIntent(intentCaptor);
assertEquals(new ComponentName("com.android.settings",
ConfirmLockPattern.InternalActivity.class.getName()),
capturedIntent.getComponent());
assertFalse(capturedIntent.getBooleanExtra(
ChooseLockSettingsHelper.EXTRA_KEY_RETURN_CREDENTIALS, false));
assertTrue(capturedIntent.getBooleanExtra(
ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false));
assertEquals(challenge, capturedIntent.getLongExtra(
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0L));
assertEquals(external,
(capturedIntent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0);
assertEquals(external, capturedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, false));
assertEquals(external, capturedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.DARK_THEME, false));
assertEquals(external, capturedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, false));
assertEquals(external, capturedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, false));
}
}
private ChooseLockSettingsHelper getChooseLockSettingsHelper(Activity mockActivity) {
LockPatternUtils mockLockPatternUtils = mock(LockPatternUtils.class);
when(mockLockPatternUtils.getKeyguardStoredPasswordQuality(anyInt()))
.thenReturn(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(mockActivity);
helper.mLockPatternUtils = mockLockPatternUtils;
return helper;
}
private Activity getMockActivity() {
Activity mockActivity = mock(Activity.class);
when(mockActivity.getSystemService(Context.USER_SERVICE))
.thenReturn(getContext().getSystemService(UserManager.class));
when(mockActivity.getContentResolver()).thenReturn(getContext().getContentResolver());
when(mockActivity.getIntent()).thenReturn(new Intent());
return mockActivity;
}
private static Intent getResultIntent(ArgumentCaptor<Intent> intentCaptor) {
List<Intent> capturedIntents = intentCaptor.getAllValues();
assertEquals(1, capturedIntents.size());
return capturedIntents.get(0);
}
}