add missing refactored files
This commit is contained in:
parent
1e4c905cdc
commit
b92a281b5e
|
@ -0,0 +1,113 @@
|
||||||
|
package io.realm.react.example;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
|
||||||
|
import com.facebook.react.LifecycleState;
|
||||||
|
import com.facebook.react.ReactInstanceManager;
|
||||||
|
import com.facebook.react.ReactPackage;
|
||||||
|
import com.facebook.react.ReactRootView;
|
||||||
|
import com.facebook.react.bridge.JavaScriptModule;
|
||||||
|
import com.facebook.react.bridge.NativeModule;
|
||||||
|
import com.facebook.react.bridge.ReactApplicationContext;
|
||||||
|
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
|
||||||
|
import com.facebook.react.shell.MainReactPackage;
|
||||||
|
import com.facebook.react.uimanager.ViewManager;
|
||||||
|
import com.facebook.soloader.SoLoader;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.realm.react.RealmReactAndroid;
|
||||||
|
|
||||||
|
public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {
|
||||||
|
|
||||||
|
private ReactInstanceManager mReactInstanceManager;
|
||||||
|
private ReactRootView mReactRootView;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
mReactRootView = new ReactRootView(this);
|
||||||
|
|
||||||
|
mReactInstanceManager = ReactInstanceManager.builder()
|
||||||
|
.setApplication(getApplication())
|
||||||
|
.setBundleAssetName("index.android.bundle")
|
||||||
|
.setJSMainModuleName("index.android")
|
||||||
|
.addPackage(new MainReactPackage())
|
||||||
|
.addPackage(new AnExampleReactPackage())
|
||||||
|
.setUseDeveloperSupport(BuildConfig.DEBUG)
|
||||||
|
.setInitialLifecycleState(LifecycleState.RESUMED)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
mReactRootView.startReactApplication(mReactInstanceManager, "ReactExample", null);
|
||||||
|
|
||||||
|
setContentView(mReactRootView);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||||
|
if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
|
||||||
|
mReactInstanceManager.showDevOptionsDialog();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onKeyUp(keyCode, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBackPressed() {
|
||||||
|
if (mReactInstanceManager != null) {
|
||||||
|
mReactInstanceManager.onBackPressed();
|
||||||
|
} else {
|
||||||
|
super.onBackPressed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invokeDefaultOnBackPressed() {
|
||||||
|
super.onBackPressed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
|
||||||
|
if (mReactInstanceManager != null) {
|
||||||
|
mReactInstanceManager.onPause();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
|
||||||
|
if (mReactInstanceManager != null) {
|
||||||
|
mReactInstanceManager.onResume(this, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class AnExampleReactPackage implements ReactPackage {
|
||||||
|
@Override
|
||||||
|
public List<NativeModule> createNativeModules(
|
||||||
|
ReactApplicationContext reactContext) {
|
||||||
|
List<NativeModule> modules = new ArrayList<>();
|
||||||
|
|
||||||
|
modules.add(new RealmReactAndroid(reactContext));
|
||||||
|
|
||||||
|
return modules;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Class<? extends JavaScriptModule>> createJSModules() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,126 @@
|
||||||
|
package io.realm.react;
|
||||||
|
|
||||||
|
import com.facebook.react.bridge.NativeModule;
|
||||||
|
import com.facebook.react.bridge.ReactApplicationContext;
|
||||||
|
import com.facebook.react.bridge.ReactContext;
|
||||||
|
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||||
|
import com.facebook.react.bridge.ReactMethod;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import com.facebook.react.bridge.Callback;
|
||||||
|
import android.util.Log;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
import fi.iki.elonen.NanoHTTPD;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import com.facebook.soloader.SoLoader;
|
||||||
|
|
||||||
|
public class RealmReactAndroid extends ReactContextBaseJavaModule {
|
||||||
|
private static final String DURATION_SHORT_KEY = "SHORT";
|
||||||
|
private static final String DURATION_LONG_KEY = "LONG";
|
||||||
|
private String filesDirPath;
|
||||||
|
|
||||||
|
private static final int DEFAULT_PORT = 8082;
|
||||||
|
private AndroidWebServer webServer;
|
||||||
|
private long rpcServerPtr;
|
||||||
|
private Handler handler = new Handler(Looper.getMainLooper());
|
||||||
|
|
||||||
|
public RealmReactAndroid(ReactApplicationContext reactContext) {
|
||||||
|
super(reactContext);
|
||||||
|
try {
|
||||||
|
filesDirPath = getReactApplicationContext().getFilesDir().getCanonicalPath();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
|
SoLoader.loadLibrary("realmreact");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "RealmReactAndroid";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> getConstants() {
|
||||||
|
long contexts = injectRealmJsContext(filesDirPath);
|
||||||
|
Log.i("RealmReactAndroid", "Initialized " + contexts + " contexts");
|
||||||
|
if (contexts == 0) {// we're running in Chrome debug mode
|
||||||
|
startWebServer();
|
||||||
|
}
|
||||||
|
return new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCatalystInstanceDestroy() {
|
||||||
|
if (webServer != null) {
|
||||||
|
Log.i("RealmReactAndroid", "Stopping the webserver");
|
||||||
|
webServer.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void startWebServer() {
|
||||||
|
rpcServerPtr = setupChromeDebugModeRealmJsContext();
|
||||||
|
webServer = new AndroidWebServer(DEFAULT_PORT);
|
||||||
|
try {
|
||||||
|
webServer.start();
|
||||||
|
Log.i("RealmReactAndroid", "Starting WebServer, Host: " + webServer.getHostname() + " Port: " + webServer.getListeningPort());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebServer
|
||||||
|
class AndroidWebServer extends NanoHTTPD {
|
||||||
|
public AndroidWebServer(int port) {
|
||||||
|
super(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AndroidWebServer(String hostname, int port) {
|
||||||
|
super(hostname, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Response serve(IHTTPSession session) {
|
||||||
|
final String cmdUri = session.getUri();
|
||||||
|
Log.v("AndroidWebServer", "Session Uri: " + cmdUri + " Mehtod: " + session.getMethod().name());
|
||||||
|
final HashMap<String, String> map = new HashMap<String, String>();
|
||||||
|
try {
|
||||||
|
session.parseBody(map);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ResponseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
final String json = map.get("postData");
|
||||||
|
Log.v("AndroidWebServer", "Post Data: \n" + json + "\n Thread id: " + Thread.currentThread().getName());
|
||||||
|
final String[] jsonResponse = new String[1];
|
||||||
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
|
// Process the command on the UI thread
|
||||||
|
handler.post(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
jsonResponse[0] = processChromeDebugCommand(rpcServerPtr, cmdUri, json);
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
latch.await();
|
||||||
|
Response response = newFixedLengthResponse(jsonResponse[0]);
|
||||||
|
response.addHeader("Access-Control-Allow-Origin", "http://localhost:8081");
|
||||||
|
return response;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fileDir: path of the internal storage of the application
|
||||||
|
private native long injectRealmJsContext(String fileDir);
|
||||||
|
// responsible for creating the rpcServer that will accept thw chrome Websocket command
|
||||||
|
private native long setupChromeDebugModeRealmJsContext();
|
||||||
|
// this receives one command from Chrome debug, & return the processing we should post back
|
||||||
|
private native String processChromeDebugCommand(long rpcServerPointer, String cmd, String args);
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class io_realm_react_RealmReactAndroid */
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "io_realm_react_RealmReactAndroid.h"
|
||||||
|
#include "js_init.h"
|
||||||
|
#include "rpc.hpp"
|
||||||
|
#include "platform.hpp"
|
||||||
|
#include "shared_realm.hpp"
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <android/log.h>
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace react {
|
||||||
|
class JSCExecutor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: io_realm_react_RealmReactAndroid
|
||||||
|
* Method: injectRealmJsContext
|
||||||
|
* Signature: ()Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_io_realm_react_RealmReactAndroid_injectRealmJsContext
|
||||||
|
(JNIEnv *env, jclass, jstring fileDir)
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_DEBUG, "JSRealm", "Java_io_realm_react_RealmReactAndroid_injectRealmJsContext");
|
||||||
|
void* handle = dlopen ("libreactnativejni.so", RTLD_LAZY);
|
||||||
|
if (!handle) {
|
||||||
|
return 0;
|
||||||
|
//return env->NewStringUTF("Cannot open library");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getting the internal storage path for the application
|
||||||
|
const char* strFileDir = env->GetStringUTFChars(fileDir , NULL);
|
||||||
|
realm::set_default_realm_file_directory(strFileDir);
|
||||||
|
env->ReleaseStringUTFChars(fileDir , strFileDir);
|
||||||
|
|
||||||
|
__android_log_print(ANDROID_LOG_DEBUG, "JSRealm", "Absolute path %s", realm::default_realm_file_directory().c_str());
|
||||||
|
|
||||||
|
// load the symbol
|
||||||
|
typedef std::unordered_map<JSContextRef, facebook::react::JSCExecutor*> (*get_jsc_context_t)();
|
||||||
|
|
||||||
|
get_jsc_context_t get_jsc_context = (get_jsc_context_t) dlsym(handle, "get_jsc_context");
|
||||||
|
|
||||||
|
if (get_jsc_context != NULL) {
|
||||||
|
// clearing previous instances
|
||||||
|
realm::Realm::s_global_cache.clear();
|
||||||
|
std::unordered_map<JSContextRef, facebook::react::JSCExecutor*> s_globalContextRefToJSCExecutor = get_jsc_context();
|
||||||
|
for (auto pair : s_globalContextRefToJSCExecutor) {
|
||||||
|
RJSInitializeInContext(pair.first);
|
||||||
|
}
|
||||||
|
return s_globalContextRefToJSCExecutor.size();
|
||||||
|
//std::stringstream msg;
|
||||||
|
//msg << "Got the globalContext map, size=" << s_globalContextRefToJSCExecutor.size();
|
||||||
|
//return env->NewStringUTF(msg.str().c_str());
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
// return env->NewStringUTF("Cannot find symbol get_jsc_context");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: io_realm_react_RealmReactAndroid
|
||||||
|
* Method: setupChromeDebugModeRealmJsContext
|
||||||
|
*/
|
||||||
|
static realm_js::RPCServer *s_rpc_server;
|
||||||
|
JNIEXPORT jlong JNICALL Java_io_realm_react_RealmReactAndroid_setupChromeDebugModeRealmJsContext
|
||||||
|
(JNIEnv *, jclass)
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_VERBOSE, "JSRealm", "Java_com_reacttests_RealmReactAndroid_setupChromeDebugModeRealmJsContext");
|
||||||
|
if (s_rpc_server) {
|
||||||
|
delete s_rpc_server;
|
||||||
|
}
|
||||||
|
s_rpc_server = new realm_js::RPCServer();
|
||||||
|
return (jlong)s_rpc_server;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: io_realm_react_RealmReactAndroid
|
||||||
|
* Method: processChromeDebugCommand
|
||||||
|
*/
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_io_realm_react_RealmReactAndroid_processChromeDebugCommand
|
||||||
|
(JNIEnv *env, jclass, jlong rpc_server_ptr, jstring chrome_cmd, jstring chrome_args)
|
||||||
|
{
|
||||||
|
__android_log_print(ANDROID_LOG_VERBOSE, "JSRealm", "Java_io_realm_react_RealmReactAndroid_processChromeDebugCommand");
|
||||||
|
const char* cmd = env->GetStringUTFChars(chrome_cmd, NULL);
|
||||||
|
const char* args = env->GetStringUTFChars(chrome_args, NULL);
|
||||||
|
realm_js::json json = realm_js::json::parse(args);
|
||||||
|
realm_js::json response = s_rpc_server->perform_request(cmd, json);
|
||||||
|
env->ReleaseStringUTFChars(chrome_cmd, cmd);
|
||||||
|
env->ReleaseStringUTFChars(chrome_args, args);
|
||||||
|
return env->NewStringUTF(response.dump().c_str());
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class io_realm_react_RealmReactAndroid */
|
||||||
|
|
||||||
|
#ifndef _Included_io_realm_react_RealmReactAndroid
|
||||||
|
#define _Included_io_realm_react_RealmReactAndroid
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: io_realm_react_RealmReactAndroid
|
||||||
|
* Method: injectRealmJsContext
|
||||||
|
* Signature: ()Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_io_realm_react_RealmReactAndroid_injectRealmJsContext
|
||||||
|
(JNIEnv *, jclass, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: io_realm_react_RealmReactAndroid
|
||||||
|
* Method: setupChromeDebugModeRealmJsContext
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_io_realm_react_RealmReactAndroid_setupChromeDebugModeRealmJsContext
|
||||||
|
(JNIEnv *, jclass);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: io_realm_react_RealmReactAndroid
|
||||||
|
* Method: processsetupChromeDebugCommand
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_io_realm_react_RealmReactAndroid_processChromeDebugCommand
|
||||||
|
(JNIEnv *, jclass, jlong, jstring, jstring);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
Loading…
Reference in New Issue