crossbow_android/permission/
mod.rs

1mod 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}