Skip to content

Commit f9ce7d2

Browse files
authored
Fabric support (#101)
1 parent 63c59eb commit f9ce7d2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+9501
-90
lines changed

android/build.gradle

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,68 @@
1+
import java.nio.file.Paths
12

23
buildscript {
34
repositories {
5+
google()
46
mavenCentral()
57
}
68

79
dependencies {
8-
classpath 'com.android.tools.build:gradle:1.3.1'
10+
classpath 'com.android.tools.build:gradle:3.5.3'
911
}
1012
}
1113

14+
def isNewArchitectureEnabled() {
15+
// To opt-in for the New Architecture, you can either:
16+
// - Set `newArchEnabled` to true inside the `gradle.properties` file
17+
// - Invoke gradle with `-newArchEnabled=true`
18+
// - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
19+
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
20+
}
21+
1222
apply plugin: 'com.android.library'
1323

24+
if (isNewArchitectureEnabled()) {
25+
apply plugin: "com.facebook.react"
26+
}
27+
28+
def getExtOrDefault(name, defaultValue) {
29+
return rootProject.ext.has(name) ? rootProject.ext.get(name) : defaultValue
30+
}
31+
1432
android {
15-
compileSdkVersion 30
16-
buildToolsVersion "29.0.3"
33+
compileSdkVersion getExtOrDefault('compileSdkVersion', 30)
34+
buildToolsVersion getExtOrDefault('buildToolsVersion', '29.0.3')
1735

1836
defaultConfig {
19-
minSdkVersion 21
20-
targetSdkVersion 30
37+
minSdkVersion getExtOrDefault('minSdkVersion', 21)
38+
targetSdkVersion getExtOrDefault('targetSdkVersion', 31)
2139
versionCode 1
2240
versionName "1.0"
41+
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
2342
}
43+
2444
lintOptions {
2545
abortOnError false
2646
}
47+
48+
sourceSets.main {
49+
java {
50+
if (isNewArchitectureEnabled()) {
51+
srcDirs += [
52+
"src/fabric/java",
53+
"${project.buildDir}/generated/source/codegen/java"
54+
]
55+
} else {
56+
srcDirs += [
57+
"src/paper/java",
58+
]
59+
}
60+
}
61+
}
2762
}
2863

2964
repositories {
65+
google()
3066
mavenCentral()
3167
}
3268

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.reactnativecommunity.progressview;
2+
3+
import android.widget.ProgressBar;
4+
5+
import androidx.annotation.NonNull;
6+
import androidx.annotation.Nullable;
7+
import com.facebook.react.bridge.ReadableMap;
8+
9+
import com.facebook.react.bridge.ReadableArray;
10+
import com.facebook.react.module.annotations.ReactModule;
11+
import com.facebook.react.uimanager.SimpleViewManager;
12+
import com.facebook.react.uimanager.ThemedReactContext;
13+
import com.facebook.react.uimanager.ViewManagerDelegate;
14+
import com.facebook.react.uimanager.annotations.ReactProp;
15+
import com.facebook.react.viewmanagers.RNCProgressViewManagerInterface;
16+
import com.facebook.react.viewmanagers.RNCProgressViewManagerDelegate;
17+
18+
19+
@ReactModule(name = RNCProgressViewManagerImpl.NAME)
20+
public class RNCProgressViewManager extends SimpleViewManager<ProgressBar>
21+
implements RNCProgressViewManagerInterface<ProgressBar> {
22+
23+
private final ViewManagerDelegate<ProgressBar> mDelegate;
24+
25+
public RNCProgressViewManager() {
26+
mDelegate = new RNCProgressViewManagerDelegate<>(this);
27+
}
28+
29+
@Nullable
30+
@Override
31+
protected ViewManagerDelegate<ProgressBar> getDelegate() {
32+
return mDelegate;
33+
}
34+
35+
@NonNull
36+
@Override
37+
public String getName() {
38+
return RNCProgressViewManagerImpl.NAME;
39+
}
40+
41+
@NonNull
42+
@Override
43+
protected ProgressBar createViewInstance(@NonNull ThemedReactContext context) {
44+
return RNCProgressViewManagerImpl.createViewInstance(context);
45+
}
46+
47+
@Override
48+
@ReactProp(name = "progress")
49+
public void setProgressViewStyle(ProgressBar bar, @Nullable String value) {
50+
// RNCProgressViewManagerImpl.setProgress(bar, (double) progress);
51+
}
52+
53+
@Override
54+
@ReactProp(name = "progress")
55+
public void setProgress(ProgressBar bar, float progress) {
56+
RNCProgressViewManagerImpl.setProgress(bar, (double) progress);
57+
}
58+
59+
@Override
60+
@ReactProp(name = "progressTintColor", customType = "Color")
61+
public void setProgressTintColor(ProgressBar bar, @Nullable Integer color) {
62+
RNCProgressViewManagerImpl.setProgressTintColor(bar, color);
63+
}
64+
65+
@Override
66+
@ReactProp(name = "trackTintColor", customType = "Color")
67+
public void setTrackTintColor(ProgressBar bar, @Nullable Integer color) {
68+
RNCProgressViewManagerImpl.setTrackTintColor(bar, color);
69+
}
70+
71+
@Override
72+
@ReactProp(name = "isIndeterminate")
73+
public void setIsIndeterminate(ProgressBar bar, boolean isIndeterminate) {
74+
RNCProgressViewManagerImpl.setIsIndeterminate(bar, isIndeterminate);
75+
}
76+
77+
@Override
78+
@ReactProp(name = "progressImage")
79+
public void setProgressImage(ProgressBar bar, @Nullable ReadableMap image) {}
80+
81+
@Override
82+
@ReactProp(name = "trackImage")
83+
public void setTrackImage(ProgressBar bar, @Nullable ReadableMap image) {}
84+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.reactnativecommunity.progressview;
2+
3+
import android.content.res.ColorStateList;
4+
import android.widget.ProgressBar;
5+
6+
import androidx.annotation.Nullable;
7+
8+
import com.facebook.react.uimanager.ThemedReactContext;
9+
10+
public class RNCProgressViewManagerImpl {
11+
private static final int MAX_PROGRESS_VALUE = 1000;
12+
13+
public static final String NAME = "RNCProgressView";
14+
15+
public static ProgressBar createViewInstance(ThemedReactContext reactContext) {
16+
ProgressBar bar = new ProgressBar(
17+
reactContext,
18+
null,
19+
android.R.attr.progressBarStyleHorizontal
20+
);
21+
bar.setMax(MAX_PROGRESS_VALUE);
22+
return bar;
23+
}
24+
25+
26+
public static void setProgress(ProgressBar bar, double progress) {
27+
bar.setProgress((int) (MAX_PROGRESS_VALUE * progress));
28+
}
29+
30+
public static void setProgressTintColor(ProgressBar bar, int color) {
31+
bar.setIndeterminateTintList(ColorStateList.valueOf(color));
32+
bar.setProgressTintList(ColorStateList.valueOf(color));
33+
}
34+
35+
public static void setTrackTintColor(ProgressBar bar, int color) {
36+
bar.setProgressBackgroundTintList(ColorStateList.valueOf(color));
37+
}
38+
39+
public static void setIsIndeterminate(ProgressBar bar, boolean isIndeterminate) {
40+
bar.setIndeterminate(isIndeterminate);
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,44 @@
11
package com.reactnativecommunity.progressview;
22

3-
import android.content.res.ColorStateList;
43
import android.widget.ProgressBar;
54

65
import androidx.annotation.NonNull;
76

7+
import com.facebook.react.bridge.ReactApplicationContext;
88
import com.facebook.react.uimanager.SimpleViewManager;
99
import com.facebook.react.uimanager.ThemedReactContext;
1010
import com.facebook.react.uimanager.annotations.ReactProp;
1111

1212
public class RNCProgressViewManager extends SimpleViewManager<ProgressBar> {
13-
private static final int MAX_PROGRESS_VALUE = 1000;
14-
1513
@NonNull
1614
@Override
1715
public String getName() {
18-
return "RNCProgressView";
16+
return RNCProgressViewManagerImpl.NAME;
1917
}
2018

2119
@NonNull
2220
@Override
2321
protected ProgressBar createViewInstance(@NonNull ThemedReactContext reactContext) {
24-
ProgressBar bar = new ProgressBar(
25-
reactContext,
26-
null,
27-
android.R.attr.progressBarStyleHorizontal
28-
);
29-
bar.setMax(MAX_PROGRESS_VALUE);
30-
return bar;
22+
return RNCProgressViewManagerImpl.createViewInstance(reactContext);
3123
}
3224

3325
@ReactProp(name = "progress")
3426
public void setProgress(ProgressBar bar, double progress) {
35-
bar.setProgress((int) (MAX_PROGRESS_VALUE * progress));
27+
RNCProgressViewManagerImpl.setProgress(bar, progress);
3628
}
3729

3830
@ReactProp(name = "progressTintColor", customType = "Color")
3931
public void setProgressTintColor(ProgressBar bar, int color) {
40-
bar.setIndeterminateTintList(ColorStateList.valueOf(color));
41-
bar.setProgressTintList(ColorStateList.valueOf(color));
32+
RNCProgressViewManagerImpl.setProgressTintColor(bar, color);
4233
}
4334

4435
@ReactProp(name = "trackTintColor", customType = "Color")
4536
public void setTrackTintColor(ProgressBar bar, int color) {
46-
bar.setProgressBackgroundTintList(ColorStateList.valueOf(color));
37+
RNCProgressViewManagerImpl.setTrackTintColor(bar, color);
4738
}
4839

4940
@ReactProp(name = "isIndeterminate")
5041
public void setIsIndeterminate(ProgressBar bar, boolean isIndeterminate) {
51-
bar.setIndeterminate(isIndeterminate);
42+
RNCProgressViewManagerImpl.setIsIndeterminate(bar, isIndeterminate);
5243
}
5344
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
2+
#pragma once
3+
4+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
5+
#include "RNCProgressViewShadowNode.h"
6+
7+
namespace facebook {
8+
namespace react {
9+
10+
/*
11+
* Descriptor for <RNCProgressView> component.
12+
*/
13+
class RNCProgressViewComponentDescriptor final
14+
: public ConcreteComponentDescriptor<RNCProgressViewShadowNode> {
15+
public:
16+
RNCProgressViewComponentDescriptor(
17+
ComponentDescriptorParameters const &parameters)
18+
: ConcreteComponentDescriptor(parameters),
19+
imageManager_(std::make_shared<ImageManager>(contextContainer_)) {}
20+
21+
void adopt(ShadowNode::Unshared const &shadowNode) const override {
22+
ConcreteComponentDescriptor::adopt(shadowNode);
23+
24+
auto progressViewhadowNode =
25+
std::static_pointer_cast<RNCProgressViewShadowNode>(shadowNode);
26+
27+
// `RNCProgressViewShadowNode` uses `ImageManager` to initiate image loading
28+
// and communicate the loading state and results to mounting layer.
29+
progressViewhadowNode->setImageManager(imageManager_);
30+
}
31+
32+
private:
33+
const SharedImageManager imageManager_;
34+
};
35+
36+
} // namespace react
37+
} // namespace facebook
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include "RNCProgressViewShadowNode.h"
2+
3+
namespace facebook {
4+
namespace react {
5+
6+
extern const char RNCProgressViewComponentName[] = "RNCProgressView";
7+
8+
void RNCProgressViewShadowNode::setImageManager(
9+
const SharedImageManager &imageManager) {
10+
ensureUnsealed();
11+
imageManager_ = imageManager;
12+
}
13+
14+
void RNCProgressViewShadowNode::updateStateIfNeeded() {
15+
const auto &newProgressImageSource = getProgressImageSource();
16+
const auto &newTrackImageSource = getTrackImageSource();
17+
18+
auto const &currentState = getStateData();
19+
20+
auto progressImageSource = currentState.getProgressImageSource();
21+
auto trackImageSource = currentState.getTrackImageSource();
22+
23+
bool anyChanged = newProgressImageSource != progressImageSource ||
24+
newTrackImageSource != trackImageSource;
25+
26+
if (!anyChanged) {
27+
return;
28+
}
29+
30+
// Now we are about to mutate the Shadow Node.
31+
ensureUnsealed();
32+
33+
auto state = RNCProgressViewState{
34+
newProgressImageSource,
35+
imageManager_->requestImage(newProgressImageSource, getSurfaceId()),
36+
newTrackImageSource,
37+
imageManager_->requestImage(newTrackImageSource, getSurfaceId()),
38+
};
39+
setStateData(std::move(state));
40+
}
41+
42+
ImageSource RNCProgressViewShadowNode::getProgressImageSource() const {
43+
return getConcreteProps().progressImage;
44+
}
45+
46+
ImageSource RNCProgressViewShadowNode::getTrackImageSource() const {
47+
return getConcreteProps().trackImage;
48+
}
49+
50+
#pragma mark - LayoutableShadowNode
51+
52+
void RNCProgressViewShadowNode::layout(LayoutContext layoutContext) {
53+
updateStateIfNeeded();
54+
}
55+
56+
} // namespace react
57+
} // namespace facebook

0 commit comments

Comments
 (0)