mirror of
https://github.com/spacedriveapp/spacedrive.git
synced 2026-10-14 12:48:29 -04:00
* Refactor navigation flow & types * Remove drawer screen wrapper * Remove DrawerItem + cleanup * Switch to JS Stack Nav & header animations * [WIP] Spacedrive core on Android & IOS * Update Podfile and cleanup Contributing guide. * Remove @sd/core from mobile * File Modal * Prettify File Modal & Add date-fns * IOS subscriptions * Update package versions * Custom header for stack screens * android subscriptions * Animate Drawer button & template for Search screen * Search header * Fix Search icon being weird * Merge branch 'main' into rustify-mobile * fix rspc dep + setup script for mobile * Less margin on header * Move shared assets & drawer logo for mobile * support for IOS simulator * add type safe rspc hooks to mobile * Cleanup PR & Update packages * Updated bindings from main * Update lefthook.yml * Remove `tag` folder from core The `tag` folder came back from the dead. Maybe it got confused in merge conflict? * update pnpm lockfile + fix tsc errors * fix asset import Co-authored-by: Utku Bakir <74243531+utkubakir@users.noreply.github.com>
112 lines
2.4 KiB
Rust
112 lines
2.4 KiB
Rust
use crate::{CLIENT_CONTEXT, EVENT_SENDER, NODE, RUNTIME};
|
|
use jni::objects::{JClass, JObject, JString};
|
|
use jni::JNIEnv;
|
|
use rspc::Request;
|
|
use sdcore::Node;
|
|
use tokio::sync::mpsc::unbounded_channel;
|
|
|
|
#[no_mangle]
|
|
pub extern "system" fn Java_com_spacedrive_app_SDCore_registerCoreEventListener(
|
|
env: JNIEnv,
|
|
class: JClass,
|
|
) {
|
|
let jvm = env.get_java_vm().unwrap();
|
|
let class = env.new_global_ref(class).unwrap();
|
|
let (tx, mut rx) = unbounded_channel();
|
|
let _ = EVENT_SENDER.set(tx);
|
|
|
|
RUNTIME.spawn(async move {
|
|
while let Some(event) = rx.recv().await {
|
|
let data = match serde_json::to_string(&event) {
|
|
Ok(json) => json,
|
|
Err(err) => {
|
|
println!("Failed to serialize event: {}", err);
|
|
continue;
|
|
},
|
|
};
|
|
|
|
let env = jvm.attach_current_thread().unwrap();
|
|
env.call_method(
|
|
&class,
|
|
"sendCoreEvent",
|
|
"(Ljava/lang/String;)V",
|
|
&[env
|
|
.new_string(data)
|
|
.expect("Couldn't create java string!")
|
|
.into()],
|
|
)
|
|
.unwrap();
|
|
}
|
|
});
|
|
}
|
|
|
|
#[no_mangle]
|
|
pub extern "system" fn Java_com_spacedrive_app_SDCore_handleCoreMsg(
|
|
env: JNIEnv,
|
|
class: JClass,
|
|
query: JString,
|
|
callback: JObject,
|
|
) {
|
|
let jvm = env.get_java_vm().unwrap();
|
|
let query: String = env
|
|
.get_string(query)
|
|
.expect("Couldn't get java string!")
|
|
.into();
|
|
let class = env.new_global_ref(class).unwrap();
|
|
let callback = env.new_global_ref(callback).unwrap();
|
|
|
|
RUNTIME.spawn(async move {
|
|
let request: Request = serde_json::from_str(&query).unwrap();
|
|
|
|
let node = &mut *NODE.lock().await;
|
|
let (node, router) = match node {
|
|
Some(node) => node.clone(),
|
|
None => {
|
|
let data_dir: String = {
|
|
let env = jvm.attach_current_thread().unwrap();
|
|
let data_dir = env
|
|
.call_method(
|
|
&class,
|
|
"getDataDirectory",
|
|
"()Ljava/lang/String;",
|
|
&[],
|
|
)
|
|
.unwrap()
|
|
.l()
|
|
.unwrap();
|
|
|
|
env.get_string(data_dir.into()).unwrap().into()
|
|
};
|
|
|
|
let new_node = Node::new(data_dir).await;
|
|
node.replace(new_node.clone());
|
|
new_node
|
|
},
|
|
};
|
|
|
|
let resp = serde_json::to_string(
|
|
&request
|
|
.handle(
|
|
node.get_request_context(),
|
|
&router,
|
|
&CLIENT_CONTEXT,
|
|
EVENT_SENDER.get(),
|
|
)
|
|
.await,
|
|
)
|
|
.unwrap();
|
|
|
|
let env = jvm.attach_current_thread().unwrap();
|
|
env.call_method(
|
|
&callback,
|
|
"resolve",
|
|
"(Ljava/lang/Object;)V",
|
|
&[env
|
|
.new_string(resp)
|
|
.expect("Couldn't create java string!")
|
|
.into()],
|
|
)
|
|
.unwrap();
|
|
});
|
|
}
|