From f3ceccfa829402541dc7603037877f2e08efbf9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Cabessa?= Date: Mon, 14 Aug 2017 21:54:31 +0200 Subject: [PATCH] add a "rewind" and "fast forward" button for android Wear This feature is only enabled for "play" build. It is useful to skip advertisement during a podcast. Note: I originaly tried to implement this in the "4 ways controller" managed by the mediaSession (it contains vol up / vol down / skip). This object is linked to the capabilities of the session and seems to be hard to customise without changing the capabilities. This patch simply add 2 new buttons --- build.gradle | 1 + core/build.gradle | 1 + .../playback/PlaybackServiceFlavorHelper.java | 10 ++++++++ .../service/playback/PlaybackService.java | 24 +++++++++++++++++++ .../playback/PlaybackServiceFlavorHelper.java | 21 ++++++++++++++++ 5 files changed, 57 insertions(+) diff --git a/build.gradle b/build.gradle index 47a4021a4..c960e98c4 100644 --- a/build.gradle +++ b/build.gradle @@ -65,6 +65,7 @@ project.ext { castCompanionLibVer = "2.8.3" playServicesVersion = "8.4.0" + wearableSupportVersion = "2.0.3" } task wrapper(type: Wrapper) { diff --git a/core/build.gradle b/core/build.gradle index c2ddd24da..f70083ec1 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -72,6 +72,7 @@ dependencies { playCompile "com.google.android.libraries.cast.companionlibrary:ccl:$castCompanionLibVer" compile "com.android.support:mediarouter-v7:$supportVersion" playCompile "com.google.android.gms:play-services-cast:$playServicesVersion" + compile "com.google.android.support:wearable:$wearableSupportVersion" } else { System.out.println("core: free build hack, skipping some dependencies") } diff --git a/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java b/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java index 6bc3ed7c5..4e6482fda 100644 --- a/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java +++ b/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java @@ -2,6 +2,8 @@ package de.danoeh.antennapod.core.service.playback; import android.content.Context; import android.support.annotation.StringRes; +import android.support.v4.media.session.MediaSessionCompat; +import android.support.v4.media.session.PlaybackStateCompat; /** * Class intended to work along PlaybackService and provide support for different flavors. @@ -41,4 +43,12 @@ public class PlaybackServiceFlavorHelper { boolean onSharedPreference(String key) { return false; } + + void sessionStateAddActionForWear(PlaybackStateCompat.Builder sessionState, String actionName, CharSequence name, int icon) { + // no-op + } + + void mediaSessionSetExtraForWear(MediaSessionCompat mediaSession) { + // no-op + } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index c3e6b55ba..3166dd743 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -133,6 +133,12 @@ public class PlaybackService extends MediaBrowserServiceCompat { */ public static final String ACTION_RESUME_PLAY_CURRENT_EPISODE = "action.de.danoeh.antennapod.core.service.resumePlayCurrentEpisode"; + /** + * Custom action used by Android Wear + */ + private static final String CUSTOM_ACTION_FAST_FORWARD = "action.de.danoeh.antennapod.core.service.fastForward"; + private static final String CUSTOM_ACTION_REWIND = "action.de.danoeh.antennapod.core.service.rewind"; + /** * Used in NOTIFICATION_TYPE_RELOAD. @@ -1083,6 +1089,14 @@ public class PlaybackService extends MediaBrowserServiceCompat { } sessionState.setActions(capabilities); + + flavorHelper.sessionStateAddActionForWear(sessionState, + CUSTOM_ACTION_REWIND, getString(R.string.rewind_label), android.R.drawable.ic_media_rew); + flavorHelper.sessionStateAddActionForWear(sessionState, + CUSTOM_ACTION_FAST_FORWARD, getString(R.string.fast_forward_label), android.R.drawable.ic_media_ff); + + flavorHelper.mediaSessionSetExtraForWear(mediaSession); + mediaSession.setPlaybackState(sessionState.build()); } @@ -1761,6 +1775,16 @@ public class PlaybackService extends MediaBrowserServiceCompat { } return false; } + + @Override + public void onCustomAction(String action, Bundle extra) { + Log.d(TAG, "onCustomAction(" + action + ")"); + if (CUSTOM_ACTION_FAST_FORWARD.equals(action)) { + onFastForward(); + } else if (CUSTOM_ACTION_REWIND.equals(action)) { + onRewind(); + } + } }; private SharedPreferences.OnSharedPreferenceChangeListener prefListener = diff --git a/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java b/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java index 0f493e63e..0cca2ffa4 100644 --- a/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java +++ b/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java @@ -6,9 +6,13 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.NetworkInfo; import android.net.wifi.WifiManager; +import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.StringRes; +import android.support.v4.media.session.MediaSessionCompat; +import android.support.v4.media.session.PlaybackStateCompat; import android.support.v7.media.MediaRouter; +import android.support.wearable.media.MediaControlConstants; import android.util.Log; import android.widget.Toast; @@ -255,4 +259,21 @@ public class PlaybackServiceFlavorHelper { } return false; } + + void sessionStateAddActionForWear(PlaybackStateCompat.Builder sessionState, String actionName, CharSequence name, int icon) { + PlaybackStateCompat.CustomAction.Builder actionBuilder = + new PlaybackStateCompat.CustomAction.Builder(actionName, name, icon); + Bundle actionExtras = new Bundle(); + actionExtras.putBoolean(MediaControlConstants.EXTRA_CUSTOM_ACTION_SHOW_ON_WEAR, true); + actionBuilder.setExtras(actionExtras); + + sessionState.addCustomAction(actionBuilder.build()); + } + + void mediaSessionSetExtraForWear(MediaSessionCompat mediaSession) { + Bundle sessionExtras = new Bundle(); + sessionExtras.putBoolean(MediaControlConstants.EXTRA_RESERVE_SLOT_SKIP_TO_PREVIOUS, true); + sessionExtras.putBoolean(MediaControlConstants.EXTRA_RESERVE_SLOT_SKIP_TO_NEXT, true); + mediaSession.setExtras(sessionExtras); + } }