From b232c29d226016072c88e9e3985c327d591c7ba0 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Mon, 22 Aug 2022 21:26:19 +0530 Subject: [PATCH 1/3] Use Locale.forLanguageTag(). --- .../extractor/localization/Localization.java | 20 ++++------------ .../extractor/stream/SubtitlesStream.java | 23 +++---------------- 2 files changed, 7 insertions(+), 36 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/localization/Localization.java b/extractor/src/main/java/org/schabi/newpipe/extractor/localization/Localization.java index 0a28d70b..c5f6edcf 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/localization/Localization.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/localization/Localization.java @@ -2,9 +2,6 @@ package org.schabi.newpipe.extractor.localization; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -14,6 +11,9 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + public class Localization implements Serializable { public static final Localization DEFAULT = new Localization("en", "GB"); @@ -38,19 +38,7 @@ public class Localization implements Serializable { * @param localizationCode a localization code, formatted like {@link #getLocalizationCode()} */ public static Localization fromLocalizationCode(final String localizationCode) { - final int indexSeparator = localizationCode.indexOf("-"); - - final String languageCode; - final String countryCode; - if (indexSeparator != -1) { - languageCode = localizationCode.substring(0, indexSeparator); - countryCode = localizationCode.substring(indexSeparator + 1); - } else { - languageCode = localizationCode; - countryCode = null; - } - - return new Localization(languageCode, countryCode); + return fromLocale(Locale.forLanguageTag(localizationCode)); } public Localization(@Nonnull final String languageCode, @Nullable final String countryCode) { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java index 778a85c9..f9ef1f5f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.extractor.stream; +import static org.schabi.newpipe.extractor.utils.Utils.EMPTY_STRING; + import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.services.youtube.ItagItem; @@ -230,26 +232,7 @@ public final class SubtitlesStream extends Stream { final boolean autoGenerated, @Nullable final String manifestUrl) { super(id, content, isUrl, mediaFormat, deliveryMethod, manifestUrl); - - /* - * Locale.forLanguageTag only for Android API >= 21 - * Locale.Builder only for Android API >= 21 - * Country codes doesn't work well without - */ - final String[] splits = languageCode.split("-"); - switch (splits.length) { - case 2: - this.locale = new Locale(splits[0], splits[1]); - break; - case 3: - // Complex variants don't work! - this.locale = new Locale(splits[0], splits[1], splits[2]); - break; - default: - this.locale = new Locale(splits[0]); - break; - } - + this.locale = Locale.forLanguageTag(languageCode); this.code = languageCode; this.format = mediaFormat; this.autoGenerated = autoGenerated; From b90a566dd82de7024e2f493984769025d38450c8 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Fri, 26 Aug 2022 06:00:40 +0530 Subject: [PATCH 2/3] Add backport implementation of Locale.forLanguageTag(). --- .../extractor/localization/Localization.java | 3 +- .../extractor/stream/SubtitlesStream.java | 3 +- .../newpipe/extractor/utils/LocaleCompat.java | 36 +++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/utils/LocaleCompat.java diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/localization/Localization.java b/extractor/src/main/java/org/schabi/newpipe/extractor/localization/Localization.java index c5f6edcf..80ac2666 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/localization/Localization.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/localization/Localization.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.extractor.localization; import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.utils.LocaleCompat; import java.io.Serializable; import java.util.ArrayList; @@ -38,7 +39,7 @@ public class Localization implements Serializable { * @param localizationCode a localization code, formatted like {@link #getLocalizationCode()} */ public static Localization fromLocalizationCode(final String localizationCode) { - return fromLocale(Locale.forLanguageTag(localizationCode)); + return fromLocale(LocaleCompat.forLanguageTag(localizationCode)); } public Localization(@Nonnull final String languageCode, @Nullable final String countryCode) { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java index f9ef1f5f..5c581aa4 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java @@ -4,6 +4,7 @@ import static org.schabi.newpipe.extractor.utils.Utils.EMPTY_STRING; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.services.youtube.ItagItem; +import org.schabi.newpipe.extractor.utils.LocaleCompat; import java.util.Locale; @@ -232,7 +233,7 @@ public final class SubtitlesStream extends Stream { final boolean autoGenerated, @Nullable final String manifestUrl) { super(id, content, isUrl, mediaFormat, deliveryMethod, manifestUrl); - this.locale = Locale.forLanguageTag(languageCode); + this.locale = LocaleCompat.forLanguageTag(languageCode); this.code = languageCode; this.format = mediaFormat; this.autoGenerated = autoGenerated; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/utils/LocaleCompat.java b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/LocaleCompat.java new file mode 100644 index 00000000..fd5af4d6 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/LocaleCompat.java @@ -0,0 +1,36 @@ +package org.schabi.newpipe.extractor.utils; + +import java.util.Locale; + +public class LocaleCompat { + private LocaleCompat() { + } + + // Source: LocaleListCompat's private forLanguageTagCompat() method. + // Use Locale.forLanguageTag() on API level >= 21 instead. + public static Locale forLanguageTag(final String str) { + if (str.contains("-")) { + String[] args = str.split("-", -1); + if (args.length > 2) { + return new Locale(args[0], args[1], args[2]); + } else if (args.length > 1) { + return new Locale(args[0], args[1]); + } else if (args.length == 1) { + return new Locale(args[0]); + } + } else if (str.contains("_")) { + String[] args = str.split("_", -1); + if (args.length > 2) { + return new Locale(args[0], args[1], args[2]); + } else if (args.length > 1) { + return new Locale(args[0], args[1]); + } else if (args.length == 1) { + return new Locale(args[0]); + } + } else { + return new Locale(str); + } + + throw new IllegalArgumentException("Can not parse language tag: [" + str + "]"); + } +} From 3b80547976185e914474576531b87b58b485a936 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Tue, 29 Nov 2022 08:59:27 +0530 Subject: [PATCH 3/3] Add code review suggestions. --- .../extractor/stream/SubtitlesStream.java | 2 -- .../newpipe/extractor/utils/LocaleCompat.java | 17 ++++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java index 5c581aa4..983d20ce 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java @@ -1,7 +1,5 @@ package org.schabi.newpipe.extractor.stream; -import static org.schabi.newpipe.extractor.utils.Utils.EMPTY_STRING; - import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.services.youtube.ItagItem; import org.schabi.newpipe.extractor.utils.LocaleCompat; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/utils/LocaleCompat.java b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/LocaleCompat.java index fd5af4d6..ca69ec14 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/utils/LocaleCompat.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/LocaleCompat.java @@ -2,15 +2,22 @@ package org.schabi.newpipe.extractor.utils; import java.util.Locale; -public class LocaleCompat { +/** + * This class contains a simple implementation of {@link Locale#forLanguageTag(String)} for Android + * API levels below 21 (Lollipop). This is needed as core library desugaring does not backport that + * method as of this writing. + * + * Relevant issue: https://issuetracker.google.com/issues/171182330 + */ +public final class LocaleCompat { private LocaleCompat() { } - // Source: LocaleListCompat's private forLanguageTagCompat() method. - // Use Locale.forLanguageTag() on API level >= 21 instead. + // Source: The AndroidX LocaleListCompat class's private forLanguageTagCompat() method. + // Use Locale.forLanguageTag() on Android API level >= 21 / Java instead. public static Locale forLanguageTag(final String str) { if (str.contains("-")) { - String[] args = str.split("-", -1); + final String[] args = str.split("-", -1); if (args.length > 2) { return new Locale(args[0], args[1], args[2]); } else if (args.length > 1) { @@ -19,7 +26,7 @@ public class LocaleCompat { return new Locale(args[0]); } } else if (str.contains("_")) { - String[] args = str.split("_", -1); + final String[] args = str.split("_", -1); if (args.length > 2) { return new Locale(args[0], args[1], args[2]); } else if (args.length > 1) {