Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ members = [
"winio-ui-android",
"winio-ui-ui-kit",
"winio-ui-apple-common",
"winio-ui-stub",
"winio-example",
]

Expand Down Expand Up @@ -43,6 +44,7 @@ winio-ui-app-kit = { path = "winio-ui-app-kit", version = "0.6.0-rc.4" }
winio-ui-android = { path = "winio-ui-android", version = "0.1.0-rc.5" }
winio-ui-ui-kit = { path = "winio-ui-ui-kit", version = "0.1.0-rc.4" }
winio-ui-apple-common = { path = "winio-ui-apple-common", version = "0.1.0-rc.2" }
winio-ui-stub = { path = "winio-ui-stub", version = "0.1.0-rc.1" }
winio = { path = "winio", version = "0.12.0-rc.3", default-features = false }

compio = { version = "0.19.0", default-features = false }
Expand Down
84 changes: 11 additions & 73 deletions winio-ui-android/src/compat/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,83 +10,21 @@ use jni::{
refs::Global,
};

use crate::{Result, current_activity, vm_exec};

jni::bind_java_type! {
Context2 => android.content.Context,
type_map {
ContentResolver => android.content.ContentResolver,
},
methods {
fn get_content_resolver() -> ContentResolver,
}
}

jni::bind_java_type! {
Uri => android.net.Uri,
methods {
static fn parse(uri: JString) -> Uri,
fn to_string() -> JString,
}
}

jni::bind_java_type! {
ContentResolver => android.content.ContentResolver,
type_map {
ParcelFileDescriptor => android.os.ParcelFileDescriptor,
Uri => android.net.Uri,
Cursor => android.database.Cursor,
},
methods {
fn open_file_descriptor(uri: Uri, mode: JString) -> ParcelFileDescriptor,
fn query(uri: Uri, projection: JString[], selection: JString, selection_args: JString[], sort_order: JString) -> Cursor,
}
}

jni::bind_java_type! {
ParcelFileDescriptor => android.os.ParcelFileDescriptor,
methods {
fn get_fd() -> jint,
}
}

