From e32d422d3d9045fd4e17c7d344ad527929ac8f9a Mon Sep 17 00:00:00 2001 From: Josh Hou Date: Mon, 28 Mar 2022 11:53:19 +0800 Subject: [PATCH] [Panlingual] Fix the app language is shown incorrectly in the work profile The root cause is that the context corresponding to the specified profile Id is not correctly used when using LocaleManager to query the app language. Bug: 222769707 Test: Verify the issue by using the steps provided in the bug Change-Id: Ic1f9e4cc9e90f5aecfa5e1094184aa63f3d94ffb --- .../applications/appinfo/AppLocaleDetails.java | 8 ++++++-- .../appinfo/AppLocalePreferenceController.java | 4 +++- .../manageapplications/ManageApplications.java | 4 ++-- .../localepicker/AppLocalePickerActivity.java | 18 ++++++++++++++++-- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppLocaleDetails.java b/src/com/android/settings/applications/appinfo/AppLocaleDetails.java index 5f75b6b3a6d..acdc32d80a2 100644 --- a/src/com/android/settings/applications/appinfo/AppLocaleDetails.java +++ b/src/com/android/settings/applications/appinfo/AppLocaleDetails.java @@ -26,6 +26,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.LocaleList; +import android.os.UserHandle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -40,6 +41,7 @@ import com.android.settings.Utils; import com.android.settings.applications.AppInfoBase; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.applications.AppUtils; +import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.widget.LayoutPreference; import java.util.Locale; @@ -214,8 +216,10 @@ public class AppLocaleDetails extends SettingsPreferenceFragment { * TODO (b209962418) Do a performance test to low end device. * @return Return the summary to show the current app's language. */ - public static CharSequence getSummary(Context context, String packageName) { - Locale appLocale = getAppDefaultLocale(context, packageName); + public static CharSequence getSummary(Context context, AppEntry entry) { + final UserHandle userHandle = UserHandle.getUserHandleForUid(entry.info.uid); + final Context contextAsUser = context.createContextAsUser(userHandle, 0); + Locale appLocale = getAppDefaultLocale(contextAsUser, entry.info.packageName); if (appLocale == null) { Locale systemLocale = Locale.getDefault(); return context.getString(R.string.preference_of_system_locale_summary, diff --git a/src/com/android/settings/applications/appinfo/AppLocalePreferenceController.java b/src/com/android/settings/applications/appinfo/AppLocalePreferenceController.java index 38e655c7fc6..f406d8763ff 100644 --- a/src/com/android/settings/applications/appinfo/AppLocalePreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppLocalePreferenceController.java @@ -29,6 +29,7 @@ import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppLocaleUtil; import com.android.settings.localepicker.AppLocalePickerActivity; @@ -62,7 +63,7 @@ public class AppLocalePreferenceController extends AppInfoPreferenceControllerBa @Override public CharSequence getSummary() { - return AppLocaleDetails.getSummary(mContext, mParent.getAppEntry().info.packageName); + return AppLocaleDetails.getSummary(mContext, mParent.getAppEntry()); } @Override @@ -74,6 +75,7 @@ public class AppLocalePreferenceController extends AppInfoPreferenceControllerBa if (mParent != null) { Intent intent = new Intent(mContext, AppLocalePickerActivity.class); intent.setData(Uri.parse("package:" + mParent.getAppEntry().info.packageName)); + intent.putExtra(AppInfoBase.ARG_PACKAGE_UID, mParent.getAppEntry().info.uid); mContext.startActivity(intent); return true; } else { diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 22a4ea74606..f11aafd84d8 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -638,6 +638,7 @@ public class ManageApplications extends InstrumentedFragment case LIST_TYPE_APPS_LOCALE: Intent intent = new Intent(getContext(), AppLocalePickerActivity.class); intent.setData(Uri.parse("package:" + mCurrentPkgName)); + intent.putExtra(AppInfoBase.ARG_PACKAGE_UID, mCurrentUid); startActivity(intent); break; // TODO: Figure out if there is a way where we can spin up the profile's settings @@ -1561,8 +1562,7 @@ public class ManageApplications extends InstrumentedFragment holder.setSummary(MediaManagementAppsDetails.getSummary(mContext, entry)); break; case LIST_TYPE_APPS_LOCALE: - holder.setSummary(AppLocaleDetails - .getSummary(mContext, entry.info.packageName)); + holder.setSummary(AppLocaleDetails.getSummary(mContext, entry)); break; default: holder.updateSizeText(entry, mManageApplications.mInvalidSizeStr, mWhichSize); diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java index 34b7472072c..b099866d218 100644 --- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java +++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java @@ -18,9 +18,11 @@ package com.android.settings.localepicker; import android.app.FragmentTransaction; import android.app.LocaleManager; +import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.os.LocaleList; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import android.view.MenuItem; @@ -31,6 +33,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.LocalePickerWithRegion; import com.android.internal.app.LocaleStore; import com.android.settings.R; +import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.appinfo.AppLocaleDetails; import com.android.settings.core.SettingsBaseActivity; @@ -45,6 +48,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity private String mPackageName; private LocalePickerWithRegion mLocalePickerWithRegion; private AppLocaleDetails mAppLocaleDetails; + private Context mContextAsUser; @Override public void onCreate(Bundle savedInstanceState) { @@ -61,11 +65,21 @@ public class AppLocalePickerActivity extends SettingsBaseActivity finish(); return; } + int uid = getIntent().getIntExtra(AppInfoBase.ARG_PACKAGE_UID, -1); + if (uid == -1) { + Log.w(TAG, "Unexpected user id"); + finish(); + } + UserHandle userHandle = UserHandle.getUserHandleForUid(uid); + mContextAsUser = createContextAsUser(userHandle, 0); getActionBar().setDisplayHomeAsUpEnabled(true); mLocalePickerWithRegion = LocalePickerWithRegion.createLanguagePicker( - this, AppLocalePickerActivity.this, false /* translate only */, mPackageName); + mContextAsUser, + AppLocalePickerActivity.this, + false /* translate only */, + mPackageName); mAppLocaleDetails = AppLocaleDetails.newInstance(mPackageName); // Launch Locale picker part. @@ -107,7 +121,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity /** Sets the app's locale to the supplied language tag */ private void setAppDefaultLocale(String languageTag) { - LocaleManager localeManager = getSystemService(LocaleManager.class); + LocaleManager localeManager = mContextAsUser.getSystemService(LocaleManager.class); if (localeManager == null) { Log.w(TAG, "LocaleManager is null, cannot set default app locale"); return;