Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba60d9d3 authored by Sandy Pan's avatar Sandy Pan
Browse files

Add metric logging to PIN recovery flow.

Including:
   SettingsEnums.ACTION_SUPERVISION_FORGOT_PIN_DURING_PIN_INVOCATION: Logged when the user clicks on "Forgot PIN" button in the PIN invocation.
   SettingsEnums.ACTION_SUPERVISION_PIN_RESET_SUCCEED: Logged after reset PIN activity, to know if the PIN recovery was successful.

Bug: 415118265
Test: SupervisionPinRecoveryActivityTest
Flag: EXEMPT unused code
Change-Id: I2c5a786a241b72a4c62050569a72131f82eaaec7
parent bf323c18
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED
import android.Manifest.permission.USE_BIOMETRIC_INTERNAL
import android.app.ActivityManager
import android.app.role.RoleManager
import android.app.settings.SettingsEnums
import android.app.supervision.SupervisionManager
import android.content.DialogInterface
import android.content.Intent
@@ -40,6 +41,7 @@ import androidx.annotation.VisibleForTesting
import androidx.core.content.ContextCompat
import androidx.fragment.app.FragmentActivity
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory
import com.android.settingslib.supervision.SupervisionLog.TAG

/**
@@ -171,8 +173,13 @@ class ConfirmSupervisionCredentialsActivity : FragmentActivity() {
            Intent(this, SupervisionPinRecoveryActivity::class.java).apply {
                action = SupervisionPinRecoveryActivity.ACTION_RECOVERY
            }
        val metricsFeatureProvider = FeatureFactory.featureFactory.metricsFeatureProvider
        val listener =
            DialogInterface.OnClickListener { _: DialogInterface?, _: Int ->
                metricsFeatureProvider.action(
                    this,
                    SettingsEnums.ACTION_SUPERVISION_FORGOT_PIN_DURING_PIN_INVOCATION,
                )
                getResultLauncher.launch(intent)
            }
        val moreOptionsButtonBuilder =
+20 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.settings.supervision

import android.Manifest
import android.app.settings.SettingsEnums
import android.app.supervision.SupervisionManager
import android.app.supervision.SupervisionRecoveryInfo
import android.app.supervision.SupervisionRecoveryInfo.EXTRA_SUPERVISION_RECOVERY_INFO
@@ -30,6 +31,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresPermission
import androidx.fragment.app.FragmentActivity
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory
import com.android.settingslib.supervision.SupervisionIntentProvider
import com.android.settingslib.supervision.SupervisionLog

@@ -172,7 +174,8 @@ class SupervisionPinRecoveryActivity : FragmentActivity() {
                                SupervisionRecoveryInfo::class.java,
                            )
                        if (recoveryInfo != null) {
                            val supervisionManager = getSystemService(SupervisionManager::class.java)
                            val supervisionManager =
                                getSystemService(SupervisionManager::class.java)
                            supervisionManager?.setSupervisionRecoveryInfo(recoveryInfo)
                            handleSuccess()
                        } else {
@@ -187,6 +190,9 @@ class SupervisionPinRecoveryActivity : FragmentActivity() {
                else -> handleError("Unknown action after verification: $action")
            }
        } else {
            if (intent.action == ACTION_RECOVERY) {
                logRecoveryResult(false)
            }
            handleError(
                "Verification process failed with result: $resultCode, action: ${intent.action}"
            )
@@ -202,8 +208,10 @@ class SupervisionPinRecoveryActivity : FragmentActivity() {
                    Toast.LENGTH_SHORT,
                )
                .show()
            logRecoveryResult(true)
            handleSuccess()
        } else {
            logRecoveryResult(false)
            handleError("Setting new PIN failed with result: $resultCode")
        }
    }
@@ -215,6 +223,7 @@ class SupervisionPinRecoveryActivity : FragmentActivity() {
    private fun startResetPinActivity() {
        if (!resetSupervisionUser()) {
            handleError("Failed to reset supervision user.")
            logRecoveryResult(false)
            return
        }
        val intent = Intent(this, SupervisionCredentialProxyActivity::class.java)
@@ -234,6 +243,16 @@ class SupervisionPinRecoveryActivity : FragmentActivity() {
        finish()
    }

    /** Logs the result of the PIN recovery process. */
    private fun logRecoveryResult(success: Boolean) {
        val metricsFeatureProvider = FeatureFactory.featureFactory.metricsFeatureProvider
        metricsFeatureProvider.action(
            this,
            SettingsEnums.ACTION_SUPERVISION_PIN_RESET_SUCCEED,
            success,
        )
    }

    /**
     * Resets the supervision user by removing the existing one and creating a new one.
     *
+9 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import android.app.Activity
import android.app.ActivityManager
import android.app.KeyguardManager
import android.app.role.RoleManager.ROLE_SYSTEM_SUPERVISION
import android.app.settings.SettingsEnums
import android.app.supervision.SupervisionManager
import android.app.supervision.SupervisionRecoveryInfo
import android.app.supervision.SupervisionRecoveryInfo.STATE_PENDING
@@ -36,8 +37,10 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R
import com.android.settings.supervision.ConfirmSupervisionCredentialsActivity.Companion.EXTRA_FORCE_CONFIRMATION
import com.android.settings.testutils.MetricsRule
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
@@ -60,6 +63,7 @@ import org.robolectric.shadows.ShadowRoleManager

@RunWith(AndroidJUnit4::class)
class ConfirmSupervisionCredentialsActivityTest {
    @get:Rule val metricsRule = MetricsRule()
    private val mockUserManager = mock<UserManager>()
    private val mockActivityManager = mock<ActivityManager>()
    private val mockSupervisionManager = mock<SupervisionManager>()
@@ -216,6 +220,11 @@ class ConfirmSupervisionCredentialsActivityTest {
            .isEqualTo(BiometricManager.Authenticators.DEVICE_CREDENTIAL)
        assertThat(biometricPrompt.contentView)
            .isInstanceOf(PromptContentViewWithMoreOptionsButton::class.java)

        val contentView = biometricPrompt.contentView as PromptContentViewWithMoreOptionsButton
        contentView.moreOptionsButtonListener.onClick(null, 0)
        verify(metricsRule.metricsFeatureProvider)
            .action(mActivity, SettingsEnums.ACTION_SUPERVISION_FORGOT_PIN_DURING_PIN_INVOCATION)
    }

    @Test
+10 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings.supervision
import android.app.Activity
import android.app.Application
import android.app.role.RoleManager.ROLE_SYSTEM_SUPERVISION
import android.app.settings.SettingsEnums
import android.app.supervision.SupervisionManager
import android.app.supervision.SupervisionRecoveryInfo
import android.app.supervision.SupervisionRecoveryInfo.EXTRA_SUPERVISION_RECOVERY_INFO
@@ -36,9 +37,11 @@ import android.os.UserManager.USER_TYPE_PROFILE_SUPERVISING
import androidx.lifecycle.Lifecycle
import androidx.test.core.app.ActivityScenario
import androidx.test.core.app.ApplicationProvider
import com.android.settings.testutils.MetricsRule
import com.google.common.truth.Truth.assertThat
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
@@ -64,6 +67,7 @@ class SupervisionPinRecoveryActivityTest {
    private lateinit var shadowPackageManager: ShadowPackageManager
    private val mockSupervisionManager = mock<SupervisionManager>()
    private val mockUserManager = mock<UserManager>()
    @get:Rule val metricsRule = MetricsRule()

    @Before
    fun setUp() {
@@ -550,6 +554,8 @@ class SupervisionPinRecoveryActivityTest {
                val verifyPinIntent = shadowActivity.nextStartedActivity
                shadowActivity.receiveResult(verifyPinIntent, testActivityResult, null)

                verify(metricsRule.metricsFeatureProvider)
                    .action(activity, SettingsEnums.ACTION_SUPERVISION_PIN_RESET_SUCCEED, false)
                assertEquals(testActivityResult, shadowActivity.resultCode)
                assertThat(activity.isFinishing).isTrue()
            }
@@ -575,6 +581,8 @@ class SupervisionPinRecoveryActivityTest {
                val setPinIntent = shadowActivity.nextStartedActivity
                shadowActivity.receiveResult(setPinIntent, testActivityResult, null)

                verify(metricsRule.metricsFeatureProvider)
                    .action(activity, SettingsEnums.ACTION_SUPERVISION_PIN_RESET_SUCCEED, true)
                assertEquals(testActivityResult, shadowActivity.resultCode)
                assertThat(activity.isFinishing).isTrue()
            }
@@ -600,6 +608,8 @@ class SupervisionPinRecoveryActivityTest {
                val setPinIntent = shadowActivity.nextStartedActivity
                shadowActivity.receiveResult(setPinIntent, testActivityResult, null)

                verify(metricsRule.metricsFeatureProvider)
                    .action(activity, SettingsEnums.ACTION_SUPERVISION_PIN_RESET_SUCCEED, false)
                assertEquals(testActivityResult, shadowActivity.resultCode)
                assertThat(activity.isFinishing).isTrue()
            }