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

Commit 9370ca54 authored by Sandy Pan's avatar Sandy Pan Committed by Android (Google) Code Review
Browse files

Merge "Add metric logging to PIN recovery flow." into main

parents fc2ad1f7 ba60d9d3
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()
            }