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

Commit 22d3b042 authored by Jacky Wang's avatar Jacky Wang
Browse files

[Catalyst] Setup metrics logger for preference ui action

Bug: 389886085
Flag: com.android.settings.flags.catalyst
Test: atest&manual
Change-Id: I8c3ce6cbdeeefe7857132a40ea486d0f56928d7a
parent 4d5fe474
Loading
Loading
Loading
Loading
+54 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings

import android.content.Context
import com.android.settings.overlay.FeatureFactory
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider
import com.android.settingslib.metadata.PreferenceUiActionMetricsLogger
import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.PreferenceScreenMetadata

/** Provides metrics for preference action. */
interface PreferenceActionMetricsProvider {

    /** Metrics action id for the preference. */
    val preferenceActionMetrics: Int
}

/** [PreferenceUiActionMetricsLogger] of Settings app. */
class SettingsMetricsLogger
@JvmOverloads
constructor(
    private val context: Context,
    private val metricsFeatureProvider: MetricsFeatureProvider =
        FeatureFactory.featureFactory.metricsFeatureProvider,
) : PreferenceUiActionMetricsLogger {

    override fun logPreferenceValueChange(
        screen: PreferenceScreenMetadata,
        preference: PreferenceMetadata,
        value: Any?,
    ) {
        if (preference !is PreferenceActionMetricsProvider) return
        when (value) {
            is Boolean ->
                metricsFeatureProvider.action(context, preference.preferenceActionMetrics, value)
            else -> {}
        }
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -77,6 +77,8 @@ public class SettingsApplication extends Application {
        if (Flags.catalyst()) {
            PreferenceScreenRegistry.INSTANCE.setPreferenceScreenMetadataFactories(
                    preferenceScreenFactories());
            PreferenceScreenRegistry.INSTANCE.setPreferenceUiActionMetricsLogger(
                    new SettingsMetricsLogger(this));
            PreferenceBindingFactory.setDefaultFactory(new SettingsPreferenceBindingFactory());
        }

+2 −1
Original line number Diff line number Diff line
@@ -58,7 +58,6 @@ android_robolectric_test {
        "Settings-robo-testutils",
        "Settings-testutils2",
        "SettingsLib-robo-testutils",
        "SettingsLibPreference-testutils",
        "Settings_robolectric_meta_service_file",
        "aconfig_settings_flags_lib",
        "android.webkit.flags-aconfig-java",
@@ -73,6 +72,7 @@ android_robolectric_test {
        "kotlin-test",
        "mockito-robolectric-prebuilt", // mockito deps order matters!
        "mockito-kotlin2",
        "SettingsLibPreference-testutils", // order matters because it depends on mockito-kotlin2
        "notification_flags_lib",
        "platform-test-annotations",
        "testables",
@@ -115,6 +115,7 @@ java_library {
    libs: [
        "Robolectric_all-target",
        "Settings-core",
        "androidx.test.core",
        "mockito-robolectric-prebuilt",
        "truth",
    ],
+41 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.testutils

import android.content.Context
import androidx.test.core.app.ApplicationProvider
import com.android.settings.SettingsMetricsLogger
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider
import com.android.settingslib.metadata.PreferenceScreenRegistry
import org.junit.rules.TestWatcher
import org.junit.runner.Description

/** Test rule for metrics. */
class MetricsRule : TestWatcher() {
    val metricsFeatureProvider: MetricsFeatureProvider =
        FakeFeatureFactory.setupForTest().metricsFeatureProvider

    override fun starting(description: Description) {
        val context: Context = ApplicationProvider.getApplicationContext()
        PreferenceScreenRegistry.preferenceUiActionMetricsLogger =
            SettingsMetricsLogger(context, metricsFeatureProvider)
    }

    override fun finished(description: Description) {
        PreferenceScreenRegistry.preferenceUiActionMetricsLogger = null
    }
}