[Android] [PATCH 05/13] MediaHolderList: don't use EventHandler

Jean-Baptiste Kempf jb at videolan.org
Thu Jan 15 20:13:12 CET 2015


OK.

On 15 Jan, Thomas Guillem wrote :
> 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
> 
> _______________________________________________
> Android mailing list
> Android at videolan.org
> https://mailman.videolan.org/listinfo/android

-- 
With my kindest regards,

-- 
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device


More information about the Android mailing list