Skip to content
This repository was archived by the owner on Sep 4, 2021. It is now read-only.

Commit 642fe70

Browse files
author
devfd
committed
Android API
1 parent 3663a7d commit 642fe70

File tree

11 files changed

+493
-0
lines changed

11 files changed

+493
-0
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ project.xcworkspace
2727
.idea
2828
.gradle
2929
local.properties
30+
*.iml
31+
/local.properties
32+
/.idea/workspace.xml
33+
/.idea/libraries
34+
/build
35+
/captures
3036

3137
# node.js
3238
#

android/build.gradle

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apply plugin: 'com.android.library'
2+
3+
android {
4+
compileSdkVersion 23
5+
buildToolsVersion "23.0.1"
6+
7+
defaultConfig {
8+
minSdkVersion 16
9+
targetSdkVersion 22
10+
versionCode 1
11+
versionName "1.0"
12+
ndk {
13+
abiFilters "armeabi-v7a", "x86"
14+
}
15+
}
16+
}
17+
18+
dependencies {
19+
compile 'com.facebook.react:react-native:+'
20+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
package="co.apptailor.Worker" >
4+
<uses-permission android:name="android.permission.INTERNET" />
5+
</manifest>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package co.apptailor.Worker;
2+
3+
import com.facebook.react.bridge.CatalystInstance;
4+
import com.facebook.react.bridge.ReactApplicationContext;
5+
import com.facebook.react.modules.core.DeviceEventManagerModule;
6+
7+
import java.util.Random;
8+
9+
import co.apptailor.Worker.core.CatalystBuilder;
10+
import co.apptailor.Worker.core.BaseModuleList;
11+
import co.apptailor.Worker.core.WorkerSelfModule;
12+
13+
public class JSWorker {
14+
private int id;
15+
private String bundleName;
16+
private String sourceURL;
17+
private String filePath;
18+
private CatalystInstance catalystInstance;
19+
20+
public JSWorker(String bundleName, String sourceURL, String filePath) {
21+
this.id = Math.abs(new Random().nextInt());
22+
this.bundleName = bundleName;
23+
this.filePath = filePath;
24+
this.sourceURL = sourceURL;
25+
}
26+
27+
public int getWorkerId() {
28+
return this.id;
29+
}
30+
31+
public String getBundleName() {
32+
return bundleName;
33+
}
34+
35+
public String getFilePath() {
36+
return filePath;
37+
}
38+
39+
public void runFromContext(ReactApplicationContext context) throws Exception {
40+
terminate();
41+
42+
catalystInstance = new CatalystBuilder(context)
43+
.setSourceURL(sourceURL)
44+
.setBundleFilePath(filePath)
45+
.setModuleList(new BaseModuleList())
46+
.build();
47+
48+
WorkerSelfModule workerSelfModule = catalystInstance.getNativeModule(WorkerSelfModule.class);
49+
50+
if (workerSelfModule == null) {
51+
throw new RuntimeException("Missing required WorkerSelfModule");
52+
}
53+
54+
workerSelfModule.initialize(id, context);
55+
}
56+
57+
public void postMessage(String message) {
58+
catalystInstance.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
59+
.emit("WorkerMessage", message);
60+
}
61+
62+
public void terminate() {
63+
if (catalystInstance == null) {
64+
return;
65+
}
66+
67+
catalystInstance.destroy();
68+
catalystInstance = null;
69+
}
70+
}
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package co.apptailor.Worker;
2+
3+
import android.app.Activity;
4+
import android.os.Handler;
5+
import android.util.Log;
6+
7+
import com.facebook.react.bridge.LifecycleEventListener;
8+
import com.facebook.react.bridge.Promise;
9+
import com.facebook.react.bridge.ReactApplicationContext;
10+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
11+
import com.facebook.react.bridge.ReactMethod;
12+
import com.facebook.react.devsupport.DevInternalSettings;
13+
import com.facebook.react.devsupport.DevServerHelper;
14+
15+
import java.io.File;
16+
import java.util.HashMap;
17+
18+
public class WorkerModule extends ReactContextBaseJavaModule implements LifecycleEventListener {
19+
private String TAG = "WorkerModule";
20+
21+
private ReactApplicationContext context;
22+
23+
private HashMap<Integer, JSWorker> workers;
24+
private DevServerHelper devServerHelper;
25+
26+
public WorkerModule(ReactApplicationContext reactContext) {
27+
super(reactContext);
28+
this.context = reactContext;
29+
this.workers = new HashMap<>();
30+
context.addLifecycleEventListener(this);
31+
}
32+
33+
@Override
34+
public String getName() {
35+
return "RNWorker";
36+
}
37+
38+
@ReactMethod
39+
public void startWorker(String bundleName, final Promise promise) {
40+
if (devServerHelper == null) {
41+
DevInternalSettings devInternalSettings = new DevInternalSettings(context, null);
42+
devInternalSettings.setHotModuleReplacementEnabled(false);
43+
devInternalSettings.setElementInspectorEnabled(false);
44+
devInternalSettings.setReloadOnJSChangeEnabled(false);
45+
46+
devServerHelper = new DevServerHelper(devInternalSettings);
47+
}
48+
49+
final File bundleFile = new File(context.getFilesDir(), bundleName);
50+
51+
final JSWorker worker = new JSWorker(bundleName, devServerHelper.getSourceUrl(bundleName),bundleFile.getAbsolutePath());
52+
53+
devServerHelper.downloadBundleFromURL(new DevServerHelper.BundleDownloadCallback() {
54+
@Override
55+
public void onSuccess() {
56+
Activity activity = getCurrentActivity();
57+
if (activity == null) {
58+
Log.d(TAG, "Worker startWorker - activity is null. aborting.");
59+
return;
60+
}
61+
62+
activity.runOnUiThread(new Runnable() {
63+
@Override
64+
public void run() {
65+
try {
66+
worker.runFromContext(context);
67+
workers.put(worker.getWorkerId(), worker);
68+
promise.resolve(worker.getWorkerId());
69+
} catch (Exception e) {
70+
e.printStackTrace();
71+
promise.reject(e);
72+
}
73+
}
74+
});
75+
}
76+
77+
@Override
78+
public void onFailure(Exception cause) {
79+
promise.reject(cause);
80+
}
81+
}, bundleName, bundleFile);
82+
}
83+
84+
@ReactMethod
85+
public void stopWorker(final int workerId) {
86+
final JSWorker worker = workers.get(workerId);
87+
if (worker == null) {
88+
Log.d(TAG, "Cannot stop worker - worker is null for id " + workerId);
89+
return;
90+
}
91+
92+
new Handler().post(new Runnable() {
93+
@Override
94+
public void run() {
95+
worker.terminate();
96+
workers.remove(workerId);
97+
}
98+
});
99+
}
100+
101+
@ReactMethod
102+
public void postWorkerMessage(int workerId, String message) {
103+
JSWorker worker = workers.get(workerId);
104+
if (worker == null) {
105+
Log.d(TAG, "Cannot post message to worker - worker is null for id " + workerId);
106+
return;
107+
}
108+
109+
worker.postMessage(message);
110+
}
111+
112+
@Override
113+
public void onHostResume() {}
114+
115+
@Override
116+
public void onHostPause() {}
117+
118+
@Override
119+
public void onHostDestroy() {
120+
Log.d(TAG, "Clean JS Workers");
121+
122+
new Handler().post(new Runnable() {
123+
@Override
124+
public void run() {
125+
for (int workerId : workers.keySet()) {
126+
workers.get(workerId).terminate();
127+
}
128+
}
129+
});
130+
}
131+
132+
@Override
133+
public void onCatalystInstanceDestroy() {
134+
super.onCatalystInstanceDestroy();
135+
onHostDestroy();
136+
}
137+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package co.apptailor.Worker;
2+
3+
import com.facebook.react.ReactPackage;
4+
import com.facebook.react.bridge.JavaScriptModule;
5+
import com.facebook.react.bridge.NativeModule;
6+
import com.facebook.react.bridge.ReactApplicationContext;
7+
import com.facebook.react.uimanager.ViewManager;
8+
9+
import java.util.ArrayList;
10+
import java.util.Collections;
11+
import java.util.List;
12+
13+
public class WorkerPackage implements ReactPackage {
14+
15+
public WorkerPackage() {
16+
super();
17+
}
18+
19+
@Override
20+
public List<Class<? extends JavaScriptModule>> createJSModules() {
21+
return Collections.emptyList();
22+
}
23+
24+
@Override
25+
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
26+
return Collections.emptyList();
27+
}
28+
29+
@Override
30+
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
31+
List<NativeModule> modules = new ArrayList<>();
32+
modules.add(new WorkerModule(reactContext));
33+
return modules;
34+
}
35+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package co.apptailor.Worker.core;
2+
3+
import com.facebook.react.bridge.JavaScriptModule;
4+
import com.facebook.react.bridge.NativeModule;
5+
import com.facebook.react.bridge.ReactApplicationContext;
6+
import com.facebook.react.modules.core.DeviceEventManagerModule;
7+
import com.facebook.react.modules.core.JSTimersExecution;
8+
import com.facebook.react.modules.core.RCTNativeAppEventEmitter;
9+
import com.facebook.react.modules.core.Timing;
10+
import com.facebook.react.modules.intent.IntentModule;
11+
import com.facebook.react.modules.location.LocationModule;
12+
import com.facebook.react.modules.netinfo.NetInfoModule;
13+
import com.facebook.react.modules.network.NetworkingModule;
14+
import com.facebook.react.modules.storage.AsyncStorageModule;
15+
import com.facebook.react.modules.systeminfo.AndroidInfoModule;
16+
import com.facebook.react.modules.vibration.VibrationModule;
17+
import com.facebook.react.modules.websocket.WebSocketModule;
18+
import com.facebook.react.uimanager.events.RCTEventEmitter;
19+
20+
import java.util.Arrays;
21+
import java.util.List;
22+
23+
public class BaseModuleList {
24+
25+
public List<NativeModule> nativeModules(ReactApplicationContext reactContext) {
26+
return Arrays.<NativeModule>asList(
27+
new AndroidInfoModule(),
28+
new Timing(reactContext),
29+
new UIManagerStubModule(reactContext),
30+
new AsyncStorageModule(reactContext),
31+
new IntentModule(reactContext),
32+
new LocationModule(reactContext),
33+
new NetworkingModule(reactContext),
34+
new NetInfoModule(reactContext),
35+
new VibrationModule(reactContext),
36+
new WebSocketModule(reactContext),
37+
new WorkerSelfModule(reactContext)
38+
);
39+
}
40+
41+
public List<Class<? extends JavaScriptModule>> jsModules() {
42+
return Arrays.asList(
43+
DeviceEventManagerModule.RCTDeviceEventEmitter.class,
44+
JSTimersExecution.class,
45+
RCTEventEmitter.class,
46+
RCTNativeAppEventEmitter.class,
47+
com.facebook.react.bridge.Systrace.class
48+
);
49+
}
50+
}

0 commit comments

Comments
 (0)