[Panlingual] Can't set per-app languages for apps on work profile page

Use startActivityAsUser instead of startActivity API to start the AppLocalePickerActivity of different users

Bug: 274378136
Test: 1. Perform AppLocalePickerActivityTest robolectric test
      2. Perform the manual test by switching different users
      3. Perform the manual test by switching different profiles
Change-Id: I4405b3b7e832b71b9ef66fa71d9e42ce12da167c
This commit is contained in:
Josh Hou
2023-03-21 10:49:35 +00:00
parent 36d78f8fe0
commit 38df174bba
5 changed files with 11 additions and 50 deletions

View File

@@ -28,7 +28,6 @@ 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;
@@ -72,7 +71,6 @@ 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 {

View File

@@ -709,8 +709,8 @@ 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);
getContext().startActivityAsUser(intent,
UserHandle.getUserHandleForUid(mCurrentUid));
break;
case LIST_TYPE_BATTERY_OPTIMIZATION:
AdvancedPowerUsageDetail.startBatteryDetailPage(

View File

@@ -18,12 +18,10 @@ package com.android.settings.localepicker;
import android.app.FragmentTransaction;
import android.app.LocaleManager;
import android.content.Context;
import android.content.pm.PackageManager;
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;
@@ -34,7 +32,6 @@ import android.widget.ListView;
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.AppLocaleUtil;
import com.android.settings.applications.appinfo.AppLocaleDetails;
import com.android.settings.core.SettingsBaseActivity;
@@ -46,7 +43,6 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
private String mPackageName;
private LocalePickerWithRegion mLocalePickerWithRegion;
private AppLocaleDetails mAppLocaleDetails;
private Context mContextAsUser;
private View mAppLocaleDetailContainer;
@Override
@@ -64,16 +60,8 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
finish();
return;
}
mContextAsUser = this;
if (getIntent().hasExtra(AppInfoBase.ARG_PACKAGE_UID)) {
int uid = getIntent().getIntExtra(AppInfoBase.ARG_PACKAGE_UID, -1);
if (uid != -1) {
UserHandle userHandle = UserHandle.getUserHandleForUid(uid);
mContextAsUser = createContextAsUser(userHandle, 0);
}
}
if (!canDisplayLocaleUi() || mContextAsUser.getUserId() != UserHandle.myUserId()) {
if (!canDisplayLocaleUi()) {
Log.w(TAG, "Not allow to display Locale Settings UI.");
finish();
return;
@@ -83,13 +71,13 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
getActionBar().setDisplayHomeAsUpEnabled(true);
mLocalePickerWithRegion = LocalePickerWithRegion.createLanguagePicker(
mContextAsUser,
this,
this,
false /* translate only */,
null,
mPackageName,
this);
mAppLocaleDetails = AppLocaleDetails.newInstance(mPackageName, mContextAsUser.getUserId());
mAppLocaleDetails = AppLocaleDetails.newInstance(mPackageName, getUserId());
mAppLocaleDetailContainer = launchAppLocaleDetailsPage();
// Launch Locale picker part.
launchLocalePickerPage();
@@ -129,7 +117,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
/** Sets the app's locale to the supplied language tag */
private void setAppDefaultLocale(String languageTag) {
Log.d(TAG, "setAppDefaultLocale: " + languageTag);
LocaleManager localeManager = mContextAsUser.getSystemService(LocaleManager.class);
LocaleManager localeManager = getSystemService(LocaleManager.class);
if (localeManager == null) {
Log.w(TAG, "LocaleManager is null, cannot set default app locale");
return;
@@ -172,8 +160,8 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
private boolean canDisplayLocaleUi() {
try {
PackageManager packageManager = mContextAsUser.getPackageManager();
return AppLocaleUtil.canDisplayLocaleUi(mContextAsUser,
PackageManager packageManager = getPackageManager();
return AppLocaleUtil.canDisplayLocaleUi(this,
packageManager.getApplicationInfo(mPackageName, 0),
packageManager.queryIntentActivities(AppLocaleUtil.LAUNCHER_ENTRY_INTENT,
PackageManager.GET_META_DATA));

View File

@@ -21,6 +21,7 @@ import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.net.Uri
import android.os.UserHandle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.remember
@@ -94,9 +95,9 @@ class AppLanguagesListModel(private val context: Context) : AppListModel<AppLang
AppListItem {
val intent = Intent(context, AppLocalePickerActivity::class.java).apply {
data = Uri.parse("package:${record.app.packageName}")
this.putExtra("uid", record.app.uid)
}
context.startActivity(intent)
val userHandle : UserHandle = UserHandle.getUserHandleForUid(record.app.uid)
context.startActivityAsUser(intent, userHandle)
}
}
}

View File

@@ -75,7 +75,6 @@ import java.util.Locale;
shadows = {
AppLocalePickerActivityTest.ShadowApplicationPackageManager.class,
AppLocalePickerActivityTest.ShadowResources.class,
AppLocalePickerActivityTest.ShadowUserHandle.class,
})
public class AppLocalePickerActivityTest {
private static final String TEST_PACKAGE_NAME = "com.android.settings";
@@ -108,7 +107,6 @@ public class AppLocalePickerActivityTest {
ReflectionHelpers.setStaticField(AppLocaleUtil.class, "sLocaleConfig", null);
ShadowResources.setDisAllowPackage(false);
ShadowApplicationPackageManager.setNoLaunchEntry(false);
ShadowUserHandle.setUserId(0);
}
@Test
@@ -171,17 +169,6 @@ public class AppLocalePickerActivityTest {
assertThat(controller.get().isFinishing()).isTrue();
}
@Test
public void launchAppLocalePickerActivity_modifyAppLocalesOfAnotherUser_failed() {
ShadowUserHandle.setUserId(10);
ActivityController<TestAppLocalePickerActivity> controller =
initActivityController(true);
controller.create();
assertThat(controller.get().isFinishing()).isTrue();
}
@Test
public void launchAppLocalePickerActivity_intentWithoutPackageName_failed() {
ActivityController<TestAppLocalePickerActivity> controller =
@@ -292,17 +279,4 @@ public class AppLocalePickerActivityTest {
sDisAllowPackage = disAllowPackage;
}
}
@Implements(UserHandle.class)
public static class ShadowUserHandle {
private static int sUserId = 0;
private static void setUserId(int userId) {
sUserId = userId;
}
@Implementation
public static int getUserId(int userId) {
return sUserId;
}
}
}