com.facebook.react.views.checkbox.ReactCheckBoxManager.java Source code

Java tutorial

Introduction

Here is the source code for com.facebook.react.views.checkbox.ReactCheckBoxManager.java

Source

/**
 * 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.checkbox;

import android.content.Context;
import android.content.res.ColorStateList;
import android.support.v4.widget.CompoundButtonCompat;
import android.support.v7.widget.TintContextWrapper;
import android.util.TypedValue;
import android.widget.CompoundButton;

import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.UIManagerModule;
import com.facebook.react.uimanager.ViewProps;
import com.facebook.react.uimanager.annotations.ReactProp;

import javax.annotation.Nullable;

/** View manager for {@link ReactCheckBox} components. */
public class ReactCheckBoxManager extends SimpleViewManager<ReactCheckBox> {

    private static final String REACT_CLASS = "AndroidCheckBox";

    private static final CompoundButton.OnCheckedChangeListener ON_CHECKED_CHANGE_LISTENER = new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            ReactContext reactContext = getReactContext(buttonView);
            reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher()
                    .dispatchEvent(new ReactCheckBoxEvent(buttonView.getId(), isChecked));
        }

        private ReactContext getReactContext(CompoundButton buttonView) {
            ReactContext reactContext;
            Context ctx = buttonView.getContext();
            if (ctx instanceof TintContextWrapper) {
                reactContext = (ReactContext) ((TintContextWrapper) ctx).getBaseContext();
            } else {
                reactContext = (ReactContext) buttonView.getContext();
            }
            return reactContext;
        }
    };

    @Override
    public String getName() {
        return REACT_CLASS;
    }

    @Override
    protected void addEventEmitters(final ThemedReactContext reactContext, final ReactCheckBox view) {
        view.setOnCheckedChangeListener(ON_CHECKED_CHANGE_LISTENER);
    }

    @Override
    protected ReactCheckBox createViewInstance(ThemedReactContext context) {
        ReactCheckBox view = new ReactCheckBox(context);
        return view;
    }

    @ReactProp(name = ViewProps.ENABLED, defaultBoolean = true)
    public void setEnabled(ReactCheckBox view, boolean enabled) {
        view.setEnabled(enabled);
    }

    @ReactProp(name = ViewProps.ON)
    public void setOn(ReactCheckBox view, boolean on) {
        // we set the checked change listener to null and then restore it so that we don't fire an
        // onChange event to JS when JS itself is updating the value of the checkbox
        view.setOnCheckedChangeListener(null);
        view.setOn(on);
        view.setOnCheckedChangeListener(ON_CHECKED_CHANGE_LISTENER);
    }

    private static int getThemeColor(final Context context, String colorId) {
        final TypedValue value = new TypedValue();
        context.getTheme().resolveAttribute(getIdentifier(context, colorId), value, true);
        return value.data;
    }

    /**
     * The appcompat-v7 BUCK dep is listed as a provided_dep, which complains that
     * com.facebook.react.R doesn't exist. Since the attributes are provided from a parent, we can access
     * those attributes dynamically.
     */
    private static int getIdentifier(Context context, String name) {
        return context.getResources().getIdentifier(name, "attr", context.getPackageName());
    }

    @ReactProp(name = "tintColors")
    public void setTintColors(ReactCheckBox view, @Nullable ReadableMap colorsMap) {
        String defaultColorIdOfCheckedState = "colorAccent";
        int trueColor = colorsMap == null || !colorsMap.hasKey("true")
                ? getThemeColor(view.getContext(), defaultColorIdOfCheckedState)
                : colorsMap.getInt("true");

        String defaultColorIdOfUncheckedState = "colorPrimaryDark";
        int falseColor = colorsMap == null || !colorsMap.hasKey("false")
                ? getThemeColor(view.getContext(), defaultColorIdOfUncheckedState)
                : colorsMap.getInt("false");

        ColorStateList csl = new ColorStateList(new int[][] { new int[] { android.R.attr.state_checked },
                new int[] { -android.R.attr.state_checked } }, new int[] { trueColor, falseColor, });

        CompoundButtonCompat.setButtonTintList(view, csl);
    }

}