feat: controls in pip on android

by correctly implementing Media Session using external plugin
This commit is contained in:
NoCrypt 2024-08-10 20:49:19 +07:00
parent 476207fd85
commit abacbf2b41
7 changed files with 56 additions and 22 deletions

View file

@ -16,6 +16,7 @@ dependencies {
implementation project(':capacitor-filesystem')
implementation project(':capacitor-local-notifications')
implementation project(':capacitor-status-bar')
implementation project(':jofr-capacitor-media-session')
implementation project(':capacitor-nodejs')
implementation project(':capacitor-plugin-safe-area')
implementation project(':capacitor-volume-control')

View file

@ -54,6 +54,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-feature android:name="android.software.leanback" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
</manifest>

View file

@ -23,6 +23,9 @@ project(':capacitor-local-notifications').projectDir = new File('../../node_modu
include ':capacitor-status-bar'
project(':capacitor-status-bar').projectDir = new File('../../node_modules/@capacitor/status-bar/android')
include ':jofr-capacitor-media-session'
project(':jofr-capacitor-media-session').projectDir = new File('../../node_modules/@jofr/capacitor-media-session/android')
include ':capacitor-nodejs'
project(':capacitor-nodejs').projectDir = new File('../../node_modules/capacitor-nodejs/android')

View file

@ -37,6 +37,7 @@
"@capacitor/ios": "^6.1.1",
"@capacitor/local-notifications": "^6.0.0",
"@capacitor/status-bar": "^6.0.0",
"@jofr/capacitor-media-session": "^4.0.0",
"capacitor-nodejs": "https://github.com/hampoelz/Capacitor-NodeJS/releases/download/v1.0.0-beta.7/capacitor-nodejs.tgz",
"capacitor-plugin-safe-area": "^3.0.3",
"capacitor-volume-control": "^0.0.1",

View file

@ -5,6 +5,7 @@
import { tick } from 'svelte'
import { state } from '../WatchTogether/WatchTogether.svelte'
import IPC from '@/modules/ipc.js'
import { SUPPORTS } from '@/modules/support.js';
const episodeRx = /Episode (\d+) - (.*)/
@ -183,23 +184,24 @@
})
function setMediaSession (nowPlaying) {
if (typeof MediaMetadata === 'undefined') return
const name = [nowPlaying.title, nowPlaying.episode, nowPlaying.episodeTitle, 'Migu'].filter(i => i).join(' - ')
const metadata =
nowPlaying.thumbnail
? new MediaMetadata({
title: name,
artwork: [
{
src: nowPlaying.thumbnail,
sizes: '256x256',
type: 'image/jpg'
}
const metadata = {
title: nowPlaying.title,
album: nowPlaying.episodeTitle,
artist: 'Migu',
artwork: [
{
src: nowPlaying.thumbnail ? nowPlaying.thumbnail : './logo_filled.png',
sizes: '256x256',
type: 'image/jpg'
}
]
})
: new MediaMetadata({ title: name })
navigator.mediaSession.metadata = metadata
}
if (SUPPORTS.isAndroid) window.Capacitor.Plugins.MediaSession.setMetadata(metadata)
if (typeof MediaMetadata === 'undefined') return
navigator.mediaSession.metadata = new MediaMetadata(metadata)
}
function setDiscordRPC (np = nowPlaying.value) {

View file

@ -42,6 +42,7 @@
}
function updatew2g () {
if (SUPPORTS.isAndroid) window.Capacitor.Plugins.MediaSession.setPlaybackState( {playbackState: paused ? 'paused' : 'playing'} )
w2gEmitter.emit('player', { time: Math.floor(currentTime), paused })
}
@ -282,6 +283,8 @@
}
function playPause () {
paused = !paused
if (SUPPORTS.isAndroid) window.Capacitor.Plugins.MediaSession.setPlaybackState( {playbackState: paused ? 'paused' : 'playing'} )
resetImmerse()
}
function toggleMute () {
@ -735,20 +738,31 @@
resetImmerse()
}, 150)
}
$: navigator.mediaSession?.setPositionState({
const mediaSession = navigator.mediaSession ? navigator.mediaSession : window.Capacitor.Plugins.MediaSession
$: mediaSession?.setPositionState({
duration: Math.max(0, safeduration || 0),
playbackRate: 1,
position: Math.max(0, Math.min(safeduration || 0, currentTime || 0))
})
if ('mediaSession' in navigator) {
navigator.mediaSession.setActionHandler('play', playPause)
navigator.mediaSession.setActionHandler('pause', playPause)
navigator.mediaSession.setActionHandler('nexttrack', playNext)
navigator.mediaSession.setActionHandler('previoustrack', playLast)
navigator.mediaSession.setActionHandler('seekforward', forward)
navigator.mediaSession.setActionHandler('seekbackward', rewind)
mediaSession.setActionHandler('play', playPause)
mediaSession.setActionHandler('pause', playPause)
mediaSession.setActionHandler('nexttrack', playNext)
mediaSession.setActionHandler('previoustrack', playLast)
mediaSession.setActionHandler('seekforward', forward)
mediaSession.setActionHandler('seekbackward', rewind)
} else {
mediaSession.setActionHandler({action: 'play'}, playPause)
mediaSession.setActionHandler({action: 'pause'}, playPause)
mediaSession.setActionHandler({action: 'nexttrack'}, playNext)
mediaSession.setActionHandler({action: 'previoustrack'}, playLast)
mediaSession.setActionHandler({action: 'seekforward'}, forward)
mediaSession.setActionHandler({action: 'seekbackward'}, rewind)
}
let stats = null
let requestCallback = null
function toggleStats () {

View file

@ -96,6 +96,9 @@ importers:
'@capacitor/status-bar':
specifier: ^6.0.0
version: 6.0.0(@capacitor/core@6.1.1)
'@jofr/capacitor-media-session':
specifier: ^4.0.0
version: 4.0.0(@capacitor/core@6.1.1)
capacitor-nodejs:
specifier: https://github.com/hampoelz/Capacitor-NodeJS/releases/download/v1.0.0-beta.7/capacitor-nodejs.tgz
version: https://github.com/hampoelz/Capacitor-NodeJS/releases/download/v1.0.0-beta.7/capacitor-nodejs.tgz(@capacitor/core@6.1.1)
@ -674,6 +677,11 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
'@jofr/capacitor-media-session@4.0.0':
resolution: {integrity: sha512-IGfc6BUzeeR0sJkk+0/jij3l0h78NdTqPMwBc9LXZrojtiqNtg4tw3CnIkYGccwZ/0glV3hPl8HVNTElOPVCyg==}
peerDependencies:
'@capacitor/core': ^6.0.0
'@jridgewell/gen-mapping@0.3.5':
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
@ -6173,6 +6181,10 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
'@jofr/capacitor-media-session@4.0.0(@capacitor/core@6.1.1)':
dependencies:
'@capacitor/core': 6.1.1
'@jridgewell/gen-mapping@0.3.5':
dependencies:
'@jridgewell/set-array': 1.2.1