[Android] [PATCH 05/13] MediaHolderList: don't use EventHandler
Thomas Guillem
thomas at gllm.fr
Thu Jan 15 19:22:22 CET 2015
Use MediaHolderList.EventListener instead.
---
libvlc/src/org/videolan/libvlc/EventHandler.java | 2 +-
.../src/org/videolan/vlc/MediaHolderList.java | 72 ++++++++-----
.../src/org/videolan/vlc/audio/AudioService.java | 115 +++++++++------------
3 files changed, 95 insertions(+), 94 deletions(-)
diff --git a/libvlc/src/org/videolan/libvlc/EventHandler.java b/libvlc/src/org/videolan/libvlc/EventHandler.java
index 2141439..6242b2d 100644
--- a/libvlc/src/org/videolan/libvlc/EventHandler.java
+++ b/libvlc/src/org/videolan/libvlc/EventHandler.java
@@ -97,7 +97,7 @@ public class EventHandler {
private ArrayList<Handler> mEventHandler;
private static EventHandler mInstance;
- public EventHandler() {
+ EventHandler() {
mEventHandler = new ArrayList<Handler>();
}
diff --git a/vlc-android/src/org/videolan/vlc/MediaHolderList.java b/vlc-android/src/org/videolan/vlc/MediaHolderList.java
index 1c348ae..8de0d4e 100644
--- a/vlc-android/src/org/videolan/vlc/MediaHolderList.java
+++ b/vlc-android/src/org/videolan/vlc/MediaHolderList.java
@@ -22,26 +22,57 @@ package org.videolan.vlc;
import java.util.ArrayList;
-import org.videolan.libvlc.EventHandler;
import org.videolan.libvlc.LibVLC;
-import android.os.Bundle;
-
public class MediaHolderList {
private static final String TAG = "VLC/MediaHolderList";
+ public interface EventListener {
+ public void onItemAdded(int index, String mrl);
+ public void onItemRemoved(int index, String mrl);
+ public void onItemMoved(int indexBefore, int indexAfter, String mrl);
+ }
+
+ private static final int EVENT_ADDED = 0;
+ private static final int EVENT_REMOVED = 1;
+ private static final int EVENT_MOVED = 2;
/* TODO: add locking */
- private ArrayList<MediaHolder> mInternalList;
- private LibVLC mLibVLC; // Used to create new objects that require a libvlc instance
- private EventHandler mEventHandler;
+ private final ArrayList<EventListener> mEventListenerList;
+ private final ArrayList<MediaHolder> mInternalList;
+ private final LibVLC mLibVLC; // Used to create new objects that require a libvlc instance
public MediaHolderList(LibVLC libVLC) {
- mEventHandler = new EventHandler(); // used in init() below to fire events at the correct targets
mInternalList = new ArrayList<MediaHolder>();
+ mEventListenerList = new ArrayList<EventListener>();
mLibVLC = libVLC;
}
+ public synchronized void addEventListener(EventListener listener) {
+ if (!mEventListenerList.contains(listener))
+ mEventListenerList.add(listener);
+ }
+
+ public synchronized void removeEventListener(EventListener listener) {
+ mEventListenerList.remove(listener);
+ }
+
+ private synchronized void signalEventListeners(int event, int arg1, int arg2, String mrl) {
+ for (EventListener listener : mEventListenerList) {
+ switch (event) {
+ case EVENT_ADDED:
+ listener.onItemAdded(arg1, mrl);
+ break;
+ case EVENT_REMOVED:
+ listener.onItemRemoved(arg1, mrl);
+ break;
+ case EVENT_MOVED:
+ listener.onItemMoved(arg1, arg2, mrl);
+ break;
+ }
+ }
+ }
+
public void add(MediaHolder media) {
mInternalList.add(media);
}
@@ -51,9 +82,8 @@ public class MediaHolderList {
*/
public void clear() {
// Signal to observers of media being deleted.
- for(int i = 0; i < mInternalList.size(); i++) {
- signal_list_event(EventHandler.CustomMediaListItemDeleted, i, mInternalList.get(i).getLocation());
- }
+ for(int i = 0; i < mInternalList.size(); i++)
+ signalEventListeners(EVENT_REMOVED, i, -1, mInternalList.get(i).getLocation());
mInternalList.clear();
}
@@ -66,7 +96,7 @@ public class MediaHolderList {
}
public void insert(int position, MediaHolder media) {
mInternalList.add(position, media);
- signal_list_event(EventHandler.CustomMediaListItemAdded, position, media.getLocation());
+ signalEventListeners(EVENT_ADDED, position, -1, media.getLocation());
}
/**
@@ -87,10 +117,7 @@ public class MediaHolderList {
mInternalList.add(endPosition, toMove);
else
mInternalList.add(endPosition - 1, toMove);
- Bundle b = new Bundle();
- b.putInt("index_before", startPosition);
- b.putInt("index_after", endPosition);
- mEventHandler.callback(EventHandler.CustomMediaListItemMoved, b);
+ signalEventListeners(EVENT_MOVED, startPosition, endPosition, toMove.getLocation());
}
public void remove(int position) {
@@ -98,7 +125,7 @@ public class MediaHolderList {
return;
String uri = mInternalList.get(position).getLocation();
mInternalList.remove(position);
- signal_list_event(EventHandler.CustomMediaListItemDeleted, position, uri);
+ signalEventListeners(EVENT_REMOVED, position, -1, uri);
}
public void remove(String location) {
@@ -106,7 +133,7 @@ public class MediaHolderList {
String uri = mInternalList.get(i).getLocation();
if (uri.equals(location)) {
mInternalList.remove(i);
- signal_list_event(EventHandler.CustomMediaListItemDeleted, i, uri);
+ signalEventListeners(EVENT_REMOVED, i, -1, uri);
i--;
}
}
@@ -132,10 +159,6 @@ public class MediaHolderList {
return mInternalList.get(position).getLocation();
}
- public EventHandler getEventHandler() {
- return mEventHandler;
- }
-
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
@@ -149,11 +172,4 @@ public class MediaHolderList {
sb.append("}");
return sb.toString();
}
-
- private void signal_list_event(int event, int position, String uri) {
- Bundle b = new Bundle();
- b.putString("item_uri", uri);
- b.putInt("item_index", position);
- mEventHandler.callback(event, b);
- }
}
diff --git a/vlc-android/src/org/videolan/vlc/audio/AudioService.java b/vlc-android/src/org/videolan/vlc/audio/AudioService.java
index 0fd43f7..195e4ea 100644
--- a/vlc-android/src/org/videolan/vlc/audio/AudioService.java
+++ b/vlc-android/src/org/videolan/vlc/audio/AudioService.java
@@ -562,75 +562,60 @@ public class AudioService extends Service {
}
};
- private final Handler mListEventHandler = new MediaListEventHandler(this);
+ private final MediaHolderList.EventListener mListEventListener = new MediaHolderList.EventListener() {
- private static class MediaListEventHandler extends WeakHandler<AudioService> {
+ @Override
+ public void onItemAdded(int index, String mrl) {
+ Log.i(TAG, "CustomMediaListItemAdded");
+ if(mCurrentIndex >= index && !mExpanding.get())
+ mCurrentIndex++;
- public MediaListEventHandler(AudioService audioService) {
- super(audioService);
+ determinePrevAndNextIndices();
+ executeUpdate();
}
@Override
- public void handleMessage(Message msg) {
- AudioService service = getOwner();
- if(service == null) return;
+ public void onItemRemoved(int index, String mrl) {
+ Log.i(TAG, "CustomMediaListItemDeleted");
+ if (mCurrentIndex == index && !mExpanding.get()) {
+ // The current item has been deleted
+ mCurrentIndex--;
+ determinePrevAndNextIndices();
+ if (mNextIndex != -1)
+ next();
+ else if (mCurrentIndex != -1) {
+ mMediaListPlayer.playIndex(mCurrentIndex);
+ executeOnMediaPlayedAdded();
+ } else
+ stop();
+ }
- int index;
- switch (msg.getData().getInt("event")) {
- case EventHandler.CustomMediaListItemAdded:
- Log.i(TAG, "CustomMediaListItemAdded");
- index = msg.getData().getInt("item_index");
- if(service.mCurrentIndex >= index && !service.mExpanding.get())
- service.mCurrentIndex++;
-
- service.determinePrevAndNextIndices();
- service.executeUpdate();
- break;
- case EventHandler.CustomMediaListItemDeleted:
- Log.i(TAG, "CustomMediaListItemDeleted");
- index = msg.getData().getInt("item_index");
- if (service.mCurrentIndex == index && !service.mExpanding.get()) {
- // The current item has been deleted
- service.mCurrentIndex--;
- service.determinePrevAndNextIndices();
- if (service.mNextIndex != -1)
- service.next();
- else if (service.mCurrentIndex != -1) {
- service.mMediaListPlayer.playIndex(service.mCurrentIndex);
- service.executeOnMediaPlayedAdded();
- } else
- service.stop();
- break;
- }
+ if(mCurrentIndex > index && !mExpanding.get())
+ mCurrentIndex--;
+ determinePrevAndNextIndices();
+ executeUpdate();
+ }
- if(service.mCurrentIndex > index && !service.mExpanding.get())
- service.mCurrentIndex--;
- service.determinePrevAndNextIndices();
- service.executeUpdate();
- break;
- case EventHandler.CustomMediaListItemMoved:
- Log.i(TAG, "CustomMediaListItemMoved");
- int positionStart = msg.getData().getInt("index_before");
- int positionEnd = msg.getData().getInt("index_after");
- if (service.mCurrentIndex == positionStart) {
- service.mCurrentIndex = positionEnd;
- if (positionEnd > positionStart)
- service.mCurrentIndex--;
- } else if (positionStart > service.mCurrentIndex
- && positionEnd <= service.mCurrentIndex)
- service.mCurrentIndex++;
- else if (positionStart < service.mCurrentIndex
- && positionEnd > service.mCurrentIndex)
- service.mCurrentIndex--;
-
- // If we are in random mode, we completely reset the stored previous track
- // as their indices changed.
- service.mPrevious.clear();
-
- service.determinePrevAndNextIndices();
- service.executeUpdate();
- break;
- }
+ @Override
+ public void onItemMoved(int indexBefore, int indexAfter, String mrl) {
+ Log.i(TAG, "CustomMediaListItemMoved");
+ if (mCurrentIndex == indexBefore) {
+ mCurrentIndex = indexAfter;
+ if (indexAfter > indexBefore)
+ mCurrentIndex--;
+ } else if (indexBefore > mCurrentIndex
+ && indexAfter <= mCurrentIndex)
+ mCurrentIndex++;
+ else if (indexBefore < mCurrentIndex
+ && indexAfter > mCurrentIndex)
+ mCurrentIndex--;
+
+ // If we are in random mode, we completely reset the stored previous track
+ // as their indices changed.
+ mPrevious.clear();
+
+ determinePrevAndNextIndices();
+ executeUpdate();
}
};
@@ -858,7 +843,7 @@ public class AudioService extends Service {
private void stop() {
mLibVLC.stop();
mEventHandler.removeHandler(mVlcEventHandler);
- mMediaListPlayer.getMediaList().getEventHandler().removeHandler(mListEventHandler);
+ mMediaListPlayer.getMediaList().removeEventListener(mListEventListener);
setRemoteControlClientPlaybackState(EventHandler.MediaPlayerStopped);
mCurrentIndex = -1;
mPrevious.clear();
@@ -1204,7 +1189,7 @@ public class AudioService extends Service {
Log.v(TAG, "Loading position " + ((Integer)position).toString() + " in " + mediaPathList.toString());
mEventHandler.addHandler(mVlcEventHandler);
- mMediaListPlayer.getMediaList().getEventHandler().removeHandler(mListEventHandler);
+ mMediaListPlayer.getMediaList().removeEventListener(mListEventListener);
mMediaListPlayer.getMediaList().clear();
MediaHolderList mediaList = mMediaListPlayer.getMediaList();
@@ -1240,7 +1225,7 @@ public class AudioService extends Service {
}
// Add handler after loading the list
- mMediaListPlayer.getMediaList().getEventHandler().addHandler(mListEventHandler);
+ mMediaListPlayer.getMediaList().addEventListener(mListEventListener);
mMediaListPlayer.playIndex(mCurrentIndex);
executeOnMediaPlayedAdded();
--
2.1.3
More information about the Android
mailing list