1
1
use jni:: {
2
2
errors:: Error ,
3
- objects:: { JObject , JString } ,
3
+ objects:: { JObject , JString , JValue } ,
4
4
JNIEnv ,
5
5
} ;
6
6
@@ -27,14 +27,17 @@ impl<'env> Intent<'env> {
27
27
Self { inner }
28
28
}
29
29
30
- pub fn new ( env : JNIEnv < ' env > , action : impl AsRef < str > ) -> Self {
30
+ pub fn new ( mut env : JNIEnv < ' env > , action : impl AsRef < str > ) -> Self {
31
31
Self :: from_fn ( || {
32
32
let intent_class = env. find_class ( "android/content/Intent" ) ?;
33
33
let action_view =
34
- env. get_static_field ( intent_class, action. as_ref ( ) , "Ljava/lang/String;" ) ?;
34
+ env. get_static_field ( & intent_class, action. as_ref ( ) , "Ljava/lang/String;" ) ?;
35
35
36
- let intent =
37
- env. new_object ( intent_class, "(Ljava/lang/String;)V" , & [ action_view. into ( ) ] ) ?;
36
+ let intent = env. new_object (
37
+ & intent_class,
38
+ "(Ljava/lang/String;)V" ,
39
+ & [ action_view. borrow ( ) ] ,
40
+ ) ?;
38
41
39
42
Ok ( Inner {
40
43
env,
@@ -43,25 +46,30 @@ impl<'env> Intent<'env> {
43
46
} )
44
47
}
45
48
46
- pub fn new_with_uri ( env : JNIEnv < ' env > , action : impl AsRef < str > , uri : impl AsRef < str > ) -> Self {
49
+ pub fn new_with_uri (
50
+ mut env : JNIEnv < ' env > ,
51
+ action : impl AsRef < str > ,
52
+ uri : impl AsRef < str > ,
53
+ ) -> Self {
47
54
Self :: from_fn ( || {
48
55
let url_string = env. new_string ( uri) ?;
49
56
let uri_class = env. find_class ( "android/net/Uri" ) ?;
50
57
let uri = env. call_static_method (
51
58
uri_class,
52
59
"parse" ,
53
60
"(Ljava/lang/String;)Landroid/net/Uri;" ,
54
- & [ JString :: from ( url_string) . into ( ) ] ,
61
+ & [ JValue :: Object ( & url_string) ] ,
55
62
) ?;
56
63
57
64
let intent_class = env. find_class ( "android/content/Intent" ) ?;
58
- let action_view =
59
- env. get_static_field ( intent_class, action. as_ref ( ) , "Ljava/lang/String;" ) ?;
65
+ let action_view = env
66
+ . get_static_field ( & intent_class, action. as_ref ( ) , "Ljava/lang/String;" ) ?
67
+ . l ( ) ?;
60
68
61
69
let intent = env. new_object (
62
- intent_class,
70
+ & intent_class,
63
71
"(Ljava/lang/String;Landroid/net/Uri;)V" ,
64
- & [ action_view . into ( ) , uri. into ( ) ] ,
72
+ & [ JValue :: Object ( & action_view ) , uri. borrow ( ) ] ,
65
73
) ?;
66
74
67
75
Ok ( Inner {
@@ -80,16 +88,20 @@ impl<'env> Intent<'env> {
80
88
/// intent.set_class_name("com.excample", "IntentTarget")
81
89
/// # })
82
90
/// ```
83
- pub fn set_class_name ( self , package_name : impl AsRef < str > , class_name : impl AsRef < str > ) -> Self {
84
- self . and_then ( |inner| {
91
+ pub fn set_class_name (
92
+ self ,
93
+ package_name : impl AsRef < str > ,
94
+ class_name : impl AsRef < str > ,
95
+ ) -> Self {
96
+ self . and_then ( |mut inner| {
85
97
let package_name = inner. env . new_string ( package_name) ?;
86
98
let class_name = inner. env . new_string ( class_name) ?;
87
99
88
100
inner. env . call_method (
89
- inner. object ,
101
+ & inner. object ,
90
102
"setClassName" ,
91
103
"(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" ,
92
- & [ package_name . into ( ) , class_name . into ( ) ] ,
104
+ & [ JValue :: Object ( & package_name ) , JValue :: Object ( & class_name ) ] ,
93
105
) ?;
94
106
95
107
Ok ( inner)
@@ -106,15 +118,15 @@ impl<'env> Intent<'env> {
106
118
/// # })
107
119
/// ```
108
120
pub fn with_extra ( self , key : impl AsRef < str > , value : impl AsRef < str > ) -> Self {
109
- self . and_then ( |inner| {
121
+ self . and_then ( |mut inner| {
110
122
let key = inner. env . new_string ( key) ?;
111
123
let value = inner. env . new_string ( value) ?;
112
124
113
125
inner. env . call_method (
114
- inner. object ,
126
+ & inner. object ,
115
127
"putExtra" ,
116
128
"(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" ,
117
- & [ key . into ( ) , value . into ( ) ] ,
129
+ & [ JValue :: Object ( & key ) , JValue :: Object ( & value ) ] ,
118
130
) ?;
119
131
120
132
Ok ( inner)
@@ -136,18 +148,17 @@ impl<'env> Intent<'env> {
136
148
pub fn into_chooser_with_title ( self , title : Option < impl AsRef < str > > ) -> Self {
137
149
self . and_then ( |mut inner| {
138
150
let title_value = if let Some ( title) = title {
139
- let s = inner. env . new_string ( title) ?;
140
- s. into ( )
151
+ inner. env . new_string ( title) ?
141
152
} else {
142
- JObject :: null ( ) . into ( )
153
+ JString :: default ( )
143
154
} ;
144
155
145
156
let intent_class = inner. env . find_class ( "android/content/Intent" ) ?;
146
157
let intent = inner. env . call_static_method (
147
158
intent_class,
148
159
"createChooser" ,
149
160
"(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;" ,
150
- & [ inner. object . into ( ) , title_value] ,
161
+ & [ JValue :: Object ( & inner. object ) , JValue :: Object ( & title_value) ] ,
151
162
) ?;
152
163
153
164
inner. object = intent. try_into ( ) ?;
@@ -165,14 +176,14 @@ impl<'env> Intent<'env> {
165
176
/// # })
166
177
/// ```
167
178
pub fn with_type ( self , type_name : impl AsRef < str > ) -> Self {
168
- self . and_then ( |inner| {
179
+ self . and_then ( |mut inner| {
169
180
let jstring = inner. env . new_string ( type_name) ?;
170
181
171
182
inner. env . call_method (
172
- inner. object ,
183
+ & inner. object ,
173
184
"setType" ,
174
185
"(Ljava/lang/String;)Landroid/content/Intent;" ,
175
- & [ jstring . into ( ) ] ,
186
+ & [ JValue :: Object ( & jstring ) ] ,
176
187
) ?;
177
188
178
189
Ok ( inner)
@@ -183,12 +194,12 @@ impl<'env> Intent<'env> {
183
194
let cx = ndk_context:: android_context ( ) ;
184
195
let activity = unsafe { JObject :: from_raw ( cx. context ( ) as jni:: sys:: jobject ) } ;
185
196
186
- self . inner . and_then ( |inner| {
197
+ self . inner . and_then ( |mut inner| {
187
198
inner. env . call_method (
188
199
activity,
189
200
"startActivity" ,
190
201
"(Landroid/content/Intent;)V" ,
191
- & [ inner. object . into ( ) ] ,
202
+ & [ JValue :: Object ( & inner. object ) ] ,
192
203
) ?;
193
204
194
205
Ok ( ( ) )
0 commit comments