Merge "[Panlingual] Improve UI can not show on at first." into tm-dev

This commit is contained in:
Tom Hsu
2022-03-03 11:36:08 +00:00
committed by Android (Google) Code Review
5 changed files with 78 additions and 47 deletions

View File

@@ -16,26 +16,35 @@
package com.android.settings.applications; package com.android.settings.applications;
import android.annotation.NonNull;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.util.Log; import android.util.Log;
import com.android.settings.R; import com.android.settings.R;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import java.util.List;
/** This class provides methods that help dealing with per app locale. */ /** This class provides methods that help dealing with per app locale. */
public class AppLocaleUtil { public class AppLocaleUtil {
private static final String TAG = AppLocaleUtil.class.getSimpleName(); private static final String TAG = AppLocaleUtil.class.getSimpleName();
public static final Intent LAUNCHER_ENTRY_INTENT =
new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER);
/** /**
* Decides the UI display of per app locale. * Decides the UI display of per app locale.
*/ */
public static boolean canDisplayLocaleUi(Context context, AppEntry app) { public static boolean canDisplayLocaleUi(
return !isDisallowedPackage(context, app.info.packageName) @NonNull Context context,
&& !isSignedWithPlatformKey(context, app.info.packageName) @NonNull String packageName,
&& app.hasLauncherEntry; @NonNull List<ResolveInfo> infos) {
return !isDisallowedPackage(context, packageName)
&& !isSignedWithPlatformKey(context, packageName)
&& hasLauncherEntry(packageName, infos);
} }
private static boolean isDisallowedPackage(Context context, String packageName) { private static boolean isDisallowedPackage(Context context, String packageName) {
@@ -65,4 +74,9 @@ public class AppLocaleUtil {
} }
return packageInfo.applicationInfo.isSignedWithPlatformKey(); return packageInfo.applicationInfo.isSignedWithPlatformKey();
} }
private static boolean hasLauncherEntry(String packageName, List<ResolveInfo> infos) {
return infos.stream()
.anyMatch(info -> info.activityInfo.packageName.equals(packageName));
}
} }

View File

@@ -16,6 +16,8 @@
package com.android.settings.applications; package com.android.settings.applications;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.util.Log; import android.util.Log;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
@@ -33,16 +35,19 @@ public class AppStateLocaleBridge extends AppStateBaseBridge {
private static final String TAG = AppStateLocaleBridge.class.getSimpleName(); private static final String TAG = AppStateLocaleBridge.class.getSimpleName();
private final Context mContext; private final Context mContext;
private final List<ResolveInfo> mListInfos;
public AppStateLocaleBridge(Context context, ApplicationsState appState, public AppStateLocaleBridge(Context context, ApplicationsState appState,
Callback callback) { Callback callback) {
super(appState, callback); super(appState, callback);
mContext = context; mContext = context;
mListInfos = context.getPackageManager().queryIntentActivities(
AppLocaleUtil.LAUNCHER_ENTRY_INTENT, PackageManager.GET_META_DATA);
} }
@Override @Override
protected void updateExtraInfo(AppEntry app, String packageName, int uid) { protected void updateExtraInfo(AppEntry app, String packageName, int uid) {
app.extraInfo = AppLocaleUtil.canDisplayLocaleUi(mContext, app) app.extraInfo = AppLocaleUtil.canDisplayLocaleUi(mContext, app.info.packageName, mListInfos)
? Boolean.TRUE : Boolean.FALSE; ? Boolean.TRUE : Boolean.FALSE;
} }
@@ -51,7 +56,8 @@ public class AppStateLocaleBridge extends AppStateBaseBridge {
final List<AppEntry> allApps = mAppSession.getAllApps(); final List<AppEntry> allApps = mAppSession.getAllApps();
for (int i = 0; i < allApps.size(); i++) { for (int i = 0; i < allApps.size(); i++) {
AppEntry app = allApps.get(i); AppEntry app = allApps.get(i);
app.extraInfo = AppLocaleUtil.canDisplayLocaleUi(mContext, app) app.extraInfo =
AppLocaleUtil.canDisplayLocaleUi(mContext, app.info.packageName, mListInfos)
? Boolean.TRUE : Boolean.FALSE; ? Boolean.TRUE : Boolean.FALSE;
} }
} }
@@ -66,12 +72,10 @@ public class AppStateLocaleBridge extends AppStateBaseBridge {
@Override @Override
public boolean filterApp(AppEntry entry) { public boolean filterApp(AppEntry entry) {
if (entry.extraInfo == null) { if (entry.extraInfo == null) {
Log.d(TAG, "No extra info."); Log.d(TAG, "[" + entry.info.packageName + "]" + " has No extra info.");
return false; return false;
} }
return (Boolean) entry.extraInfo; return (Boolean) entry.extraInfo;
} }
}; };
} }

