crossbow_android/permission/
mod.rs1mod android_permission;
2mod request_permission;
3
4pub use android_permission::*;
5
6use crate::error::*;
7use std::sync::{
8 mpsc::{sync_channel, SyncSender},
9 RwLock,
10};
11
12lazy_static::lazy_static! {
13 static ref PERMISSION_SENDER: RwLock<Option<SyncSender<RequestPermissionResult>>> = Default::default();
14}
15
16#[derive(Debug, Clone, PartialEq, Eq)]
17pub struct RequestPermissionResult {
18 pub granted: bool,
19 pub permission: String,
20}
21
22pub async fn request_permission(permission: &AndroidPermission) -> crate::error::Result<bool> {
23 let receiver = {
24 let mut sender_guard = PERMISSION_SENDER.write().unwrap();
25 let (sender, receiver) = sync_channel(1);
26 sender_guard.replace(sender);
27 receiver
28 };
29 let res = request_permission::request_permission(permission)?;
30 if res {
31 Ok(true)
32 } else {
33 let result = receiver.recv().unwrap();
34 Ok(result.granted)
35 }
36}
37
38pub(crate) fn on_request_permission_result(permission: String, granted: bool) -> Result<()> {
39 let sender = PERMISSION_SENDER.read().unwrap();
40 if let Some(sender) = sender.as_ref() {
41 let permission_result = RequestPermissionResult {
42 granted,
43 permission,
44 };
45 let res = sender.try_send(permission_result);
46 if let Err(err) = res {
47 println!(
48 "Received permission result but no one is listening: {:?}",
49 err
50 );
51 }
52 } else {
53 println!("Received permission result but no one is listening");
54 }
55 Ok(())
56}