polyhorn_android/raw/
platform.rs1use 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
10pub 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}