diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-10-18 22:29:11 +0200 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-11-20 13:33:51 +0100 |
commit | 08f9f17ed36c1102db51eaa1a88e6914757f2026 (patch) | |
tree | e11be5f0d186cf229103bf2cdf0dc1c60da97720 | |
parent | b494acbf19b52feb122d7d52a84c735e6522a5f5 (diff) | |
download | servo-08f9f17ed36c1102db51eaa1a88e6914757f2026.tar.gz servo-08f9f17ed36c1102db51eaa1a88e6914757f2026.zip |
Send MediaSessionAction from Android
10 files changed, 64 insertions, 15 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 3204871d459..14a667b8918 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -1913,12 +1913,6 @@ impl HTMLMediaElement { self.media_element_load_algorithm(); } } - - fn send_media_session_event(&self, event: MediaSessionEvent) { - let global = self.global(); - let media_session = global.as_window().Navigator().MediaSession(); - media_session.send_event(event); - } } // XXX Placeholder for [https://github.com/servo/servo/issues/22293] diff --git a/components/script/dom/mediasession.rs b/components/script/dom/mediasession.rs index ef64170f312..29d7108e3e3 100644 --- a/components/script/dom/mediasession.rs +++ b/components/script/dom/mediasession.rs @@ -61,6 +61,7 @@ impl MediaSession { } pub fn handle_action(&self, action: MediaSessionActionType) { + println!("HANDLE ACTION {:?}", action); if let Some(handler) = self.action_handlers.borrow().get(&action) { if handler.Call__(ExceptionHandling::Report).is_err() { warn!("Error calling MediaSessionActionHandler callback"); diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index b4b85889ea0..7b921db70e4 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -1087,3 +1087,20 @@ pub enum MediaSessionActionType { /// The action intent is to move the playback time to a specific time. SeekTo, } + +impl From<i32> for MediaSessionActionType { + fn from(value: i32) -> MediaSessionActionType { + match value { + 1 => MediaSessionActionType::Play, + 2 => MediaSessionActionType::Pause, + 3 => MediaSessionActionType::SeekBackward, + 4 => MediaSessionActionType::SeekForward, + 5 => MediaSessionActionType::PreviousTrack, + 6 => MediaSessionActionType::NextTrack, + 7 => MediaSessionActionType::SkipAd, + 8 => MediaSessionActionType::Stop, + 9 => MediaSessionActionType::SeekTo, + _ => panic!("Unknown MediaSessionActionType"), + } + } +} diff --git a/ports/libsimpleservo/api/src/lib.rs b/ports/libsimpleservo/api/src/lib.rs index 3eb28992427..85f5baf56a9 100644 --- a/ports/libsimpleservo/api/src/lib.rs +++ b/ports/libsimpleservo/api/src/lib.rs @@ -19,7 +19,7 @@ use servo::embedder_traits::{EmbedderMsg, MediaSessionEvent}; use servo::euclid::{Point2D, Rect, Scale, Size2D, Vector2D}; use servo::keyboard_types::{Key, KeyState, KeyboardEvent}; use servo::msg::constellation_msg::TraversalDirection; -use servo::script_traits::{MediaSessionActionType, TouchEventType, TouchId}; +use servo::script_traits::{TouchEventType, TouchId}; use servo::servo_config::opts; use servo::servo_config::{pref, set_pref}; use servo::servo_url::ServoUrl; @@ -470,13 +470,10 @@ impl ServoGlue { self.process_event(WindowEvent::Keyboard(key_event)) } - pub fn media_session_action( - &mut self, - action: MediaSessionActionType, - ) -> Result<(), &'static str> { + pub fn media_session_action(&mut self, action: i32) -> Result<(), &'static str> { info!("Media session action {:?}", action); let browser_id = self.get_browser_id()?; - self.process_event(WindowEvent::MediaSessionAction(browser_id, action)) + self.process_event(WindowEvent::MediaSessionAction(browser_id, action.into())) } fn process_event(&mut self, event: WindowEvent) -> Result<(), &'static str> { diff --git a/ports/libsimpleservo/jniapi/src/lib.rs b/ports/libsimpleservo/jniapi/src/lib.rs index 44b6207d3e6..1125f3a5680 100644 --- a/ports/libsimpleservo/jniapi/src/lib.rs +++ b/ports/libsimpleservo/jniapi/src/lib.rs @@ -333,6 +333,16 @@ pub fn Java_org_mozilla_servoview_JNIServo_click(env: JNIEnv, _: JClass, x: jint call(&env, |s| s.click(x as f32, y as f32)); } +#[no_mangle] +pub fn Java_org_mozilla_servoview_JNIServo_mediaSessionAction( + env: JNIEnv, + _: JClass, + action: jint, +) { + debug!("mediaSessionAction"); + call(&env, |s| s.media_session_action(action as i32)); +} + pub struct WakeupCallback { callback: GlobalRef, jvm: Arc<JavaVM>, diff --git a/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MainActivity.java b/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MainActivity.java index 7cc2ab99eca..f95cfe4a64e 100644 --- a/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MainActivity.java +++ b/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MainActivity.java @@ -241,11 +241,11 @@ public class MainActivity extends Activity implements Servo.Client { mMediaSession = new MediaSession(mServoView, this, getApplicationContext()); } Log.d("SERVOMEDIA", "PLAYBACK STATE CHANGED " + state); - if (state == 1 /* none */) { + if (state == MediaSession.PLAYBACK_STATE_NONE) { mMediaSession.hideMediaSessionControls(); return; } - if (state == 2 /* playing */) { + if (state == MediaSession.PLAYBACK_STATE_PLAYING) { mMediaSession.showMediaSessionControls(); return; } diff --git a/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MediaSession.java b/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MediaSession.java index b786bee2669..ce8d1e6315a 100644 --- a/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MediaSession.java +++ b/support/android/apk/servoapp/src/main/java/org/mozilla/servo/MediaSession.java @@ -32,6 +32,22 @@ public class MediaSession { } } + // https://w3c.github.io/mediasession/#enumdef-mediasessionplaybackstate + public static final int PLAYBACK_STATE_NONE = 1; + public static final int PLAYBACK_STATE_PLAYING = 2; + public static final int PLAYBACK_STATE_PAUSED = 3; + + // https://w3c.github.io/mediasession/#enumdef-mediasessionaction + private static final int ACTION_PLAY = 1; + private static final int ACTION_PAUSE = 2; + private static final int ACTON_SEEK_BACKWARD = 3; + private static final int ACTION_SEEK_FORWARD = 4; + private static final int ACTION_PREVIOUS_TRACK = 5; + private static final int ACTION_NEXT_TRACK = 6; + private static final int ACTION_SKIP_AD = 7; + private static final int ACTION_STOP = 8; + private static final int ACTION_SEEK_TO = 9; + private static final String MEDIA_CHANNEL_ID = "MediaNotificationChannel"; private static final String KEY_MEDIA_PAUSE = "org.mozilla.servoview.MainActivity.pause"; private static final String KEY_MEDIA_PREV = "org.mozilla.servoview.MainActivity.prev"; @@ -79,12 +95,16 @@ public class MediaSession { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(KEY_MEDIA_PAUSE)) { + mView.mediaSessionAction(ACTION_PAUSE); Log.d("SERVOMEDIA", "PAUSE"); } else if (intent.getAction().equals(KEY_MEDIA_STOP)) { + mView.mediaSessionAction(ACTION_STOP); Log.d("SERVOMEDIA", "STOP"); } else if (intent.getAction().equals(KEY_MEDIA_NEXT)) { + mView.mediaSessionAction(ACTION_NEXT_TRACK); Log.d("SERVOMEDIA", "NEXT"); } else if (intent.getAction().equals(KEY_MEDIA_PREV)) { + mView.mediaSessionAction(ACTION_PREVIOUS_TRACK); Log.d("SERVOMEDIA", "PREV"); } } diff --git a/support/android/apk/servoview/src/main/java/org/mozilla/servoview/JNIServo.java b/support/android/apk/servoview/src/main/java/org/mozilla/servoview/JNIServo.java index b1ce302e0aa..6181a298f0a 100644 --- a/support/android/apk/servoview/src/main/java/org/mozilla/servoview/JNIServo.java +++ b/support/android/apk/servoview/src/main/java/org/mozilla/servoview/JNIServo.java @@ -66,6 +66,8 @@ public class JNIServo { public native void click(float x, float y); + public native void mediaSessionAction(int action); + public static class ServoOptions { public String args; public String url; diff --git a/support/android/apk/servoview/src/main/java/org/mozilla/servoview/Servo.java b/support/android/apk/servoview/src/main/java/org/mozilla/servoview/Servo.java index 7daea963bb5..f45f55e79f5 100644 --- a/support/android/apk/servoview/src/main/java/org/mozilla/servoview/Servo.java +++ b/support/android/apk/servoview/src/main/java/org/mozilla/servoview/Servo.java @@ -168,6 +168,10 @@ public class Servo { mSuspended = suspended; } + public void mediaSessionAction(int action) { + mRunCallback.inGLThread(() -> mJNI.mediaSessionAction(action)); + } + public interface Client { void onAlert(String message); diff --git a/support/android/apk/servoview/src/main/java/org/mozilla/servoview/ServoView.java b/support/android/apk/servoview/src/main/java/org/mozilla/servoview/ServoView.java index 33431afa19a..3784bbf58cb 100644 --- a/support/android/apk/servoview/src/main/java/org/mozilla/servoview/ServoView.java +++ b/support/android/apk/servoview/src/main/java/org/mozilla/servoview/ServoView.java @@ -134,8 +134,12 @@ public class ServoView extends GLSurfaceView } } + public void mediaSessionAction(int action) { + mServo.mediaSessionAction(action); + } + public void flushGLBuffers() { - requestRender(); + requestRender(); } // Scroll and click |