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 78b90baddd1c6f..ab96ecfdfdda2e 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 void onReceive(Context context, Intent intent) { 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 55cfb20215a916..f80b1c65618a62 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.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 void onProgress( } 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 804e9d7b023e81..8053ece767a0b0 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.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 int getResourceDrawableId(Context context, @Nullable String name) { 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 df6cc09407b081..99ae31e7d501c7 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 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 void setCursorColor(ReactEditText view, @Nullable Integer color) { } private static boolean shouldHideCursorForEmailTextInput() { - String manufacturer = Build.MANUFACTURER.toLowerCase(); + String manufacturer = Build.MANUFACTURER.toLowerCase(Locale.ROOT); return (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q && manufacturer.contains("xiaomi")); }