diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index b9592085b..2c7f76322 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -190,6 +190,8 @@ public class MainActivity extends AppCompatActivity { && ReleaseVersionUtil.INSTANCE.isReleaseApk()) { UpdateSettingsFragment.askForConsentToUpdateChecks(this); } + + Localization.migrateAppLanguageSettingIfNecessary(getApplicationContext()); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java index 93640756e..421440ea7 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -6,12 +6,9 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.Build; import android.os.Environment; -import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.StringRes; -import androidx.appcompat.app.AppCompatDelegate; -import androidx.core.os.LocaleListCompat; import androidx.preference.PreferenceManager; import org.schabi.newpipe.App; @@ -45,7 +42,6 @@ import java.util.Set; * Helper class for global settings. */ public final class NewPipeSettings { - private static final String TAG = NewPipeSettings.class.toString(); private NewPipeSettings() { } public static void initSettings(final Context context) { @@ -68,7 +64,6 @@ public final class NewPipeSettings { saveDefaultAudioDownloadDirectory(context); disableMediaTunnelingIfNecessary(context); - migrateAppLanguageSettingIfNecessary(context); } static void saveDefaultVideoDownloadDirectory(final Context context) { @@ -189,32 +184,4 @@ public final class NewPipeSettings { DeviceUtils.MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION).apply(); } } - - private static void migrateAppLanguageSettingIfNecessary(@NonNull final Context context) { - // Starting with pull request #12093, NewPipe on Android 13+ exclusively uses Android's - // public per-app language APIs to read and set the UI language for NewPipe. - // If running on Android 13+, the following migration will move any existing custom - // app language in SharedPreferences to use the public per-app language APIs instead. - if (Build.VERSION.SDK_INT >= 33) { - final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); - final String appLanguageKey = context.getString(R.string.app_language_key); - final String appLanguageValue = sp.getString(appLanguageKey, null); - if (appLanguageValue != null) { - sp.edit().remove(appLanguageKey).apply(); - final String appLanguageDefaultValue = - context.getString(R.string.default_localization_key); - if (!appLanguageValue.equals(appLanguageDefaultValue)) { - try { - AppCompatDelegate.setApplicationLocales( - LocaleListCompat.forLanguageTags(appLanguageValue) - ); - } catch (final RuntimeException e) { - Log.e(TAG, "Failed to migrate previous custom app language " - + "setting to public per-app language APIs" - ); - } - } - } - } - } } diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index acb0dff04..679d52bb8 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -12,6 +12,7 @@ import android.os.Build; import android.text.TextUtils; import android.text.format.DateUtils; import android.util.DisplayMetrics; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -19,6 +20,7 @@ import androidx.annotation.PluralsRes; import androidx.annotation.StringRes; import androidx.appcompat.app.AppCompatDelegate; import androidx.core.math.MathUtils; +import androidx.core.os.LocaleListCompat; import androidx.preference.PreferenceManager; import org.ocpsoft.prettytime.PrettyTime; @@ -65,6 +67,7 @@ import java.util.stream.Collectors; */ public final class Localization { + private static final String TAG = Localization.class.toString(); public static final String DOT_SEPARATOR = " • "; private static PrettyTime prettyTime; @@ -433,4 +436,32 @@ public final class Localization { final int safeCount = (int) MathUtils.clamp(count, Integer.MIN_VALUE, Integer.MAX_VALUE); return context.getResources().getQuantityString(pluralId, safeCount, formattedCount); } + + public static void migrateAppLanguageSettingIfNecessary(@NonNull final Context context) { + // Starting with pull request #12093, NewPipe on Android 13+ exclusively uses Android's + // public per-app language APIs to read and set the UI language for NewPipe. + // If running on Android 13+, the following code will migrate any existing custom + // app language in SharedPreferences to use the public per-app language APIs instead. + if (Build.VERSION.SDK_INT >= 33) { + final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + final String appLanguageKey = context.getString(R.string.app_language_key); + final String appLanguageValue = sp.getString(appLanguageKey, null); + if (appLanguageValue != null) { + sp.edit().remove(appLanguageKey).apply(); + final String appLanguageDefaultValue = + context.getString(R.string.default_localization_key); + if (!appLanguageValue.equals(appLanguageDefaultValue)) { + try { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags(appLanguageValue) + ); + } catch (final RuntimeException e) { + Log.e(TAG, "Failed to migrate previous custom app language " + + "setting to public per-app language APIs" + ); + } + } + } + } + } }