Loading AndroidManifest.xml +12 −0 Original line number Diff line number Diff line Loading @@ -832,6 +832,18 @@ android:theme="@style/Theme.LocalePickerWithRegionActivity"> </activity> <activity android:name=".applications.appinfo.AppLocalePickerActivity" android:label="@string/app_locale_picker_title" android:exported="true" > <intent-filter> <action android:name="android.settings.APP_LOCALE_SETTINGS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="com.android.settings.FRAGMENT_CLASS" android:value="com.android.settings.applications.appinfo.AppLocaleDetails" /> </activity> <activity android:name=".Settings$LanguageAndInputSettingsActivity" android:label="@string/language_settings" Loading src/com/android/settings/applications/appinfo/AppLocaleDetails.java +8 −3 Original line number Diff line number Diff line Loading @@ -270,9 +270,14 @@ public class AppLocaleDetails extends AppInfoBase implements RadioButtonPreferen /** Gets per app's default locale */ public static Locale getAppDefaultLocale(Context context, String packageName) { LocaleManager localeManager = context.getSystemService(LocaleManager.class); try { LocaleList localeList = (localeManager == null) ? new LocaleList() : localeManager.getApplicationLocales(packageName); return localeList.isEmpty() ? null : localeList.get(0); } catch (IllegalArgumentException e) { Log.w(TAG, "package name : " + packageName + " is not correct. " + e); } return null; } /** Sets per app's default language to system. */ Loading src/com/android/settings/applications/appinfo/AppLocalePickerActivity.java 0 → 100644 +53 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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.applications.appinfo; import android.content.Intent; import android.os.Bundle; import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.settings.SettingsActivity; import com.android.settings.applications.AppInfoBase; /** Activity for the entry of {@link #AppLocaleDetails} from outside Settings app. */ public class AppLocalePickerActivity extends SettingsActivity { private static final String TAG = "AppLocalePickerActivity"; @Override protected void onCreate(Bundle savedState) { Intent intent = getEntryIntent(getIntent()); if (intent == null) { finish(); return; } setIntent(intent); super.onCreate(savedState); } @VisibleForTesting Intent getEntryIntent(Intent intent) { String callingPackage = getCallingPackage(); if (callingPackage == null || callingPackage.isEmpty()) { Log.d(TAG, "No calling package name is found."); return null; } final Bundle fragmentArgs = new Bundle(); fragmentArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, callingPackage); return intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, fragmentArgs); } } src/com/android/settings/core/gateway/SettingsGateway.java +3 −1 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import com.android.settings.applications.ProcessStatsUi; import com.android.settings.applications.UsageAccessDetails; import com.android.settings.applications.appinfo.AlarmsAndRemindersDetails; import com.android.settings.applications.appinfo.AppInfoDashboardFragment; import com.android.settings.applications.appinfo.AppLocaleDetails; import com.android.settings.applications.appinfo.DrawOverlayDetails; import com.android.settings.applications.appinfo.ExternalSourcesDetails; import com.android.settings.applications.appinfo.ManageExternalStorageDetails; Loading Loading @@ -331,7 +332,8 @@ public class SettingsGateway { MediaManagementAppsDetails.class.getName(), AutoBrightnessSettings.class.getName(), OneHandedSettings.class.getName(), MobileNetworkSettings.class.getName() MobileNetworkSettings.class.getName(), AppLocaleDetails.class.getName() }; public static final String[] SETTINGS_FOR_RESTRICTED = { Loading tests/unit/src/com/android/settings/applications/appinfo/AppLocalePickerActivityTest.java 0 → 100644 +87 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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.applications.appinfo; import static com.google.common.truth.Truth.assertThat; import android.content.Intent; import android.os.Bundle; import android.os.Looper; import androidx.test.annotation.UiThreadTest; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.SettingsActivity; import com.android.settings.applications.AppInfoBase; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class AppLocalePickerActivityTest { private TestAppLocalePickerActivity mActivity; @Before @UiThreadTest public void setUp() { if (Looper.myLooper() == null) { Looper.prepare(); } mActivity = new TestAppLocalePickerActivity(); } @After public void cleanUp() { mActivity = null; } @Test public void onCreate_getEntryIntent_returnNull() { TestAppLocalePickerActivity.setCallingPackage(null); Intent intent = new Intent(); assertThat(mActivity.getEntryIntent(intent)).isEqualTo(null); } @Test public void onCreate_getEntryIntent_returnIntentWithPackageName() { String callingPackageName = "com.example.android"; TestAppLocalePickerActivity.setCallingPackage(callingPackageName); Intent intent = new Intent(); Intent entryIntent = mActivity.getEntryIntent(intent); Bundle outputBundle = entryIntent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS); String packageName = outputBundle.getString(AppInfoBase.ARG_PACKAGE_NAME); assertThat(packageName).isEqualTo(callingPackageName); } private static class TestAppLocalePickerActivity extends AppLocalePickerActivity { private static String sCallingPackage; @Override public String getCallingPackage() { return sCallingPackage; } public static void setCallingPackage(String packageName) { sCallingPackage = packageName; } } } Loading
AndroidManifest.xml +12 −0 Original line number Diff line number Diff line Loading @@ -832,6 +832,18 @@ android:theme="@style/Theme.LocalePickerWithRegionActivity"> </activity> <activity android:name=".applications.appinfo.AppLocalePickerActivity" android:label="@string/app_locale_picker_title" android:exported="true" > <intent-filter> <action android:name="android.settings.APP_LOCALE_SETTINGS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="com.android.settings.FRAGMENT_CLASS" android:value="com.android.settings.applications.appinfo.AppLocaleDetails" /> </activity> <activity android:name=".Settings$LanguageAndInputSettingsActivity" android:label="@string/language_settings" Loading
src/com/android/settings/applications/appinfo/AppLocaleDetails.java +8 −3 Original line number Diff line number Diff line Loading @@ -270,9 +270,14 @@ public class AppLocaleDetails extends AppInfoBase implements RadioButtonPreferen /** Gets per app's default locale */ public static Locale getAppDefaultLocale(Context context, String packageName) { LocaleManager localeManager = context.getSystemService(LocaleManager.class); try { LocaleList localeList = (localeManager == null) ? new LocaleList() : localeManager.getApplicationLocales(packageName); return localeList.isEmpty() ? null : localeList.get(0); } catch (IllegalArgumentException e) { Log.w(TAG, "package name : " + packageName + " is not correct. " + e); } return null; } /** Sets per app's default language to system. */ Loading
src/com/android/settings/applications/appinfo/AppLocalePickerActivity.java 0 → 100644 +53 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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.applications.appinfo; import android.content.Intent; import android.os.Bundle; import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.settings.SettingsActivity; import com.android.settings.applications.AppInfoBase; /** Activity for the entry of {@link #AppLocaleDetails} from outside Settings app. */ public class AppLocalePickerActivity extends SettingsActivity { private static final String TAG = "AppLocalePickerActivity"; @Override protected void onCreate(Bundle savedState) { Intent intent = getEntryIntent(getIntent()); if (intent == null) { finish(); return; } setIntent(intent); super.onCreate(savedState); } @VisibleForTesting Intent getEntryIntent(Intent intent) { String callingPackage = getCallingPackage(); if (callingPackage == null || callingPackage.isEmpty()) { Log.d(TAG, "No calling package name is found."); return null; } final Bundle fragmentArgs = new Bundle(); fragmentArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, callingPackage); return intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, fragmentArgs); } }
src/com/android/settings/core/gateway/SettingsGateway.java +3 −1 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import com.android.settings.applications.ProcessStatsUi; import com.android.settings.applications.UsageAccessDetails; import com.android.settings.applications.appinfo.AlarmsAndRemindersDetails; import com.android.settings.applications.appinfo.AppInfoDashboardFragment; import com.android.settings.applications.appinfo.AppLocaleDetails; import com.android.settings.applications.appinfo.DrawOverlayDetails; import com.android.settings.applications.appinfo.ExternalSourcesDetails; import com.android.settings.applications.appinfo.ManageExternalStorageDetails; Loading Loading @@ -331,7 +332,8 @@ public class SettingsGateway { MediaManagementAppsDetails.class.getName(), AutoBrightnessSettings.class.getName(), OneHandedSettings.class.getName(), MobileNetworkSettings.class.getName() MobileNetworkSettings.class.getName(), AppLocaleDetails.class.getName() }; public static final String[] SETTINGS_FOR_RESTRICTED = { Loading
tests/unit/src/com/android/settings/applications/appinfo/AppLocalePickerActivityTest.java 0 → 100644 +87 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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.applications.appinfo; import static com.google.common.truth.Truth.assertThat; import android.content.Intent; import android.os.Bundle; import android.os.Looper; import androidx.test.annotation.UiThreadTest; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.SettingsActivity; import com.android.settings.applications.AppInfoBase; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class AppLocalePickerActivityTest { private TestAppLocalePickerActivity mActivity; @Before @UiThreadTest public void setUp() { if (Looper.myLooper() == null) { Looper.prepare(); } mActivity = new TestAppLocalePickerActivity(); } @After public void cleanUp() { mActivity = null; } @Test public void onCreate_getEntryIntent_returnNull() { TestAppLocalePickerActivity.setCallingPackage(null); Intent intent = new Intent(); assertThat(mActivity.getEntryIntent(intent)).isEqualTo(null); } @Test public void onCreate_getEntryIntent_returnIntentWithPackageName() { String callingPackageName = "com.example.android"; TestAppLocalePickerActivity.setCallingPackage(callingPackageName); Intent intent = new Intent(); Intent entryIntent = mActivity.getEntryIntent(intent); Bundle outputBundle = entryIntent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS); String packageName = outputBundle.getString(AppInfoBase.ARG_PACKAGE_NAME); assertThat(packageName).isEqualTo(callingPackageName); } private static class TestAppLocalePickerActivity extends AppLocalePickerActivity { private static String sCallingPackage; @Override public String getCallingPackage() { return sCallingPackage; } public static void setCallingPackage(String packageName) { sCallingPackage = packageName; } } }