polyhorn_android/raw/
platform.rs

1use polyhorn_android_sys::{Activity, Object, Thread};
2use polyhorn_core::EventLoop;
3use polyhorn_ui::layout::LayoutTree;
4
5use super::{
6    AndroidLogger, CommandBuffer, Compositor, ContainerID, Environment, OpaqueComponent,
7    OpaqueContainer,
8};
9
10/// Non-constructable type that implements the platform trait for iOS.
11pub enum Platform {}
12
13impl polyhorn_core::Platform for Platform {
14    type CommandBuffer = CommandBuffer;
15    type Component = OpaqueComponent;
16    type Compositor = Compositor;
17    type Container = OpaqueContainer;
18    type ContainerID = ContainerID;
19    type Environment = Environment;
20
21    fn with_compositor<F>(mut container: Self::Container, task: F) -> polyhorn_core::Disposable
22    where
23        F: FnOnce(Self::ContainerID, Self::Compositor, EventLoop) -> polyhorn_core::Disposable
24            + Send
25            + 'static,
26    {
27        use std::sync::{Arc, RwLock};
28
29        log::set_logger(&AndroidLogger).unwrap();
30        log::set_max_level(log::LevelFilter::max());
31
32        let activity = container.downcast_mut::<Activity>().unwrap().clone();
33
34        let vm = activity.as_reference().vm();
35
36        let env = unsafe { vm.env().prolong_lifetime() };
37
38        let layout_tree = Arc::new(RwLock::new(LayoutTree::new()));
39
40        Thread::new(&env, move |env| {
41            let environment =
42                Environment::new(activity, unsafe { env.prolong_lifetime() }, layout_tree);
43
44            let mut compositor = Compositor::new(environment);
45            let id = compositor.track(container);
46
47            let mut runtime = tokio::runtime::Runtime::new().unwrap();
48            runtime.block_on(async move {
49                let (evloop, handler) = EventLoop::new();
50                let _compositor = compositor.clone();
51                let _result = task(id, compositor, evloop);
52
53                handler.main().await;
54            })
55        })
56        .start(&env);
57
58        struct Connection;
59
60        impl Drop for Connection {
61            fn drop(&mut self) {}
62        }
63
64        polyhorn_core::Disposable::new(Connection)
65    }
66}