From b888dc72cff90e213545d346c45169fee8d73f30 Mon Sep 17 00:00:00 2001 From: Miles Krell Date: Tue, 11 Mar 2025 23:29:23 -0400 Subject: [PATCH 01/17] Support per-app language preferences --- app/build.gradle | 4 ++++ app/src/main/res/resources.properties | 1 + 2 files changed, 5 insertions(+) create mode 100644 app/src/main/res/resources.properties diff --git a/app/build.gradle b/app/build.gradle index d03bd64e3..bbb02e8b3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -97,6 +97,10 @@ android { androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) } + androidResources { + generateLocaleConfig = true + } + buildFeatures { viewBinding true buildConfig true diff --git a/app/src/main/res/resources.properties b/app/src/main/res/resources.properties new file mode 100644 index 000000000..467b3efec --- /dev/null +++ b/app/src/main/res/resources.properties @@ -0,0 +1 @@ +unqualifiedResLocale=en-US From 87693a2ad1eda0563d5d0979909826d7a937fc50 Mon Sep 17 00:00:00 2001 From: Miles Krell Date: Sat, 15 Mar 2025 21:44:31 -0400 Subject: [PATCH 02/17] Redirect to per-app language settings on Android 13+ --- .../settings/ContentSettingsFragment.java | 26 +++++++++++++++++++ .../org/schabi/newpipe/util/Localization.java | 6 +++++ app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/xml/content_settings.xml | 7 +++++ 4 files changed, 40 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index ec2bed67a..575d6c733 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -1,10 +1,15 @@ package org.schabi.newpipe.settings; import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.provider.Settings; import android.util.Log; import android.widget.Toast; +import androidx.appcompat.app.AppCompatDelegate; import androidx.preference.Preference; import org.schabi.newpipe.DownloaderImpl; @@ -17,6 +22,7 @@ import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.image.PreferredImageQuality; import java.io.IOException; +import java.util.Locale; public class ContentSettingsFragment extends BasePreferenceFragment { private String youtubeRestrictedModeEnabledKey; @@ -37,6 +43,26 @@ public class ContentSettingsFragment extends BasePreferenceFragment { .getPreferredContentCountry(requireContext()); initialLanguage = defaultPreferences.getString(getString(R.string.app_language_key), "en"); + if (Build.VERSION.SDK_INT >= 33) { + requirePreference(R.string.app_language_key).setVisible(false); + final Preference newAppLanguagePref = + requirePreference(R.string.app_language_android_13_and_up_key); + newAppLanguagePref.setSummaryProvider(preference -> { + final Locale customLocale = AppCompatDelegate.getApplicationLocales().get(0); + if (customLocale != null) { + return customLocale.getDisplayName(); + } + return getString(R.string.systems_language); + }); + newAppLanguagePref.setOnPreferenceClickListener(preference -> { + final Intent intent = new Intent(Settings.ACTION_APP_LOCALE_SETTINGS) + .setData(Uri.fromParts("package", requireContext().getPackageName(), null)); + startActivity(intent); + return true; + }); + newAppLanguagePref.setVisible(true); + } + final Preference imageQualityPreference = requirePreference(R.string.image_quality_key); imageQualityPreference.setOnPreferenceChangeListener( (preference, newValue) -> { 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 8f8ba596f..acb0dff04 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -17,6 +17,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.PluralsRes; import androidx.annotation.StringRes; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.math.MathUtils; import androidx.preference.PreferenceManager; @@ -39,6 +40,7 @@ import java.time.format.FormatStyle; import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.stream.Collectors; @@ -101,6 +103,10 @@ public final class Localization { } public static Locale getAppLocale(@NonNull final Context context) { + if (Build.VERSION.SDK_INT >= 33) { + final Locale customLocale = AppCompatDelegate.getApplicationLocales().get(0); + return Objects.requireNonNullElseGet(customLocale, Locale::getDefault); + } return getLocaleFromPrefs(context, R.string.app_language_key); } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index fb68a464d..61125c47f 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -353,6 +353,7 @@ playback_skip_silence_key app_language_key + app_language_android_13_and_up_key feed_update_threshold_key 300 diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index 2cdc6c545..f17783a22 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -13,6 +13,13 @@ app:iconSpaceReserved="false" app:useSimpleSummaryProvider="true" /> + + Date: Sat, 15 Mar 2025 22:13:01 -0400 Subject: [PATCH 03/17] Migrate from pre-Android 13 app language pref --- app/src/main/java/org/schabi/newpipe/App.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 8ce161eec..495ef43a5 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -3,11 +3,14 @@ package org.schabi.newpipe; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; +import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.app.NotificationChannelCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.core.os.LocaleListCompat; import androidx.preference.PreferenceManager; import com.jakewharton.processphoenix.ProcessPhoenix; @@ -122,6 +125,22 @@ public class App extends Application { configureRxJavaErrorHandler(); YoutubeStreamExtractor.setPoTokenProvider(PoTokenProviderImpl.INSTANCE); + + if (Build.VERSION.SDK_INT >= 33) { + final String appLanguageKey = getString(R.string.app_language_key); + if (prefs.contains(appLanguageKey)) { + // Migrate to Android per-app language settings + final String languageCode = prefs.getString(appLanguageKey, null); + prefs.edit().remove(appLanguageKey).apply(); + try { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags(languageCode) + ); + } catch (final RuntimeException e) { + Log.e(TAG, "Error migrating to Android 13+ per-app language settings"); + } + } + } } @Override From da106e2361b9660b25e1a9a81fa5d74d37d826e2 Mon Sep 17 00:00:00 2001 From: Miles Krell Date: Sat, 15 Mar 2025 22:54:17 -0400 Subject: [PATCH 04/17] Don't try to migrate "system" app language --- app/src/main/java/org/schabi/newpipe/App.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 495ef43a5..992651141 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -127,17 +127,20 @@ public class App extends Application { YoutubeStreamExtractor.setPoTokenProvider(PoTokenProviderImpl.INSTANCE); if (Build.VERSION.SDK_INT >= 33) { + final String appLanguageDefaultValue = getString(R.string.default_localization_key); final String appLanguageKey = getString(R.string.app_language_key); - if (prefs.contains(appLanguageKey)) { + final String appLanguageCurrentValue = prefs.getString(appLanguageKey, null); + if (appLanguageCurrentValue != null) { // Migrate to Android per-app language settings - final String languageCode = prefs.getString(appLanguageKey, null); prefs.edit().remove(appLanguageKey).apply(); - try { - AppCompatDelegate.setApplicationLocales( - LocaleListCompat.forLanguageTags(languageCode) - ); - } catch (final RuntimeException e) { - Log.e(TAG, "Error migrating to Android 13+ per-app language settings"); + if (!appLanguageCurrentValue.equals(appLanguageDefaultValue)) { + try { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags(appLanguageCurrentValue) + ); + } catch (final RuntimeException e) { + Log.e(TAG, "Error migrating to Android 13+ per-app language settings"); + } } } } From 980a35a70835858206165e825e8f5beddd695f44 Mon Sep 17 00:00:00 2001 From: Miles Krell Date: Sat, 15 Mar 2025 23:00:31 -0400 Subject: [PATCH 05/17] Move migration to separate method --- app/src/main/java/org/schabi/newpipe/App.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 992651141..d37c8bc27 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -127,20 +127,24 @@ public class App extends Application { YoutubeStreamExtractor.setPoTokenProvider(PoTokenProviderImpl.INSTANCE); if (Build.VERSION.SDK_INT >= 33) { - final String appLanguageDefaultValue = getString(R.string.default_localization_key); - final String appLanguageKey = getString(R.string.app_language_key); - final String appLanguageCurrentValue = prefs.getString(appLanguageKey, null); - if (appLanguageCurrentValue != null) { - // Migrate to Android per-app language settings - prefs.edit().remove(appLanguageKey).apply(); - if (!appLanguageCurrentValue.equals(appLanguageDefaultValue)) { - try { - AppCompatDelegate.setApplicationLocales( - LocaleListCompat.forLanguageTags(appLanguageCurrentValue) - ); - } catch (final RuntimeException e) { - Log.e(TAG, "Error migrating to Android 13+ per-app language settings"); - } + ensureAppLanguagePreferenceIsMigrated(prefs); + } + } + + private void ensureAppLanguagePreferenceIsMigrated(final SharedPreferences prefs) { + final String appLanguageDefaultValue = getString(R.string.default_localization_key); + final String appLanguageKey = getString(R.string.app_language_key); + final String appLanguageCurrentValue = prefs.getString(appLanguageKey, null); + if (appLanguageCurrentValue != null) { + // Migrate to Android per-app language settings + prefs.edit().remove(appLanguageKey).apply(); + if (!appLanguageCurrentValue.equals(appLanguageDefaultValue)) { + try { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags(appLanguageCurrentValue) + ); + } catch (final RuntimeException e) { + Log.e(TAG, "Error migrating to Android 13+ per-app language settings"); } } } From 70416e73f301046b9285cca8e885445ca07ca6ea Mon Sep 17 00:00:00 2001 From: Miles Krell Date: Sun, 16 Mar 2025 19:24:04 -0400 Subject: [PATCH 06/17] Move app language setting migration to SettingMigrations --- app/src/main/java/org/schabi/newpipe/App.java | 26 -------------- .../newpipe/settings/SettingMigrations.java | 36 ++++++++++++++++++- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index d37c8bc27..8ce161eec 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -3,14 +3,11 @@ package org.schabi.newpipe; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; -import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatDelegate; import androidx.core.app.NotificationChannelCompat; import androidx.core.app.NotificationManagerCompat; -import androidx.core.os.LocaleListCompat; import androidx.preference.PreferenceManager; import com.jakewharton.processphoenix.ProcessPhoenix; @@ -125,29 +122,6 @@ public class App extends Application { configureRxJavaErrorHandler(); YoutubeStreamExtractor.setPoTokenProvider(PoTokenProviderImpl.INSTANCE); - - if (Build.VERSION.SDK_INT >= 33) { - ensureAppLanguagePreferenceIsMigrated(prefs); - } - } - - private void ensureAppLanguagePreferenceIsMigrated(final SharedPreferences prefs) { - final String appLanguageDefaultValue = getString(R.string.default_localization_key); - final String appLanguageKey = getString(R.string.app_language_key); - final String appLanguageCurrentValue = prefs.getString(appLanguageKey, null); - if (appLanguageCurrentValue != null) { - // Migrate to Android per-app language settings - prefs.edit().remove(appLanguageKey).apply(); - if (!appLanguageCurrentValue.equals(appLanguageDefaultValue)) { - try { - AppCompatDelegate.setApplicationLocales( - LocaleListCompat.forLanguageTags(appLanguageCurrentValue) - ); - } catch (final RuntimeException e) { - Log.e(TAG, "Error migrating to Android 13+ per-app language settings"); - } - } - } } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index d731f2f5e..ce5e3a341 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -2,9 +2,12 @@ package org.schabi.newpipe.settings; import android.content.Context; import android.content.SharedPreferences; +import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.os.LocaleListCompat; import androidx.preference.PreferenceManager; import org.schabi.newpipe.App; @@ -143,6 +146,36 @@ public final class SettingMigrations { } }; + public static final Migration MIGRATION_6_7 = new Migration(6, 7) { + @Override + protected void migrate(@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 String appLanguageDefaultValue = + context.getString(R.string.default_localization_key); + final String appLanguageKey = context.getString(R.string.app_language_key); + final String appLanguageCurrentValue = sp.getString(appLanguageKey, null); + if (appLanguageCurrentValue != null) { + sp.edit().remove(appLanguageKey).apply(); + if (!appLanguageCurrentValue.equals(appLanguageDefaultValue)) { + try { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags(appLanguageCurrentValue) + ); + } catch (final RuntimeException e) { + Log.e(TAG, "Failed to migrate previous custom app language " + + "setting to public per-app language APIs" + ); + } + } + } + } + } + }; + /** * List of all implemented migrations. *

@@ -156,12 +189,13 @@ public final class SettingMigrations { MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6, + MIGRATION_6_7, }; /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - private static final int VERSION = 6; + private static final int VERSION = 7; public static void runMigrationsIfNeeded(@NonNull final Context context) { From 35abb99dac89d072a5053a8c25d2fd7409411c28 Mon Sep 17 00:00:00 2001 From: Miles Krell Date: Sun, 16 Mar 2025 20:15:38 -0400 Subject: [PATCH 07/17] Only show toast on Android <13 --- .../newpipe/settings/ContentSettingsFragment.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 575d6c733..e3e674610 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -108,9 +108,13 @@ public class ContentSettingsFragment extends BasePreferenceFragment { if (!selectedLocalization.equals(initialSelectedLocalization) || !selectedContentCountry.equals(initialSelectedContentCountry) || !selectedLanguage.equals(initialLanguage)) { - Toast.makeText(requireContext(), R.string.localization_changes_requires_app_restart, - Toast.LENGTH_LONG).show(); - + if (Build.VERSION.SDK_INT < 33) { + Toast.makeText( + requireContext(), + R.string.localization_changes_requires_app_restart, + Toast.LENGTH_LONG + ).show(); + } NewPipe.setupLocalization(selectedLocalization, selectedContentCountry); } } From c7bf498c047a7235f9285616d726c999113a82d4 Mon Sep 17 00:00:00 2001 From: Miles Krell Date: Sun, 16 Mar 2025 20:27:05 -0400 Subject: [PATCH 08/17] Don't show toast because of changing content language or country --- .../settings/ContentSettingsFragment.java | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index e3e674610..a8129f680 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -27,8 +27,6 @@ import java.util.Locale; public class ContentSettingsFragment extends BasePreferenceFragment { private String youtubeRestrictedModeEnabledKey; - private Localization initialSelectedLocalization; - private ContentCountry initialSelectedContentCountry; private String initialLanguage; @Override @@ -37,10 +35,6 @@ public class ContentSettingsFragment extends BasePreferenceFragment { addPreferencesFromResourceRegistry(); - initialSelectedLocalization = org.schabi.newpipe.util.Localization - .getPreferredLocalization(requireContext()); - initialSelectedContentCountry = org.schabi.newpipe.util.Localization - .getPreferredContentCountry(requireContext()); initialLanguage = defaultPreferences.getString(getString(R.string.app_language_key), "en"); if (Build.VERSION.SDK_INT >= 33) { @@ -98,16 +92,10 @@ public class ContentSettingsFragment extends BasePreferenceFragment { public void onDestroy() { super.onDestroy(); - final Localization selectedLocalization = org.schabi.newpipe.util.Localization - .getPreferredLocalization(requireContext()); - final ContentCountry selectedContentCountry = org.schabi.newpipe.util.Localization - .getPreferredContentCountry(requireContext()); final String selectedLanguage = defaultPreferences.getString(getString(R.string.app_language_key), "en"); - if (!selectedLocalization.equals(initialSelectedLocalization) - || !selectedContentCountry.equals(initialSelectedContentCountry) - || !selectedLanguage.equals(initialLanguage)) { + if (!selectedLanguage.equals(initialLanguage)) { if (Build.VERSION.SDK_INT < 33) { Toast.makeText( requireContext(), @@ -115,6 +103,10 @@ public class ContentSettingsFragment extends BasePreferenceFragment { Toast.LENGTH_LONG ).show(); } + final Localization selectedLocalization = org.schabi.newpipe.util.Localization + .getPreferredLocalization(requireContext()); + final ContentCountry selectedContentCountry = org.schabi.newpipe.util.Localization + .getPreferredContentCountry(requireContext()); NewPipe.setupLocalization(selectedLocalization, selectedContentCountry); } } From 6d6b73ef738c1a62466cc683a323a68938993bbf Mon Sep 17 00:00:00 2001 From: malania02 Date: Sat, 22 Mar 2025 16:09:58 +0100 Subject: [PATCH 09/17] textview for download date added --- app/src/main/res/layout/mission_item.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/src/main/res/layout/mission_item.xml b/app/src/main/res/layout/mission_item.xml index 5338949aa..c864f60f0 100644 --- a/app/src/main/res/layout/mission_item.xml +++ b/app/src/main/res/layout/mission_item.xml @@ -82,6 +82,18 @@ android:textColor="@color/white" android:textSize="12sp" /> + + From 536b78f2e6d2ad0fd93a04052153c300eda42732 Mon Sep 17 00:00:00 2001 From: malania02 Date: Sat, 22 Mar 2025 16:13:45 +0100 Subject: [PATCH 10/17] textview for download date added --- app/src/main/res/layout/mission_item_linear.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/src/main/res/layout/mission_item_linear.xml b/app/src/main/res/layout/mission_item_linear.xml index ce2d1af4b..b8cb762f2 100644 --- a/app/src/main/res/layout/mission_item_linear.xml +++ b/app/src/main/res/layout/mission_item_linear.xml @@ -62,6 +62,18 @@ android:textSize="12sp" android:textStyle="bold" /> + + Date: Sat, 22 Mar 2025 16:19:26 +0100 Subject: [PATCH 11/17] Show download date --- .../java/us/shandian/giga/ui/adapter/MissionAdapter.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index 77d270c05..b3be8efbd 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -71,6 +71,9 @@ import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; +import java.util.Date; +import java.util.Locale; +import java.text.DateFormat; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; @@ -213,6 +216,10 @@ public class MissionAdapter extends Adapter implements Handler.Callb h.status.setText("100%"); h.progress.setProgress(1.0f); h.size.setText(Utility.formatBytes(item.mission.length)); + + DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault()); + Date date = new Date(item.mission.timestamp); + h.date.setText(dateFormat.format(date)); } } From 7f10312d0af44bf013c5516f30c1e9b53cb64867 Mon Sep 17 00:00:00 2001 From: Miles Krell Date: Sun, 23 Mar 2025 17:38:14 -0400 Subject: [PATCH 12/17] Move migration to NewPipeSettings --- .../newpipe/settings/NewPipeSettings.java | 33 +++++++++++++++++ .../newpipe/settings/SettingMigrations.java | 36 +------------------ 2 files changed, 34 insertions(+), 35 deletions(-) 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 421440ea7..93640756e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -6,9 +6,12 @@ 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; @@ -42,6 +45,7 @@ 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) { @@ -64,6 +68,7 @@ public final class NewPipeSettings { saveDefaultAudioDownloadDirectory(context); disableMediaTunnelingIfNecessary(context); + migrateAppLanguageSettingIfNecessary(context); } static void saveDefaultVideoDownloadDirectory(final Context context) { @@ -184,4 +189,32 @@ 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/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index ce5e3a341..d731f2f5e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -2,12 +2,9 @@ package org.schabi.newpipe.settings; import android.content.Context; import android.content.SharedPreferences; -import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatDelegate; -import androidx.core.os.LocaleListCompat; import androidx.preference.PreferenceManager; import org.schabi.newpipe.App; @@ -146,36 +143,6 @@ public final class SettingMigrations { } }; - public static final Migration MIGRATION_6_7 = new Migration(6, 7) { - @Override - protected void migrate(@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 String appLanguageDefaultValue = - context.getString(R.string.default_localization_key); - final String appLanguageKey = context.getString(R.string.app_language_key); - final String appLanguageCurrentValue = sp.getString(appLanguageKey, null); - if (appLanguageCurrentValue != null) { - sp.edit().remove(appLanguageKey).apply(); - if (!appLanguageCurrentValue.equals(appLanguageDefaultValue)) { - try { - AppCompatDelegate.setApplicationLocales( - LocaleListCompat.forLanguageTags(appLanguageCurrentValue) - ); - } catch (final RuntimeException e) { - Log.e(TAG, "Failed to migrate previous custom app language " - + "setting to public per-app language APIs" - ); - } - } - } - } - } - }; - /** * List of all implemented migrations. *

@@ -189,13 +156,12 @@ public final class SettingMigrations { MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6, - MIGRATION_6_7, }; /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - private static final int VERSION = 7; + private static final int VERSION = 6; public static void runMigrationsIfNeeded(@NonNull final Context context) { From 205466c56a88ecf144bb43db02fc4bcf03a7994b Mon Sep 17 00:00:00 2001 From: Miles Krell Date: Thu, 27 Mar 2025 19:14:41 -0400 Subject: [PATCH 13/17] Move call to setApplicationLocales --- .../java/org/schabi/newpipe/MainActivity.java | 2 ++ .../newpipe/settings/NewPipeSettings.java | 33 ------------------- .../org/schabi/newpipe/util/Localization.java | 31 +++++++++++++++++ 3 files changed, 33 insertions(+), 33 deletions(-) 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" + ); + } + } + } + } + } } From 912f07a1dd05ffe802416e28ead6ac3e5646c18a Mon Sep 17 00:00:00 2001 From: malania02 Date: Sun, 30 Mar 2025 14:50:05 +0200 Subject: [PATCH 14/17] Missing lines added --- .../main/java/us/shandian/giga/ui/adapter/MissionAdapter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index b3be8efbd..9722a9a1f 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -211,6 +211,8 @@ public class MissionAdapter extends Adapter implements Handler.Callb h.pause.setTitle(mission.unknownLength ? R.string.stop : R.string.pause); updateProgress(h); mPendingDownloadsItems.add(h); + + h.date.setText(""); } else { h.progress.setMarquee(false); h.status.setText("100%"); @@ -839,6 +841,7 @@ public class MissionAdapter extends Adapter implements Handler.Callb ImageView icon; TextView name; TextView size; + TextView date; ProgressDrawable progress; PopupMenu popupMenu; @@ -869,6 +872,7 @@ public class MissionAdapter extends Adapter implements Handler.Callb name = itemView.findViewById(R.id.item_name); icon = itemView.findViewById(R.id.item_icon); size = itemView.findViewById(R.id.item_size); + date = itemView.findViewById(R.id.item_date); name.setSelected(true); From e1dedd45ed99e2c52eb062d1fceb2d233bbeee89 Mon Sep 17 00:00:00 2001 From: FineFindus Date: Wed, 2 Apr 2025 22:14:01 +0200 Subject: [PATCH 15/17] [YouTube] Access first element if array size is one Fixes a regression, where if the challenge data array size was one, the second element would be accessed, leading to a crash. This was introduced when porting the challenge parsing from JS to Kotlin. Ref: https://github.com/TeamNewPipe/NewPipe/commit/53b599b042ff23cf2e74e3e8d90609b574a30fd1 --- .../main/java/org/schabi/newpipe/util/potoken/JavaScriptUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/JavaScriptUtil.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/JavaScriptUtil.kt index a9169e2c6..06740a00e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/JavaScriptUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/JavaScriptUtil.kt @@ -17,7 +17,7 @@ fun parseChallengeData(rawChallengeData: String): String { val descrambled = descramble(scrambled.getString(1)) JsonParser.array().from(descrambled) } else { - scrambled.getArray(1) + scrambled.getArray(0) } val messageId = challengeData.getString(0) From f39eda086f22e88ccdec47a0bbce87bad20d6ed4 Mon Sep 17 00:00:00 2001 From: malania02 Date: Wed, 9 Apr 2025 23:40:14 +0200 Subject: [PATCH 16/17] Fix for overlapping --- app/src/main/res/layout/mission_item_linear.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/mission_item_linear.xml b/app/src/main/res/layout/mission_item_linear.xml index b8cb762f2..6288e4759 100644 --- a/app/src/main/res/layout/mission_item_linear.xml +++ b/app/src/main/res/layout/mission_item_linear.xml @@ -67,7 +67,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/item_name" - android:layout_alignParentRight="true" + android:layout_toLeftOf="@id/item_more" android:padding="6dp" android:singleLine="true" android:text="" From c9542ad6fd6ca7a0d6fbb0d76c3b133fcaf342b5 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 27 Apr 2025 07:43:52 +0530 Subject: [PATCH 17/17] Update extractor --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4813b8456..7c564f9e9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -54,7 +54,7 @@ swiperefreshlayout = "1.1.0" # This works thanks to JitPack: https://jitpack.io/ teamnewpipe-filepicker = "5.0.0" teamnewpipe-nanojson = "1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" -teamnewpipe-newpipe-extractor = "0b99100db" +teamnewpipe-newpipe-extractor = "67f3301d9" webkit = "1.9.0" work = "2.8.1"