use jni::objects::JValue; use super::{Color, Context, Env, Object, Rect, Reference}; #[derive(Clone)] pub struct View { reference: Reference, } impl View { pub fn new(env: &Env, context: impl Into) -> View { unsafe { let context = context.into(); let object = env.call_constructor( "com/glacyr/polyhorn/View", "(Landroid/content/Context;)V", &[JValue::Object(context.as_reference().as_object()).into()], ); View { reference: env.retain(object), } } } pub fn set_background_color(&mut self, env: &Env, color: Color) { unsafe { match color { Color::Unmanaged(value) => env.call_method( self.reference.as_object(), "setBackgroundColor", "(I)V", &[JValue::Int(value)], ), Color::Managed(_) => todo!("Managed colors are not yet available on Android."), }; } } pub fn set_frame(&mut self, env: &Env, frame: Rect) { unsafe { env.call_method( self.reference.as_object(), "setFrame", "(Lcom/glacyr/polyhorn/Rect;)V", &[JValue::Object(frame.as_reference().as_object())], ); } } pub fn bounds(&self, env: &Env) -> Rect { unsafe { match env.call_method( self.reference.as_object(), "getBounds", "()Lcom/glacyr/polyhorn/Rect;", &[], ) { JValue::Object(value) => Rect::from_reference(env.retain(value)), _ => unreachable!(), } } } pub fn add_view(&mut self, env: &Env, view: &View) { unsafe { env.call_method( self.reference.as_object(), "addView", "(Landroid/view/View;)V", &[JValue::Object(view.as_reference().as_object()).into()], ); } } } impl Object for View { fn from_reference(reference: Reference) -> Self { View { reference } } fn as_reference(&self) -> &Reference { &self.reference } }