get app names in English along current user locale
This commit is contained in:
parent
7a8e8503af
commit
510a7c8f5a
1 changed files with 37 additions and 6 deletions
|
@ -6,8 +6,11 @@ import android.content.Intent;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
|
import android.content.res.Configuration;
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
@ -27,6 +30,7 @@ import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@ -110,14 +114,41 @@ public class AppAdapterHandler implements MethodChannel.MethodCallHandler {
|
||||||
Intent intent = new Intent(Intent.ACTION_MAIN, null);
|
Intent intent = new Intent(Intent.ACTION_MAIN, null);
|
||||||
intent.addCategory(Intent.CATEGORY_LAUNCHER);
|
intent.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
|
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
|
||||||
PackageManager packageManager = context.getPackageManager();
|
|
||||||
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, 0);
|
// apps tend to use their name in English when creating folders
|
||||||
|
// so we get their names in English as well as the current locale
|
||||||
|
Configuration config = new Configuration();
|
||||||
|
config.setLocale(Locale.ENGLISH);
|
||||||
|
|
||||||
|
PackageManager pm = context.getPackageManager();
|
||||||
|
List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(intent, 0);
|
||||||
for (ResolveInfo resolveInfo : resolveInfoList) {
|
for (ResolveInfo resolveInfo : resolveInfoList) {
|
||||||
ApplicationInfo applicationInfo = resolveInfo.activityInfo.applicationInfo;
|
ApplicationInfo ai = resolveInfo.activityInfo.applicationInfo;
|
||||||
boolean isSystemPackage = (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
|
boolean isSystemPackage = (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
|
||||||
if (!isSystemPackage) {
|
if (!isSystemPackage) {
|
||||||
String appName = String.valueOf(packageManager.getApplicationLabel(applicationInfo));
|
String packageName = ai.packageName;
|
||||||
nameMap.put(appName, applicationInfo.packageName);
|
|
||||||
|
String currentLabel = String.valueOf(pm.getApplicationLabel(ai));
|
||||||
|
nameMap.put(currentLabel, packageName);
|
||||||
|
|
||||||
|
int labelRes = ai.labelRes;
|
||||||
|
if (labelRes != 0) {
|
||||||
|
try {
|
||||||
|
Resources resources = pm.getResourcesForApplication(ai);
|
||||||
|
// `updateConfiguration` is deprecated but it seems to be the only way
|
||||||
|
// to query resources from another app with a specific locale.
|
||||||
|
// The following methods do not work:
|
||||||
|
// - `resources.getConfiguration().setLocale(...)`
|
||||||
|
// - getting a package manager from a custom context with `context.createConfigurationContext(config)`
|
||||||
|
resources.updateConfiguration(config, resources.getDisplayMetrics());
|
||||||
|
String englishLabel = resources.getString(labelRes);
|
||||||
|
if (!TextUtils.equals(englishLabel, currentLabel)) {
|
||||||
|
nameMap.put(englishLabel, packageName);
|
||||||
|
}
|
||||||
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
Log.w(LOG_TAG, "failed to get app englishLabel for packageName=" + packageName, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nameMap;
|
return nameMap;
|
||||||
|
|
Loading…
Reference in a new issue