jni::bind_java_type! {
DocumentsContract => android.provider.DocumentsContract,
type_map {
Uri => android.net.Uri,
use crate::{
Result, current_activity,
java::android::{
content::Context,
database::Cursor,
net::Uri,
provider::{DocumentsContract, DocumentsContractDocument},
},
methods {
static fn get_tree_document_id(uri: Uri) -> JString,
static fn build_child_documents_uri_using_tree(tree_uri: Uri, document_id: JString) -> Uri,
static fn build_document_uri_using_tree(tree_uri: Uri, document_id: JString) -> Uri,
}
}

jni::bind_java_type! {
DocumentsContractDocument => "android.provider.DocumentsContract$Document",
fields {
#[allow(non_snake_case)]
static COLUMN_DOCUMENT_ID: JString,
#[allow(non_snake_case)]
static COLUMN_DISPLAY_NAME: JString,
#[allow(non_snake_case)]
static COLUMN_MIME_TYPE: JString,
}
}

jni::bind_java_type! {
Cursor => android.database.Cursor,
methods {
fn move_to_next() -> bool,
fn get_string(column_index: jint) -> JString,
fn get_column_index(column_name: JString) -> jint,
}
}
vm_exec,
};

fn open_uri_with_mode(uri: &Path, mode: &str) -> Result<File> {
vm_exec(|env| {
let act = current_activity(env)?;
let context = env.cast_local::<Context2>(act)?;
let context = env.cast_local::<Context>(act)?;
let resolver = context.get_content_resolver(env)?;
let uri = env.new_string(uri.to_string_lossy())?;
let uri = Uri::parse(env, uri)?;
Expand Down Expand Up @@ -164,7 +102,7 @@ pub struct UriReadDir {
pub fn read_dir(uri: &Path) -> Result<UriReadDir> {
vm_exec(|env| {
let act = current_activity(env)?;
let context = env.cast_local::<Context2>(act)?;
let context = env.cast_local::<Context>(act)?;
let resolver = context.get_content_resolver(env)?;
let uri = env.new_string(uri.to_string_lossy())?;
let uri = Uri::parse(env, uri)?;
Expand Down
16 changes: 1 addition & 15 deletions winio-ui-android/src/convert.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
use jni::{Env, errors::Result, objects::JCharSequence};

jni::bind_java_type! {
JCharSequence2 => java.lang.CharSequence,
methods {
fn to_string() -> JString,
}
}
use crate::java::lang::JCharSequence2;

pub(crate) trait JCharSequenceExt {
fn try_to_string(self, env: &mut Env<'_>) -> Result<String>;
Expand Down Expand Up @@ -33,12 +28,3 @@ macro_rules! impl_listener {
}

pub(crate) use impl_listener;

jni::bind_java_type! {
pub(crate) JRunnable => java.lang.Runnable,
methods {
fn run(),
}
}

impl_listener!(JRunnable);
Original file line number Diff line number Diff line change
Expand Up @@ -13,95 +13,18 @@ use jni::{
use jni_min_helper::DynamicProxy;
use winio_handle::AsWindow;

use crate::{Activity, Error, Result, impl_listener, vm_exec};

jni::bind_java_type! {
ActivityResultCaller => androidx.activity.result.ActivityResultCaller,
type_map {
ActivityResultContract => androidx.activity.result.contract.ActivityResultContract,
ActivityResultLauncher => androidx.activity.result.ActivityResultLauncher,
ActivityResultCallback => androidx.activity.result.ActivityResultCallback,
},
methods {
fn register_for_activity_result(contract: &ActivityResultContract, callback: &ActivityResultCallback) -> ActivityResultLauncher,
},
}

jni::bind_java_type! {
ActivityResultContract => androidx.activity.result.contract.ActivityResultContract,
}

jni::bind_java_type! {
GetContent => "androidx.activity.result.contract.ActivityResultContracts$GetContent",
type_map {
ActivityResultContract => androidx.activity.result.contract.ActivityResultContract
},
constructors {
fn new(),
},
is_instance_of = {
base = ActivityResultContract,
}
}

jni::bind_java_type! {
GetMultipleContents => "androidx.activity.result.contract.ActivityResultContracts$GetMultipleContents",
type_map {
ActivityResultContract => androidx.activity.result.contract.ActivityResultContract
},
constructors {
fn new(),
},
is_instance_of = {
base = ActivityResultContract,
}
}

jni::bind_java_type! {
OpenDocumentTree => "androidx.activity.result.contract.ActivityResultContracts$OpenDocumentTree",
type_map {
ActivityResultContract => androidx.activity.result.contract.ActivityResultContract
},
constructors {
fn new(),
use crate::{
Error, Result,
java::{
android::net::Uri,
androidx::activity::{
ActivityResultCallback, ActivityResultCaller, ActivityResultLauncher, CreateDocument,
GetContent, GetMultipleContents, OpenDocumentTree,
},
custom::Activity,
},
is_instance_of = {
base = ActivityResultContract,
}
}

jni::bind_java_type! {
CreateDocument => "androidx.activity.result.contract.ActivityResultContracts$CreateDocument",
type_map {
ActivityResultContract => androidx.activity.result.contract.ActivityResultContract
},
constructors {
fn new(),
},
is_instance_of = {
base = ActivityResultContract,
}
}

jni::bind_java_type! {
ActivityResultLauncher => androidx.activity.result.ActivityResultLauncher,
methods {
fn launch(input: &JObject),
},
}

jni::bind_java_type! {
ActivityResultCallback => androidx.activity.result.ActivityResultCallback,
}

impl_listener!(ActivityResultCallback);

jni::bind_java_type! {
Uri => android.net.Uri,
methods {
fn to_string() -> JString,
},
}
vm_exec,
};

struct ProxyCallback {
proxy: DynamicProxy,
Expand Down
5 changes: 5 additions & 0 deletions winio-ui-android/src/dialogs/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
mod msgbox;
pub use msgbox::*;

mod filebox;
pub use filebox::*;
Original file line number Diff line number Diff line change
Expand Up @@ -7,58 +7,20 @@ use jni_min_helper::{DynamicProxy, JInteger};
use winio_handle::AsWindow;
use winio_primitive::{MessageBoxButton, MessageBoxResponse, MessageBoxStyle};

use crate::{Activity, Context, Error, Result, impl_listener, vm_exec};

jni::bind_java_type! {
AlertDialog => android.app.AlertDialog,
type_map {
OnCancelListener => "android.content.DialogInterface$OnCancelListener",
OnDismissListener => "android.content.DialogInterface$OnDismissListener",
},
methods {
fn show(),
fn set_on_cancel_listener(listener: &OnCancelListener),
fn set_on_dismiss_listener(listener: &OnDismissListener),
}
}

jni::bind_java_type! {
AlertDialogBuilder => "android.app.AlertDialog$Builder",
type_map {
AlertDialog => android.app.AlertDialog,
Context => android.content.Context,
OnClickListener => "android.content.DialogInterface$OnClickListener",
use crate::{
Error, Result,
java::{
android::{
app::AlertDialogBuilder,
content::{
DialogInterfaceOnCancelListener, DialogInterfaceOnClickListener,
DialogInterfaceOnDismissListener,
},
},
custom::Activity,
},
constructors {
fn new(context: &Context),
},
methods {
fn create() -> AlertDialog,
fn set_message(message: &JCharSequence) -> AlertDialogBuilder,
fn set_title(title: &JCharSequence) -> AlertDialogBuilder,
fn set_positive_button(text: &JCharSequence, listener: &OnClickListener) -> AlertDialogBuilder,
fn set_negative_button(text: &JCharSequence, listener: &OnClickListener) -> AlertDialogBuilder,
fn set_neutral_button(text: &JCharSequence, listener: &OnClickListener) -> AlertDialogBuilder,
}
}

jni::bind_java_type! {
OnClickListener => "android.content.DialogInterface$OnClickListener",
}

impl_listener!(OnClickListener);

jni::bind_java_type! {
OnCancelListener => "android.content.DialogInterface$OnCancelListener",
}

impl_listener!(OnCancelListener);

jni::bind_java_type! {
OnDismissListener => "android.content.DialogInterface$OnDismissListener",
}

impl_listener!(OnDismissListener);
vm_exec,
};

#[derive(Debug, Default, Clone)]
pub struct MessageBox {
Expand Down Expand Up @@ -186,9 +148,9 @@ impl MessageBox {
env,
&LoaderContext::None,
[
OnClickListener::class_name(),
OnCancelListener::class_name(),
OnDismissListener::class_name(),
DialogInterfaceOnClickListener::class_name(),
DialogInterfaceOnCancelListener::class_name(),
DialogInterfaceOnDismissListener::class_name(),
],
move |env, method, args| {
let name = method.get_name(env)?.try_to_string(env)?;
Expand Down
37 changes: 37 additions & 0 deletions winio-ui-android/src/java/android/app.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
use super::content::{
Context, DialogInterfaceOnCancelListener, DialogInterfaceOnClickListener,
DialogInterfaceOnDismissListener,
};

jni::bind_java_type! {
pub AlertDialog => android.app.AlertDialog,
type_map {
DialogInterfaceOnCancelListener => "android.content.DialogInterface$OnCancelListener",
DialogInterfaceOnDismissListener => "android.content.DialogInterface$OnDismissListener",
},
methods {
fn show(),
fn set_on_cancel_listener(listener: &DialogInterfaceOnCancelListener),
fn set_on_dismiss_listener(listener: &DialogInterfaceOnDismissListener),
}
}

jni::bind_java_type! {
pub AlertDialogBuilder => "android.app.AlertDialog$Builder",
type_map {
AlertDialog => android.app.AlertDialog,
Context => android.content.Context,
DialogInterfaceOnClickListener => "android.content.DialogInterface$OnClickListener",
},
constructors {
fn new(context: &Context),
},
methods {
fn create() -> AlertDialog,
fn set_message(message: &JCharSequence) -> AlertDialogBuilder,
fn set_title(title: &JCharSequence) -> AlertDialogBuilder,
fn set_positive_button(text: &JCharSequence, listener: &DialogInterfaceOnClickListener) -> AlertDialogBuilder,
fn set_negative_button(text: &JCharSequence, listener: &DialogInterfaceOnClickListener) -> AlertDialogBuilder,
fn set_neutral_button(text: &JCharSequence, listener: &DialogInterfaceOnClickListener) -> AlertDialogBuilder,
}
}
Loading