diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java index 092207bdcf5..d1e113767ff 100644 --- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java +++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java @@ -18,6 +18,7 @@ package com.android.settings.localepicker; import android.app.FragmentTransaction; import android.app.LocaleManager; +import android.app.settings.SettingsEnums; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; @@ -37,15 +38,22 @@ 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 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; private String mPackageName; private LocalePickerWithRegion mLocalePickerWithRegion; private AppLocaleDetails mAppLocaleDetails; private View mAppLocaleDetailContainer; + private MetricsFeatureProvider mMetricsFeatureProvider; @Override public void onCreate(Bundle savedInstanceState) { @@ -71,6 +79,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity setTitle(R.string.app_locale_picker_title); getActionBar().setDisplayHomeAsUpEnabled(true); + mMetricsFeatureProvider = FeatureFactory.getFactory(this).getMetricsFeatureProvider(); mLocalePickerWithRegion = LocalePickerWithRegion.createLanguagePicker( this, @@ -99,6 +108,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity if (localeInfo == null || localeInfo.getLocale() == null || localeInfo.isSystemLocale()) { setAppDefaultLocale(""); } else { + logLocaleSource(localeInfo); setAppDefaultLocale(localeInfo.getLocale().toLanguageTag()); } finish(); @@ -177,4 +187,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 48caecdf6f7..8fb3a5d06ab 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; @@ -45,6 +48,7 @@ import androidx.annotation.ArrayRes; import com.android.internal.app.LocaleStore; import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppLocaleUtil; +import com.android.settings.testutils.FakeFeatureFactory; import org.junit.After; import org.junit.Before; @@ -79,6 +83,7 @@ import java.util.Locale; public class AppLocalePickerActivityTest { private static final String TEST_PACKAGE_NAME = "com.android.settings"; private static final Uri TEST_PACKAGE_URI = Uri.parse("package:" + TEST_PACKAGE_NAME); + private FakeFeatureFactory mFeatureFactory; @Mock LocaleStore.LocaleInfo mLocaleInfo; @@ -99,6 +104,7 @@ public class AppLocalePickerActivityTest { when(mLocaleConfig.getStatus()).thenReturn(LocaleConfig.STATUS_SUCCESS); when(mLocaleConfig.getSupportedLocales()).thenReturn(LocaleList.forLanguageTags("en-US")); ReflectionHelpers.setStaticField(AppLocaleUtil.class, "sLocaleConfig", mLocaleConfig); + mFeatureFactory = FakeFeatureFactory.setupForTest(); } @After @@ -210,6 +216,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)); + } + private ActivityController initActivityController( boolean hasPackageName) { Intent data = new Intent();