View File

@@ -17,19 +17,29 @@
package com.android.settings.applications.appinfo; package com.android.settings.applications.appinfo;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.util.FeatureFlagUtils; import android.util.FeatureFlagUtils;
import androidx.annotation.VisibleForTesting;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.applications.AppLocaleUtil; import com.android.settings.applications.AppLocaleUtil;
import java.util.List;
/** /**
* A controller to update current locale information of application. * A controller to update current locale information of application.
*/ */
public class AppLocalePreferenceController extends AppInfoPreferenceControllerBase { public class AppLocalePreferenceController extends AppInfoPreferenceControllerBase {
private static final String TAG = AppLocalePreferenceController.class.getSimpleName(); private static final String TAG = AppLocalePreferenceController.class.getSimpleName();
private final List<ResolveInfo> mListInfos;
public AppLocalePreferenceController(Context context, String key) { public AppLocalePreferenceController(Context context, String key) {
super(context, key); super(context, key);
mListInfos = context.getPackageManager().queryIntentActivities(
AppLocaleUtil.LAUNCHER_ENTRY_INTENT, PackageManager.GET_META_DATA);
} }
@Override @Override
@@ -49,7 +59,9 @@ public class AppLocalePreferenceController extends AppInfoPreferenceControllerBa
return AppLocaleDetails.getSummary(mContext, mParent.getAppEntry().info.packageName); return AppLocaleDetails.getSummary(mContext, mParent.getAppEntry().info.packageName);
} }
@VisibleForTesting
boolean canDisplayLocaleUi() { boolean canDisplayLocaleUi() {
return AppLocaleUtil.canDisplayLocaleUi(mContext, mParent.getAppEntry()); return AppLocaleUtil
.canDisplayLocaleUi(mContext, mParent.getAppEntry().info.packageName, mListInfos);
} }
} }

View File

@@ -210,7 +210,7 @@ public class AppFilterRegistry {
// Apps that can configurate appication's locale. // Apps that can configurate appication's locale.
mFilters[FILTER_APPS_LOCALE] = new AppFilterItem( mFilters[FILTER_APPS_LOCALE] = new AppFilterItem(
AppStateLocaleBridge.FILTER_APPS_LOCALE, AppStateLocaleBridge.FILTER_APPS_LOCALE,
FILTER_APPS_LOCALE, FILTER_APPS_LOCALE,
R.string.app_locale_picker_title); R.string.app_locale_picker_title);
} }

View File

