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;
+    }
 }