Remove Picker from OSS

Summary: Changelog: [General][Removed] - Remove Picker code from Android

Reviewed By: ShikaSD

Differential Revision: D29123164

fbshipit-source-id: 4471ea5f52885735ead07a656452ed5ef2bff65b
This commit is contained in:
Luna Wei
2021-06-21 22:59:30 -07:00
committed by Facebook GitHub Bot
parent 7f117394af
commit 77366cd869
34 changed files with 1 additions and 1340 deletions
@@ -11,7 +11,7 @@ LOCAL_MODULE := fabricjni
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_SHARED_LIBRARIES := libreactconfig librrc_slider librrc_progressbar librrc_switch librrc_modal libyoga libglog libfb libfbjni libglog_init libfolly_json libfolly_futures libreact_render_mounting libreactnativeutilsjni libreact_utils libreact_render_debug libreact_render_graphics libreact_render_core react_render_componentregistry librrc_view librrc_unimplementedview librrc_root librrc_scrollview libbetter libreact_render_attributedstring libreact_render_uimanager libreact_render_templateprocessor libreact_render_scheduler libreact_render_animations libreact_render_imagemanager libreact_render_textlayoutmanager libreact_codegen_rncore rrc_text librrc_image librrc_textinput librrc_picker libreact_debug libreact_render_mapbuffer libmapbufferjni libreact_render_telemetry
LOCAL_SHARED_LIBRARIES := libreactconfig librrc_slider librrc_progressbar librrc_switch librrc_modal libyoga libglog libfb libfbjni libglog_init libfolly_json libfolly_futures libreact_render_mounting libreactnativeutilsjni libreact_utils libreact_render_debug libreact_render_graphics libreact_render_core react_render_componentregistry librrc_view librrc_unimplementedview librrc_root librrc_scrollview libbetter libreact_render_attributedstring libreact_render_uimanager libreact_render_templateprocessor libreact_render_scheduler libreact_render_animations libreact_render_imagemanager libreact_render_textlayoutmanager libreact_codegen_rncore rrc_text librrc_image librrc_textinput libreact_debug libreact_render_mapbuffer libmapbufferjni libreact_render_telemetry
LOCAL_STATIC_LIBRARIES :=
@@ -43,7 +43,6 @@ $(call import-module,react/renderer/core)
$(call import-module,react/renderer/components/image)
$(call import-module,react/renderer/components/modal)
$(call import-module,react/renderer/components/root)
$(call import-module,react/renderer/components/picker)
$(call import-module,react/renderer/components/progressbar)
$(call import-module,react/renderer/components/scrollview)
$(call import-module,react/renderer/components/slider)
@@ -47,7 +47,6 @@ rn_xplat_cxx_library(
"//xplat/js/react-native-github:generated_components-rncore",
react_native_xplat_target("react/renderer/components/image:image"),
react_native_xplat_target("react/renderer/components/modal:modal"),
react_native_xplat_target("react/renderer/components/picker:androidpicker"),
react_native_xplat_target("react/renderer/components/slider:slider"),
react_native_xplat_target("react/renderer/components/switch:androidswitch"),
react_native_xplat_target("react/renderer/components/progressbar:androidprogressbar"),
@@ -12,8 +12,6 @@
#include <fbjni/fbjni.h>
#include <react/renderer/componentregistry/ComponentDescriptorRegistry.h>
#include <react/renderer/components/androidpicker/AndroidDialogPickerComponentDescriptor.h>
#include <react/renderer/components/androidpicker/AndroidDropdownPickerComponentDescriptor.h>
#include <react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h>
#include <react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h>
#include <react/renderer/components/image/ImageComponentDescriptor.h>
@@ -71,10 +69,6 @@ CoreComponentsRegistry::sharedProviderRegistry() {
concreteComponentDescriptorProvider<ParagraphComponentDescriptor>());
providerRegistry->add(concreteComponentDescriptorProvider<
AndroidDrawerLayoutComponentDescriptor>());
providerRegistry->add(concreteComponentDescriptorProvider<
AndroidDialogPickerComponentDescriptor>());
providerRegistry->add(concreteComponentDescriptorProvider<
AndroidDropdownPickerComponentDescriptor>());
return providerRegistry;
}();
@@ -55,7 +55,6 @@ rn_android_library(
react_native_target("java/com/facebook/react/views/drawer:drawer"),
react_native_target("java/com/facebook/react/views/image:image"),
react_native_target("java/com/facebook/react/views/modal:modal"),
react_native_target("java/com/facebook/react/views/picker:picker"),
react_native_target("java/com/facebook/react/views/progressbar:progressbar"),
react_native_target("java/com/facebook/react/views/scroll:scroll"),
react_native_target("java/com/facebook/react/views/slider:slider"),
@@ -43,8 +43,6 @@ import com.facebook.react.uimanager.ViewManager;
import com.facebook.react.views.drawer.ReactDrawerLayoutManager;
import com.facebook.react.views.image.ReactImageManager;
import com.facebook.react.views.modal.ReactModalHostManager;
import com.facebook.react.views.picker.ReactDialogPickerManager;
import com.facebook.react.views.picker.ReactDropdownPickerManager;
import com.facebook.react.views.progressbar.ReactProgressBarViewManager;
import com.facebook.react.views.scroll.ReactHorizontalScrollContainerViewManager;
import com.facebook.react.views.scroll.ReactHorizontalScrollViewManager;
@@ -160,9 +158,7 @@ public class MainReactPackage extends TurboReactPackage {
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
List<ViewManager> viewManagers = new ArrayList<>();
viewManagers.add(new ReactDialogPickerManager());
viewManagers.add(new ReactDrawerLayoutManager());
viewManagers.add(new ReactDropdownPickerManager());
viewManagers.add(new ReactHorizontalScrollViewManager());
viewManagers.add(new ReactHorizontalScrollContainerViewManager());
viewManagers.add(new ReactProgressBarViewManager());
@@ -1,48 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @generated by codegen project: GeneratePropsJavaDelegate.js
*/
package com.facebook.react.viewmanagers;
import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.uimanager.BaseViewManagerDelegate;
import com.facebook.react.uimanager.BaseViewManagerInterface;
import com.facebook.react.uimanager.LayoutShadowNode;
public class AndroidDialogPickerManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & AndroidDialogPickerManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
public AndroidDialogPickerManagerDelegate(U viewManager) {
super(viewManager);
}
@Override
public void setProperty(T view, String propName, @Nullable Object value) {
switch (propName) {
case "color":
mViewManager.setColor(view, value == null ? null : ((Double) value).intValue());
break;
case "backgroundColor":
mViewManager.setBackgroundColor(view, value == null ? null : ((Double) value).intValue());
break;
case "enabled":
mViewManager.setEnabled(view, value == null ? true : (boolean) value);
break;
case "items":
mViewManager.setItems(view, (ReadableArray) value);
break;
case "prompt":
mViewManager.setPrompt(view, value == null ? "" : (String) value);
break;
case "selected":
mViewManager.setSelected(view, value == null ? 0 : ((Double) value).intValue());
break;
default:
super.setProperty(view, propName, value);
}
}
}
@@ -1,23 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @generated by codegen project: GeneratePropsJavaInterface.js
*/
package com.facebook.react.viewmanagers;
import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableArray;
public interface AndroidDialogPickerManagerInterface<T extends View> {
void setColor(T view, @Nullable Integer value);
void setBackgroundColor(T view, @Nullable Integer value);
void setEnabled(T view, boolean value);
void setItems(T view, @Nullable ReadableArray value);
void setPrompt(T view, @Nullable String value);
void setSelected(T view, int value);
}
@@ -1,48 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*
* @generated by codegen project: GeneratePropsJavaDelegate.js
*/
package com.facebook.react.viewmanagers;
import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.uimanager.BaseViewManagerDelegate;
import com.facebook.react.uimanager.BaseViewManagerInterface;
import com.facebook.react.uimanager.LayoutShadowNode;
public class AndroidDropdownPickerManagerDelegate<
T extends View,
U extends BaseViewManagerInterface<T> & AndroidDropdownPickerManagerInterface<T>>
extends BaseViewManagerDelegate<T, U> {
public AndroidDropdownPickerManagerDelegate(U viewManager) {
super(viewManager);
}
@Override
public void setProperty(T view, String propName, @Nullable Object value) {
switch (propName) {
case "color":
mViewManager.setColor(view, value == null ? null : ((Double) value).intValue());
break;
case "enabled":
mViewManager.setEnabled(view, value == null ? true : (boolean) value);
break;
case "items":
mViewManager.setItems(view, (ReadableArray) value);
break;
case "prompt":
mViewManager.setPrompt(view, value == null ? "" : (String) value);
break;
case "selected":
mViewManager.setSelected(view, value == null ? 0 : ((Double) value).intValue());
break;
default:
super.setProperty(view, propName, value);
}
}
}
@@ -1,22 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @generated by codegen project: GeneratePropsJavaInterface.js
*/
package com.facebook.react.viewmanagers;
import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableArray;
public interface AndroidDropdownPickerManagerInterface<T extends View> {
void setColor(T view, @Nullable Integer value);
void setEnabled(T view, boolean value);
void setItems(T view, @Nullable ReadableArray value);
void setPrompt(T view, @Nullable String value);
void setSelected(T view, int value);
}
@@ -1,30 +0,0 @@
load("//tools/build_defs/oss:rn_defs.bzl", "react_native_dep", "react_native_target", "rn_android_library")
rn_android_library(
name = "picker",
srcs = glob(["**/*.java"]),
autoglob = False,
is_androidx = True,
labels = ["supermodule:xplat/default/public.react_native.infra"],
provided_deps = [
react_native_dep("third-party/android/androidx:annotation"),
react_native_dep("third-party/android/androidx:appcompat"),
react_native_dep("third-party/android/androidx:core"),
react_native_dep("third-party/android/androidx:fragment"),
react_native_dep("third-party/android/androidx:legacy-support-core-ui"),
react_native_dep("third-party/android/androidx:legacy-support-core-utils"),
],
visibility = [
"PUBLIC",
],
deps = [
react_native_dep("third-party/java/infer-annotations:infer-annotations"),
react_native_dep("third-party/java/jsr-305:jsr-305"),
react_native_target("java/com/facebook/react/bridge:bridge"),
react_native_target("java/com/facebook/react/common:common"),
react_native_target("java/com/facebook/react/module/annotations:annotations"),
react_native_target("java/com/facebook/react/uimanager:uimanager"),
react_native_target("java/com/facebook/react/uimanager/annotations:annotations"),
react_native_target("java/com/facebook/react/viewmanagers:viewmanagers"),
],
)
@@ -1,51 +0,0 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.views.picker;
import android.widget.Spinner;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewManagerDelegate;
import com.facebook.react.viewmanagers.AndroidDialogPickerManagerDelegate;
import com.facebook.react.viewmanagers.AndroidDialogPickerManagerInterface;
/** {@link ReactPickerManager} for {@link ReactPicker} with {@link Spinner#MODE_DIALOG}. */
@ReactModule(name = ReactDialogPickerManager.REACT_CLASS)
public class ReactDialogPickerManager extends ReactPickerManager
implements AndroidDialogPickerManagerInterface<ReactPicker> {
public static final String REACT_CLASS = "AndroidDialogPicker";
private final ViewManagerDelegate<ReactPicker> mDelegate;
public ReactDialogPickerManager() {
mDelegate = new AndroidDialogPickerManagerDelegate<>(this);
}
@Override
public String getName() {
return REACT_CLASS;
}
@Override
protected ReactPicker createViewInstance(ThemedReactContext reactContext) {
return new ReactPicker(reactContext, Spinner.MODE_DIALOG);
}
@Override
protected ViewManagerDelegate<ReactPicker> getDelegate() {
return mDelegate;
}
@Override
public void setBackgroundColor(@NonNull ReactPicker view, @Nullable Integer backgroundColor) {
view.setStagedBackgroundColor(backgroundColor);
}
}
@@ -1,50 +0,0 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.views.picker;
import android.widget.Spinner;
import androidx.annotation.NonNull;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewManagerDelegate;
import com.facebook.react.viewmanagers.AndroidDropdownPickerManagerDelegate;
import com.facebook.react.viewmanagers.AndroidDropdownPickerManagerInterface;
/** {@link ReactPickerManager} for {@link ReactPicker} with {@link Spinner#MODE_DROPDOWN}. */
@ReactModule(name = ReactDropdownPickerManager.REACT_CLASS)
public class ReactDropdownPickerManager extends ReactPickerManager
implements AndroidDropdownPickerManagerInterface<ReactPicker> {
public static final String REACT_CLASS = "AndroidDropdownPicker";
private final ViewManagerDelegate<ReactPicker> mDelegate;
public ReactDropdownPickerManager() {
mDelegate = new AndroidDropdownPickerManagerDelegate<>(this);
}
@Override
public String getName() {
return REACT_CLASS;
}
@Override
protected ReactPicker createViewInstance(ThemedReactContext reactContext) {
return new ReactPicker(reactContext, Spinner.MODE_DROPDOWN);
}
@Override
protected ViewManagerDelegate<ReactPicker> getDelegate() {
return mDelegate;
}
@Override
public void setBackgroundColor(@NonNull ReactPicker view, int backgroundColor) {
view.setStagedBackgroundColor(backgroundColor);
}
}
@@ -1,196 +0,0 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.views.picker;
import android.content.Context;
import android.content.res.ColorStateList;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatSpinner;
import androidx.core.view.ViewCompat;
import com.facebook.react.common.annotations.VisibleForTesting;
import java.util.List;
public class ReactPicker extends AppCompatSpinner {
private int mMode = Spinner.MODE_DIALOG;
private @Nullable OnSelectListener mOnSelectListener;
private @Nullable List<ReactPickerItem> mItems;
private @Nullable List<ReactPickerItem> mStagedItems;
private @Nullable Integer mStagedSelection;
private @Nullable Integer mStagedPrimaryTextColor;
private @Nullable Integer mStagedBackgroundColor;
private final OnItemSelectedListener mItemSelectedListener =
new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (mOnSelectListener != null) {
mOnSelectListener.onItemSelected(position);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
if (mOnSelectListener != null) {
mOnSelectListener.onItemSelected(-1);
}
}
};
/** Listener interface for ReactPicker events. */
public interface OnSelectListener {
void onItemSelected(int position);
}
public ReactPicker(Context context) {
super(context);
}
public ReactPicker(Context context, int mode) {
super(context, mode);
mMode = mode;
}
public ReactPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ReactPicker(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ReactPicker(Context context, AttributeSet attrs, int defStyle, int mode) {
super(context, attrs, defStyle, mode);
mMode = mode;
}
private final Runnable measureAndLayout =
new Runnable() {
@Override
public void run() {
measure(
MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
layout(getLeft(), getTop(), getRight(), getBottom());
}
};
@Override
public void requestLayout() {
super.requestLayout();
// The spinner relies on a measure + layout pass happening after it calls requestLayout().
// Without this, the widget never actually changes the selection and doesn't call the
// appropriate listeners. Since we override onLayout in our ViewGroups, a layout pass never
// happens after a call to requestLayout, so we simulate one here.
post(measureAndLayout);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
// onItemSelected gets fired immediately after layout because checkSelectionChanged() in
// AdapterView updates the selection position from the default INVALID_POSITION.
// To match iOS behavior, which no onItemSelected during initial layout.
// We setup the listener after layout.
if (getOnItemSelectedListener() == null) setOnItemSelectedListener(mItemSelectedListener);
}
public void setOnSelectListener(@Nullable OnSelectListener onSelectListener) {
mOnSelectListener = onSelectListener;
}
@Nullable
public OnSelectListener getOnSelectListener() {
return mOnSelectListener;
}
/* package */ void setStagedItems(final @Nullable List<ReactPickerItem> items) {
mStagedItems = items;
}
/**
* Will cache "selection" value locally and set it only once {@link #commitStagedData} is called
*/
/* package */ void setStagedSelection(int selection) {
mStagedSelection = selection;
}
/** Will set the "selection" value immediately as opposed to {@link #setStagedSelection(int)} */
/* package */ void setImmediateSelection(int selection) {
if (selection != getSelectedItemPosition()) {
setOnItemSelectedListener(null);
setSelection(selection, false);
setOnItemSelectedListener(mItemSelectedListener);
}
}
/* package */ void setStagedPrimaryTextColor(@Nullable Integer primaryColor) {
mStagedPrimaryTextColor = primaryColor;
}
/* package */ void setStagedBackgroundColor(@Nullable Integer backgroundColor) {
mStagedBackgroundColor = backgroundColor;
}
/**
* Used to commit staged data into ReactPicker view. During this period, we will disable {@link
* OnSelectListener#onItemSelected(int)} temporarily, so we don't get an event when changing the
* items/selection ourselves.
*/
/* package */ void commitStagedData() {
setOnItemSelectedListener(null);
ReactPickerAdapter adapter = (ReactPickerAdapter) getAdapter();
final int origSelection = getSelectedItemPosition();
if (mStagedItems != null && mStagedItems != mItems) {
mItems = mStagedItems;
mStagedItems = null;
if (adapter == null) {
adapter = new ReactPickerAdapter(getContext(), mItems);
setAdapter(adapter);
} else {
adapter.clear();
adapter.addAll(mItems);
adapter.notifyDataSetChanged();
}
}
if (mStagedSelection != null && mStagedSelection != origSelection) {
setSelection(mStagedSelection, false);
mStagedSelection = null;
}
if (mStagedPrimaryTextColor != null
&& adapter != null
&& mStagedPrimaryTextColor != adapter.getPrimaryTextColor()) {
adapter.setPrimaryTextColor(mStagedPrimaryTextColor);
ViewCompat.setBackgroundTintList(this, ColorStateList.valueOf(mStagedPrimaryTextColor));
mStagedPrimaryTextColor = null;
}
if (mStagedBackgroundColor != null
&& adapter != null
&& mStagedBackgroundColor != adapter.getBackgroundColor()) {
adapter.setBackgroundColor(mStagedBackgroundColor);
mStagedBackgroundColor = null;
}
setOnItemSelectedListener(mItemSelectedListener);
}
@VisibleForTesting
public int getMode() {
return mMode;
}
}
@@ -1,95 +0,0 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.views.picker;
import android.content.Context;
import android.content.res.ColorStateList;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.facebook.infer.annotation.Assertions;
import java.util.List;
/* package */
class ReactPickerAdapter extends ArrayAdapter<ReactPickerItem> {
private final LayoutInflater mInflater;
private @Nullable Integer mPrimaryTextColor;
private @Nullable Integer mBackgroundColor;
public ReactPickerAdapter(Context context, List<ReactPickerItem> data) {
super(context, 0, data);
mInflater =
(LayoutInflater)
Assertions.assertNotNull(context.getSystemService(Context.LAYOUT_INFLATER_SERVICE));
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent, false);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent, true);
}
private View getView(int position, View convertView, ViewGroup parent, boolean isDropdown) {
ReactPickerItem item = getItem(position);
boolean isNew = false;
if (convertView == null) {
int layoutResId =
isDropdown
? android.R.layout.simple_spinner_dropdown_item
: android.R.layout.simple_spinner_item;
convertView = mInflater.inflate(layoutResId, parent, false);
// Save original text colors
convertView.setTag(((TextView) convertView).getTextColors());
isNew = true;
}
TextView textView = (TextView) convertView;
textView.setText(item.label);
if (!isDropdown && mPrimaryTextColor != null) {
textView.setTextColor(mPrimaryTextColor);
} else if (item.color != null) {
textView.setTextColor(item.color);
} else if (textView.getTag() != null && !isNew) {
// In case the new item does not set the color prop, go back to the default one
textView.setTextColor((ColorStateList) textView.getTag());
}
if (mBackgroundColor != null) {
textView.setBackgroundColor(mBackgroundColor);
}
return textView;
}
public @Nullable Integer getPrimaryTextColor() {
return mPrimaryTextColor;
}
public @Nullable Integer getBackgroundColor() {
return mBackgroundColor;
}
public void setPrimaryTextColor(@Nullable Integer primaryTextColor) {
mPrimaryTextColor = primaryTextColor;
notifyDataSetChanged();
}
public void setBackgroundColor(@Nullable Integer backgroundColor) {
mBackgroundColor = backgroundColor;
notifyDataSetChanged();
}
}
@@ -1,43 +0,0 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.views.picker;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import java.util.ArrayList;
import java.util.List;
/* package */
class ReactPickerItem {
public final String label;
@Nullable public final Integer color;
public ReactPickerItem(final ReadableMap jsMapData) {
label = jsMapData.getString("label");
if (jsMapData.hasKey("color") && !jsMapData.isNull("color")) {
color = jsMapData.getInt("color");
} else {
color = null;
}
}
@Nullable
public static List<ReactPickerItem> createFromJsArrayMap(final ReadableArray jsArrayMap) {
if (jsArrayMap == null) {
return null;
}
final List<ReactPickerItem> items = new ArrayList<>(jsArrayMap.size());
for (int i = 0; i < jsArrayMap.size(); ++i) {
items.add(new ReactPickerItem(jsArrayMap.getMap(i)));
}
return items;
}
}
@@ -1,99 +0,0 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.views.picker;
import android.widget.Spinner;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.UIManagerHelper;
import com.facebook.react.uimanager.ViewProps;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.events.EventDispatcher;
import com.facebook.react.views.picker.events.PickerItemSelectEvent;
import java.util.List;
/**
* {@link ViewManager} for the {@link ReactPicker} view. This is abstract because the {@link
* Spinner} doesn't support setting the mode (dropdown/dialog) outside the constructor, so that is
* delegated to the separate {@link ReactDropdownPickerManager} and {@link ReactDialogPickerManager}
* components. These are merged back on the JS side into one React component.
*/
public abstract class ReactPickerManager extends SimpleViewManager<ReactPicker> {
@ReactProp(name = "items")
public void setItems(ReactPicker view, @Nullable ReadableArray items) {
final List<ReactPickerItem> pickerItems = ReactPickerItem.createFromJsArrayMap(items);
view.setStagedItems(pickerItems);
}
@ReactProp(name = ViewProps.COLOR, customType = "Color")
public void setColor(ReactPicker view, @Nullable Integer color) {
view.setStagedPrimaryTextColor(color);
}
@ReactProp(name = "prompt")
public void setPrompt(ReactPicker view, @Nullable String prompt) {
view.setPrompt(prompt);
}
@ReactProp(name = ViewProps.ENABLED, defaultBoolean = true)
public void setEnabled(ReactPicker view, boolean enabled) {
view.setEnabled(enabled);
}
@ReactProp(name = "selected")
public void setSelected(ReactPicker view, int selected) {
view.setStagedSelection(selected);
}
@Override
protected void onAfterUpdateTransaction(ReactPicker view) {
super.onAfterUpdateTransaction(view);
view.commitStagedData();
}
@Override
protected void addEventEmitters(final ThemedReactContext reactContext, final ReactPicker picker) {
picker.setOnSelectListener(
new PickerEventEmitter(
picker, UIManagerHelper.getEventDispatcherForReactTag(reactContext, picker.getId())));
}
@Override
public void receiveCommand(
@NonNull ReactPicker view, String commandId, @Nullable ReadableArray args) {
switch (commandId) {
case "setNativeSelectedPosition":
if (args != null) {
view.setImmediateSelection(args.getInt(0));
break;
}
}
}
private static class PickerEventEmitter implements ReactPicker.OnSelectListener {
private final ReactPicker mReactPicker;
private final EventDispatcher mEventDispatcher;
public PickerEventEmitter(ReactPicker reactPicker, EventDispatcher eventDispatcher) {
mReactPicker = reactPicker;
mEventDispatcher = eventDispatcher;
}
@Override
public void onItemSelected(int position) {
mEventDispatcher.dispatchEvent(
new PickerItemSelectEvent(
UIManagerHelper.getSurfaceId(mReactPicker), mReactPicker.getId(), position));
}
}
}
@@ -1,42 +0,0 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.views.picker.events;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
public class PickerItemSelectEvent extends Event<PickerItemSelectEvent> {
public static final String EVENT_NAME = "topSelect";
private final int mPosition;
@Deprecated
public PickerItemSelectEvent(int reactTag, int position) {
this(-1, reactTag, position);
}
public PickerItemSelectEvent(int surfaceId, int reactTag, int position) {
super(surfaceId, reactTag);
mPosition = position;
}
@Override
public String getEventName() {
return EVENT_NAME;
}
@Nullable
@Override
protected WritableMap getEventData() {
WritableMap eventData = Arguments.createMap();
eventData.putInt("position", mPosition);
return eventData;
}
}