Skip to content

Commit d27d936

Browse files
Merge pull request #46 from itsramiel/feat/new-arch
feat: support new arch with backward compatibility
2 parents 667c9a5 + 9fb4036 commit d27d936

File tree

20 files changed

+369
-486
lines changed

20 files changed

+369
-486
lines changed

android/build.gradle

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,48 @@
1-
def safeExtGet(prop, fallback) {
1+
def isNewArchitectureEnabled() {
2+
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
3+
}
4+
buildscript {
5+
ext.safeExtGet = {prop, fallback ->
26
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
7+
}
8+
repositories {
9+
google()
10+
gradlePluginPortal()
11+
}
12+
dependencies {
13+
classpath("com.android.tools.build:gradle:7.3.1")
14+
}
315
}
416

517
apply plugin: 'com.android.library'
18+
apply plugin: 'com.facebook.react'
619

720
android {
8-
compileSdkVersion safeExtGet('compileSdkVersion', 30)
9-
buildToolsVersion safeExtGet('buildToolsVersion', '28.0.3')
21+
compileSdkVersion safeExtGet('compileSdkVersion', 33)
22+
namespace "com.clipsub.RNShake"
1023

11-
defaultConfig {
12-
minSdkVersion safeExtGet('minSdkVersion', 18)
13-
versionCode 4
14-
versionName "4.0.0"
15-
}
16-
lintOptions {
17-
warning 'InvalidPackage'
24+
defaultConfig {
25+
minSdkVersion safeExtGet('minSdkVersion', 21)
26+
targetSdkVersion safeExtGet('targetSdkVersion', 33)
27+
buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString())
28+
}
29+
30+
sourceSets {
31+
main {
32+
if(isNewArchitectureEnabled()) {
33+
java.srcDirs += ['src/newarch/java']
34+
} else {
35+
java.srcDirs += ['src/oldarch/java']
36+
}
1837
}
38+
}
1939
}
2040

21-
dependencies {
22-
implementation "com.facebook.react:react-native:+"
41+
repositories {
42+
mavenCentral()
43+
google()
2344
}
2445

25-
allprojects {
26-
repositories {
27-
maven { url "https://jitpack.io" }
28-
mavenLocal()
29-
jcenter()
30-
maven {
31-
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
32-
url "$rootDir/../node_modules/react-native/android"
33-
}
34-
maven {
35-
url "https://maven.google.com"
36-
}
37-
}
38-
}
46+
dependencies {
47+
implementation 'com.facebook.react:react-native'
48+
}

android/src/main/AndroidManifest.xml

Lines changed: 0 additions & 3 deletions
This file was deleted.

android/src/main/java/com/clipsub/RNShake/RNShakeEventModule.java

Lines changed: 0 additions & 44 deletions
This file was deleted.

android/src/main/java/com/clipsub/RNShake/RNShakeEventPackage.java

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.clipsub.RNShake;
2+
3+
import android.content.Context;
4+
import android.hardware.SensorManager;
5+
6+
import com.facebook.react.bridge.ReactApplicationContext;
7+
import com.facebook.react.modules.core.DeviceEventManagerModule;
8+
9+
public class RNShakeModuleImpl {
10+
private final ReactApplicationContext reactContext;
11+
12+
public static final String NAME = "RNShake";
13+
public final String EVENT_NAME = "ShakeEvent";
14+
15+
private CustomShakeDetector mCustomShakeDetector = null;
16+
17+
public RNShakeModuleImpl(ReactApplicationContext reactContext){
18+
this.reactContext = reactContext;
19+
}
20+
21+
public void onInitialize() {
22+
mCustomShakeDetector = new CustomShakeDetector(this::sendEvent);
23+
24+
mCustomShakeDetector.start(
25+
(SensorManager) reactContext.getSystemService(Context.SENSOR_SERVICE));
26+
}
27+
28+
public void onInvalidate() {
29+
mCustomShakeDetector.stop();
30+
mCustomShakeDetector = null;
31+
}
32+
33+
private void sendEvent(){
34+
reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
35+
.emit(EVENT_NAME, null);
36+
}
37+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.clipsub.RNShake;
2+
3+
import androidx.annotation.Nullable;
4+
import com.facebook.react.bridge.NativeModule;
5+
import com.facebook.react.bridge.ReactApplicationContext;
6+
import com.facebook.react.module.model.ReactModuleInfo;
7+
import com.facebook.react.module.model.ReactModuleInfoProvider;
8+
import com.facebook.react.TurboReactPackage;
9+
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
13+
public class RNShakePackage extends TurboReactPackage {
14+
15+
@Nullable
16+
@Override
17+
public NativeModule getModule(String name, ReactApplicationContext reactContext) {
18+
if(name.equals(RNShakeModuleImpl.NAME)){
19+
return new RNShakeModule(reactContext);
20+
} else {
21+
return null;
22+
}
23+
}
24+
25+
@Override
26+
public ReactModuleInfoProvider getReactModuleInfoProvider() {
27+
return () -> {
28+
boolean isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
29+
final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>();
30+
moduleInfos.put(
31+
RNShakeModuleImpl.NAME,
32+
new ReactModuleInfo(
33+
RNShakeModuleImpl.NAME,
34+
RNShakeModuleImpl.NAME,
35+
false,
36+
false,
37+
true,
38+
false,
39+
isTurboModule
40+
)
41+
);
42+
return moduleInfos;
43+
};
44+
}
45+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.clipsub.RNShake;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import com.facebook.react.bridge.ReactApplicationContext;
6+
7+
public class RNShakeModule extends NativeRNShakeSpec {
8+
private RNShakeModuleImpl moduleImpl;
9+
10+
public RNShakeModule(ReactApplicationContext reactContext){
11+
super(reactContext);
12+
moduleImpl = new RNShakeModuleImpl(reactContext);
13+
}
14+
15+
@Override
16+
public void initialize() {
17+
super.initialize();
18+
moduleImpl.onInitialize();
19+
}
20+
21+
@Override
22+
public void invalidate() {
23+
super.invalidate();
24+
moduleImpl.onInvalidate();
25+
}
26+
27+
@Override
28+
public void addListener(String eventName) {
29+
30+
}
31+
32+
@Override
33+
public void removeListeners(double count) {
34+
35+
}
36+
37+
@NonNull
38+
@Override
39+
public String getName() {
40+
return RNShakeModuleImpl.NAME;
41+
}
42+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.clipsub.RNShake;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import com.facebook.react.bridge.ReactApplicationContext;
6+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
7+
import com.facebook.react.bridge.ReactMethod;
8+
import com.facebook.react.module.annotations.ReactModule;
9+
10+
@ReactModule(name = RNShakeModuleImpl.NAME)
11+
public class RNShakeModule extends ReactContextBaseJavaModule {
12+
private final RNShakeModuleImpl moduleImpl;
13+
14+
public RNShakeModule(ReactApplicationContext reactContext) {
15+
super(reactContext);
16+
moduleImpl = new RNShakeModuleImpl(reactContext);
17+
}
18+
19+
@NonNull
20+
@Override
21+
public String getName() {
22+
return RNShakeModuleImpl.NAME;
23+
}
24+
25+
@Override
26+
public void initialize() {
27+
super.initialize();
28+
moduleImpl.onInitialize();
29+
}
30+
31+
@Override
32+
public void invalidate() {
33+
super.invalidate();
34+
moduleImpl.onInvalidate();
35+
}
36+
37+
@ReactMethod
38+
public void addListener(String eventName) {
39+
}
40+
41+
@ReactMethod
42+
public void removeListeners(double count) {
43+
}
44+
}

ios/RNShake.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#import <React/RCTEventEmitter.h>
2+
3+
@interface RNShake : RCTEventEmitter
4+
5+
@end

ios/RNShake.mm

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#import "RNShake.h"
2+
#import "RNShakeImpl.h"
3+
4+
#if RCT_NEW_ARCH_ENABLED
5+
6+
#import "RNShakeSpec.h"
7+
8+
@interface RNShake () <NativeRNShakeSpec>
9+
@end
10+
11+
#endif
12+
13+
@interface RNShake () <RNShakeImplDelegate>
14+
@end
15+
16+
@implementation RNShake{
17+
RNShakeImpl *moduleImpl;
18+
BOOL hasListeners;
19+
}
20+
21+
RCT_EXPORT_MODULE(RNShake)
22+
23+
-(instancetype)init {
24+
self = [super init];
25+
if(self){
26+
moduleImpl = [RNShakeImpl new];
27+
moduleImpl.delegate = self;
28+
}
29+
return self;
30+
}
31+
32+
- (void)handleEventWithName:(NSString * _Nonnull)name {
33+
if(hasListeners){
34+
[self sendEventWithName:name body:nil];
35+
}
36+
}
37+
38+
- (NSArray<NSString *> *)supportedEvents
39+
{
40+
return [RNShakeImpl supportedEvents];
41+
}
42+
43+
- (void)startObserving
44+
{
45+
hasListeners = YES;
46+
}
47+
48+
-(void)stopObserving
49+
{
50+
hasListeners = NO;
51+
}
52+
53+
+ (BOOL)requiresMainQueueSetup
54+
{
55+
return YES;
56+
}
57+
58+
#if RCT_NEW_ARCH_ENABLED
59+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params {
60+
return std::make_shared<facebook::react::NativeRNShakeSpecJSI>(params);
61+
}
62+
#endif
63+
64+
@end

0 commit comments

Comments
 (0)