From 5604177818eea93dcd9fcc23d6d4eadd701a9d28 Mon Sep 17 00:00:00 2001 From: Allen Su Date: Wed, 1 Nov 2023 16:24:27 +0000 Subject: [PATCH] Add locale souce metrics Bug: 284094665 Test: atest SettingsRoboTests:com.android.settings.localepicker Change-Id: I174e31fb185e859dd70b6277e23fab759c495e80 --- .../localepicker/AppLocalePickerActivity.java | 38 +++++++++++++++++++ .../AppLocalePickerActivityTest.java | 37 ++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java index 194a08f6973..6706c6d0c10 100644 --- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java +++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java @@ -23,6 +23,7 @@ import android.app.LocaleManager; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; +import android.app.settings.SettingsEnums; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; @@ -45,12 +46,18 @@ import com.android.settings.R; import com.android.settings.applications.AppLocaleUtil; import com.android.settings.applications.appinfo.AppLocaleDetails; import com.android.settings.core.SettingsBaseActivity; +import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class AppLocalePickerActivity extends SettingsBaseActivity implements LocalePickerWithRegion.LocaleSelectedListener, MenuItem.OnActionExpandListener { private static final String TAG = AppLocalePickerActivity.class.getSimpleName(); private static final String CHANNEL_ID_SUGGESTION = "suggestion"; private static final String CHANNEL_ID_SUGGESTION_TO_USER = "Locale suggestion"; + private static final int SIM_LOCALE = 1 << 0; + private static final int SYSTEM_LOCALE = 1 << 1; + private static final int APP_LOCALE = 1 << 2; + private static final int IME_LOCALE = 1 << 3; static final String EXTRA_APP_LOCALE = "app_locale"; static final String EXTRA_NOTIFICATION_ID = "notification_id"; @@ -59,6 +66,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity private AppLocaleDetails mAppLocaleDetails; private View mAppLocaleDetailContainer; private NotificationController mNotificationController; + private MetricsFeatureProvider mMetricsFeatureProvider; @Override public void onCreate(Bundle savedInstanceState) { @@ -84,6 +92,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity setTitle(R.string.app_locale_picker_title); getActionBar().setDisplayHomeAsUpEnabled(true); + mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); mNotificationController = NotificationController.getInstance(this); mLocalePickerWithRegion = LocalePickerWithRegion.createLanguagePicker( @@ -113,6 +122,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity if (localeInfo == null || localeInfo.getLocale() == null || localeInfo.isSystemLocale()) { setAppDefaultLocale(""); } else { + logLocaleSource(localeInfo); setAppDefaultLocale(localeInfo.getLocale().toLanguageTag()); broadcastAppLocaleChange(localeInfo); } @@ -268,4 +278,32 @@ public class AppLocalePickerActivity extends SettingsBaseActivity return false; } + + private void logLocaleSource(LocaleStore.LocaleInfo localeInfo) { + if (!localeInfo.isSuggested() || localeInfo.isAppCurrentLocale()) { + return; + } + int localeSource = 0; + if (hasSuggestionType(localeInfo, + LocaleStore.LocaleInfo.SUGGESTION_TYPE_SYSTEM_AVAILABLE_LANGUAGE)) { + localeSource |= SYSTEM_LOCALE; + } + if (hasSuggestionType(localeInfo, + LocaleStore.LocaleInfo.SUGGESTION_TYPE_OTHER_APP_LANGUAGE)) { + localeSource |= APP_LOCALE; + } + if (hasSuggestionType(localeInfo, LocaleStore.LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE)) { + localeSource |= IME_LOCALE; + } + if (hasSuggestionType(localeInfo, LocaleStore.LocaleInfo.SUGGESTION_TYPE_SIM)) { + localeSource |= SIM_LOCALE; + } + mMetricsFeatureProvider.action(this, + SettingsEnums.ACTION_CHANGE_APP_LANGUAGE_FROM_SUGGESTED, localeSource); + } + + private static boolean hasSuggestionType(LocaleStore.LocaleInfo localeInfo, + int suggestionType) { + return localeInfo.isSuggestionOfType(suggestionType); + } } diff --git a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java index 72b01f83565..817df4c840e 100644 --- a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java +++ b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java @@ -18,6 +18,8 @@ package com.android.settings.localepicker; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; @@ -27,6 +29,7 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.app.ApplicationPackageManager; import android.app.LocaleConfig; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -51,6 +54,7 @@ import com.android.internal.app.LocaleStore; import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppLocaleUtil; import com.android.settings.flags.Flags; +import com.android.settings.testutils.FakeFeatureFactory; import org.junit.After; import org.junit.Before; @@ -91,6 +95,7 @@ public class AppLocalePickerActivityTest { private static final String EN_US = "en-US"; private static int sUid; + private FakeFeatureFactory mFeatureFactory; private LocaleNotificationDataManager mDataManager; private AppLocalePickerActivity mActivity; @@ -117,6 +122,7 @@ public class AppLocalePickerActivityTest { when(mLocaleConfig.getSupportedLocales()).thenReturn(LocaleList.forLanguageTags("en-US")); ReflectionHelpers.setStaticField(AppLocaleUtil.class, "sLocaleConfig", mLocaleConfig); sUid = Process.myUid(); + mFeatureFactory = FakeFeatureFactory.setupForTest(); } @After @@ -228,6 +234,37 @@ public class AppLocalePickerActivityTest { assertThat(controller.get().isFinishing()).isTrue(); } + @Test + public void onLocaleSelected_logLocaleSource() { + ActivityController controller = + initActivityController(true); + LocaleList.setDefault(LocaleList.forLanguageTags("ja-JP,en-CA,en-US")); + Locale locale = new Locale("en", "US"); + when(mLocaleInfo.getLocale()).thenReturn(locale); + when(mLocaleInfo.isSystemLocale()).thenReturn(false); + when(mLocaleInfo.isSuggested()).thenReturn(true); + when(mLocaleInfo.isSuggestionOfType(LocaleStore.LocaleInfo.SUGGESTION_TYPE_SIM)).thenReturn( + true); + when(mLocaleInfo.isSuggestionOfType( + LocaleStore.LocaleInfo.SUGGESTION_TYPE_SYSTEM_AVAILABLE_LANGUAGE)).thenReturn( + true); + when(mLocaleInfo.isSuggestionOfType( + LocaleStore.LocaleInfo.SUGGESTION_TYPE_OTHER_APP_LANGUAGE)).thenReturn( + true); + when(mLocaleInfo.isSuggestionOfType( + LocaleStore.LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE)).thenReturn( + true); + + controller.create(); + AppLocalePickerActivity mActivity = controller.get(); + mActivity.onLocaleSelected(mLocaleInfo); + + int localeSource = 15; // SIM_LOCALE | SYSTEM_LOCALE |IME_LOCALE|APP_LOCALE + verify(mFeatureFactory.metricsFeatureProvider).action( + any(), eq(SettingsEnums.ACTION_CHANGE_APP_LANGUAGE_FROM_SUGGESTED), + eq(localeSource)); + } + @Test @RequiresFlagsEnabled(Flags.FLAG_LOCALE_NOTIFICATION_ENABLED) public void onLocaleSelected_evaluateNotification_simpleLocaleUpdate_localeCreatedWithUid()