[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
This commit is contained in:
@@ -26,6 +26,7 @@ import android.content.pm.ApplicationInfo;
|
|||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.LocaleList;
|
import android.os.LocaleList;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -40,6 +41,7 @@ import com.android.settings.Utils;
|
|||||||
import com.android.settings.applications.AppInfoBase;
|
import com.android.settings.applications.AppInfoBase;
|
||||||
import com.android.settings.widget.EntityHeaderController;
|
import com.android.settings.widget.EntityHeaderController;
|
||||||
import com.android.settingslib.applications.AppUtils;
|
import com.android.settingslib.applications.AppUtils;
|
||||||
|
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||||
import com.android.settingslib.widget.LayoutPreference;
|
import com.android.settingslib.widget.LayoutPreference;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@@ -214,8 +216,10 @@ public class AppLocaleDetails extends SettingsPreferenceFragment {
|
|||||||
* TODO (b209962418) Do a performance test to low end device.
|
* TODO (b209962418) Do a performance test to low end device.
|
||||||
* @return Return the summary to show the current app's language.
|
* @return Return the summary to show the current app's language.
|
||||||
*/
|
*/
|
||||||
public static CharSequence getSummary(Context context, String packageName) {
|
public static CharSequence getSummary(Context context, AppEntry entry) {
|
||||||
Locale appLocale = getAppDefaultLocale(context, packageName);
|
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) {
|
if (appLocale == null) {
|
||||||
Locale systemLocale = Locale.getDefault();
|
Locale systemLocale = Locale.getDefault();
|
||||||
return context.getString(R.string.preference_of_system_locale_summary,
|
return context.getString(R.string.preference_of_system_locale_summary,
|
||||||
|
@@ -29,6 +29,7 @@ import androidx.annotation.VisibleForTesting;
|
|||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
|
|
||||||
import com.android.settings.SettingsPreferenceFragment;
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
|
import com.android.settings.applications.AppInfoBase;
|
||||||
import com.android.settings.applications.AppLocaleUtil;
|
import com.android.settings.applications.AppLocaleUtil;
|
||||||
import com.android.settings.localepicker.AppLocalePickerActivity;
|
import com.android.settings.localepicker.AppLocalePickerActivity;
|
||||||
|
|
||||||
@@ -62,7 +63,7 @@ public class AppLocalePreferenceController extends AppInfoPreferenceControllerBa
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CharSequence getSummary() {
|
public CharSequence getSummary() {
|
||||||
return AppLocaleDetails.getSummary(mContext, mParent.getAppEntry().info.packageName);
|
return AppLocaleDetails.getSummary(mContext, mParent.getAppEntry());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -74,6 +75,7 @@ public class AppLocalePreferenceController extends AppInfoPreferenceControllerBa
|
|||||||
if (mParent != null) {
|
if (mParent != null) {
|
||||||
Intent intent = new Intent(mContext, AppLocalePickerActivity.class);
|
Intent intent = new Intent(mContext, AppLocalePickerActivity.class);
|
||||||
intent.setData(Uri.parse("package:" + mParent.getAppEntry().info.packageName));
|
intent.setData(Uri.parse("package:" + mParent.getAppEntry().info.packageName));
|
||||||
|
intent.putExtra(AppInfoBase.ARG_PACKAGE_UID, mParent.getAppEntry().info.uid);
|
||||||
mContext.startActivity(intent);
|
mContext.startActivity(intent);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -638,6 +638,7 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
case LIST_TYPE_APPS_LOCALE:
|
case LIST_TYPE_APPS_LOCALE:
|
||||||
Intent intent = new Intent(getContext(), AppLocalePickerActivity.class);
|
Intent intent = new Intent(getContext(), AppLocalePickerActivity.class);
|
||||||
intent.setData(Uri.parse("package:" + mCurrentPkgName));
|
intent.setData(Uri.parse("package:" + mCurrentPkgName));
|
||||||
|
intent.putExtra(AppInfoBase.ARG_PACKAGE_UID, mCurrentUid);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
break;
|
break;
|
||||||
// TODO: Figure out if there is a way where we can spin up the profile's settings
|
// 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));
|
holder.setSummary(MediaManagementAppsDetails.getSummary(mContext, entry));
|
||||||
break;
|
break;
|
||||||
case LIST_TYPE_APPS_LOCALE:
|
case LIST_TYPE_APPS_LOCALE:
|
||||||
holder.setSummary(AppLocaleDetails
|
holder.setSummary(AppLocaleDetails.getSummary(mContext, entry));
|
||||||
.getSummary(mContext, entry.info.packageName));
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
holder.updateSizeText(entry, mManageApplications.mInvalidSizeStr, mWhichSize);
|
holder.updateSizeText(entry, mManageApplications.mInvalidSizeStr, mWhichSize);
|
||||||
|
@@ -18,9 +18,11 @@ package com.android.settings.localepicker;
|
|||||||
|
|
||||||
import android.app.FragmentTransaction;
|
import android.app.FragmentTransaction;
|
||||||
import android.app.LocaleManager;
|
import android.app.LocaleManager;
|
||||||
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.LocaleList;
|
import android.os.LocaleList;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.MenuItem;
|
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.LocalePickerWithRegion;
|
||||||
import com.android.internal.app.LocaleStore;
|
import com.android.internal.app.LocaleStore;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.applications.AppInfoBase;
|
||||||
import com.android.settings.applications.appinfo.AppLocaleDetails;
|
import com.android.settings.applications.appinfo.AppLocaleDetails;
|
||||||
import com.android.settings.core.SettingsBaseActivity;
|
import com.android.settings.core.SettingsBaseActivity;
|
||||||
|
|
||||||
@@ -45,6 +48,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
|
|||||||
private String mPackageName;
|
private String mPackageName;
|
||||||
private LocalePickerWithRegion mLocalePickerWithRegion;
|
private LocalePickerWithRegion mLocalePickerWithRegion;
|
||||||
private AppLocaleDetails mAppLocaleDetails;
|
private AppLocaleDetails mAppLocaleDetails;
|
||||||
|
private Context mContextAsUser;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
@@ -61,11 +65,21 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
|
|||||||
finish();
|
finish();
|
||||||
return;
|
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);
|
getActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
|
||||||
mLocalePickerWithRegion = LocalePickerWithRegion.createLanguagePicker(
|
mLocalePickerWithRegion = LocalePickerWithRegion.createLanguagePicker(
|
||||||
this, AppLocalePickerActivity.this, false /* translate only */, mPackageName);
|
mContextAsUser,
|
||||||
|
AppLocalePickerActivity.this,
|
||||||
|
false /* translate only */,
|
||||||
|
mPackageName);
|
||||||
mAppLocaleDetails = AppLocaleDetails.newInstance(mPackageName);
|
mAppLocaleDetails = AppLocaleDetails.newInstance(mPackageName);
|
||||||
|
|
||||||
// Launch Locale picker part.
|
// Launch Locale picker part.
|
||||||
@@ -107,7 +121,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
|
|||||||
|
|
||||||
/** Sets the app's locale to the supplied language tag */
|
/** Sets the app's locale to the supplied language tag */
|
||||||
private void setAppDefaultLocale(String languageTag) {
|
private void setAppDefaultLocale(String languageTag) {
|
||||||
LocaleManager localeManager = getSystemService(LocaleManager.class);
|
LocaleManager localeManager = mContextAsUser.getSystemService(LocaleManager.class);
|
||||||
if (localeManager == null) {
|
if (localeManager == null) {
|
||||||
Log.w(TAG, "LocaleManager is null, cannot set default app locale");
|
Log.w(TAG, "LocaleManager is null, cannot set default app locale");
|
||||||
return;
|
return;
|
||||||
|
Reference in New Issue
Block a user