Introduce TimelineCallback

This makes it simpler for non-playback activities to get callbacks
This commit is contained in:
Adrian Ulrich 2016-02-28 12:18:44 +01:00
parent 29307ae357
commit c0adcdee2f
4 changed files with 95 additions and 65 deletions

View File

@ -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);

View File

@ -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();
}

View File

@ -281,11 +281,7 @@ public final class PlaybackService extends Service
/**
* Static referenced-array to PlaybackActivities, used for callbacks
*/
private static final ArrayList<PlaybackActivity> sActivities = new ArrayList<PlaybackActivity>(5);
/**
* Static reference to MirrorLinkMediaBrowserService, used for callbacks
*/
private static MirrorLinkMediaBrowserService sMirrorLinkMediaBrowserService = null;
private static final ArrayList<TimelineCallback> sCallbacks = new ArrayList<TimelineCallback>(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<PlaybackActivity> list = sActivities;
ArrayList<TimelineCallback> 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<PlaybackActivity> list = sActivities;
ArrayList<TimelineCallback> 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<PlaybackActivity> list = sActivities;
ArrayList<TimelineCallback> 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<PlaybackActivity> list = sActivities;
ArrayList<TimelineCallback> 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<PlaybackActivity> list = sActivities;
ArrayList<TimelineCallback> 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<PlaybackActivity> list = sActivities;
ArrayList<TimelineCallback> 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<PlaybackActivity> list = sActivities;
ArrayList<TimelineCallback> 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);
}
/**

View File

@ -0,0 +1,49 @@
/*
* Copyright (C) 2016 Adrian Ulrich <adrian@blinkenlights.ch>
*
* 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 <http://www.gnu.org/licenses/>.
*/
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();
}