From 2bc178ed485136b8715917fba5bf2de75cbcce6a Mon Sep 17 00:00:00 2001 From: LoveSy Date: Wed, 26 Jan 2022 03:19:28 +0800 Subject: [PATCH] Generate language list compile time (#1561) * Generate language list compile time * Add English --- app/build.gradle.kts | 34 ++++++++++++++ .../manager/ui/fragment/SettingsFragment.java | 47 ++++--------------- app/src/main/res/values-en/strings.xml | 2 + app/src/main/res/values/arrays.xml | 4 -- app/src/main/res/xml/prefs.xml | 1 - 5 files changed, 44 insertions(+), 44 deletions(-) create mode 100644 app/src/main/res/values-en/strings.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ed5a116d..fe022628 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -18,8 +18,10 @@ */ import com.android.build.gradle.internal.dsl.BuildType +import java.io.PrintStream import java.nio.file.Paths import java.time.Instant +import java.util.* plugins { id("org.gradle.idea") @@ -161,6 +163,38 @@ tasks.whenTaskAdded { } } +afterEvaluate { + android.applicationVariants.forEach { variant -> + val outSrcDir = file("$buildDir/generated/source/langList/${variant.name}") + val outSrc = file("$outSrcDir/org/lsposed/manager/util/LangList.java") + val genLangList = + tasks.register("generate${variant.name.capitalize(Locale.ROOT)}LangList") { + inputs.files("src/main/res") + outputs.file(outSrc) + doLast { + val langList = File(projectDir, "src/main/res").listFiles { dir -> + dir.name.startsWith("values-") && File(dir, "strings.xml").exists() + }.orEmpty().map { + it.name.substring(7).split("-", limit = 2) + }.map { + if (it.size == 1) Locale(it[0]) + else Locale(it[0], it[1].substring(1)) + }.map { it.toLanguageTag() } + PrintStream(outSrc).print( + """ + |package org.lsposed.manager.util; + |public final class LangList { + | public static final String[] LANG_LIST = {"SYSTEM", ${ + langList.joinToString(", ") { """"$it"""" } + }}; + |}""".trimMargin() + ) + } + } + variant.registerJavaGeneratingTask(genLangList, outSrcDir) + } +} + dependencies { val glideVersion = "4.12.0" val navVersion: String by rootProject.extra diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java index 008f42f4..e4ca7705 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java @@ -20,8 +20,6 @@ package org.lsposed.manager.ui.fragment; import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources.NotFoundException; import android.os.Build; import android.os.Bundle; import android.provider.Settings; @@ -49,6 +47,7 @@ import org.lsposed.manager.R; import org.lsposed.manager.databinding.FragmentSettingsBinding; import org.lsposed.manager.ui.activity.MainActivity; import org.lsposed.manager.util.BackupUtils; +import org.lsposed.manager.util.LangList; import org.lsposed.manager.util.NavUtil; import org.lsposed.manager.util.ThemeUtil; @@ -255,18 +254,17 @@ public class SettingsFragment extends BaseFragment { var tag = language.getValue(); var userLocale = App.getLocale(); var entries = new ArrayList(); - entries.add(language.getEntries()[0]); - var lstLang = getAppLanguages(requireContext(), R.string.Settings); + var lstLang = LangList.LANG_LIST; for (var lang : lstLang) { + if (lang.equals(SYSTEM)) { + entries.add(getString(rikka.core.R.string.follow_system)); + continue; + } var locale = Locale.forLanguageTag(lang); - entries.add(HtmlCompat.fromHtml(String.format("%s - %s", - !TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(locale) : locale.getDisplayName(locale), - !TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(userLocale) : locale.getDisplayName(userLocale) - ), HtmlCompat.FROM_HTML_MODE_LEGACY)); + entries.add(HtmlCompat.fromHtml(locale.getDisplayName(locale), HtmlCompat.FROM_HTML_MODE_LEGACY)); } language.setEntries(entries.toArray(new CharSequence[0])); - lstLang.add(0, SYSTEM); - language.setEntryValues(lstLang.toArray(new CharSequence[0])); + language.setEntryValues(lstLang); if (TextUtils.isEmpty(tag) || SYSTEM.equals(tag)) { language.setSummary(getString(rikka.material.R.string.follow_system)); } else { @@ -312,34 +310,5 @@ public class SettingsFragment extends BaseFragment { } return recyclerView; } - - private ArrayList getAppLanguages(Context ctx, int id) { - Configuration conf = ctx.getResources().getConfiguration(); - Locale originalLocale = conf.getLocales().get(0); - conf.setLocale(Locale.ENGLISH); - - var lstLang = new ArrayList(); - lstLang.add(Locale.ENGLISH.getLanguage()); - - final String reference; - try { - reference = ctx.createConfigurationContext(conf).getString(id); - } catch (NotFoundException nfe) { - return lstLang; // return only english - } - - for (String loc : ctx.getAssets().getLocales()) { - if (loc.isEmpty()) { - continue; - } - Locale locale = Locale.forLanguageTag(loc); - conf.setLocale(locale); - if (!lstLang.contains(loc) && !reference.equals(ctx.createConfigurationContext(conf).getString(id))) { - lstLang.add(loc); - } - } - conf.setLocale(originalLocale); - return lstLang; - } } } diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml new file mode 100644 index 00000000..3ea04e70 --- /dev/null +++ b/app/src/main/res/values-en/strings.xml @@ -0,0 +1,2 @@ + + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index a3122a12..2ddb9495 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -32,10 +32,6 @@ MODE_NIGHT_FOLLOW_SYSTEM - - @string/follow_system - - SAKURA MATERIAL_RED diff --git a/app/src/main/res/xml/prefs.xml b/app/src/main/res/xml/prefs.xml index e06bf226..04eb90fb 100644 --- a/app/src/main/res/xml/prefs.xml +++ b/app/src/main/res/xml/prefs.xml @@ -34,7 +34,6 @@