mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
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:
committed by
Facebook GitHub Bot
parent
7f117394af
commit
77366cd869
@@ -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());
|
||||
|
||||
-48
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
-23
@@ -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);
|
||||
}
|
||||
-48
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
-22
@@ -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"),
|
||||
],
|
||||
)
|
||||
-51
@@ -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);
|
||||
}
|
||||
}
|
||||
-50
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
-42
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user