@@ -20,27 +20,31 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.content.Context; import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources; import android.content.res.Resources;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class AppLocaleUtilTest { public class AppLocaleUtilTest {
@Mock @Mock
@@ -48,15 +52,14 @@ public class AppLocaleUtilTest {
@Mock @Mock
private ActivityManager mActivityManager; private ActivityManager mActivityManager;
@Mock @Mock
private AppEntry mEntry;
@Mock
private ApplicationInfo mApplicationInfo; private ApplicationInfo mApplicationInfo;
@Mock @Mock
private Resources mResources; private Resources mResources;
private Context mContext; private Context mContext;
private String mDisallowedPackage = "com.disallowed.package"; private String mDisallowedPackage = "com.disallowed.package";
private String mAallowedPackage = "com.allowed.package"; private String mAllowedPackage = "com.allowed.package";
private List<ResolveInfo> mListResolveInfo;
@Before @Before
public void setUp() { public void setUp() {
@@ -64,54 +67,43 @@ public class AppLocaleUtilTest {
mContext = spy(ApplicationProvider.getApplicationContext()); mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getSystemService(ActivityManager.class)).thenReturn(mActivityManager); when(mContext.getSystemService(ActivityManager.class)).thenReturn(mActivityManager);
}
@Test
public void isDisplayLocaleUi_showUI() throws PackageManager.NameNotFoundException {
setTestAppEntry(mAallowedPackage);
setDisallowedPackageName(mDisallowedPackage); setDisallowedPackageName(mDisallowedPackage);
setApplicationInfo(/*no platform key*/false);
mEntry.hasLauncherEntry = true;
assertTrue(AppLocaleUtil.canDisplayLocaleUi(mContext, mEntry));
} }
@Test @Test
public void isDisplayLocaleUi_notShowUI_hasPlatformKey() public void canDisplayLocaleUi_showUI() throws PackageManager.NameNotFoundException {
setApplicationInfo(/*no platform key*/ false);
setActivityInfo(mAllowedPackage);
assertTrue(AppLocaleUtil.canDisplayLocaleUi(mContext, mAllowedPackage, mListResolveInfo));
}
@Test
public void canDisplayLocaleUi_notShowUI_hasPlatformKey()
throws PackageManager.NameNotFoundException { throws PackageManager.NameNotFoundException {
setTestAppEntry(mAallowedPackage); setApplicationInfo(/*has platform key*/ true);
setDisallowedPackageName(mDisallowedPackage); setActivityInfo(mAllowedPackage);
setApplicationInfo(/*has platform key*/true);
mEntry.hasLauncherEntry = true;
assertFalse(AppLocaleUtil.canDisplayLocaleUi(mContext, mEntry)); assertFalse(AppLocaleUtil.canDisplayLocaleUi(mContext, mAllowedPackage, mListResolveInfo));
} }
@Test @Test
public void isDisplayLocaleUi_notShowUI_noLauncherEntry() public void canDisplayLocaleUi_notShowUI_noLauncherEntry()
throws PackageManager.NameNotFoundException { throws PackageManager.NameNotFoundException {
setTestAppEntry(mAallowedPackage);
setDisallowedPackageName(mDisallowedPackage);
setApplicationInfo(/*no platform key*/false); setApplicationInfo(/*no platform key*/false);
mEntry.hasLauncherEntry = false; setActivityInfo("");
assertFalse(AppLocaleUtil.canDisplayLocaleUi(mContext, mEntry)); assertFalse(AppLocaleUtil.canDisplayLocaleUi(mContext, mAllowedPackage, mListResolveInfo));
} }
@Test @Test
public void isDisplayLocaleUi_notShowUI_matchDisallowedPackageList() public void canDisplayLocaleUi_notShowUI_matchDisallowedPackageList()
throws PackageManager.NameNotFoundException { throws PackageManager.NameNotFoundException {
setTestAppEntry(mDisallowedPackage);
setDisallowedPackageName(mDisallowedPackage);
setApplicationInfo(/*no platform key*/false); setApplicationInfo(/*no platform key*/false);
mEntry.hasLauncherEntry = false; setActivityInfo("");
assertFalse(AppLocaleUtil.canDisplayLocaleUi(mContext, mEntry)); assertFalse(AppLocaleUtil
} .canDisplayLocaleUi(mContext, mDisallowedPackage, mListResolveInfo));
private void setTestAppEntry(String packageName) {
mEntry.info = mApplicationInfo;
mApplicationInfo.packageName = packageName;
} }
private void setDisallowedPackageName(String packageName) { private void setDisallowedPackageName(String packageName) {
@@ -132,4 +124,13 @@ public class AppLocaleUtilTest {
when(mPackageManager.getPackageInfoAsUser(anyString(), anyInt(), anyInt())).thenReturn( when(mPackageManager.getPackageInfoAsUser(anyString(), anyInt(), anyInt())).thenReturn(
packageInfo); packageInfo);
} }
private void setActivityInfo(String packageName) {
ResolveInfo resolveInfo = mock(ResolveInfo.class);
ActivityInfo activityInfo = mock(ActivityInfo.class);
activityInfo.packageName = packageName;
resolveInfo.activityInfo = activityInfo;
mListResolveInfo = new ArrayList<>();
mListResolveInfo.add(resolveInfo);
}
} }