Skip to content

Commit bfe9262

Browse files
committed
GeckoView: media session control
*probably fixes #132 *media keys play/pause handling
1 parent 67ec006 commit bfe9262

File tree

4 files changed

+79
-4
lines changed

4 files changed

+79
-4
lines changed

app/src/main/java/com/phlox/tvwebbrowser/activity/main/MainActivity.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -866,9 +866,7 @@ open class MainActivity : AppCompatActivity(), ActionBar.Callback {
866866
return true
867867
} else if ((keyCode == KeyEvent.KEYCODE_MEDIA_PLAY ||
868868
keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE ||
869-
keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) && !config.isWebEngineGecko()) {
870-
//trick to make play/pause media buttons work
871-
//TODO: remove this if someday webview starts handling media keys by himself
869+
keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)) {
872870
if (event.action == KeyEvent.ACTION_UP) {
873871
uiHandler.post {
874872
tabsModel.currentTab.value?.webEngine?.togglePlayback()

app/src/main/java/com/phlox/tvwebbrowser/webengine/gecko/GeckoWebEngine.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class GeckoWebEngine(val tab: WebTabState): WebEngine {
112112
val permissionDelegate = MyPermissionDelegate(this)
113113
val historyDelegate = MyHistoryDelegate(this)
114114
val contentBlockingDelegate = MyContentBlockingDelegate(this)
115+
val mediaSessionDelegate = MyMediaSessionDelegate()
115116
var appWebExtensionPortDelegate: AppWebExtensionPortDelegate? = null
116117
private lateinit var webExtObserver: (WebExtension?) -> Unit
117118

@@ -137,6 +138,7 @@ class GeckoWebEngine(val tab: WebTabState): WebEngine {
137138
session.permissionDelegate = permissionDelegate
138139
session.historyDelegate = historyDelegate
139140
session.contentBlockingDelegate = contentBlockingDelegate
141+
session.mediaSessionDelegate = mediaSessionDelegate
140142

141143
webExtObserver = { ext: WebExtension? ->
142144
if (ext != null) {
@@ -307,6 +309,11 @@ class GeckoWebEngine(val tab: WebTabState): WebEngine {
307309

308310
override fun onPause() {
309311
session.setFocused(false)
312+
mediaSessionDelegate.mediaSession?.let {
313+
if (!mediaSessionDelegate.paused) {
314+
it.pause()
315+
}
316+
}
310317
}
311318

312319
override fun onUpdateAdblockSetting(newState: Boolean) {
@@ -318,7 +325,13 @@ class GeckoWebEngine(val tab: WebTabState): WebEngine {
318325
}
319326

320327
override fun togglePlayback() {
321-
328+
mediaSessionDelegate.mediaSession?.let {
329+
if (mediaSessionDelegate.paused) {
330+
it.play()
331+
} else {
332+
it.pause()
333+
}
334+
}
322335
}
323336

324337
override suspend fun renderThumbnail(bitmap: Bitmap?): Bitmap? {
@@ -364,6 +377,7 @@ class GeckoWebEngine(val tab: WebTabState): WebEngine {
364377
}
365378
if (destroyTab) {
366379
Log.d(TAG, "Closing session completely")
380+
mediaSessionDelegate.mediaSession?.stop()
367381
session.close()
368382
}
369383
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.phlox.tvwebbrowser.webengine.gecko.delegates
2+
3+
import org.mozilla.geckoview.GeckoSession
4+
import org.mozilla.geckoview.MediaSession
5+
6+
class MyMediaSessionDelegate: MediaSession.Delegate {
7+
var mediaSession: MediaSession? = null
8+
var paused = false
9+
override fun onActivated(session: GeckoSession, mediaSession: MediaSession) {
10+
super.onActivated(session, mediaSession)
11+
this.mediaSession = mediaSession
12+
this.paused = false
13+
}
14+
15+
override fun onDeactivated(session: GeckoSession, mediaSession: MediaSession) {
16+
super.onDeactivated(session, mediaSession)
17+
this.mediaSession = null
18+
}
19+
20+
override fun onMetadata(
21+
session: GeckoSession,
22+
mediaSession: MediaSession,
23+
meta: MediaSession.Metadata
24+
) {
25+
super.onMetadata(session, mediaSession, meta)
26+
}
27+
28+
override fun onFeatures(session: GeckoSession, mediaSession: MediaSession, features: Long) {
29+
super.onFeatures(session, mediaSession, features)
30+
}
31+
32+
override fun onPlay(session: GeckoSession, mediaSession: MediaSession) {
33+
super.onPlay(session, mediaSession)
34+
paused = false
35+
}
36+
37+
override fun onPause(session: GeckoSession, mediaSession: MediaSession) {
38+
super.onPause(session, mediaSession)
39+
paused = true
40+
}
41+
42+
override fun onStop(session: GeckoSession, mediaSession: MediaSession) {
43+
super.onStop(session, mediaSession)
44+
}
45+
46+
override fun onPositionState(
47+
session: GeckoSession,
48+
mediaSession: MediaSession,
49+
state: MediaSession.PositionState
50+
) {
51+
super.onPositionState(session, mediaSession, state)
52+
}
53+
54+
override fun onFullscreen(
55+
session: GeckoSession,
56+
mediaSession: MediaSession,
57+
enabled: Boolean,
58+
meta: MediaSession.ElementMetadata?
59+
) {
60+
super.onFullscreen(session, mediaSession, enabled, meta)
61+
}
62+
}

app/src/main/java/com/phlox/tvwebbrowser/webengine/webview/WebViewEx.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,7 @@ class WebViewEx(context: Context, val callback: Callback, val jsInterface: Andro
605605
}
606606
}
607607

608+
//trick to make play/pause media buttons work
608609
fun togglePlayback() {
609610
evaluateJavascript("tvBroTogglePlayback()", null)
610611
}

0 commit comments

Comments
 (0)