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

Commit c871c565 authored by Allen Su's avatar Allen Su
Browse files

[Panlingual]Log metrics for App's locale from the suggested

Bug: 258128535
Test: atest AppLocalePickerActivityTest
Change-Id: I007c0e76d8b88f08518ba2696d42bd1db194f5b7
Merged-In: I007c0e76d8b88f08518ba2696d42bd1db194f5b7
parent 0df79b1c
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -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);
    }
}
+37 −0
Original line number Diff line number Diff line
@@ -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<TestAppLocalePickerActivity> 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<TestAppLocalePickerActivity> initActivityController(
            boolean hasPackageName) {
        Intent data = new Intent();