Loading res/layout/choose_lock_generic_fingerprint_header.xml +3 −3 Original line number Diff line number Diff line Loading @@ -18,9 +18,9 @@ android:id="@+id/fingerprint_header_description" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:minHeight="56dp" android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingTop="@dimen/suw_description_glif_margin_top" android:paddingBottom="@dimen/suw_description_glif_margin_bottom_lists" android:text="@string/lock_settings_picker_fingerprint_message" style="@style/SuwDescription.Glif" /> style="@style/FingerprintHeaderStyle" /> tests/app/src/com/android/settings/ChooseLockGenericTest.java +85 −100 Original line number Diff line number Diff line Loading @@ -16,11 +16,20 @@ package com.android.settings; import static android.support.test.InstrumentationRegistry.getInstrumentation; import static android.support.test.InstrumentationRegistry.getTargetContext; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertTrue; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.AppTask; import android.app.KeyguardManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.support.test.filters.MediumTest; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; Loading @@ -29,24 +38,17 @@ import android.support.test.runner.lifecycle.Stage; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiSelector; import android.text.format.DateUtils; import android.view.KeyEvent; import com.android.settings.R; import java.util.Collection; import com.android.internal.widget.LockPatternUtils; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import static android.support.test.InstrumentationRegistry.getInstrumentation; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertTrue; import java.util.Collection; import java.util.List; /** * Tests for {@link ChooseLockGenericTest} Loading @@ -68,7 +70,7 @@ public class ChooseLockGenericTest { private UiDevice mDevice; private Context mTargetContext; private String mSettingPackage; private PackageManager mPackageManager; @Rule public ActivityTestRule<ChooseLockGeneric> mChooseLockGenericActivityRule = new ActivityTestRule<>( Loading @@ -81,108 +83,105 @@ public class ChooseLockGenericTest { mDevice = UiDevice.getInstance(getInstrumentation()); mTargetContext = getInstrumentation().getTargetContext(); mSettingPackage = mTargetContext.getPackageName(); mPackageManager = mTargetContext.getPackageManager(); setPassword(); } @After public void tearDown() throws Exception { clearPassword(); } @Test public void testConfirmLockPasswordShown_deviceWithPassword() throws Exception, Throwable { public void testConfirmLockPasswordShown_deviceWithPassword() throws Throwable { setPassword(); try { // GIVEN a PIN password is set on this device at set up. // WHEN ChooseLockGeneric is launched with no extras. mChooseLockGenericActivityRule.launchActivity(null /* No extras */); // THEN ConfirmLockPassword.InternalActivity is shown. assertThat(getCurrentActivity()).isInstanceOf(ConfirmLockPassword.InternalActivity.class); assertThat(getCurrentActivity()) .isInstanceOf(ConfirmLockPassword.InternalActivity.class); } finally { finishAllAppTasks(); mDevice.waitForIdle(); clearPassword(); } } @Test public void testConfirmLockPasswordShown_deviceWithPassword_phishingAttack() throws Exception, Throwable { public void testConfirmLockPasswordShown_deviceWithPassword_phishingAttack() throws Throwable { setPassword(); try { // GIVEN a PIN password is set on this device at set up. // WHEN ChooseLockGeneric is launched with extras to by-pass lock password confirmation. mChooseLockGenericActivityRule.launchActivity(PHISHING_ATTACK_INTENT); // THEN ConfirmLockPassword.InternalActivity is still shown. assertThat(getCurrentActivity()).isInstanceOf(ConfirmLockPassword.InternalActivity.class); assertThat(getCurrentActivity()) .isInstanceOf(ConfirmLockPassword.InternalActivity.class); } finally { finishAllAppTasks(); mDevice.waitForIdle(); clearPassword(); } } @Test public void testForFingerprint_inflateLayout() { mChooseLockGenericActivityRule.launchActivity(new Intent() .putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true)); assertThat(mChooseLockGenericActivityRule.getActivity().isResumed()).isTrue(); } private Activity getCurrentActivity() throws Throwable { getInstrumentation().waitForIdleSync(); final Activity[] activity = new Activity[1]; getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { getInstrumentation().runOnMainSync(() -> { Collection<Activity> activities = ActivityLifecycleMonitorRegistry.getInstance() .getActivitiesInStage(Stage.RESUMED); activity[0] = activities.iterator().next(); } }); return activity[0]; } private void launchNewPassword() throws Exception { Intent newPasswordIntent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD) .setPackage(mSettingPackage) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getInstrumentation().getContext().startActivity(newPasswordIntent); mDevice.waitForIdle(); } /** Sets a PIN password, 12345, for testing. */ private void setPassword() throws Exception { launchNewPassword(); if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { // Set "lock_none", but it actually means we don't want to enroll a fingerprint. UiObject view = new UiObject( new UiSelector().resourceId(mSettingPackage + ":id/lock_none")); assertTrue("lock_none", view.waitForExists(TIMEOUT)); view.click(); Intent newPasswordIntent = new Intent(getTargetContext(), ChooseLockGeneric.class) .putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) .putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, "12345") .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getInstrumentation().getContext().startActivity(newPasswordIntent); mDevice.waitForIdle(); } // Pick PIN from the option list UiObject view = new UiObject(new UiSelector() .resourceId(mSettingPackage + ":id/lock_pin")); assertTrue("lock_pin", view.waitForExists(TIMEOUT)); view.click(); mDevice.waitForIdle(); // Ignore any interstitial options view = new UiObject(new UiSelector() UiObject view = new UiObject(new UiSelector() .resourceId(mSettingPackage + ":id/encrypt_dont_require_password")); if (view.waitForExists(TIMEOUT)) { view.click(); mDevice.waitForIdle(); } // Yes, we really want to view = new UiObject(new UiSelector() .resourceId(mSettingPackage + ":id/next_button")); if (view.waitForExists(TIMEOUT)) { view.click(); mDevice.waitForIdle(); } // Set our PIN view = new UiObject(new UiSelector() .resourceId(mSettingPackage + ":id/password_entry")); assertTrue("password_entry", view.waitForExists(TIMEOUT)); // Enter it twice to confirm enterTestPin(); enterTestPin(); enterTestPin(view); enterTestPin(view); mDevice.pressBack(); assertThat(getTargetContext().getSystemService(KeyguardManager.class).isDeviceSecure()) .isTrue(); } /** Clears the previous set PIN password. */ private void clearPassword() throws Exception { launchNewPassword(); Intent newPasswordIntent = new Intent(getTargetContext(), ChooseLockGeneric.class) .putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); getInstrumentation().getContext().startActivity(newPasswordIntent); mDevice.waitForIdle(); // Enter current PIN UiObject view = new UiObject( Loading @@ -195,40 +194,26 @@ public class ChooseLockGenericTest { assertTrue("password_entry", view.waitForExists(TIMEOUT)); } enterTestPin(); enterTestPin(view); // Set back to "none" view = new UiObject(new UiSelector().resourceId(mSettingPackage + ":id/lock_none")); assertTrue("lock_none", view.waitForExists(TIMEOUT)); view.click(); mDevice.waitForIdle(); mDevice.pressBack(); // Yes, we really want "none" if prompted again view = new UiObject(new UiSelector().resourceId(mSettingPackage + ":id/lock_none")); if (view.waitForExists(TIMEOUT)) { view.click(); mDevice.waitForIdle(); assertThat(getTargetContext().getSystemService(KeyguardManager.class).isDeviceSecure()) .isFalse(); } // Yes, we really want to view = new UiObject(new UiSelector() .resourceId("android:id/button1")); if (view.waitForExists(TIMEOUT)) { view.click(); mDevice.waitForIdle(); private void finishAllAppTasks() { final ActivityManager activityManager = getTargetContext().getSystemService(ActivityManager.class); final List<AppTask> appTasks = activityManager.getAppTasks(); for (ActivityManager.AppTask task : appTasks) { task.finishAndRemoveTask(); } mDevice.pressBack(); } private void enterTestPin() throws Exception { mDevice.waitForIdle(); mDevice.pressKeyCode(KeyEvent.KEYCODE_1); mDevice.pressKeyCode(KeyEvent.KEYCODE_2); mDevice.pressKeyCode(KeyEvent.KEYCODE_3); mDevice.pressKeyCode(KeyEvent.KEYCODE_4); mDevice.pressKeyCode(KeyEvent.KEYCODE_5); private void enterTestPin(UiObject view) throws Exception { mDevice.waitForIdle(); view.setText("12345"); mDevice.pressEnter(); mDevice.waitForIdle(); } Loading Loading
res/layout/choose_lock_generic_fingerprint_header.xml +3 −3 Original line number Diff line number Diff line Loading @@ -18,9 +18,9 @@ android:id="@+id/fingerprint_header_description" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:minHeight="56dp" android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingTop="@dimen/suw_description_glif_margin_top" android:paddingBottom="@dimen/suw_description_glif_margin_bottom_lists" android:text="@string/lock_settings_picker_fingerprint_message" style="@style/SuwDescription.Glif" /> style="@style/FingerprintHeaderStyle" />
tests/app/src/com/android/settings/ChooseLockGenericTest.java +85 −100 Original line number Diff line number Diff line Loading @@ -16,11 +16,20 @@ package com.android.settings; import static android.support.test.InstrumentationRegistry.getInstrumentation; import static android.support.test.InstrumentationRegistry.getTargetContext; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertTrue; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.AppTask; import android.app.KeyguardManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.support.test.filters.MediumTest; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; Loading @@ -29,24 +38,17 @@ import android.support.test.runner.lifecycle.Stage; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiSelector; import android.text.format.DateUtils; import android.view.KeyEvent; import com.android.settings.R; import java.util.Collection; import com.android.internal.widget.LockPatternUtils; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import static android.support.test.InstrumentationRegistry.getInstrumentation; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertTrue; import java.util.Collection; import java.util.List; /** * Tests for {@link ChooseLockGenericTest} Loading @@ -68,7 +70,7 @@ public class ChooseLockGenericTest { private UiDevice mDevice; private Context mTargetContext; private String mSettingPackage; private PackageManager mPackageManager; @Rule public ActivityTestRule<ChooseLockGeneric> mChooseLockGenericActivityRule = new ActivityTestRule<>( Loading @@ -81,108 +83,105 @@ public class ChooseLockGenericTest { mDevice = UiDevice.getInstance(getInstrumentation()); mTargetContext = getInstrumentation().getTargetContext(); mSettingPackage = mTargetContext.getPackageName(); mPackageManager = mTargetContext.getPackageManager(); setPassword(); } @After public void tearDown() throws Exception { clearPassword(); } @Test public void testConfirmLockPasswordShown_deviceWithPassword() throws Exception, Throwable { public void testConfirmLockPasswordShown_deviceWithPassword() throws Throwable { setPassword(); try { // GIVEN a PIN password is set on this device at set up. // WHEN ChooseLockGeneric is launched with no extras. mChooseLockGenericActivityRule.launchActivity(null /* No extras */); // THEN ConfirmLockPassword.InternalActivity is shown. assertThat(getCurrentActivity()).isInstanceOf(ConfirmLockPassword.InternalActivity.class); assertThat(getCurrentActivity()) .isInstanceOf(ConfirmLockPassword.InternalActivity.class); } finally { finishAllAppTasks(); mDevice.waitForIdle(); clearPassword(); } } @Test public void testConfirmLockPasswordShown_deviceWithPassword_phishingAttack() throws Exception, Throwable { public void testConfirmLockPasswordShown_deviceWithPassword_phishingAttack() throws Throwable { setPassword(); try { // GIVEN a PIN password is set on this device at set up. // WHEN ChooseLockGeneric is launched with extras to by-pass lock password confirmation. mChooseLockGenericActivityRule.launchActivity(PHISHING_ATTACK_INTENT); // THEN ConfirmLockPassword.InternalActivity is still shown. assertThat(getCurrentActivity()).isInstanceOf(ConfirmLockPassword.InternalActivity.class); assertThat(getCurrentActivity()) .isInstanceOf(ConfirmLockPassword.InternalActivity.class); } finally { finishAllAppTasks(); mDevice.waitForIdle(); clearPassword(); } } @Test public void testForFingerprint_inflateLayout() { mChooseLockGenericActivityRule.launchActivity(new Intent() .putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true)); assertThat(mChooseLockGenericActivityRule.getActivity().isResumed()).isTrue(); } private Activity getCurrentActivity() throws Throwable { getInstrumentation().waitForIdleSync(); final Activity[] activity = new Activity[1]; getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { getInstrumentation().runOnMainSync(() -> { Collection<Activity> activities = ActivityLifecycleMonitorRegistry.getInstance() .getActivitiesInStage(Stage.RESUMED); activity[0] = activities.iterator().next(); } }); return activity[0]; } private void launchNewPassword() throws Exception { Intent newPasswordIntent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD) .setPackage(mSettingPackage) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getInstrumentation().getContext().startActivity(newPasswordIntent); mDevice.waitForIdle(); } /** Sets a PIN password, 12345, for testing. */ private void setPassword() throws Exception { launchNewPassword(); if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { // Set "lock_none", but it actually means we don't want to enroll a fingerprint. UiObject view = new UiObject( new UiSelector().resourceId(mSettingPackage + ":id/lock_none")); assertTrue("lock_none", view.waitForExists(TIMEOUT)); view.click(); Intent newPasswordIntent = new Intent(getTargetContext(), ChooseLockGeneric.class) .putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) .putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, "12345") .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getInstrumentation().getContext().startActivity(newPasswordIntent); mDevice.waitForIdle(); } // Pick PIN from the option list UiObject view = new UiObject(new UiSelector() .resourceId(mSettingPackage + ":id/lock_pin")); assertTrue("lock_pin", view.waitForExists(TIMEOUT)); view.click(); mDevice.waitForIdle(); // Ignore any interstitial options view = new UiObject(new UiSelector() UiObject view = new UiObject(new UiSelector() .resourceId(mSettingPackage + ":id/encrypt_dont_require_password")); if (view.waitForExists(TIMEOUT)) { view.click(); mDevice.waitForIdle(); } // Yes, we really want to view = new UiObject(new UiSelector() .resourceId(mSettingPackage + ":id/next_button")); if (view.waitForExists(TIMEOUT)) { view.click(); mDevice.waitForIdle(); } // Set our PIN view = new UiObject(new UiSelector() .resourceId(mSettingPackage + ":id/password_entry")); assertTrue("password_entry", view.waitForExists(TIMEOUT)); // Enter it twice to confirm enterTestPin(); enterTestPin(); enterTestPin(view); enterTestPin(view); mDevice.pressBack(); assertThat(getTargetContext().getSystemService(KeyguardManager.class).isDeviceSecure()) .isTrue(); } /** Clears the previous set PIN password. */ private void clearPassword() throws Exception { launchNewPassword(); Intent newPasswordIntent = new Intent(getTargetContext(), ChooseLockGeneric.class) .putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); getInstrumentation().getContext().startActivity(newPasswordIntent); mDevice.waitForIdle(); // Enter current PIN UiObject view = new UiObject( Loading @@ -195,40 +194,26 @@ public class ChooseLockGenericTest { assertTrue("password_entry", view.waitForExists(TIMEOUT)); } enterTestPin(); enterTestPin(view); // Set back to "none" view = new UiObject(new UiSelector().resourceId(mSettingPackage + ":id/lock_none")); assertTrue("lock_none", view.waitForExists(TIMEOUT)); view.click(); mDevice.waitForIdle(); mDevice.pressBack(); // Yes, we really want "none" if prompted again view = new UiObject(new UiSelector().resourceId(mSettingPackage + ":id/lock_none")); if (view.waitForExists(TIMEOUT)) { view.click(); mDevice.waitForIdle(); assertThat(getTargetContext().getSystemService(KeyguardManager.class).isDeviceSecure()) .isFalse(); } // Yes, we really want to view = new UiObject(new UiSelector() .resourceId("android:id/button1")); if (view.waitForExists(TIMEOUT)) { view.click(); mDevice.waitForIdle(); private void finishAllAppTasks() { final ActivityManager activityManager = getTargetContext().getSystemService(ActivityManager.class); final List<AppTask> appTasks = activityManager.getAppTasks(); for (ActivityManager.AppTask task : appTasks) { task.finishAndRemoveTask(); } mDevice.pressBack(); } private void enterTestPin() throws Exception { mDevice.waitForIdle(); mDevice.pressKeyCode(KeyEvent.KEYCODE_1); mDevice.pressKeyCode(KeyEvent.KEYCODE_2); mDevice.pressKeyCode(KeyEvent.KEYCODE_3); mDevice.pressKeyCode(KeyEvent.KEYCODE_4); mDevice.pressKeyCode(KeyEvent.KEYCODE_5); private void enterTestPin(UiObject view) throws Exception { mDevice.waitForIdle(); view.setText("12345"); mDevice.pressEnter(); mDevice.waitForIdle(); } Loading