diff --git a/res/layout/choose_lock_generic_fingerprint_header.xml b/res/layout/choose_lock_generic_fingerprint_header.xml index a92b68f46e9..6a107bf06d5 100644 --- a/res/layout/choose_lock_generic_fingerprint_header.xml +++ b/res/layout/choose_lock_generic_fingerprint_header.xml @@ -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" /> diff --git a/tests/app/src/com/android/settings/ChooseLockGenericTest.java b/tests/app/src/com/android/settings/ChooseLockGenericTest.java index dee6697b7f1..924e716e740 100644 --- a/tests/app/src/com/android/settings/ChooseLockGenericTest.java +++ b/tests/app/src/com/android/settings/ChooseLockGenericTest.java @@ -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; @@ -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 com.android.internal.widget.LockPatternUtils; -import java.util.Collection; - -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} @@ -68,7 +70,7 @@ public class ChooseLockGenericTest { private UiDevice mDevice; private Context mTargetContext; private String mSettingPackage; - private PackageManager mPackageManager; + @Rule public ActivityTestRule mChooseLockGenericActivityRule = new ActivityTestRule<>( @@ -81,108 +83,105 @@ public class ChooseLockGenericTest { mDevice = UiDevice.getInstance(getInstrumentation()); mTargetContext = getInstrumentation().getTargetContext(); mSettingPackage = mTargetContext.getPackageName(); - mPackageManager = mTargetContext.getPackageManager(); + } + @Test + public void testConfirmLockPasswordShown_deviceWithPassword() throws Throwable { setPassword(); - } - - @After - public void tearDown() throws Exception { - clearPassword(); + 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); + } finally { + finishAllAppTasks(); + mDevice.waitForIdle(); + clearPassword(); + } } @Test - public void testConfirmLockPasswordShown_deviceWithPassword() throws Exception, Throwable { - // 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); + 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); + } finally { + finishAllAppTasks(); + mDevice.waitForIdle(); + clearPassword(); + } } @Test - public void testConfirmLockPasswordShown_deviceWithPassword_phishingAttack() - throws Exception, Throwable { - // 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); + 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() { - Collection activities = ActivityLifecycleMonitorRegistry.getInstance() - .getActivitiesInStage(Stage.RESUMED); - activity[0] = activities.iterator().next(); - } + getInstrumentation().runOnMainSync(() -> { + Collection 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) + /** Sets a PIN password, 12345, for testing. */ + private void setPassword() throws Exception { + 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(); - } - /** 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(); - 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( @@ -195,40 +194,26 @@ public class ChooseLockGenericTest { assertTrue("password_entry", view.waitForExists(TIMEOUT)); } - enterTestPin(); - - // Set back to "none" - view = new UiObject(new UiSelector().resourceId(mSettingPackage + ":id/lock_none")); - assertTrue("lock_none", view.waitForExists(TIMEOUT)); - view.click(); - mDevice.waitForIdle(); - - // 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(); - } - - // Yes, we really want to - view = new UiObject(new UiSelector() - .resourceId("android:id/button1")); - if (view.waitForExists(TIMEOUT)) { - view.click(); - mDevice.waitForIdle(); - } + enterTestPin(view); mDevice.pressBack(); + + assertThat(getTargetContext().getSystemService(KeyguardManager.class).isDeviceSecure()) + .isFalse(); } - 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 finishAllAppTasks() { + final ActivityManager activityManager = + getTargetContext().getSystemService(ActivityManager.class); + final List appTasks = activityManager.getAppTasks(); + for (ActivityManager.AppTask task : appTasks) { + task.finishAndRemoveTask(); + } + } + + private void enterTestPin(UiObject view) throws Exception { mDevice.waitForIdle(); + view.setText("12345"); mDevice.pressEnter(); mDevice.waitForIdle(); }