btleplug 0.13.0

A Cross-Platform Rust Bluetooth Low Energy (BLE) GATT library.
Documentation
use ::jni::{
    Env, bind_java_type,
    errors::Result,
    jni_sig,
    objects::{JObject, Reference},
};
use std::task::Waker;

bind_java_type! {
    pub JWaker => io.github.gedgygedgy.rust.task.Waker,
}

pub fn waker<'a>(env: &mut Env<'a>, waker: Waker) -> Result<JObject<'a>> {
    let runnable = super::ops::fn_once_runnable(env, |_e, _o| waker.wake())?;

    let class = <JWaker as Reference>::lookup_class(env, &Default::default())?;
    let obj = env.new_object(
        &*class,
        jni_sig!("(Lio/github/gedgygedgy/rust/ops/FnRunnable;)V"),
        &[(&runnable).into()],
    )?;
    Ok(obj)
}

bind_java_type! {
    pub JPollResult => io.github.gedgygedgy.rust.task.PollResult,
    methods {
        fn get() -> JObject,
    },
}

#[cfg(test)]
mod test {
    use super::super::test_utils;
    use jni::{jni_sig, jni_str};
    use std::sync::Arc;

    #[test]
    fn test_waker_wake() {
        test_utils::with_env(|env| {
            let data = Arc::new(test_utils::TestWakerData::new());
            assert_eq!(Arc::strong_count(&data), 1);
            assert_eq!(data.value(), false);

            let waker = test_utils::test_waker(&data);
            assert_eq!(Arc::strong_count(&data), 2);
            assert_eq!(data.value(), false);

            let jwaker = super::waker(env, waker).unwrap();
            assert_eq!(Arc::strong_count(&data), 2);
            assert_eq!(data.value(), false);

            env.call_method(&jwaker, jni_str!("wake"), jni_sig!("()V"), &[])
                .unwrap();
            assert_eq!(Arc::strong_count(&data), 1);
            assert_eq!(data.value(), true);
            data.set_value(false);

            env.call_method(&jwaker, jni_str!("wake"), jni_sig!("()V"), &[])
                .unwrap();
            assert_eq!(Arc::strong_count(&data), 1);
            assert_eq!(data.value(), false);
            Ok(())
        })
        .unwrap();
    }

    #[test]
    fn test_waker_close_wake() {
        test_utils::with_env(|env| {
            let data = Arc::new(test_utils::TestWakerData::new());
            assert_eq!(Arc::strong_count(&data), 1);
            assert_eq!(data.value(), false);

            let waker = test_utils::test_waker(&data);
            assert_eq!(Arc::strong_count(&data), 2);
            assert_eq!(data.value(), false);

            let jwaker = super::waker(env, waker).unwrap();
            assert_eq!(Arc::strong_count(&data), 2);
            assert_eq!(data.value(), false);

            env.call_method(&jwaker, jni_str!("close"), jni_sig!("()V"), &[])
                .unwrap();
            assert_eq!(Arc::strong_count(&data), 1);
            assert_eq!(data.value(), false);

            env.call_method(&jwaker, jni_str!("wake"), jni_sig!("()V"), &[])
                .unwrap();
            assert_eq!(Arc::strong_count(&data), 1);
            assert_eq!(data.value(), false);
            Ok(())
        })
        .unwrap();
    }
}