Skip to content

Commit aed4278

Browse files
committed
Unify getString for compatibility
(read the method's javadoc for why)
1 parent 3ab1322 commit aed4278

5 files changed

Lines changed: 54 additions & 14 deletions

File tree

app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentExcepti
2828
import org.schabi.newpipe.ktx.isNetworkRelated
2929
import org.schabi.newpipe.player.mediasource.FailedMediaSource
3030
import org.schabi.newpipe.player.resolver.PlaybackResolver
31+
import org.schabi.newpipe.util.Localization
3132
import java.net.UnknownHostException
3233

3334
/**
@@ -147,13 +148,11 @@ class ErrorInfo private constructor(
147148
private vararg val formatArgs: String,
148149
) : Parcelable {
149150
fun getString(context: Context): String {
151+
// use Localization.compatGetString() just in case context is not AppCompatActivity
150152
return if (formatArgs.isEmpty()) {
151-
// use ContextCompat.getString() just in case context is not AppCompatActivity
152-
ContextCompat.getString(context, stringRes)
153+
Localization.compatGetString(context, stringRes)
153154
} else {
154-
// ContextCompat.getString() with formatArgs does not exist, so we just
155-
// replicate its source code but with formatArgs
156-
ContextCompat.getContextForLanguage(context).getString(stringRes, *formatArgs)
155+
Localization.compatGetString(context, stringRes, *formatArgs)
157156
}
158157
}
159158
}

app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import android.os.Bundle
66
import android.os.ResultReceiver
77
import android.support.v4.media.session.PlaybackStateCompat
88
import android.util.Log
9-
import androidx.core.content.ContextCompat
109
import androidx.core.net.toUri
1110
import com.google.android.exoplayer2.Player
1211
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackPreparer
@@ -29,6 +28,7 @@ import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue
2928
import org.schabi.newpipe.player.playqueue.SinglePlayQueue
3029
import org.schabi.newpipe.util.ChannelTabHelper
3130
import org.schabi.newpipe.util.ExtractorHelper
31+
import org.schabi.newpipe.util.Localization
3232
import org.schabi.newpipe.util.NavigationHelper
3333
import java.util.function.BiConsumer
3434
import java.util.function.Consumer
@@ -111,7 +111,7 @@ class MediaBrowserPlaybackPreparer(
111111
//region Errors
112112
private fun onUnsupportedError() {
113113
setMediaSessionError.accept(
114-
ContextCompat.getString(context, R.string.content_not_supported),
114+
Localization.compatGetString(context, R.string.content_not_supported),
115115
PlaybackStateCompat.ERROR_CODE_NOT_SUPPORTED
116116
)
117117
}

app/src/main/java/org/schabi/newpipe/settings/viewmodel/SettingsViewModel.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package org.schabi.newpipe.settings.viewmodel
33
import android.app.Application
44
import android.content.Context
55
import android.content.SharedPreferences
6-
import androidx.core.content.ContextCompat
76
import androidx.lifecycle.AndroidViewModel
87
import dagger.hilt.android.lifecycle.HiltViewModel
98
import dagger.hilt.android.qualifiers.ApplicationContext
109
import kotlinx.coroutines.flow.MutableStateFlow
1110
import kotlinx.coroutines.flow.asStateFlow
1211
import org.schabi.newpipe.R
12+
import org.schabi.newpipe.util.Localization
1313
import javax.inject.Inject
1414

1515
@HiltViewModel
@@ -20,11 +20,12 @@ class SettingsViewModel @Inject constructor(
2020

2121
private var _settingsLayoutRedesignPref: Boolean
2222
get() = preferenceManager.getBoolean(
23-
ContextCompat.getString(getApplication(), R.string.settings_layout_redesign_key), false
23+
Localization.compatGetString(getApplication(), R.string.settings_layout_redesign_key),
24+
false
2425
)
2526
set(value) {
2627
preferenceManager.edit().putBoolean(
27-
ContextCompat.getString(getApplication(), R.string.settings_layout_redesign_key),
28+
Localization.compatGetString(getApplication(), R.string.settings_layout_redesign_key),
2829
value
2930
).apply()
3031
}

app/src/main/java/org/schabi/newpipe/util/Localization.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import androidx.annotation.PluralsRes;
1919
import androidx.annotation.StringRes;
2020
import androidx.appcompat.app.AppCompatDelegate;
21+
import androidx.core.content.ContextCompat;
2122
import androidx.core.math.MathUtils;
2223
import androidx.core.os.LocaleListCompat;
2324
import androidx.preference.PreferenceManager;
@@ -71,6 +72,46 @@ public final class Localization {
7172

7273
private Localization() { }
7374

75+
/**
76+
* Gets a string like you would normally do with {@link Context#getString}, except that when
77+
* Context is not an AppCompatActivity the correct locale is still used. The latter step uses
78+
* {@link ContextCompat#getString}, which might fail if the Locale system service is not
79+
* available (e.g. inside of Compose previews). In that case this method falls back to plain old
80+
* {@link Context#getString}.
81+
* <p>This method also supports format args (see {@link #compatGetString(Context, int,
82+
* Object...)}, unlike {@link ContextCompat#getString}.</p>
83+
*
84+
* @param context any Android context, even the App context
85+
* @param resId the string resource to resolve
86+
* @return the resolved string
87+
*/
88+
public static String compatGetString(final Context context, @StringRes final int resId) {
89+
try {
90+
return ContextCompat.getString(context, resId);
91+
} catch (final Throwable e) {
92+
return context.getString(resId);
93+
}
94+
}
95+
96+
/**
97+
* @see #compatGetString(Context, int)
98+
* @param context any Android context, even the App context
99+
* @param resId the string resource to resolve
100+
* @param formatArgs the formatting arguments
101+
* @return the resolved string
102+
*/
103+
public static String compatGetString(final Context context,
104+
@StringRes final int resId,
105+
final Object... formatArgs) {
106+
try {
107+
// ContextCompat.getString() with formatArgs does not exist, so we just
108+
// replicate its source code but with formatArgs
109+
return ContextCompat.getContextForLanguage(context).getString(resId, formatArgs);
110+
} catch (final Throwable e) {
111+
return context.getString(resId, formatArgs);
112+
}
113+
}
114+
74115
@NonNull
75116
public static String concatenateStrings(final String... strings) {
76117
return concatenateStrings(DOT_SEPARATOR, Arrays.asList(strings));

app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -641,10 +641,9 @@ public static void openAbout(final Context context) {
641641

642642
public static void openSettings(final Context context) {
643643
final Class<?> settingsClass = PreferenceManager.getDefaultSharedPreferences(context)
644-
.getBoolean(
645-
ContextCompat.getString(context, R.string.settings_layout_redesign_key),
646-
false
647-
) ? SettingsV2Activity.class : SettingsActivity.class;
644+
.getBoolean(Localization.compatGetString(context,
645+
R.string.settings_layout_redesign_key), false)
646+
? SettingsV2Activity.class : SettingsActivity.class;
648647

649648
final Intent intent = new Intent(context, settingsClass);
650649
context.startActivity(intent);

0 commit comments

Comments
 (0)