From c0adcdee2fe86760a174e13c878ef483f5956370 Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Sun, 28 Feb 2016 12:18:44 +0100 Subject: [PATCH] Introduce TimelineCallback This makes it simpler for non-playback activities to get callbacks --- .../MirrorLinkMediaBrowserService.java | 20 +++-- .../android/vanilla/PlaybackActivity.java | 7 +- .../android/vanilla/PlaybackService.java | 84 +++++++------------ .../android/vanilla/TimelineCallback.java | 49 +++++++++++ 4 files changed, 95 insertions(+), 65 deletions(-) create mode 100644 src/ch/blinkenlights/android/vanilla/TimelineCallback.java diff --git a/src/ch/blinkenlights/android/vanilla/MirrorLinkMediaBrowserService.java b/src/ch/blinkenlights/android/vanilla/MirrorLinkMediaBrowserService.java index b758e944..74088921 100644 --- a/src/ch/blinkenlights/android/vanilla/MirrorLinkMediaBrowserService.java +++ b/src/ch/blinkenlights/android/vanilla/MirrorLinkMediaBrowserService.java @@ -56,7 +56,9 @@ import java.util.List; */ @TargetApi(21) -public class MirrorLinkMediaBrowserService extends MediaBrowserService implements Handler.Callback { +public class MirrorLinkMediaBrowserService extends MediaBrowserService + implements Handler.Callback, + TimelineCallback { private static final String TAG = "MirrorLinkMediaBrowserService"; // Action to change the repeat mode @@ -167,7 +169,7 @@ public class MirrorLinkMediaBrowserService extends MediaBrowserService implement mSession.setExtras(mSessionExtras); // Register with the PlaybackService - PlaybackService.registerService(this); + PlaybackService.addTimelineCallback(this); // Make sure the PlaybackService is running if(!PlaybackService.hasInstance()) { @@ -196,7 +198,7 @@ public class MirrorLinkMediaBrowserService extends MediaBrowserService implement public void onDestroy() { Log.d("VanillaMusic", "MediaBrowserService#onDestroy"); mServiceStarted = false; - PlaybackService.unregisterService(); + PlaybackService.removeTimelineCallback(this); mSession.release(); } @@ -730,17 +732,23 @@ public class MirrorLinkMediaBrowserService extends MediaBrowserService implement */ public void onTimelineChanged() { mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_STATE, null)); - // updatePlaybackState(null); } public void setState(long uptime, int state) { mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_STATE, null)); - // updatePlaybackState(null); + } + + public void replaceSong(int delta, Song song) { + } + + public void onMediaChange() { + } + + public void recreate() { } public void setSong(long uptime, Song song) { mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_STATE, null)); -// updatePlaybackState(null); if(song == null) { if(PlaybackService.hasInstance()) { song = PlaybackService.get(this).getSong(0); diff --git a/src/ch/blinkenlights/android/vanilla/PlaybackActivity.java b/src/ch/blinkenlights/android/vanilla/PlaybackActivity.java index b68004da..4876e24a 100644 --- a/src/ch/blinkenlights/android/vanilla/PlaybackActivity.java +++ b/src/ch/blinkenlights/android/vanilla/PlaybackActivity.java @@ -52,7 +52,8 @@ import android.widget.Toast; * changes. */ public abstract class PlaybackActivity extends Activity - implements Handler.Callback, + implements TimelineCallback, + Handler.Callback, View.OnClickListener, CoverView.Callback { @@ -87,7 +88,7 @@ public abstract class PlaybackActivity extends Activity { super.onCreate(state); - PlaybackService.addActivity(this); + PlaybackService.addTimelineCallback(this); setVolumeControlStream(AudioManager.STREAM_MUSIC); @@ -102,7 +103,7 @@ public abstract class PlaybackActivity extends Activity @Override public void onDestroy() { - PlaybackService.removeActivity(this); + PlaybackService.removeTimelineCallback(this); mLooper.quit(); super.onDestroy(); } diff --git a/src/ch/blinkenlights/android/vanilla/PlaybackService.java b/src/ch/blinkenlights/android/vanilla/PlaybackService.java index aa281daf..53527408 100644 --- a/src/ch/blinkenlights/android/vanilla/PlaybackService.java +++ b/src/ch/blinkenlights/android/vanilla/PlaybackService.java @@ -281,11 +281,7 @@ public final class PlaybackService extends Service /** * Static referenced-array to PlaybackActivities, used for callbacks */ - private static final ArrayList sActivities = new ArrayList(5); - /** - * Static reference to MirrorLinkMediaBrowserService, used for callbacks - */ - private static MirrorLinkMediaBrowserService sMirrorLinkMediaBrowserService = null; + private static final ArrayList sCallbacks = new ArrayList(5); /** * Cached app-wide SharedPreferences instance. */ @@ -890,7 +886,7 @@ public final class PlaybackService extends Service mAutoPlPlaycounts = settings.getInt(PrefKeys.AUTOPLAYLIST_PLAYCOUNTS, PrefDefaults.AUTOPLAYLIST_PLAYCOUNTS); } else if (PrefKeys.USE_DARK_THEME.equals(key)) { // Theme changed: trigger a restart of all registered activites - ArrayList list = sActivities; + ArrayList list = sCallbacks; for (int i = list.size(); --i != -1; ) list.get(i).recreate(); } @@ -1036,27 +1032,17 @@ public final class PlaybackService extends Service private void broadcastChange(int state, Song song, long uptime) { if (state != -1) { - ArrayList list = sActivities; + ArrayList list = sCallbacks; for (int i = list.size(); --i != -1; ) list.get(i).setState(uptime, state); - - MirrorLinkMediaBrowserService service = sMirrorLinkMediaBrowserService; - if(service != null) { - service.setState(uptime, state); - } } if (song != null) { - ArrayList list = sActivities; + ArrayList list = sCallbacks; for (int i = list.size(); --i != -1; ) list.get(i).setSong(uptime, song); } - MirrorLinkMediaBrowserService service = sMirrorLinkMediaBrowserService; - if(service != null) { - service.setSong(uptime, song); - } - updateWidgets(); if (mReadaheadEnabled) @@ -1143,17 +1129,29 @@ public final class PlaybackService extends Service * while driving */ private void showMirrorLinkSafeToast(int resId, int duration) { - if(sMirrorLinkMediaBrowserService == null) { + if(getMirrorLinkCallback() == null) { Toast.makeText(this, resId, duration).show(); } } private void showMirrorLinkSafeToast(CharSequence text, int duration) { - if(sMirrorLinkMediaBrowserService == null) { + if(getMirrorLinkCallback() == null) { Toast.makeText(this, text, duration).show(); } } + /** + * Returns TRUE if the mirror link service has been registered + */ + private MirrorLinkMediaBrowserService getMirrorLinkCallback() { + for (Object o : sCallbacks) { + if (o instanceof MirrorLinkMediaBrowserService) { + return (MirrorLinkMediaBrowserService)o; + } + } + return null; + } + /** * Start playing if currently paused. * @@ -1394,7 +1392,8 @@ public final class PlaybackService extends Service public boolean onError(MediaPlayer player, int what, int extra) { Log.e("VanillaMusic", "MediaPlayer error: " + what + ' ' + extra); - MirrorLinkMediaBrowserService service = sMirrorLinkMediaBrowserService; + + MirrorLinkMediaBrowserService service = getMirrorLinkCallback(); if(service != null) { service.onError("MediaPlayer Error"); } @@ -1441,7 +1440,7 @@ public final class PlaybackService extends Service setFlag(FLAG_NO_MEDIA); } - ArrayList list = sActivities; + ArrayList list = sCallbacks; for (int i = list.size(); --i != -1; ) list.get(i).onMediaChange(); @@ -1636,7 +1635,7 @@ public final class PlaybackService extends Service @Override public void activeSongReplaced(int delta, Song song) { - ArrayList list = sActivities; + ArrayList list = sCallbacks; for (int i = list.size(); --i != -1; ) list.get(i).replaceSong(delta, song); @@ -1852,27 +1851,18 @@ public final class PlaybackService extends Service mHandler.removeMessages(MSG_GAPLESS_UPDATE); mHandler.sendEmptyMessageDelayed(MSG_GAPLESS_UPDATE, 100); - ArrayList list = sActivities; + ArrayList list = sCallbacks; for (int i = list.size(); --i != -1; ) list.get(i).onTimelineChanged(); - MirrorLinkMediaBrowserService service = sMirrorLinkMediaBrowserService; - if(service != null) { - service.onTimelineChanged(); - } } @Override public void positionInfoChanged() { - ArrayList list = sActivities; + ArrayList list = sCallbacks; for (int i = list.size(); --i != -1; ) list.get(i).onPositionInfoChanged(); - - MirrorLinkMediaBrowserService service = sMirrorLinkMediaBrowserService; - if(service != null) { - service.onPositionInfoChanged(); - } } private final ContentObserver mObserver = new ContentObserver(null) { @@ -1918,9 +1908,9 @@ public final class PlaybackService extends Service * * @param activity The Activity to be added */ - public static void addActivity(PlaybackActivity activity) + public static void addTimelineCallback(TimelineCallback consumer) { - sActivities.add(activity); + sCallbacks.add(consumer); } /** @@ -1928,27 +1918,9 @@ public final class PlaybackService extends Service * * @param activity The Activity to be removed */ - public static void removeActivity(PlaybackActivity activity) + public static void removeTimelineCallback(TimelineCallback consumer) { - sActivities.remove(activity); - } - - /** - * Register a MirrorLinkMediaBrowserService instance - * - * @param service the Service to be registered - */ - public static void registerService(MirrorLinkMediaBrowserService service) { - sMirrorLinkMediaBrowserService = service; - } - - /** - * Deregister a MirrorLinkMediaBrowserService instance - * - * @param service the Service to be deregistered - */ - public static void unregisterService() { - sMirrorLinkMediaBrowserService = null; + sCallbacks.remove(consumer); } /** diff --git a/src/ch/blinkenlights/android/vanilla/TimelineCallback.java b/src/ch/blinkenlights/android/vanilla/TimelineCallback.java new file mode 100644 index 00000000..b0ff2c44 --- /dev/null +++ b/src/ch/blinkenlights/android/vanilla/TimelineCallback.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2016 Adrian Ulrich + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package ch.blinkenlights.android.vanilla; + +public interface TimelineCallback { + /** + * Called when the song timeline position/size has changed + */ + void onPositionInfoChanged(); + /** + * The library contents changed and should be invalidated + */ + void onMediaChange(); + /** + * Notification about a change in the timeline + */ + void onTimelineChanged(); + /** + * Updates song at 'delta' + */ + void replaceSong(int delta, Song song); + /** + * Sets the currently active song + */ + void setSong(long uptime, Song song); + /** + * Sets the current playback state + */ + void setState(long uptime, int state); + /** + * The view/activity should re-create itself due to a theme change + */ + void recreate(); +}