1
- use jni:: {
2
- errors:: Error ,
3
- objects:: { JObject , JString } ,
4
- JNIEnv ,
5
- } ;
6
-
7
- struct Inner < ' env > {
8
- env : JNIEnv < ' env > ,
9
- object : JObject < ' env > ,
10
- }
1
+ use jni:: { errors:: Error , objects:: JObject , JNIEnv } ;
11
2
12
- /// A messaging object you can use to request an action from another android app component.
13
3
#[ must_use]
14
4
pub struct Intent < ' env > {
15
- inner : Result < Inner < ' env > , Error > ,
5
+ pub ( crate ) env : JNIEnv < ' env > ,
6
+ pub ( crate ) object : JObject < ' env > ,
7
+ }
8
+
9
+ impl Intent < ' _ > {
10
+ // TODO: Could also return a borrowed JString
11
+ pub fn action ( & self ) -> std:: io:: Result < String > {
12
+ let action = self
13
+ . env
14
+ . call_method ( self . object , "getAction" , "()Ljava/lang/String;" , & [ ] )
15
+ . map_err ( std:: io:: Error :: other) ?
16
+ . l ( )
17
+ . map_err ( std:: io:: Error :: other) ?;
18
+ dbg ! ( action) ;
19
+ let action = self
20
+ . env
21
+ . get_string ( action. into ( ) )
22
+ . map_err ( std:: io:: Error :: other) ?;
23
+ Ok ( action. into ( ) )
24
+ }
25
+
26
+ pub fn data_string ( & self ) -> std:: io:: Result < String > {
27
+ let data_string = self
28
+ . env
29
+ . call_method ( self . object , "getDataString" , "()Ljava/lang/String;" , & [ ] )
30
+ . map_err ( std:: io:: Error :: other) ?
31
+ . l ( )
32
+ . map_err ( std:: io:: Error :: other) ?;
33
+ let data_string = self
34
+ . env
35
+ . get_string ( data_string. into ( ) )
36
+ . map_err ( std:: io:: Error :: other) ?;
37
+ Ok ( data_string. into ( ) )
38
+ }
39
+
40
+ /// <https://developer.android.com/reference/android/content/Intent#getStringExtra(java.lang.String)>
41
+ pub fn string_extra ( & self , name : & str ) -> std:: io:: Result < String > {
42
+ let name = self . env . new_string ( name) . map_err ( std:: io:: Error :: other) ?;
43
+
44
+ let extra = self
45
+ . env
46
+ . call_method (
47
+ self . object ,
48
+ "getStringExtra" ,
49
+ "(Ljava/lang/String;)Ljava/lang/String;" ,
50
+ & [ name. into ( ) ] ,
51
+ )
52
+ . map_err ( std:: io:: Error :: other) ?
53
+ . l ( )
54
+ . map_err ( std:: io:: Error :: other) ?;
55
+ let extra = self
56
+ . env
57
+ . get_string ( extra. into ( ) )
58
+ . map_err ( std:: io:: Error :: other) ?;
59
+ Ok ( extra. into ( ) )
60
+ }
61
+ }
62
+
63
+ /// A messaging object you can use to request an action from another Android app component.
64
+ #[ must_use]
65
+ pub struct IntentBuilder < ' env > {
66
+ inner : Result < Intent < ' env > , Error > ,
16
67
}
17
68
18
- impl < ' env > Intent < ' env > {
69
+ impl < ' env > IntentBuilder < ' env > {
19
70
pub fn from_object ( env : JNIEnv < ' env > , object : JObject < ' env > ) -> Self {
20
71
Self {
21
- inner : Ok ( Inner { env, object } ) ,
72
+ inner : Ok ( Intent { env, object } ) ,
22
73
}
23
74
}
24
75
25
- fn from_fn ( f : impl FnOnce ( ) -> Result < Inner < ' env > , Error > ) -> Self {
76
+ fn from_fn ( f : impl FnOnce ( ) -> Result < Intent < ' env > , Error > ) -> Self {
26
77
let inner = f ( ) ;
27
78
Self { inner }
28
79
}
@@ -33,10 +84,9 @@ impl<'env> Intent<'env> {
33
84
let action_view =
34
85
env. get_static_field ( intent_class, action. as_ref ( ) , "Ljava/lang/String;" ) ?;
35
86
36
- let intent =
37
- env. new_object ( intent_class, "(Ljava/lang/String;)V" , & [ action_view. into ( ) ] ) ?;
87
+ let intent = env. new_object ( intent_class, "(Ljava/lang/String;)V" , & [ action_view] ) ?;
38
88
39
- Ok ( Inner {
89
+ Ok ( Intent {
40
90
env,
41
91
object : intent,
42
92
} )
@@ -51,7 +101,7 @@ impl<'env> Intent<'env> {
51
101
uri_class,
52
102
"parse" ,
53
103
"(Ljava/lang/String;)Landroid/net/Uri;" ,
54
- & [ JString :: from ( url_string) . into ( ) ] ,
104
+ & [ url_string. into ( ) ] ,
55
105
) ?;
56
106
57
107
let intent_class = env. find_class ( "android/content/Intent" ) ?;
@@ -61,10 +111,10 @@ impl<'env> Intent<'env> {
61
111
let intent = env. new_object (
62
112
intent_class,
63
113
"(Ljava/lang/String;Landroid/net/Uri;)V" ,
64
- & [ action_view. into ( ) , uri. into ( ) ] ,
114
+ & [ action_view, uri] ,
65
115
) ?;
66
116
67
- Ok ( Inner {
117
+ Ok ( Intent {
68
118
env,
69
119
object : intent,
70
120
} )
@@ -80,7 +130,11 @@ impl<'env> Intent<'env> {
80
130
/// intent.set_class_name("com.excample", "IntentTarget")
81
131
/// # })
82
132
/// ```
83
- pub fn set_class_name ( self , package_name : impl AsRef < str > , class_name : impl AsRef < str > ) -> Self {
133
+ pub fn set_class_name (
134
+ self ,
135
+ package_name : impl AsRef < str > ,
136
+ class_name : impl AsRef < str > ,
137
+ ) -> Self {
84
138
self . and_then ( |inner| {
85
139
let package_name = inner. env . new_string ( package_name) ?;
86
140
let class_name = inner. env . new_string ( class_name) ?;
@@ -195,7 +249,7 @@ impl<'env> Intent<'env> {
195
249
} )
196
250
}
197
251
198
- fn and_then ( mut self , f : impl FnOnce ( Inner ) -> Result < Inner , Error > ) -> Self {
252
+ fn and_then ( mut self , f : impl FnOnce ( Intent ) -> Result < Intent , Error > ) -> Self {
199
253
self . inner = self . inner . and_then ( f) ;
200
254
self
201
255
}
0 commit comments