aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-10-18 22:29:11 +0200
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-11-20 13:33:51 +0100
commit08f9f17ed36c1102db51eaa1a88e6914757f2026 (patch)
treee11be5f0d186cf229103bf2cdf0dc1c60da97720
parentb494acbf19b52feb122d7d52a84c735e6522a5f5 (diff)
downloadservo-08f9f17ed36c1102db51eaa1a88e6914757f2026.tar.gz
servo-08f9f17ed36c1102db51eaa1a88e6914757f2026.zip
Send MediaSessionAction from Android
-rw-r--r--components/script/dom/htmlmediaelement.rs6
-rw-r--r--components/script/dom/mediasession.rs1
-rw-r--r--components/script_traits/lib.rs17
-rw-r--r--ports/libsimpleservo/api/src/lib.rs9
-rw-r--r--ports/libsimpleservo/jniapi/src/lib.rs10
-rw-r--r--support/android/apk/servoapp/src/main/java/org/mozilla/servo/MainActivity.java4
-rw-r--r--support/android/apk/servoapp/src/main/java/org/mozilla/servo/MediaSession.java20
-rw-r--r--support/android/apk/servoview/src/main/java/org/mozilla/servoview/JNIServo.java2
-rw-r--r--support/android/apk/servoview/src/main/java/org/mozilla/servoview/Servo.java4
-rw-r--r--support/android/apk/servoview/src/main/java/org/mozilla/servoview/ServoView.java6
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