Screen lock type metrics are not reported if user goes back
bug: 63116381
Test: Manually tested and verified that metrics are passed back to
setupwizard. Also added robolectric tests
Change-Id: I9d095754addc34121a2a0a12b3e5d1479ff15a78
diff --git a/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
index 8f93bca..59907cf 100644
--- a/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
@@ -16,9 +16,11 @@
package com.android.settings.fingerprint;
+import android.app.Activity;
import android.app.KeyguardManager;
import android.app.admin.DevicePolicyManager;
import android.content.Intent;
+import android.os.Bundle;
import android.os.UserHandle;
import android.widget.Button;
import android.widget.TextView;
@@ -32,6 +34,25 @@
import com.android.settings.password.SetupSkipDialog;
public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntroduction {
+ private static final String KEY_LOCK_SCREEN_PRESENT = "wasLockScreenPresent";
+ private boolean mAlreadyHadLockScreenSetup = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState == null) {
+ mAlreadyHadLockScreenSetup = isKeyguardSecure();
+ } else {
+ mAlreadyHadLockScreenSetup = savedInstanceState.getBoolean(
+ KEY_LOCK_SCREEN_PRESENT, false);
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(KEY_LOCK_SCREEN_PRESENT, mAlreadyHadLockScreenSetup);
+ }
@Override
protected Intent getChooseLockIntent() {
@@ -70,25 +91,32 @@
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == FINGERPRINT_FIND_SENSOR_REQUEST) {
- if (data == null) {
- data = new Intent();
- }
- LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
- data.putExtra(SetupChooseLockGeneric.
- SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY,
- lockPatternUtils.getKeyguardStoredPasswordQuality(UserHandle.myUserId()));
+ // if lock was already present, do not return intent data since it must have been
+ // reported in previous attempts
+ if (requestCode == FINGERPRINT_FIND_SENSOR_REQUEST && isKeyguardSecure()
+ && !mAlreadyHadLockScreenSetup) {
+ data = getMetricIntent(data);
}
super.onActivityResult(requestCode, resultCode, data);
}
+ private Intent getMetricIntent(Intent data) {
+ if (data == null) {
+ data = new Intent();
+ }
+ LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
+ data.putExtra(SetupChooseLockGeneric.
+ SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY,
+ lockPatternUtils.getKeyguardStoredPasswordQuality(UserHandle.myUserId()));
+ return data;
+ }
+
@Override
protected void onCancelButtonClick() {
- KeyguardManager keyguardManager = getSystemService(KeyguardManager.class);
- if (keyguardManager.isKeyguardSecure()) {
+ if (isKeyguardSecure()) {
// If the keyguard is already set up securely (maybe the user added a backup screen
// lock and skipped fingerprint), return RESULT_SKIP directly.
- setResult(RESULT_SKIP);
+ setResult(RESULT_SKIP, mAlreadyHadLockScreenSetup ? null : getMetricIntent(null));
finish();
} else {
setResult(SetupSkipDialog.RESULT_SKIP);
@@ -96,6 +124,22 @@
}
}
+ /**
+ * Propagate lock screen metrics if the user goes back from the fingerprint setup screen
+ * after having added lock screen to his device.
+ */
+ @Override
+ public void onBackPressed() {
+ if (!mAlreadyHadLockScreenSetup && isKeyguardSecure()) {
+ setResult(Activity.RESULT_CANCELED, getMetricIntent(null));
+ }
+ super.onBackPressed();
+ }
+
+ private boolean isKeyguardSecure() {
+ return getSystemService(KeyguardManager.class).isKeyguardSecure();
+ }
+
@Override
public int getMetricsCategory() {
return MetricsEvent.FINGERPRINT_ENROLL_INTRO_SETUP;
diff --git a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
index 9ee53ef..801ee5d 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
@@ -29,6 +29,7 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
+import com.android.settings.password.SetupChooseLockGeneric.SetupChooseLockGenericFragment;
import com.android.settings.password.SetupSkipDialog;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
@@ -105,6 +106,89 @@
.isEqualTo(FingerprintEnrollBase.RESULT_SKIP);
}
+ @Test
+ public void testBackKeyPress_shouldSetIntentDataIfLockScreenAdded() {
+ getShadowKeyguardManager().setIsKeyguardSecure(false);
+
+ mController.create().resume();
+ getShadowKeyguardManager().setIsKeyguardSecure(true);
+ SetupFingerprintEnrollIntroduction activity = mController.get();
+ activity.onBackPressed();
+
+ ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+ assertThat(shadowActivity.getResultIntent()).isNotNull();
+ assertThat(shadowActivity.getResultIntent().hasExtra(
+ SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY)).isTrue();
+ }
+
+ @Test
+ public void testBackKeyPress_shouldNotSetIntentDataIfLockScreenPresentBeforeLaunch() {
+ getShadowKeyguardManager().setIsKeyguardSecure(true);
+
+ mController.create().resume();
+ SetupFingerprintEnrollIntroduction activity = mController.get();
+ activity.onBackPressed();
+
+ ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+ assertThat(shadowActivity.getResultIntent()).isNull();
+ }
+
+ @Test
+ public void testCancelClicked_shouldSetIntentDataIfLockScreenAdded() {
+ getShadowKeyguardManager().setIsKeyguardSecure(false);
+
+ SetupFingerprintEnrollIntroduction activity = mController.create().resume().get();
+ final Button skipButton = activity.findViewById(R.id.fingerprint_cancel_button);
+ getShadowKeyguardManager().setIsKeyguardSecure(true);
+ skipButton.performClick();
+
+ ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+ assertThat(shadowActivity.getResultIntent()).isNotNull();
+ assertThat(shadowActivity.getResultIntent().hasExtra(
+ SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY)).isTrue();
+ }
+
+ @Test
+ public void testCancelClicked_shouldNotSetIntentDataIfLockScreenPresentBeforeLaunch() {
+ getShadowKeyguardManager().setIsKeyguardSecure(true);
+
+ SetupFingerprintEnrollIntroduction activity = mController.create().resume().get();
+ final Button skipButton = activity.findViewById(R.id.fingerprint_cancel_button);
+ skipButton.performClick();
+
+ ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+ assertThat(shadowActivity.getResultIntent()).isNull();
+ }
+
+ @Test
+ public void testOnResultFromFindSensor_shouldNotSetIntentDataIfLockScreenPresentBeforeLaunch() {
+ getShadowKeyguardManager().setIsKeyguardSecure(true);
+ SetupFingerprintEnrollIntroduction activity = mController.create().resume().get();
+ activity.onActivityResult(FingerprintEnrollIntroduction.FINGERPRINT_FIND_SENSOR_REQUEST,
+ FingerprintEnrollBase.RESULT_FINISHED, null);
+ assertThat(Shadows.shadowOf(activity).getResultIntent()).isNull();
+ }
+
+ @Test
+ public void testOnResultFromFindSensor_shouldSetIntentDataIfLockScreenAdded() {
+ getShadowKeyguardManager().setIsKeyguardSecure(false);
+ SetupFingerprintEnrollIntroduction activity = mController.create().resume().get();
+ getShadowKeyguardManager().setIsKeyguardSecure(true);
+ activity.onActivityResult(FingerprintEnrollIntroduction.FINGERPRINT_FIND_SENSOR_REQUEST,
+ FingerprintEnrollBase.RESULT_FINISHED, null);
+ assertThat(Shadows.shadowOf(activity).getResultIntent()).isNotNull();
+ }
+
+ @Test
+ public void testOnResultFromFindSensor_shouldNotSetIntentDataIfLockScreenNotAdded() {
+ getShadowKeyguardManager().setIsKeyguardSecure(false);
+ SetupFingerprintEnrollIntroduction activity = mController.create().resume().get();
+ activity.onActivityResult(FingerprintEnrollIntroduction.FINGERPRINT_FIND_SENSOR_REQUEST,
+ FingerprintEnrollBase.RESULT_FINISHED, null);
+ assertThat(Shadows.shadowOf(activity).getResultIntent()).isNull();
+ }
+
+
private ShadowKeyguardManager getShadowKeyguardManager() {
return Shadows.shadowOf(application.getSystemService(KeyguardManager.class));
}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java
index 7c56dc6..3182a93 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java
@@ -19,12 +19,14 @@
import android.app.admin.DevicePolicyManager;
import com.android.internal.widget.LockPatternUtils;
+
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@Implements(LockPatternUtils.class)
public class ShadowLockPatternUtils {
+ private int mPasswordQuality = 1;
@Implementation
public boolean isSecure(int id) {
return true;
@@ -34,4 +36,19 @@
public int getActivePasswordQuality(int userId) {
return DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
}
+
+ @Implementation
+ public int getKeyguardStoredPasswordQuality(int userHandle) {
+ return mPasswordQuality;
+ }
+
+ // Non-Android accessor.
+ public int getPasswordQuality() {
+ return mPasswordQuality;
+ }
+
+ // Non-Android accessor.
+ public void setPasswordQuality(int passwordQuality) {
+ mPasswordQuality = passwordQuality;
+ }
}