Introduce TimelineCallback
This makes it simpler for non-playback activities to get callbacks
This commit is contained in:
parent
29307ae357
commit
c0adcdee2f
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
49
src/ch/blinkenlights/android/vanilla/TimelineCallback.java
Normal file
49
src/ch/blinkenlights/android/vanilla/TimelineCallback.java
Normal 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();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user