Skip to content

Commit

Permalink
Fabric support (#101)
Browse files Browse the repository at this point in the history
  • Loading branch information
nutstick authored Oct 31, 2022
1 parent 63c59eb commit f9ce7d2
Show file tree
Hide file tree
Showing 42 changed files with 9,501 additions and 90 deletions.
46 changes: 41 additions & 5 deletions android/build.gradle
Original file line number Diff line number Diff line change
@@ -1,32 +1,68 @@
import java.nio.file.Paths

buildscript {
repositories {
google()
mavenCentral()
}

dependencies {
classpath 'com.android.tools.build:gradle:1.3.1'
classpath 'com.android.tools.build:gradle:3.5.3'
}
}

def isNewArchitectureEnabled() {
// To opt-in for the New Architecture, you can either:
// - Set `newArchEnabled` to true inside the `gradle.properties` file
// - Invoke gradle with `-newArchEnabled=true`
// - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
}

apply plugin: 'com.android.library'

if (isNewArchitectureEnabled()) {
apply plugin: "com.facebook.react"
}

def getExtOrDefault(name, defaultValue) {
return rootProject.ext.has(name) ? rootProject.ext.get(name) : defaultValue
}

android {
compileSdkVersion 30
buildToolsVersion "29.0.3"
compileSdkVersion getExtOrDefault('compileSdkVersion', 30)
buildToolsVersion getExtOrDefault('buildToolsVersion', '29.0.3')

defaultConfig {
minSdkVersion 21
targetSdkVersion 30
minSdkVersion getExtOrDefault('minSdkVersion', 21)
targetSdkVersion getExtOrDefault('targetSdkVersion', 31)
versionCode 1
versionName "1.0"
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
}

lintOptions {
abortOnError false
}

sourceSets.main {
java {
if (isNewArchitectureEnabled()) {
srcDirs += [
"src/fabric/java",
"${project.buildDir}/generated/source/codegen/java"
]
} else {
srcDirs += [
"src/paper/java",
]
}
}
}
}

repositories {
google()
mavenCentral()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package com.reactnativecommunity.progressview;

import android.widget.ProgressBar;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReadableMap;

import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewManagerDelegate;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.viewmanagers.RNCProgressViewManagerInterface;
import com.facebook.react.viewmanagers.RNCProgressViewManagerDelegate;


@ReactModule(name = RNCProgressViewManagerImpl.NAME)
public class RNCProgressViewManager extends SimpleViewManager<ProgressBar>
implements RNCProgressViewManagerInterface<ProgressBar> {

private final ViewManagerDelegate<ProgressBar> mDelegate;

public RNCProgressViewManager() {
mDelegate = new RNCProgressViewManagerDelegate<>(this);
}

@Nullable
@Override
protected ViewManagerDelegate<ProgressBar> getDelegate() {
return mDelegate;
}

@NonNull
@Override
public String getName() {
return RNCProgressViewManagerImpl.NAME;
}

@NonNull
@Override
protected ProgressBar createViewInstance(@NonNull ThemedReactContext context) {
return RNCProgressViewManagerImpl.createViewInstance(context);
}

@Override
@ReactProp(name = "progress")
public void setProgressViewStyle(ProgressBar bar, @Nullable String value) {
// RNCProgressViewManagerImpl.setProgress(bar, (double) progress);
}

@Override
@ReactProp(name = "progress")
public void setProgress(ProgressBar bar, float progress) {
RNCProgressViewManagerImpl.setProgress(bar, (double) progress);
}

@Override
@ReactProp(name = "progressTintColor", customType = "Color")
public void setProgressTintColor(ProgressBar bar, @Nullable Integer color) {
RNCProgressViewManagerImpl.setProgressTintColor(bar, color);
}

@Override
@ReactProp(name = "trackTintColor", customType = "Color")
public void setTrackTintColor(ProgressBar bar, @Nullable Integer color) {
RNCProgressViewManagerImpl.setTrackTintColor(bar, color);
}

@Override
@ReactProp(name = "isIndeterminate")
public void setIsIndeterminate(ProgressBar bar, boolean isIndeterminate) {
RNCProgressViewManagerImpl.setIsIndeterminate(bar, isIndeterminate);
}

@Override
@ReactProp(name = "progressImage")
public void setProgressImage(ProgressBar bar, @Nullable ReadableMap image) {}

@Override
@ReactProp(name = "trackImage")
public void setTrackImage(ProgressBar bar, @Nullable ReadableMap image) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.reactnativecommunity.progressview;

import android.content.res.ColorStateList;
import android.widget.ProgressBar;

import androidx.annotation.Nullable;

import com.facebook.react.uimanager.ThemedReactContext;

public class RNCProgressViewManagerImpl {
private static final int MAX_PROGRESS_VALUE = 1000;

public static final String NAME = "RNCProgressView";

public static ProgressBar createViewInstance(ThemedReactContext reactContext) {
ProgressBar bar = new ProgressBar(
reactContext,
null,
android.R.attr.progressBarStyleHorizontal
);
bar.setMax(MAX_PROGRESS_VALUE);
return bar;
}


public static void setProgress(ProgressBar bar, double progress) {
bar.setProgress((int) (MAX_PROGRESS_VALUE * progress));
}

public static void setProgressTintColor(ProgressBar bar, int color) {
bar.setIndeterminateTintList(ColorStateList.valueOf(color));
bar.setProgressTintList(ColorStateList.valueOf(color));
}

public static void setTrackTintColor(ProgressBar bar, int color) {
bar.setProgressBackgroundTintList(ColorStateList.valueOf(color));
}

public static void setIsIndeterminate(ProgressBar bar, boolean isIndeterminate) {
bar.setIndeterminate(isIndeterminate);
}
}
Original file line number Diff line number Diff line change
@@ -1,53 +1,44 @@
package com.reactnativecommunity.progressview;

import android.content.res.ColorStateList;
import android.widget.ProgressBar;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;

public class RNCProgressViewManager extends SimpleViewManager<ProgressBar> {
private static final int MAX_PROGRESS_VALUE = 1000;

@NonNull
@Override
public String getName() {
return "RNCProgressView";
return RNCProgressViewManagerImpl.NAME;
}

@NonNull
@Override
protected ProgressBar createViewInstance(@NonNull ThemedReactContext reactContext) {
ProgressBar bar = new ProgressBar(
reactContext,
null,
android.R.attr.progressBarStyleHorizontal
);
bar.setMax(MAX_PROGRESS_VALUE);
return bar;
return RNCProgressViewManagerImpl.createViewInstance(reactContext);
}

@ReactProp(name = "progress")
public void setProgress(ProgressBar bar, double progress) {
bar.setProgress((int) (MAX_PROGRESS_VALUE * progress));
RNCProgressViewManagerImpl.setProgress(bar, progress);
}

@ReactProp(name = "progressTintColor", customType = "Color")
public void setProgressTintColor(ProgressBar bar, int color) {
bar.setIndeterminateTintList(ColorStateList.valueOf(color));
bar.setProgressTintList(ColorStateList.valueOf(color));
RNCProgressViewManagerImpl.setProgressTintColor(bar, color);
}

@ReactProp(name = "trackTintColor", customType = "Color")
public void setTrackTintColor(ProgressBar bar, int color) {
bar.setProgressBackgroundTintList(ColorStateList.valueOf(color));
RNCProgressViewManagerImpl.setTrackTintColor(bar, color);
}

@ReactProp(name = "isIndeterminate")
public void setIsIndeterminate(ProgressBar bar, boolean isIndeterminate) {
bar.setIndeterminate(isIndeterminate);
RNCProgressViewManagerImpl.setIsIndeterminate(bar, isIndeterminate);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@

#pragma once

#include <react/renderer/core/ConcreteComponentDescriptor.h>
#include "RNCProgressViewShadowNode.h"

namespace facebook {
namespace react {

/*
* Descriptor for <RNCProgressView> component.
*/
class RNCProgressViewComponentDescriptor final
: public ConcreteComponentDescriptor<RNCProgressViewShadowNode> {
public:
RNCProgressViewComponentDescriptor(
ComponentDescriptorParameters const &parameters)
: ConcreteComponentDescriptor(parameters),
imageManager_(std::make_shared<ImageManager>(contextContainer_)) {}

void adopt(ShadowNode::Unshared const &shadowNode) const override {
ConcreteComponentDescriptor::adopt(shadowNode);

auto progressViewhadowNode =
std::static_pointer_cast<RNCProgressViewShadowNode>(shadowNode);

// `RNCProgressViewShadowNode` uses `ImageManager` to initiate image loading
// and communicate the loading state and results to mounting layer.
progressViewhadowNode->setImageManager(imageManager_);
}

private:
const SharedImageManager imageManager_;
};

} // namespace react
} // namespace facebook
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#include "RNCProgressViewShadowNode.h"

namespace facebook {
namespace react {

extern const char RNCProgressViewComponentName[] = "RNCProgressView";

void RNCProgressViewShadowNode::setImageManager(
const SharedImageManager &imageManager) {
ensureUnsealed();
imageManager_ = imageManager;
}

void RNCProgressViewShadowNode::updateStateIfNeeded() {
const auto &newProgressImageSource = getProgressImageSource();
const auto &newTrackImageSource = getTrackImageSource();

auto const &currentState = getStateData();

auto progressImageSource = currentState.getProgressImageSource();
auto trackImageSource = currentState.getTrackImageSource();

bool anyChanged = newProgressImageSource != progressImageSource ||
newTrackImageSource != trackImageSource;

if (!anyChanged) {
return;
}

// Now we are about to mutate the Shadow Node.
ensureUnsealed();

auto state = RNCProgressViewState{
newProgressImageSource,
imageManager_->requestImage(newProgressImageSource, getSurfaceId()),
newTrackImageSource,
imageManager_->requestImage(newTrackImageSource, getSurfaceId()),
};
setStateData(std::move(state));
}

ImageSource RNCProgressViewShadowNode::getProgressImageSource() const {
return getConcreteProps().progressImage;
}

ImageSource RNCProgressViewShadowNode::getTrackImageSource() const {
return getConcreteProps().trackImage;
}

#pragma mark - LayoutableShadowNode

void RNCProgressViewShadowNode::layout(LayoutContext layoutContext) {
updateStateIfNeeded();
}

} // namespace react
} // namespace facebook
Loading

0 comments on commit f9ce7d2

Please sign in to comment.