From 0af842347bbc507b54fc93f587b72974b5cf177b Mon Sep 17 00:00:00 2001 From: Joao Pedro Date: Tue, 2 Jan 2024 14:54:02 -0400 Subject: [PATCH 1/2] Add code to hide dropdown icon on Android --- .../reactnativecommunity/picker/ReactPicker.java | 13 +++++++++++++ .../picker/ReactPickerManager.java | 5 +++++ android/src/main/jni/conversions.h | 2 ++ .../RNCAndroidDialogPickerManagerDelegate.java | 3 +++ .../RNCAndroidDialogPickerManagerInterface.java | 1 + .../RNCAndroidDropdownPickerManagerDelegate.java | 3 +++ .../RNCAndroidDropdownPickerManagerInterface.java | 1 + js/AndroidDialogPickerNativeComponent.js | 1 + js/AndroidDropdownPickerNativeComponent.js | 1 + js/PickerAndroid.android.js | 2 ++ typings/Picker.d.ts | 5 +++++ 11 files changed, 37 insertions(+) diff --git a/android/src/main/java/com/reactnativecommunity/picker/ReactPicker.java b/android/src/main/java/com/reactnativecommunity/picker/ReactPicker.java index f215c41e20..3d83ac754c 100644 --- a/android/src/main/java/com/reactnativecommunity/picker/ReactPicker.java +++ b/android/src/main/java/com/reactnativecommunity/picker/ReactPicker.java @@ -285,6 +285,19 @@ public void setDropdownIconRippleColor(@Nullable int color) { backgroundDrawable.setColor(ColorStateList.valueOf(color)); } + public void setDropdownIconVisible(@Nullable boolean visible) { + LayerDrawable drawable = (LayerDrawable) this.getBackground(); + RippleDrawable backgroundDrawable = (RippleDrawable) drawable.findDrawableByLayerId(R.id.dropdown_icon); + + if (visible) { + backgroundDrawable.setAlpha(255); + } + else { + backgroundDrawable.setAlpha(0); + } + + } + public void setBackgroundColor(@Nullable int color) { LayerDrawable drawable = (LayerDrawable) this.getBackground(); GradientDrawable backgroundDrawable = (GradientDrawable) drawable.findDrawableByLayerId(R.id.dropdown_background); diff --git a/android/src/main/java/com/reactnativecommunity/picker/ReactPickerManager.java b/android/src/main/java/com/reactnativecommunity/picker/ReactPickerManager.java index 6299432d9f..198507658b 100644 --- a/android/src/main/java/com/reactnativecommunity/picker/ReactPickerManager.java +++ b/android/src/main/java/com/reactnativecommunity/picker/ReactPickerManager.java @@ -181,6 +181,11 @@ public void setDropdownIconRippleColor(ReactPicker view, @Nullable int color) { view.setDropdownIconRippleColor(color); } + @ReactProp(name = "dropdownIconVisible") + public void setDropdownIconVisible(ReactPicker view, @Nullable boolean visible) { + view.setDropdownIconVisible(visible); + } + @ReactProp(name = ViewProps.NUMBER_OF_LINES, defaultInt = 1) public void setNumberOfLines(ReactPicker view, int numberOfLines) { ReactPickerAdapter adapter = (ReactPickerAdapter) view.getAdapter(); diff --git a/android/src/main/jni/conversions.h b/android/src/main/jni/conversions.h index cbeacff8ab..0c38b556c9 100644 --- a/android/src/main/jni/conversions.h +++ b/android/src/main/jni/conversions.h @@ -50,6 +50,7 @@ namespace facebook values["backgroundColor"] = props.backgroundColor; values["dropdownIconColor"] = props.dropdownIconColor; values["dropdownIconRippleColor"] = props.dropdownIconRippleColor; + values["dropdownIconVisible"] = props.dropdownIconVisible; values["numberOfLines"] = props.numberOfLines; values["mode"] = "dialog"; @@ -97,6 +98,7 @@ namespace facebook values["backgroundColor"] = props.backgroundColor; values["dropdownIconColor"] = props.dropdownIconColor; values["dropdownIconRippleColor"] = props.dropdownIconRippleColor; + values["dropdownIconVisible"] = props.dropdownIconVisible; values["numberOfLines"] = props.numberOfLines; values["mode"] = "dropdown"; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDialogPickerManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDialogPickerManagerDelegate.java index ec47a941ac..b53a3a2af4 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDialogPickerManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDialogPickerManagerDelegate.java @@ -47,6 +47,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "dropdownIconRippleColor": mViewManager.setDropdownIconRippleColor(view, value == null ? 0 : ((Double) value).intValue()); break; + case "dropdownIconVisible": + mViewManager.setDropdownIconVisible(view, value == null ? true : (boolean) value); + break; case "numberOfLines": mViewManager.setNumberOfLines(view, value == null ? 0 : ((Double) value).intValue()); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDialogPickerManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDialogPickerManagerInterface.java index 0e276a1ee9..847a3b4792 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDialogPickerManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDialogPickerManagerInterface.java @@ -22,6 +22,7 @@ public interface RNCAndroidDialogPickerManagerInterface { void setBackgroundColor(T view, int value); void setDropdownIconColor(T view, int value); void setDropdownIconRippleColor(T view, int value); + void setDropdownIconVisible(T view, boolean value); void setNumberOfLines(T view, int value); void focus(T view); void blur(T view); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDropdownPickerManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDropdownPickerManagerDelegate.java index 4ee8df37f1..3010eb3fce 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDropdownPickerManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDropdownPickerManagerDelegate.java @@ -47,6 +47,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "dropdownIconRippleColor": mViewManager.setDropdownIconRippleColor(view, value == null ? 0 : ((Double) value).intValue()); break; + case "dropdownIconVisible": + mViewManager.setDropdownIconVisible(view, value == null ? true : (boolean) value); + break; case "numberOfLines": mViewManager.setNumberOfLines(view, value == null ? 0 : ((Double) value).intValue()); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDropdownPickerManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDropdownPickerManagerInterface.java index 8a7b516cb7..c3ac78455f 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDropdownPickerManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNCAndroidDropdownPickerManagerInterface.java @@ -22,6 +22,7 @@ public interface RNCAndroidDropdownPickerManagerInterface { void setBackgroundColor(T view, int value); void setDropdownIconColor(T view, int value); void setDropdownIconRippleColor(T view, int value); + void setDropdownIconVisible(T view, boolean value); void setNumberOfLines(T view, int value); void focus(T view); void blur(T view); diff --git a/js/AndroidDialogPickerNativeComponent.js b/js/AndroidDialogPickerNativeComponent.js index 444b9195f4..fb422cc4e9 100644 --- a/js/AndroidDialogPickerNativeComponent.js +++ b/js/AndroidDialogPickerNativeComponent.js @@ -53,6 +53,7 @@ type NativeProps = $ReadOnly<{| backgroundColor?: Int32, dropdownIconColor?: Int32, dropdownIconRippleColor?: Int32, + dropdownIconVisible?: ?boolean, numberOfLines?: ?Int32, onSelect?: BubblingEventHandler, onFocus?: BubblingEventHandler, diff --git a/js/AndroidDropdownPickerNativeComponent.js b/js/AndroidDropdownPickerNativeComponent.js index 6666e539a5..01225b50d2 100644 --- a/js/AndroidDropdownPickerNativeComponent.js +++ b/js/AndroidDropdownPickerNativeComponent.js @@ -53,6 +53,7 @@ type NativeProps = $ReadOnly<{| backgroundColor?: Int32, dropdownIconColor?: Int32, dropdownIconRippleColor?: Int32, + dropdownIconVisible?: ?boolean, numberOfLines?: ?Int32, onSelect?: BubblingEventHandler, onFocus?: BubblingEventHandler, diff --git a/js/PickerAndroid.android.js b/js/PickerAndroid.android.js index bdc5a8a05b..59c55e45bf 100644 --- a/js/PickerAndroid.android.js +++ b/js/PickerAndroid.android.js @@ -40,6 +40,7 @@ type PickerAndroidProps = $ReadOnly<{| prompt?: ?string, testID?: string, dropdownIconColor?: string, + dropdownIconVisible?: ?boolean, numberOfLines?: ?number, |}>; @@ -230,6 +231,7 @@ function PickerAndroid(props: PickerAndroidProps, ref: PickerRef): React.Node { style: props.style, dropdownIconColor: processColor(props.dropdownIconColor), dropdownIconRippleColor: processColor(props.dropdownIconRippleColor), + dropdownIconVisible: props.dropdownIconVisible, testID: props.testID, numberOfLines: props.numberOfLines, }; diff --git a/typings/Picker.d.ts b/typings/Picker.d.ts index 67a1e4b60f..109bb3901c 100644 --- a/typings/Picker.d.ts +++ b/typings/Picker.d.ts @@ -95,6 +95,11 @@ export interface PickerProps extends ViewProps { * @platform android */ dropdownIconRippleColor?: number | ColorValue; + /** + * Visibility of spinner's arrow + * @platform android + */ + dropdownIconVisible?: boolean; /** * On Android & iOS, used to truncate the text with an ellipsis after computing the text layout, including line wrapping, * such that the total number of lines does not exceed this number. Default is '1' From 55dd8d5af9f87b62b44680885a48d5ed78ea7ce9 Mon Sep 17 00:00:00 2001 From: Joao Pedro <47327515+JoaoPLF@users.noreply.github.com> Date: Fri, 5 Jan 2024 06:25:38 -0400 Subject: [PATCH 2/2] Fix NullPointerException issue --- .../main/java/com/reactnativecommunity/picker/ReactPicker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/reactnativecommunity/picker/ReactPicker.java b/android/src/main/java/com/reactnativecommunity/picker/ReactPicker.java index 3d83ac754c..b24c6cee18 100644 --- a/android/src/main/java/com/reactnativecommunity/picker/ReactPicker.java +++ b/android/src/main/java/com/reactnativecommunity/picker/ReactPicker.java @@ -289,7 +289,7 @@ public void setDropdownIconVisible(@Nullable boolean visible) { LayerDrawable drawable = (LayerDrawable) this.getBackground(); RippleDrawable backgroundDrawable = (RippleDrawable) drawable.findDrawableByLayerId(R.id.dropdown_icon); - if (visible) { + if (Boolean.TRUE.equals(visible)) { backgroundDrawable.setAlpha(255); } else {