@Override
 public void receiveCommand(ReactViewGroup root, int commandId, @Nullable ReadableArray args) {
   switch (commandId) {
     case CMD_HOTSPOT_UPDATE:
       {
         if (args == null || args.size() != 2) {
           throw new JSApplicationIllegalArgumentException(
               "Illegal number of arguments for 'updateHotspot' command");
         }
         if (Build.VERSION.SDK_INT >= 21) {
           root.getLocationOnScreen(sLocationBuf);
           float x = PixelUtil.toPixelFromDIP(args.getDouble(0)) - sLocationBuf[0];
           float y = PixelUtil.toPixelFromDIP(args.getDouble(1)) - sLocationBuf[1];
           root.drawableHotspotChanged(x, y);
         }
         break;
       }
     case CMD_SET_PRESSED:
       {
         if (args == null || args.size() != 1) {
           throw new JSApplicationIllegalArgumentException(
               "Illegal number of arguments for 'setPressed' command");
         }
         root.setPressed(args.getBoolean(0));
         break;
       }
   }
 }
 @ReactProp(name = "nativeBackgroundAndroid")
 public void setNativeBackground(ReactViewGroup view, @Nullable ReadableMap bg) {
   view.setTranslucentBackgroundDrawable(
       bg == null
           ? null
           : ReactDrawableHelper.createDrawableFromJSDescription(view.getContext(), bg));
 }
 @Override
 public void removeAllViews(ReactViewGroup parent) {
   boolean removeClippedSubviews = parent.getRemoveClippedSubviews();
   if (removeClippedSubviews) {
     parent.removeAllViewsWithSubviewClippingEnabled();
   } else {
     parent.removeAllViews();
   }
 }
 @Override
 public View getChildAt(ReactViewGroup parent, int index) {
   boolean removeClippedSubviews = parent.getRemoveClippedSubviews();
   if (removeClippedSubviews) {
     return parent.getChildAtWithSubviewClippingEnabled(index);
   } else {
     return parent.getChildAt(index);
   }
 }
 @Override
 public int getChildCount(ReactViewGroup parent) {
   boolean removeClippedSubviews = parent.getRemoveClippedSubviews();
   if (removeClippedSubviews) {
     return parent.getAllChildrenCount();
   } else {
     return parent.getChildCount();
   }
 }
 @Override
 public void addView(ReactViewGroup parent, View child, int index) {
   boolean removeClippedSubviews = parent.getRemoveClippedSubviews();
   if (removeClippedSubviews) {
     parent.addViewWithSubviewClippingEnabled(child, index);
   } else {
     parent.addView(child, index);
   }
 }
 @Override
 public void removeViewAt(ReactViewGroup parent, int index) {
   boolean removeClippedSubviews = parent.getRemoveClippedSubviews();
   if (removeClippedSubviews) {
     View child = getChildAt(parent, index);
     if (child.getParent() != null) {
       parent.removeView(child);
     }
     parent.removeViewWithSubviewClippingEnabled(child);
   } else {
     parent.removeViewAt(index);
   }
 }
 @Override
 public void onLayoutChange(
     View v,
     int left,
     int top,
     int right,
     int bottom,
     int oldLeft,
     int oldTop,
     int oldRight,
     int oldBottom) {
   if (mParent.getRemoveClippedSubviews()) {
     mParent.updateSubviewClipStatus(v);
   }
 }
 @ReactProp(name = ViewProps.BORDER_WIDTH, defaultFloat = CSSConstants.UNDEFINED)
 public void setBorderWidth(ReactViewGroup view, float width) {
   if (!CSSConstants.isUndefined(width)) {
     width = PixelUtil.toPixelFromDIP(width);
   }
   view.setBorderWidth(Spacing.ALL, width);
 }
 @ReactProp(name = "pointerEvents")
 public void setPointerEvents(ReactViewGroup view, @Nullable String pointerEventsStr) {
   if (pointerEventsStr != null) {
     PointerEvents pointerEvents =
         PointerEvents.valueOf(pointerEventsStr.toUpperCase(Locale.US).replace("-", "_"));
     view.setPointerEvents(pointerEvents);
   }
 }
 @ReactPropGroup(
     names = {
       "borderColor",
       "borderLeftColor",
       "borderRightColor",
       "borderTopColor",
       "borderBottomColor"
     },
     customType = "Color")
 public void setBorderColor(ReactViewGroup view, int index, Integer color) {
   view.setBorderColor(
       SPACING_TYPES[index], color == null ? CSSConstants.UNDEFINED : (float) color);
 }
 @ReactPropGroup(
     names = {
       ViewProps.BORDER_WIDTH,
       ViewProps.BORDER_LEFT_WIDTH,
       ViewProps.BORDER_RIGHT_WIDTH,
       ViewProps.BORDER_TOP_WIDTH,
       ViewProps.BORDER_BOTTOM_WIDTH,
     },
     defaultFloat = CSSConstants.UNDEFINED)
 public void setBorderWidth(ReactViewGroup view, int index, float width) {
   if (!CSSConstants.isUndefined(width)) {
     width = PixelUtil.toPixelFromDIP(width);
   }
   view.setBorderWidth(SPACING_TYPES[index], width);
 }
 @ReactProp(name = "accessible")
 public void setAccessible(ReactViewGroup view, boolean accessible) {
   view.setFocusable(accessible);
 }
 @ReactProp(name = ViewProps.NEEDS_OFFSCREEN_ALPHA_COMPOSITING)
 public void setNeedsOffscreenAlphaCompositing(
     ReactViewGroup view, boolean needsOffscreenAlphaCompositing) {
   view.setNeedsOffscreenAlphaCompositing(needsOffscreenAlphaCompositing);
 }
 @ReactProp(name = "borderRadius")
 public void setBorderRadius(ReactViewGroup view, float borderRadius) {
   view.setBorderRadius(PixelUtil.toPixelFromDIP(borderRadius));
 }
 @ReactProp(name = ReactClippingViewGroupHelper.PROP_REMOVE_CLIPPED_SUBVIEWS)
 public void setRemoveClippedSubviews(ReactViewGroup view, boolean removeClippedSubviews) {
   view.setRemoveClippedSubviews(removeClippedSubviews);
 }
 @ReactProp(name = "borderStyle")
 public void setBorderStyle(ReactViewGroup view, @Nullable String borderStyle) {
   view.setBorderStyle(borderStyle);
 }