feat(rustadapter): index notebook

This commit is contained in:
Matthieu Bessat 2024-02-05 15:28:45 +01:00
parent e292058b5c
commit ea3a307f96
12 changed files with 170 additions and 18 deletions

View file

@ -63,5 +63,6 @@ dependencies {
debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-tooling")
implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.annotation:annotation")
} }

View file

@ -3,7 +3,8 @@ package net.mbess.popequer
import android.content.Context import android.content.Context
class AppContext( class AppContext(
val androidContext: Context val androidContext: Context,
) { ) {
val gitActions = GitActions(androidContext) val gitActions = GitActions(androidContext)
val popequer = PopequerAdapter(gitActions.cloneFolder.absolutePath)
} }

View file

@ -11,7 +11,7 @@ import kotlin.math.absoluteValue
class GitActions( class GitActions(
private val context: Context private val context: Context
) { ) {
private val cloneFolder = context.filesDir.resolve("popequer") val cloneFolder = context.filesDir.resolve("popequer")
private val myCommitter = "Mobile Sandbox" to "example@example.org" private val myCommitter = "Mobile Sandbox" to "example@example.org"
private val credentials = UsernamePasswordCredentialsProvider( private val credentials = UsernamePasswordCredentialsProvider(
"popequer-mobile-sandbox", "popequer-mobile-sandbox",

View file

@ -0,0 +1,47 @@
// Automatically generated by flapigen
package net.mbess.popequer;
import androidx.annotation.NonNull;
public final class PopequerAdapter {
public PopequerAdapter(@NonNull String notebook_fs_path) {
mNativeObj = init(notebook_fs_path);
}
private static native long init(@NonNull String notebook_fs_path);
public final @NonNull String index() {
String ret = do_index(mNativeObj);
return ret;
}
private static native @NonNull String do_index(long self);
public final @NonNull String upcomingEvents() {
String ret = do_upcomingEvents(mNativeObj);
return ret;
}
private static native @NonNull String do_upcomingEvents(long self);
public synchronized void delete() {
if (mNativeObj != 0) {
do_delete(mNativeObj);
mNativeObj = 0;
}
}
@Override
protected void finalize() throws Throwable {
try {
delete();
}
finally {
super.finalize();
}
}
private static native void do_delete(long me);
/*package*/ PopequerAdapter(InternalPointerMarker marker, long ptr) {
assert marker == InternalPointerMarker.RAW_PTR;
this.mNativeObj = ptr;
}
/*package*/ long mNativeObj;
}

View file

@ -0,0 +1,23 @@
// Automatically generated by flapigen
package net.mbess.popequer;
public enum PopequerAdapterErr {
ReadDb(0),
Indexing(1),
View(2);
private final int value;
PopequerAdapterErr(int value) {
this.value = value;
}
public final int getValue() { return value; }
/*package*/ static PopequerAdapterErr fromInt(int x) {
switch (x) {
case 0: return ReadDb;
case 1: return Indexing;
case 2: return View;
default: throw new Error("Invalid value for enum PopequerAdapterErr: " + x);
}
}
}

View file

@ -1,10 +0,0 @@
package net.mbess.popequer
import android.content.Context
import android.util.Log
import kotlin.math.absoluteValue
class PopequerProvider(
private val context: Context
) {
}

View file

@ -99,7 +99,7 @@ fun AppContainer(
onClick = { onClick = {
scope.launch(Dispatchers.IO) { scope.launch(Dispatchers.IO) {
runCatching { runCatching {
context.gitActions.trigger() // context.gitActions.trigger()
}.onFailure { }.onFailure {
Log.e("MainActivity", "Failed to trigger git actions", it) Log.e("MainActivity", "Failed to trigger git actions", it)
} }

View file

@ -19,17 +19,17 @@ import net.mbess.popequer.Foo
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
System.loadLibrary("rustadapter")
val appContext = AppContext(this) val appContext = AppContext(this)
//Native.fsInfo(appContext.gitActions.cloneFolder.absolutePath).let {
// Log.d("MainActivity", "From foreign rust result fsInfo $it")
//}
System.loadLibrary("rustadapter")
val foo_instance = Foo(10) val foo_instance = Foo(10)
Log.d("MainActivity", "From rust: " + foo_instance.f(32, 43)) Log.d("MainActivity", "From rust: " + foo_instance.f(32, 43))
foo_instance.setField(154) foo_instance.setField(154)
Log.d("MainActivity", "${foo_instance.data}") Log.d("MainActivity", "${foo_instance.data}")
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
Looper.prepare() Looper.prepare()
runCatching { runCatching {
@ -40,6 +40,10 @@ class MainActivity : ComponentActivity() {
Toast.makeText(appContext.androidContext, "A repo was just cloned", Toast.LENGTH_LONG) Toast.makeText(appContext.androidContext, "A repo was just cloned", Toast.LENGTH_LONG)
.show() .show()
} }
appContext.gitActions.sync()
Log.d("Ppq", "${appContext.popequer}");
Log.d("Ppq", "Index: ${appContext.popequer.index()}");
Log.d("Ppq", "Upcoming: ${appContext.popequer.upcomingEvents()}");
}.onFailure { }.onFailure {
Log.e("MainActivity", "Failed to prepare git repo", it) Log.e("MainActivity", "Failed to prepare git repo", it)
} }

View file

@ -13,6 +13,8 @@ rifgen = "0.1"
popequer_rust = { path = "../../../popequer_rust" } popequer_rust = { path = "../../../popequer_rust" }
jni-sys = "0.3" jni-sys = "0.3"
log = "0.4.20" log = "0.4.20"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
[build-dependencies] [build-dependencies]
rifgen = "0.1" rifgen = "0.1"

View file

@ -2,6 +2,8 @@
use std::env; use std::env;
fn main() { fn main() {
env::set_var("RUST_LOG", "DEBUG");
let source_folder = "/mnt/extramedia3/mbess/workspace/popequer/android_app/rust-adapter/src"; //use your projects folder let source_folder = "/mnt/extramedia3/mbess/workspace/popequer/android_app/rust-adapter/src"; //use your projects folder
let out_file = "/mnt/extramedia3/mbess/workspace/popequer/android_app/rust-adapter/glue.rs"; let out_file = "/mnt/extramedia3/mbess/workspace/popequer/android_app/rust-adapter/glue.rs";
rifgen::Generator::new(rifgen::TypeCases::CamelCase, rifgen::Language::Java,source_folder) rifgen::Generator::new(rifgen::TypeCases::CamelCase, rifgen::Language::Java,source_folder)
@ -18,7 +20,7 @@
.join("popequer"), .join("popequer"),
"net.mbess.popequer".into(), "net.mbess.popequer".into(),
) )
.use_null_annotation_from_package("android.support.annotation".into()), .use_null_annotation_from_package("androidx.annotation".into()),
)) ))
.rustfmt_bindings(true); .rustfmt_bindings(true);

View file

@ -1,6 +1,13 @@
//Automatically generated by rifgen //Automatically generated by rifgen
use crate::*; use crate::*;
use jni_sys::*; use jni_sys::*;
foreign_enum!(
enum PopequerAdapterErr {
ReadDb = PopequerAdapterErr::ReadDb,
Indexing = PopequerAdapterErr::Indexing,
View = PopequerAdapterErr::View,
}
);
foreign_class!( foreign_class!(
class Foo { class Foo {
self_type Foo; self_type Foo;
@ -11,3 +18,11 @@ foreign_class!(
fn Foo::set_field(& mut self , v : i32); alias setField; fn Foo::set_field(& mut self , v : i32); alias setField;
} }
); );
foreign_class!(
class PopequerAdapter {
self_type PopequerAdapter;
constructor PopequerAdapter::new(notebook_fs_path : String)->PopequerAdapter;
fn PopequerAdapter::index(& self)->String; alias index;
fn PopequerAdapter::upcoming_events(& self)->String; alias upcomingEvents;
}
);

View file

@ -4,6 +4,73 @@ pub use crate::java_glue::*;
use rifgen::rifgen_attr::*; use rifgen::rifgen_attr::*;
use popequer::{database::read::read_db, fs_notebook::NotebookContext, indexer::index_and_save, views::calendar::get_upcoming_events};
use serde::Serialize;
struct PopequerAdapter {
context: NotebookContext
}
#[generate_interface]
enum PopequerAdapterErr {
ReadDb,
Indexing,
View
}
#[derive(Serialize)]
struct EventItem {
name: String,
start_time: String,
end_time: Option<String>
}
impl PopequerAdapter {
#[generate_interface(constructor)]
fn new(notebook_fs_path: String) -> PopequerAdapter {
PopequerAdapter {
context: NotebookContext {
base_path: notebook_fs_path.into()
}
}
}
#[generate_interface]
fn index(&self) -> String {
match index_and_save(
&self.context
) {
Ok(_n) => format!("Indexing OK"),
Err(err) => format!("Indexing ERR {err:?}")
}
}
#[generate_interface]
fn upcoming_events(&self) -> String {
let notebook = match read_db(&self.context) {
Ok(n) => n,
Err(err) => {
return format!("Err: {err:?}");
}
};
let events = match get_upcoming_events(&notebook) {
Ok(x) => x,
Err(err) => {
return format!("Err: {err:?}");
}
};
let formatted_events: Vec<EventItem> = events.iter().map(|e| {
EventItem {
name: e.name.clone(),
start_time: e.start_time.to_rfc3339(),
end_time: e.end_time.map(|x| x.to_rfc3339())
}
}).collect();
serde_json::to_string(&formatted_events).expect("Cannot serialize into json")
}
}
struct Foo { struct Foo {
data: i32 data: i32
} }