From 5341ad896245c40a00b6faead1b90d01aac58f8c Mon Sep 17 00:00:00 2001 From: Hamid Date: Wed, 9 Feb 2022 14:05:02 -0800 Subject: [PATCH] use root locale when converting string case (#33028) Summary: Not setting locale for language/country neutral operation may cause bug depending on the default locale. See https://docs.oracle.com/javase/7/docs/api/java/util/Locale.html#ROOT Note: I am just searching for toLowerCase() and toUppercase() in my project's dependencies and send the same PR, in order to just be considered. Although I've seen the lack of explicit locale has caused issues for us, I am not sure if react-native is actually affected. I haven't checked for `String.format()` yet. Example related issue: joltup/rn-fetch-blob#573 ## Changelog [Android] [Fixed] - Use root locale when converting string case. Pull Request resolved: https://github.com/facebook/react-native/pull/33028 Reviewed By: ShikaSD Differential Revision: D33943446 Pulled By: cortinico fbshipit-source-id: d5be9392ea7c21a33436acac5b5e8c50b7c7e31e --- .../com/facebook/react/devsupport/DevSupportManagerBase.java | 2 +- .../com/facebook/react/modules/network/NetworkingModule.java | 5 ++++- .../react/views/imagehelper/ResourceDrawableIdHelper.java | 3 ++- .../react/views/textinput/ReactTextInputManager.java | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java index 78b90baddd1..ab96ecfdfdd 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java @@ -198,7 +198,7 @@ public abstract class DevSupportManagerBase implements DevSupportManager { final String bundleFile = subclassTag + "ReactNativeDevBundle.js"; mJSBundleDownloadedFile = new File(applicationContext.getFilesDir(), bundleFile); - final String splitBundlesDir = subclassTag.toLowerCase() + "_dev_js_split_bundles"; + final String splitBundlesDir = subclassTag.toLowerCase(Locale.ROOT) + "_dev_js_split_bundles"; mJSSplitBundlesDir = mApplicationContext.getDir(splitBundlesDir, Context.MODE_PRIVATE); mDefaultNativeModuleCallExceptionHandler = new DefaultNativeModuleCallExceptionHandler(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java index 55cfb20215a..f80b1c65618 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java @@ -30,6 +30,7 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.concurrent.TimeUnit; import okhttp3.Call; @@ -376,7 +377,9 @@ public final class NetworkingModule extends NativeNetworkingAndroidSpec { } RequestBody requestBody; - if (data == null || method.toLowerCase().equals("get") || method.toLowerCase().equals("head")) { + if (data == null + || method.toLowerCase(Locale.ROOT).equals("get") + || method.toLowerCase(Locale.ROOT).equals("head")) { requestBody = RequestBodyUtil.getEmptyBody(method); } else if (handler != null) { requestBody = handler.toRequestBody(data, contentType); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java index 804e9d7b023..8053ece767a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java @@ -12,6 +12,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import androidx.annotation.Nullable; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import javax.annotation.concurrent.ThreadSafe; @@ -47,7 +48,7 @@ public class ResourceDrawableIdHelper { if (name == null || name.isEmpty()) { return 0; } - name = name.toLowerCase().replace("-", "_"); + name = name.toLowerCase(Locale.ROOT).replace("-", "_"); // name could be a resource id. try { diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java index df6cc09407b..99ae31e7d50 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java @@ -75,6 +75,7 @@ import com.facebook.yoga.YogaConstants; import java.lang.reflect.Field; import java.util.HashMap; import java.util.LinkedList; +import java.util.Locale; import java.util.Map; /** Manages instances of TextInput. */ @@ -569,7 +570,7 @@ public class ReactTextInputManager extends BaseViewManager