From 4d215c95573f486f628281d3bb5fc40477446a1d Mon Sep 17 00:00:00 2001 From: Shinichi Morimoto Date: Wed, 27 Nov 2019 23:05:21 +0900 Subject: [PATCH] extended HostTrait with on_media_session_set_position_state --- components/embedder_traits/lib.rs | 6 +++--- ports/libsimpleservo/api/src/lib.rs | 12 +++++++++++- ports/libsimpleservo/capi/src/lib.rs | 15 +++++++++++++++ ports/libsimpleservo/jniapi/src/lib.rs | 24 ++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/components/embedder_traits/lib.rs b/components/embedder_traits/lib.rs index d8773318e35e..4ac1b4f793d7 100644 --- a/components/embedder_traits/lib.rs +++ b/components/embedder_traits/lib.rs @@ -243,9 +243,9 @@ pub enum MediaSessionPlaybackState { /// https://w3c.github.io/mediasession/#dictdef-mediapositionstate #[derive(Clone, Debug, Deserialize, Serialize)] pub struct MediaPositionState { - pub duration: Option, - pub playback_rate: Option, - pub position: Option, + pub duration: f64, + pub playback_rate: f64, + pub position: f64, } impl MediaPositionState { diff --git a/ports/libsimpleservo/api/src/lib.rs b/ports/libsimpleservo/api/src/lib.rs index c7986e05623b..05a8bf9d32c3 100644 --- a/ports/libsimpleservo/api/src/lib.rs +++ b/ports/libsimpleservo/api/src/lib.rs @@ -132,8 +132,10 @@ pub trait HostTrait { fn set_clipboard_contents(&self, contents: String); /// Called when we get the media session metadata/ fn on_media_session_metadata(&self, title: String, artist: String, album: String); - /// Called when the media sessoin playback state changes. + /// Called when the media session playback state changes. fn on_media_session_playback_state_change(&self, state: i32); + /// Called when the media session position state is set. + fn on_media_session_set_position_state(&self, duration: f64, position: f64, playback_rate: f64); } pub struct ServoGlue { @@ -594,6 +596,14 @@ impl ServoGlue { .callbacks .host_callbacks .on_media_session_playback_state_change(state as i32), + MediaSessionEvent::SetPositionState(position_state) => self + .callbacks + .host_callbacks + .on_media_session_set_position_state( + position_state.duration, + position_state.position, + position_state.playback_rate, + ), }; }, EmbedderMsg::Status(..) | diff --git a/ports/libsimpleservo/capi/src/lib.rs b/ports/libsimpleservo/capi/src/lib.rs index a9fdd2ccdedc..8ca727213a39 100644 --- a/ports/libsimpleservo/capi/src/lib.rs +++ b/ports/libsimpleservo/capi/src/lib.rs @@ -219,6 +219,8 @@ pub struct CHostCallbacks { pub on_media_session_metadata: extern "C" fn(title: *const c_char, album: *const c_char, artist: *const c_char), pub on_media_session_playback_state_change: extern "C" fn(state: i32), + pub on_media_session_set_position_state: + extern "C" fn(duration: f64, position: f64, playback_rate: f64), } /// Servo options @@ -727,4 +729,17 @@ impl HostTrait for HostCallbacks { debug!("on_media_session_playback_state_change {:?}", state); (self.0.on_media_session_playback_state_change)(state); } + + fn on_media_session_set_position_state( + &self, + duration: f64, + position: f64, + playback_rate: f64, + ) { + debug!( + "on_media_session_set_position_state ({:?} {:?} {:?})", + duration, position, playback_rate + ); + (self.0.on_media_session_set_position_state)(duration, position, playback_rate); + } } diff --git a/ports/libsimpleservo/jniapi/src/lib.rs b/ports/libsimpleservo/jniapi/src/lib.rs index 1125f3a56808..74db8774a157 100644 --- a/ports/libsimpleservo/jniapi/src/lib.rs +++ b/ports/libsimpleservo/jniapi/src/lib.rs @@ -560,6 +560,30 @@ impl HostTrait for HostCallbacks { ) .unwrap(); } + + fn on_media_session_set_position_state( + &self, + duration: f64, + position: f64, + playback_rate: f64, + ) { + info!( + "on_media_session_playback_state_change ({:?}, {:?}, {:?})", + duration, position, playback_rate + ); + let env = self.jvm.get_env().unwrap(); + let duration = JValue::Float(duration as jfloat); + let position = JValue::Float(position as jfloat); + let playback_rate = JValue::Float(playback_rate as jfloat); + + env.call_method( + self.callbacks.as_obj(), + "onMediaSessionSetPositionState", + "(FFF)V", + &[duration, position, playback_rate], + ) + .unwrap(); + } } fn initialize_android_glue(env: &JNIEnv, activity: JObject) {