[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