From ccbd7743afaf6193d921c5524469a7e849338bcc Mon Sep 17 00:00:00 2001 From: farfromrefug Date: Wed, 18 Dec 2024 11:08:55 +0100 Subject: [PATCH] fix(android): allow to play/pause with headphones buttons --- app/android/activity.android.ts | 2 +- app/components/FullscreenPlayer.svelte | 4 --- app/handlers/StoryHandler.ts | 2 +- app/services/android/AccessiblityService.ts | 2 +- app/services/android/BgService.ts | 23 +++++++++----- .../android/MediaSessionCompatCallback.ts | 30 +++++++++++-------- 6 files changed, 36 insertions(+), 27 deletions(-) diff --git a/app/android/activity.android.ts b/app/android/activity.android.ts index 4215490..2f4ad18 100644 --- a/app/android/activity.android.ts +++ b/app/android/activity.android.ts @@ -15,7 +15,7 @@ function handleKey(activity: androidx.appcompat.app.AppCompatActivity, keyCode: const action = event.getAction(); const storyHandler = instance.storyHandler; - DEV_LOG && console.warn('handleKey', activity, instance, instance.shouldHandleVolumeButtons, storyHandler.id, keyCode, action); + // DEV_LOG && console.warn('handleKey', activity, instance, instance.shouldHandleVolumeButtons, storyHandler.id, keyCode, action); const playingInfo = storyHandler?.currentPlayingInfo; const { canNext, canPrev, isStory, pack, ...other } = playingInfo; diff --git a/app/components/FullscreenPlayer.svelte b/app/components/FullscreenPlayer.svelte index 3d08450..1d9d462 100644 --- a/app/components/FullscreenPlayer.svelte +++ b/app/components/FullscreenPlayer.svelte @@ -427,10 +427,6 @@ } function onStoryDraw(event: { canvas: Canvas; object: CanvasView }) { - if (DEV_LOG) { - const { pack, ...others } = story; - console.log('onStoryDraw', JSON.stringify(others)); - } if (story?.episode && story?.pack.extra?.episodeCount) { textPaint.color = colorOnTertiaryContainer; textPaint.fontWeight = 'bold'; diff --git a/app/handlers/StoryHandler.ts b/app/handlers/StoryHandler.ts index a4fb4fa..ce580da 100644 --- a/app/handlers/StoryHandler.ts +++ b/app/handlers/StoryHandler.ts @@ -150,7 +150,7 @@ export class StoryHandler extends Handler { let description = pack.subtitle || pack.description; let isStory = false; let inverseImageColors = !onlyInverseLuniiTypeImages || cover !== pack.getThumbnail(); - DEV_LOG && console.log('playingInfo',cover, pack.getThumbnail(), inverseImageColors); + DEV_LOG && console.log('playingInfo', cover, pack.getThumbnail(), inverseImageColors); if (currentStage) { if (duration > 30000 || pack.stageIsStory(currentStage)) { isStory = true; diff --git a/app/services/android/AccessiblityService.ts b/app/services/android/AccessiblityService.ts index ccc887d..eee9e52 100644 --- a/app/services/android/AccessiblityService.ts +++ b/app/services/android/AccessiblityService.ts @@ -23,7 +23,7 @@ export class AccessiblityService extends android.accessibilityservice.Accessibil const storyHandler = getBGServiceInstance().storyHandler; const action = event.getAction(); const keyCode = event.getKeyCode(); - DEV_LOG && console.log('handleKeyEvent', action, keyCode); + // DEV_LOG && console.log('handleKeyEvent', action, keyCode); if (!storyHandler.canOverrideButtons()) { return false; } diff --git a/app/services/android/BgService.ts b/app/services/android/BgService.ts index bbf78be..43246de 100644 --- a/app/services/android/BgService.ts +++ b/app/services/android/BgService.ts @@ -368,14 +368,23 @@ export class BgService extends android.app.Service { } handleMediaIntent(intent: android.content.Intent) { const event = intent.getParcelableExtra(android.content.Intent.EXTRA_KEY_EVENT) as android.view.KeyEvent; - const keyCode = event.getKeyCode(); - switch (event.getKeyCode()) { - case android.view.KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: { - this.storyHandler.togglePlayState(); - break; + if (event.getAction() === 1) { + const keyCode = event.getKeyCode(); + switch (keyCode) { + case 85 /* android.view.KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE */: + case 79 /* android.view.KeyEvent.KEYCODE_HEADSETHOOK */: + this.storyHandler?.togglePlayState(); + break; + case 87 /* android.view.KeyEvent.KEYCODE_MEDIA_NEXT */: + this.storyHandler?.handleAction('next'); + break; + case 88 /* android.view.KeyEvent.KEYCODE_MEDIA_PREVIOUS */: + this.storyHandler?.handleAction('previous'); + break; + case 86 /* android.view.KeyEvent.KEYCODE_MEDIA_STOP */: + this.storyHandler.stopPlaying(); + break; } - case android.view.KeyEvent.KEYCODE_MEDIA_STOP: - this.storyHandler.stopPlaying(); } } updateAlbumArt(image) { diff --git a/app/services/android/MediaSessionCompatCallback.ts b/app/services/android/MediaSessionCompatCallback.ts index eec378d..74b0074 100644 --- a/app/services/android/MediaSessionCompatCallback.ts +++ b/app/services/android/MediaSessionCompatCallback.ts @@ -42,19 +42,23 @@ export class MediaSessionCompatCallback extends android.support.v4.media.session if (!instance.shouldHandleVolumeButtons) { return false; } - const keyEvent = mediaButtonIntent.getParcelableExtra(android.content.Intent.EXTRA_KEY_EVENT) as android.view.KeyEvent; - DEV_LOG && console.log('onMediaButtonEvent', action, keyEvent); - const keyCode = keyEvent.getKeyCode(); - switch (keyCode) { - case 87: - instance.storyHandler?.handleAction('next'); - break; - case 88: - instance.storyHandler?.handleAction('previous'); - break; - default: - break; - } + instance.handleMediaIntent(mediaButtonIntent); + // const keyEvent = mediaButtonIntent.getParcelableExtra(android.content.Intent.EXTRA_KEY_EVENT) as android.view.KeyEvent; + // DEV_LOG && console.log('onMediaButtonEvent', action, keyEvent); + // const keyCode = keyEvent.getKeyCode(); + // switch (keyCode) { + // case 79 /* android.view.KeyEvent.KEYCODE_HEADSETHOOK */: + // instance.storyHandler?.handleAction('pause'); + // break; + // case 87 /* android.view.KeyEvent.KEYCODE_MEDIA_NEXT */: + // instance.storyHandler?.handleAction('next'); + // break; + // case 88 /* android.view.KeyEvent.KEYCODE_MEDIA_PREVIOUS */: + // instance.storyHandler?.handleAction('previous'); + // break; + // default: + // break; + // } return true; } return super.onMediaButtonEvent(mediaButtonIntent);