diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/common/BUCK b/ReactAndroid/src/main/java/com/facebook/react/views/common/BUCK new file mode 100644 index 00000000000..5515d51744e --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/views/common/BUCK @@ -0,0 +1,14 @@ +include_defs("//ReactAndroid/DEFS") + +android_library( + name = "common", + srcs = glob(["*.java"]), + provided_deps = [ + react_native_dep("third-party/android/support/v4:lib-support-v4"), + ], + visibility = [ + "PUBLIC", + ], + deps = [ + ], +) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/common/ViewHelper.java b/ReactAndroid/src/main/java/com/facebook/react/views/common/ViewHelper.java new file mode 100644 index 00000000000..a560cafcb88 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/views/common/ViewHelper.java @@ -0,0 +1,28 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +package com.facebook.react.views.common; + +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.view.View; + +/** Helper class for Views */ +public class ViewHelper { + + /** + * Set the background to a given Drawable, or remove the background. It calls {@link + * View#setBackground(Drawable)} or {@link View#setBackgroundDrawable(Drawable)} based on the sdk + * version. + * + * @param view {@link View} to apply the background. + * @param drawable {@link Drawable} The Drawable to use as the background, or null to remove the + * background + */ + public static void setBackground(View view, Drawable drawable) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + view.setBackground(drawable); + } else { + view.setBackgroundDrawable(drawable); + } + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index 25e3d04e796..b64415bfadb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -16,7 +16,6 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; import android.view.MotionEvent; import android.view.View; import android.widget.HorizontalScrollView; @@ -25,7 +24,7 @@ import com.facebook.react.uimanager.MeasureSpecAssertions; import com.facebook.react.uimanager.ReactClippingViewGroup; import com.facebook.react.uimanager.ReactClippingViewGroupHelper; import com.facebook.react.uimanager.events.NativeGestureUtil; -import com.facebook.react.views.view.ReactViewBackgroundDrawable; +import com.facebook.react.views.view.ReactViewBackgroundManager; import javax.annotation.Nullable; /** @@ -49,7 +48,7 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements private @Nullable String mScrollPerfTag; private @Nullable Drawable mEndBackground; private int mEndFillColor = Color.TRANSPARENT; - private @Nullable ReactViewBackgroundDrawable mReactBackgroundDrawable; + private ReactViewBackgroundManager mReactBackgroundManager; public ReactHorizontalScrollView(Context context) { this(context, null); @@ -57,6 +56,7 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements public ReactHorizontalScrollView(Context context, @Nullable FpsListener fpsListener) { super(context); + mReactBackgroundManager = new ReactViewBackgroundManager(this); mFpsListener = fpsListener; } @@ -325,47 +325,27 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements @Override public void setBackgroundColor(int color) { - if (color == Color.TRANSPARENT && mReactBackgroundDrawable == null) { - // don't do anything, no need to allocate ReactBackgroundDrawable for transparent background - } else { - getOrCreateReactViewBackground().setColor(color); - } + mReactBackgroundManager.setBackgroundColor(color); } public void setBorderWidth(int position, float width) { - getOrCreateReactViewBackground().setBorderWidth(position, width); + mReactBackgroundManager.setBorderWidth(position, width); } public void setBorderColor(int position, float color, float alpha) { - getOrCreateReactViewBackground().setBorderColor(position, color, alpha); + mReactBackgroundManager.setBorderColor(position, color, alpha); } public void setBorderRadius(float borderRadius) { - getOrCreateReactViewBackground().setRadius(borderRadius); + mReactBackgroundManager.setBorderRadius(borderRadius); } public void setBorderRadius(float borderRadius, int position) { - getOrCreateReactViewBackground().setRadius(borderRadius, position); + mReactBackgroundManager.setBorderRadius(borderRadius, position); } public void setBorderStyle(@Nullable String style) { - getOrCreateReactViewBackground().setBorderStyle(style); + mReactBackgroundManager.setBorderStyle(style); } - private ReactViewBackgroundDrawable getOrCreateReactViewBackground() { - if (mReactBackgroundDrawable == null) { - mReactBackgroundDrawable = new ReactViewBackgroundDrawable(); - Drawable backgroundDrawable = getBackground(); - super.setBackground(null); // required so that drawable callback is cleared before we add the - // drawable back as a part of LayerDrawable - if (backgroundDrawable == null) { - super.setBackground(mReactBackgroundDrawable); - } else { - LayerDrawable layerDrawable = - new LayerDrawable(new Drawable[]{mReactBackgroundDrawable, backgroundDrawable}); - super.setBackground(layerDrawable); - } - } - return mReactBackgroundDrawable; - } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 9d71b94457e..cafa7bff0e9 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -14,7 +14,6 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; import android.util.Log; import android.view.MotionEvent; import android.view.View; @@ -28,7 +27,7 @@ import com.facebook.react.uimanager.MeasureSpecAssertions; import com.facebook.react.uimanager.ReactClippingViewGroup; import com.facebook.react.uimanager.ReactClippingViewGroupHelper; import com.facebook.react.uimanager.events.NativeGestureUtil; -import com.facebook.react.views.view.ReactViewBackgroundDrawable; +import com.facebook.react.views.view.ReactViewBackgroundManager; import java.lang.reflect.Field; import javax.annotation.Nullable; @@ -60,7 +59,7 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou private @Nullable Drawable mEndBackground; private int mEndFillColor = Color.TRANSPARENT; private View mContentView; - private @Nullable ReactViewBackgroundDrawable mReactBackgroundDrawable; + private ReactViewBackgroundManager mReactBackgroundManager; public ReactScrollView(ReactContext context) { this(context, null); @@ -69,6 +68,7 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou public ReactScrollView(ReactContext context, @Nullable FpsListener fpsListener) { super(context); mFpsListener = fpsListener; + mReactBackgroundManager = new ReactViewBackgroundManager(this); if (!sTriedToGetScrollerField) { sTriedToGetScrollerField = true; @@ -394,48 +394,29 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou } } + @Override public void setBackgroundColor(int color) { - if (color == Color.TRANSPARENT && mReactBackgroundDrawable == null) { - // don't do anything, no need to allocate ReactBackgroundDrawable for transparent background - } else { - getOrCreateReactViewBackground().setColor(color); - } + mReactBackgroundManager.setBackgroundColor(color); } public void setBorderWidth(int position, float width) { - getOrCreateReactViewBackground().setBorderWidth(position, width); + mReactBackgroundManager.setBorderWidth(position, width); } public void setBorderColor(int position, float color, float alpha) { - getOrCreateReactViewBackground().setBorderColor(position, color, alpha); + mReactBackgroundManager.setBorderColor(position, color, alpha); } public void setBorderRadius(float borderRadius) { - getOrCreateReactViewBackground().setRadius(borderRadius); + mReactBackgroundManager.setBorderRadius(borderRadius); } public void setBorderRadius(float borderRadius, int position) { - getOrCreateReactViewBackground().setRadius(borderRadius, position); + mReactBackgroundManager.setBorderRadius(borderRadius, position); } public void setBorderStyle(@Nullable String style) { - getOrCreateReactViewBackground().setBorderStyle(style); + mReactBackgroundManager.setBorderStyle(style); } - private ReactViewBackgroundDrawable getOrCreateReactViewBackground() { - if (mReactBackgroundDrawable == null) { - mReactBackgroundDrawable = new ReactViewBackgroundDrawable(); - Drawable backgroundDrawable = getBackground(); - super.setBackground(null); // required so that drawable callback is cleared before we add the - // drawable back as a part of LayerDrawable - if (backgroundDrawable == null) { - super.setBackground(mReactBackgroundDrawable); - } else { - LayerDrawable layerDrawable = - new LayerDrawable(new Drawable[]{mReactBackgroundDrawable, backgroundDrawable}); - super.setBackground(layerDrawable); - } - } - return mReactBackgroundDrawable; - } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java index fa8f87710b1..c324646ee58 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java @@ -9,12 +9,8 @@ package com.facebook.react.views.text; -import javax.annotation.Nullable; - import android.content.Context; -import android.graphics.Color; import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; import android.os.Build; import android.text.Layout; import android.text.Spanned; @@ -22,10 +18,10 @@ import android.text.TextUtils; import android.view.Gravity; import android.view.ViewGroup; import android.widget.TextView; - import com.facebook.react.uimanager.ReactCompoundView; import com.facebook.react.uimanager.ViewDefaults; -import com.facebook.react.views.view.ReactViewBackgroundDrawable; +import com.facebook.react.views.view.ReactViewBackgroundManager; +import javax.annotation.Nullable; public class ReactTextView extends TextView implements ReactCompoundView { @@ -41,10 +37,11 @@ public class ReactTextView extends TextView implements ReactCompoundView { private int mNumberOfLines = ViewDefaults.NUMBER_OF_LINES; private TextUtils.TruncateAt mEllipsizeLocation = TextUtils.TruncateAt.END; - private ReactViewBackgroundDrawable mReactBackgroundDrawable; + private ReactViewBackgroundManager mReactBackgroundManager; public ReactTextView(Context context) { super(context); + mReactBackgroundManager = new ReactViewBackgroundManager(this); mDefaultGravityHorizontal = getGravity() & (Gravity.HORIZONTAL_GRAVITY_MASK | Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK); mDefaultGravityVertical = getGravity() & Gravity.VERTICAL_GRAVITY_MASK; @@ -204,15 +201,6 @@ public class ReactTextView extends TextView implements ReactCompoundView { } } - @Override - public void setBackgroundColor(int color) { - if (color == Color.TRANSPARENT && mReactBackgroundDrawable == null) { - // don't do anything, no need to allocate ReactBackgroundDrawable for transparent background - } else { - getOrCreateReactViewBackground().setColor(color); - } - } - /* package */ void setGravityHorizontal(int gravityHorizontal) { if (gravityHorizontal == 0) { gravityHorizontal = mDefaultGravityHorizontal; @@ -244,40 +232,28 @@ public class ReactTextView extends TextView implements ReactCompoundView { setEllipsize(ellipsizeLocation); } + @Override + public void setBackgroundColor(int color) { + mReactBackgroundManager.setBackgroundColor(color); + } + public void setBorderWidth(int position, float width) { - getOrCreateReactViewBackground().setBorderWidth(position, width); + mReactBackgroundManager.setBorderWidth(position, width); } public void setBorderColor(int position, float color, float alpha) { - getOrCreateReactViewBackground().setBorderColor(position, color, alpha); + mReactBackgroundManager.setBorderColor(position, color, alpha); } public void setBorderRadius(float borderRadius) { - getOrCreateReactViewBackground().setRadius(borderRadius); + mReactBackgroundManager.setBorderRadius(borderRadius); } public void setBorderRadius(float borderRadius, int position) { - getOrCreateReactViewBackground().setRadius(borderRadius, position); + mReactBackgroundManager.setBorderRadius(borderRadius, position); } public void setBorderStyle(@Nullable String style) { - getOrCreateReactViewBackground().setBorderStyle(style); - } - - private ReactViewBackgroundDrawable getOrCreateReactViewBackground() { - if (mReactBackgroundDrawable == null) { - mReactBackgroundDrawable = new ReactViewBackgroundDrawable(); - Drawable backgroundDrawable = getBackground(); - super.setBackground(null); // required so that drawable callback is cleared before we add the - // drawable back as a part of LayerDrawable - if (backgroundDrawable == null) { - super.setBackground(mReactBackgroundDrawable); - } else { - LayerDrawable layerDrawable = - new LayerDrawable(new Drawable[]{mReactBackgroundDrawable, backgroundDrawable}); - super.setBackground(layerDrawable); - } - } - return mReactBackgroundDrawable; + mReactBackgroundManager.setBorderStyle(style); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java index 6dfa88241e0..19aa1d589b6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java @@ -10,11 +10,9 @@ package com.facebook.react.views.textinput; import android.content.Context; -import android.graphics.Color; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; import android.os.Build; import android.text.Editable; import android.text.InputType; @@ -39,7 +37,7 @@ import com.facebook.react.views.text.CustomStyleSpan; import com.facebook.react.views.text.ReactTagSpan; import com.facebook.react.views.text.ReactTextUpdate; import com.facebook.react.views.text.TextInlineImageSpan; -import com.facebook.react.views.view.ReactViewBackgroundDrawable; +import com.facebook.react.views.view.ReactViewBackgroundManager; import java.util.ArrayList; import javax.annotation.Nullable; @@ -82,7 +80,7 @@ public class ReactEditText extends EditText { private final InternalKeyListener mKeyListener; private boolean mDetectScrollMovement = false; - private ReactViewBackgroundDrawable mReactBackgroundDrawable; + private ReactViewBackgroundManager mReactBackgroundManager; private static final KeyListener sKeyListener = QwertyKeyListener.getInstanceForFullKeyboard(); @@ -90,6 +88,7 @@ public class ReactEditText extends EditText { super(context); setFocusableInTouchMode(false); + mReactBackgroundManager = new ReactViewBackgroundManager(this); mInputMethodManager = (InputMethodManager) Assertions.assertNotNull(getContext().getSystemService(Context.INPUT_METHOD_SERVICE)); mDefaultGravityHorizontal = @@ -577,48 +576,27 @@ public class ReactEditText extends EditText { @Override public void setBackgroundColor(int color) { - if (color == Color.TRANSPARENT && mReactBackgroundDrawable == null) { - // don't do anything, no need to allocate ReactBackgroundDrawable for transparent background - } else { - getOrCreateReactViewBackground().setColor(color); - } + mReactBackgroundManager.setBackgroundColor(color); } public void setBorderWidth(int position, float width) { - getOrCreateReactViewBackground().setBorderWidth(position, width); + mReactBackgroundManager.setBorderWidth(position, width); } public void setBorderColor(int position, float color, float alpha) { - getOrCreateReactViewBackground().setBorderColor(position, color, alpha); + mReactBackgroundManager.setBorderColor(position, color, alpha); } public void setBorderRadius(float borderRadius) { - getOrCreateReactViewBackground().setRadius(borderRadius); + mReactBackgroundManager.setBorderRadius(borderRadius); } public void setBorderRadius(float borderRadius, int position) { - getOrCreateReactViewBackground().setRadius(borderRadius, position); + mReactBackgroundManager.setBorderRadius(borderRadius, position); } public void setBorderStyle(@Nullable String style) { - getOrCreateReactViewBackground().setBorderStyle(style); - } - - private ReactViewBackgroundDrawable getOrCreateReactViewBackground() { - if (mReactBackgroundDrawable == null) { - mReactBackgroundDrawable = new ReactViewBackgroundDrawable(); - Drawable backgroundDrawable = getBackground(); - super.setBackground(null); // required so that drawable callback is cleared before we add the - // drawable back as a part of LayerDrawable - if (backgroundDrawable == null) { - super.setBackground(mReactBackgroundDrawable); - } else { - LayerDrawable layerDrawable = - new LayerDrawable(new Drawable[]{mReactBackgroundDrawable, backgroundDrawable}); - super.setBackground(layerDrawable); - } - } - return mReactBackgroundDrawable; + mReactBackgroundManager.setBorderStyle(style); } /** diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/BUCK b/ReactAndroid/src/main/java/com/facebook/react/views/view/BUCK index 24cbabe1832..4e709c43066 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/view/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/BUCK @@ -14,6 +14,7 @@ android_library( 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/touch:touch"), + react_native_target("java/com/facebook/react/views/common:common"), react_native_target("java/com/facebook/react/uimanager:uimanager"), react_native_target("java/com/facebook/react/uimanager/annotations:annotations"), ], diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundManager.java new file mode 100644 index 00000000000..daf12b202e5 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundManager.java @@ -0,0 +1,67 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +package com.facebook.react.views.view; + +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.view.View; +import com.facebook.react.views.common.ViewHelper; +import javax.annotation.Nullable; + +/** Class that manages the background for views and borders. */ +public class ReactViewBackgroundManager { + + private @Nullable ReactViewBackgroundDrawable mReactBackgroundDrawable; + private View mView; + + public ReactViewBackgroundManager(View view) { + this.mView = view; + } + + private ReactViewBackgroundDrawable getOrCreateReactViewBackground() { + if (mReactBackgroundDrawable == null) { + mReactBackgroundDrawable = new ReactViewBackgroundDrawable(); + Drawable backgroundDrawable = mView.getBackground(); + ViewHelper.setBackground( + mView, null); // required so that drawable callback is cleared before we add the + // drawable back as a part of LayerDrawable + if (backgroundDrawable == null) { + ViewHelper.setBackground(mView, mReactBackgroundDrawable); + } else { + LayerDrawable layerDrawable = + new LayerDrawable(new Drawable[] {mReactBackgroundDrawable, backgroundDrawable}); + ViewHelper.setBackground(mView, layerDrawable); + } + } + return mReactBackgroundDrawable; + } + + public void setBackgroundColor(int color) { + if (color == Color.TRANSPARENT && mReactBackgroundDrawable == null) { + // don't do anything, no need to allocate ReactBackgroundDrawable for transparent background + } else { + getOrCreateReactViewBackground().setColor(color); + } + } + + public void setBorderWidth(int position, float width) { + getOrCreateReactViewBackground().setBorderWidth(position, width); + } + + public void setBorderColor(int position, float color, float alpha) { + getOrCreateReactViewBackground().setBorderColor(position, color, alpha); + } + + public void setBorderRadius(float borderRadius) { + getOrCreateReactViewBackground().setRadius(borderRadius); + } + + public void setBorderRadius(float borderRadius, int position) { + getOrCreateReactViewBackground().setRadius(borderRadius, position); + } + + public void setBorderStyle(@Nullable String style) { + getOrCreateReactViewBackground().setBorderStyle(style); + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java index 4361d914d10..afd2f8dab02 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java @@ -9,23 +9,21 @@ package com.facebook.react.views.view; -import javax.annotation.Nullable; - import android.content.Context; import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; -import android.view.animation.Animation; +import android.os.Build; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; - +import android.view.animation.Animation; import com.facebook.infer.annotation.Assertions; import com.facebook.react.common.annotations.VisibleForTesting; +import com.facebook.react.touch.OnInterceptTouchEventListener; import com.facebook.react.touch.ReactHitSlopView; import com.facebook.react.touch.ReactInterceptingViewGroup; -import com.facebook.react.touch.OnInterceptTouchEventListener; import com.facebook.react.uimanager.MeasureSpecAssertions; import com.facebook.react.uimanager.PointerEvents; import com.facebook.react.uimanager.ReactClippingViewGroup; @@ -33,6 +31,7 @@ import com.facebook.react.uimanager.ReactClippingViewGroupHelper; import com.facebook.react.uimanager.ReactPointerEventsView; import com.facebook.react.uimanager.ReactZIndexedViewGroup; import com.facebook.react.uimanager.ViewGroupDrawingOrderHelper; +import javax.annotation.Nullable; /** * Backing for a React View. Has support for borders, but since borders aren't common, lazy @@ -147,13 +146,13 @@ public class ReactViewGroup extends ViewGroup implements // background to be a layer drawable that contains a drawable that has been previously setup // as a background previously. This will not work correctly as the drawable callback logic is // messed up in AOSP - super.setBackground(null); + updateBackgroundDrawable(null); if (mReactBackgroundDrawable != null && background != null) { LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] {mReactBackgroundDrawable, background}); - super.setBackground(layerDrawable); + updateBackgroundDrawable(layerDrawable); } else if (background != null) { - super.setBackground(background); + updateBackgroundDrawable(background); } } @@ -562,14 +561,15 @@ public class ReactViewGroup extends ViewGroup implements if (mReactBackgroundDrawable == null) { mReactBackgroundDrawable = new ReactViewBackgroundDrawable(); Drawable backgroundDrawable = getBackground(); - super.setBackground(null); // required so that drawable callback is cleared before we add the + updateBackgroundDrawable( + null); // required so that drawable callback is cleared before we add the // drawable back as a part of LayerDrawable if (backgroundDrawable == null) { - super.setBackground(mReactBackgroundDrawable); + updateBackgroundDrawable(mReactBackgroundDrawable); } else { LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] {mReactBackgroundDrawable, backgroundDrawable}); - super.setBackground(layerDrawable); + updateBackgroundDrawable(layerDrawable); } } return mReactBackgroundDrawable; @@ -584,4 +584,19 @@ public class ReactViewGroup extends ViewGroup implements mHitSlopRect = rect; } + /** + * Set the background for the view or remove the background. It calls {@link + * #setBackground(Drawable)} or {@link #setBackgroundDrawable(Drawable)} based on the sdk version. + * + * @param drawable {@link Drawable} The Drawable to use as the background, or null to remove the + * background + */ + private void updateBackgroundDrawable(Drawable drawable) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + super.setBackground(drawable); + } else { + super.setBackgroundDrawable(drawable); + } + } + }