Use interface instead of abstract class to reference view manager in generated delegate

Summary:
Our JS codegen assumes that all Android view managers extend `BaseViewManager` which allows generated delegates to set base view props using `BaseViewManagerDelegate`, see and example of the generated delegate for `FbReactTTRCStepRenderFlagManager`:
```
public class TTRCStepRenderFlagManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & TTRCStepRenderFlagManagerInterface<T>>{
  public TTRCStepRenderFlagManagerDelegate(U viewManager) {
    super(viewManager);
  }
  Override
  public void setProperty(T view, String propName, Nullable Object value) {
    switch (propName) {
      case "traceId":
        mViewManager.setTraceId(view, value == null ? null : (String) value);
        break;
      case "stepName":
        mViewManager.setStepName(view, value == null ? null : (String) value);
        break;
      default:
        super.setProperty(view, propName, value);
    }
  }
}
```
The problem is that `FbReactTTRCStepRenderFlagManager` doesn't extend `BaseViewManager`, but `ViewManager`, which means that we cannot use it with the generated delegate. We cannot use  `ViewManager` instead of `BaseViewManager` in our JS codegen either, otherwise we will not be able to set base view props.

This diff makes it possible for delegates generated by JS to be used by Android view managers that do not extend `BaseViewManager`. By having a `BaseViewManagerInterface` we will be able to introduce a no-op base view manager implementation and wrap our original view manager in it so that we can pass as a constructor parameter to `BaseViewManagerDelegate`.

See an example of this approach for `FbReactTTRCStepRenderFlagManager`:

```
public class FbReactTTRCStepRenderFlagManager extends ViewManager<FbReactTTRCStepRenderFlag, ReactShadowNodeImpl> implements TTRCStepRenderFlagManagerInterface<FbReactTTRCStepRenderFlag> {

    private final ViewManagerDelegate<FbReactTTRCStepRenderFlag> mDelegate;

    public FbReactTTRCStepRenderFlagManager() {
        mDelegate = new TTRCStepRenderFlagManagerDelegate<>(new ViewManagerWrapper(this));
    }
    ...

    private static class ViewManagerWrapper extends BaseViewManagerAdapter<FbReactTTRCStepRenderFlag> implements TTRCStepRenderFlagManagerInterface<FbReactTTRCStepRenderFlag> {

        private final TTRCStepRenderFlagManagerInterface<FbReactTTRCStepRenderFlag> mViewManager;

        private FbReactTTRCStepRenderFlagManagerAdapter(TTRCStepRenderFlagManagerInterface<FbReactTTRCStepRenderFlag> viewManager) {
          mViewManager = viewManager;
        }

        Override
        public void setTraceId(FbReactTTRCStepRenderFlag view, Nullable String traceId) {
          mViewManager.setTraceId(view, traceId);
        }

        Override
        public void setStepName(FbReactTTRCStepRenderFlag view, Nullable String stepName) {
          mViewManager.setStepName(view, stepName);
        }
    }
}
```

Reviewed By: mdvacca

Differential Revision: D16984121

fbshipit-source-id: ea2761dda68a96ff3ba6ac64153bc4e56e396774
This commit is contained in:
Oleksandr Melnykov authored and Facebook Github Bot committed 2019-09-04 07:04:08 -07:00
1 parent 1ee811c951
commit d38afb4a9d
19 files changed
+176 -90

No files matched your search

@@ -0,0 +1,62 @@
package com.facebook.react.uimanager;
import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
/**
* This is an interface that should be implemented by view managers supporting the base view
* properties such as backgroundColor, opacity, etc.
*/
public interface BaseViewManagerInterface<T extends View> {
void setAccessibilityActions(T view, @Nullable ReadableArray accessibilityActions);
void setAccessibilityHint(T view, @Nullable String accessibilityHint);
void setAccessibilityLabel(T view, @Nullable String accessibilityLabel);
void setAccessibilityLiveRegion(T view, @Nullable String liveRegion);
void setAccessibilityRole(T view, @Nullable String accessibilityRole);
void setViewState(T view, @Nullable ReadableMap accessibilityState);
void setBackgroundColor(T view, int backgroundColor);
void setBorderRadius(T view, float borderRadius);
void setBorderBottomLeftRadius(T view, float borderRadius);
void setBorderBottomRightRadius(T view, float borderRadius);
void setBorderTopLeftRadius(T view, float borderRadius);
void setBorderTopRightRadius(T view, float borderRadius);
void setElevation(T view, float elevation);
void setImportantForAccessibility(T view, @Nullable String importantForAccessibility);
void setNativeId(T view, @Nullable String nativeId);
void setOpacity(T view, float opacity);
void setRenderToHardwareTexture(T view, boolean useHWTexture);
void setRotation(T view, float rotation);
void setScaleX(T view, float scaleX);
void setScaleY(T view, float scaleY);
void setTestId(T view, String testId);
void setTransform(T view, @Nullable ReadableArray matrix);
void setTranslateX(T view, float translateX);
void setTranslateY(T view, float translateY);
void setZIndex(T view, float zIndex);
}