[Android] [PATCH 1/6] rename PlaybackServiceController to PlaybackServiceClient

Jean-Baptiste Kempf jb at videolan.org
Thu Jun 11 17:48:31 CEST 2015


+1000

On 11 Jun, Thomas Guillem wrote :
> ---
>  .../org/videolan/vlc/PlaybackServiceClient.java    | 536 +++++++++++++++++++++
>  .../videolan/vlc/PlaybackServiceController.java    | 536 ---------------------
>  .../vlc/gui/AudioPlayerContainerActivity.java      |  10 +-
>  .../src/org/videolan/vlc/gui/HistoryAdapter.java   |   8 +-
>  .../src/org/videolan/vlc/gui/HistoryFragment.java  |   4 +-
>  .../org/videolan/vlc/gui/PreferencesActivity.java  |  13 +-
>  .../videolan/vlc/gui/audio/AudioAlbumFragment.java |   6 +-
>  .../vlc/gui/audio/AudioAlbumsSongsFragment.java    |   8 +-
>  .../vlc/gui/audio/AudioBrowserFragment.java        |   6 +-
>  .../org/videolan/vlc/gui/audio/AudioPlayer.java    |   6 +-
>  .../vlc/gui/browser/BaseBrowserFragment.java       |   7 +-
>  .../videolan/vlc/gui/video/VideoGridFragment.java  |  10 +-
>  .../vlc/gui/video/VideoPlayerActivity.java         |  12 +-
>  vlc-android/src/org/videolan/vlc/util/Util.java    |   8 +-
>  .../videolan/vlc/widget/AudioMediaSwitcher.java    |   4 +-
>  .../vlc/gui/tv/MediaItemDetailsFragment.java       |   8 +-
>  .../gui/tv/audioplayer/AudioPlayerActivity.java    |   8 +-
>  17 files changed, 593 insertions(+), 597 deletions(-)
>  create mode 100644 vlc-android/src/org/videolan/vlc/PlaybackServiceClient.java
>  delete mode 100644 vlc-android/src/org/videolan/vlc/PlaybackServiceController.java
> 
> diff --git a/vlc-android/src/org/videolan/vlc/PlaybackServiceClient.java b/vlc-android/src/org/videolan/vlc/PlaybackServiceClient.java
> new file mode 100644
> index 0000000..bddb420
> --- /dev/null
> +++ b/vlc-android/src/org/videolan/vlc/PlaybackServiceClient.java
> @@ -0,0 +1,536 @@
> +/*****************************************************************************
> + * PlaybackServiceClient.java
> + *****************************************************************************
> + * Copyright © 2011-2015 VLC authors and VideoLAN
> + *
> + * 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 2 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, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +package org.videolan.vlc;
> +
> +import android.content.ComponentName;
> +import android.content.Context;
> +import android.content.Intent;
> +import android.content.ServiceConnection;
> +import android.content.SharedPreferences;
> +import android.graphics.Bitmap;
> +import android.os.IBinder;
> +import android.os.RemoteException;
> +import android.preference.PreferenceManager;
> +import android.util.Log;
> +
> +import org.videolan.vlc.interfaces.IAudioPlayer;
> +import org.videolan.vlc.interfaces.IAudioPlayerControl;
> +import org.videolan.vlc.interfaces.IPlaybackService;
> +import org.videolan.vlc.interfaces.IPlaybackServiceCallback;
> +
> +import java.lang.reflect.InvocationTargetException;
> +import java.lang.reflect.Method;
> +import java.util.ArrayList;
> +import java.util.List;
> +
> +public class PlaybackServiceClient implements IAudioPlayerControl {
> +    public static final String TAG = "PlaybackServiceClient";
> +
> +    private static PlaybackServiceClient mInstance;
> +    private static boolean mIsBound = false;
> +    private IPlaybackService mAudioServiceBinder;
> +    private ServiceConnection mAudioServiceConnection;
> +    private final ArrayList<IAudioPlayer> mAudioPlayer;
> +    private final ArrayList<MediaPlayedListener> mMediaPlayedListener;
> +
> +    public interface MediaPlayedListener {
> +        public void onMediaPlayedAdded(MediaWrapper media, int index);
> +        public void onMediaPlayedRemoved(int index);
> +    }
> +
> +    private final IPlaybackServiceCallback mCallback = new IPlaybackServiceCallback.Stub() {
> +        @Override
> +        public void update() throws RemoteException {
> +            updateAudioPlayer();
> +        }
> +
> +        @Override
> +        public void updateProgress() throws RemoteException {
> +            updateProgressAudioPlayer();
> +        }
> +
> +        @Override
> +        public void onMediaPlayedAdded(MediaWrapper media, int index) throws RemoteException {
> +            updateMediaPlayedAdded(media, index);
> +        }
> +
> +        @Override
> +        public void onMediaPlayedRemoved(int index) throws RemoteException {
> +            updateMediaPlayedRemoved(index);
> +        }
> +    };
> +
> +    private PlaybackServiceClient() {
> +        mAudioPlayer = new ArrayList<IAudioPlayer>();
> +        mMediaPlayedListener = new ArrayList<MediaPlayedListener>();
> +    }
> +
> +    public static PlaybackServiceClient getInstance() {
> +        if (mInstance == null) {
> +            mInstance = new PlaybackServiceClient();
> +        }
> +        return mInstance;
> +    }
> +
> +    /**
> +     * The connection listener interface for the audio service
> +     */
> +    public interface AudioServiceConnectionListener {
> +        public void onConnectionSuccess();
> +        public void onConnectionFailed();
> +    }
> +
> +    /**
> +     * Bind to audio service if it is running
> +     */
> +    public void bindAudioService(Context context) {
> +        bindAudioService(context, null);
> +    }
> +
> +    public void bindAudioService(Context context, final AudioServiceConnectionListener connectionListerner) {
> +        if (context == null) {
> +            Log.w(TAG, "bindAudioService() with null Context. Ooops" );
> +            return;
> +        }
> +        context = context.getApplicationContext();
> +
> +        if (!mIsBound) {
> +            Intent service = new Intent(context, PlaybackService.class);
> +
> +            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
> +            final boolean enableHS = prefs.getBoolean("enable_headset_detection", true);
> +
> +            // Setup audio service connection
> +            mAudioServiceConnection = new ServiceConnection() {
> +                @Override
> +                public void onServiceDisconnected(ComponentName name) {
> +                    Log.d(TAG, "Service Disconnected");
> +                    mAudioServiceBinder = null;
> +                    mIsBound = false;
> +                }
> +
> +                @Override
> +                public void onServiceConnected(ComponentName name, IBinder service) {
> +                    if (!mIsBound) // Can happen if unbind is called quickly before this callback
> +                        return;
> +                    Log.d(TAG, "Service Connected");
> +                    mAudioServiceBinder = IPlaybackService.Stub.asInterface(service);
> +
> +                    // Register controller to the service
> +                    try {
> +                        mAudioServiceBinder.addAudioCallback(mCallback);
> +                        mAudioServiceBinder.detectHeadset(enableHS);
> +                        if (connectionListerner != null)
> +                            connectionListerner.onConnectionSuccess();
> +                    } catch (RemoteException e) {
> +                        Log.e(TAG, "remote procedure call failed: addAudioCallback()");
> +                        if (connectionListerner != null)
> +                            connectionListerner.onConnectionFailed();
> +                    }
> +                    updateAudioPlayer();
> +                }
> +            };
> +
> +            mIsBound = context.bindService(service, mAudioServiceConnection, Context.BIND_AUTO_CREATE);
> +        } else {
> +            // Register controller to the service
> +            try {
> +                if (mAudioServiceBinder != null)
> +                    mAudioServiceBinder.addAudioCallback(mCallback);
> +                if (connectionListerner != null)
> +                    connectionListerner.onConnectionSuccess();
> +            } catch (RemoteException e) {
> +                Log.e(TAG, "remote procedure call failed: addAudioCallback()");
> +                if (connectionListerner != null)
> +                    connectionListerner.onConnectionFailed();
> +            }
> +        }
> +    }
> +
> +    public void unbindAudioService(Context context) {
> +        if (context == null) {
> +            Log.w(TAG, "unbindAudioService() with null Context. Ooops" );
> +            return;
> +        }
> +        context = context.getApplicationContext();
> +
> +        if (mIsBound) {
> +            mIsBound = false;
> +            try {
> +                if (mAudioServiceBinder != null)
> +                    mAudioServiceBinder.removeAudioCallback(mCallback);
> +            } catch (RemoteException e) {
> +                Log.e(TAG, "remote procedure call failed: removeAudioCallback()");
> +            }
> +            context.unbindService(mAudioServiceConnection);
> +            mAudioServiceBinder = null;
> +            mAudioServiceConnection = null;
> +        }
> +    }
> +
> +    /**
> +     * Add a MediaPlayedListener
> +     * @param li
> +     */
> +    public void addMediaPlayedListener(MediaPlayedListener li) {
> +        if (!mMediaPlayedListener.contains(li))
> +            mMediaPlayedListener.add(li);
> +    }
> +
> +    /**
> +     * Remove MediaPlayedListener from list
> +     * @param li
> +     */
> +    public void removeMediaPlayedListener(MediaPlayedListener li) {
> +        if (mMediaPlayedListener.contains(li))
> +            mMediaPlayedListener.remove(li);
> +    }
> +
> +    /**
> +     * Add a AudioPlayer
> +     * @param ap
> +     */
> +    public void addAudioPlayer(IAudioPlayer ap) {
> +        if (!mAudioPlayer.contains(ap))
> +            mAudioPlayer.add(ap);
> +    }
> +
> +    /**
> +     * Remove AudioPlayer from list
> +     * @param ap
> +     */
> +    public void removeAudioPlayer(IAudioPlayer ap) {
> +        if (mAudioPlayer.contains(ap))
> +            mAudioPlayer.remove(ap);
> +    }
> +
> +    /**
> +     * Update all AudioPlayer
> +     */
> +    private void updateAudioPlayer() {
> +        for (IAudioPlayer player : mAudioPlayer)
> +            player.update();
> +    }
> +
> +    /**
> +     * Update the progress of all AudioPlayers
> +     */
> +    private void updateProgressAudioPlayer() {
> +        for (IAudioPlayer player : mAudioPlayer)
> +            player.updateProgress();
> +    }
> +
> +    private void updateMediaPlayedAdded(MediaWrapper media, int index) {
> +        for (MediaPlayedListener listener : mMediaPlayedListener) {
> +            listener.onMediaPlayedAdded(media, index);
> +        }
> +    }
> +
> +    private void updateMediaPlayedRemoved(int index) {
> +        for (MediaPlayedListener listener : mMediaPlayedListener) {
> +            listener.onMediaPlayedRemoved(index);
> +        }
> +    }
> +
> +    /**
> +     * This is a handy utility function to call remote procedure calls from mAudioServiceBinder
> +     * to reduce code duplication across methods of AudioServiceController.
> +     *
> +     * @param instance The instance of IPlaybackService to call, usually mAudioServiceBinder
> +     * @param returnType Return type of the method being called
> +     * @param defaultValue Default value to return in case of null or exception
> +     * @param functionName The function name to call, e.g. "stop"
> +     * @param parameterTypes List of parameter types. Pass null if none.
> +     * @param parameters List of parameters. Must be in same order as parameterTypes. Pass null if none.
> +     * @return The results of the RPC or defaultValue if error
> +     */
> +    private <T> T remoteProcedureCall(IPlaybackService instance, Class<T> returnType, T defaultValue, String functionName, Class<?> parameterTypes[], Object parameters[]) {
> +        if(instance == null) {
> +            return defaultValue;
> +        }
> +
> +        try {
> +            Method m = IPlaybackService.class.getMethod(functionName, parameterTypes);
> +            @SuppressWarnings("unchecked")
> +            T returnVal = (T) m.invoke(instance, parameters);
> +            return returnVal;
> +        } catch(NoSuchMethodException e) {
> +            e.printStackTrace();
> +            return defaultValue;
> +        } catch (IllegalArgumentException e) {
> +            e.printStackTrace();
> +            return defaultValue;
> +        } catch (IllegalAccessException e) {
> +            e.printStackTrace();
> +            return defaultValue;
> +        } catch (InvocationTargetException e) {
> +            if(e.getTargetException() instanceof RemoteException) {
> +                Log.e(TAG, "remote procedure call failed: " + functionName + "()");
> +            }
> +            return defaultValue;
> +        }
> +    }
> +
> +    public void loadLocation(String mediaPath) {
> +        ArrayList < String > arrayList = new ArrayList<String>();
> +        arrayList.add(mediaPath);
> +        loadLocations(arrayList, 0);
> +    }
> +
> +
> +    public void load(MediaWrapper media, boolean forceAudio) {
> +        ArrayList<MediaWrapper> arrayList = new ArrayList<MediaWrapper>();
> +        arrayList.add(media);
> +        load(arrayList, 0, forceAudio);
> +    }
> +
> +    public void load(MediaWrapper media) {
> +        load(media, false);
> +    }
> +
> +    public void loadLocations(List<String> mediaPathList, int position) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void) null, "loadLocations",
> +                new Class<?>[]{List.class, int.class},
> +                new Object[]{mediaPathList, position});
> +    }
> +
> +    public void load(List<MediaWrapper> mediaList, int position) {
> +        load(mediaList, position, false);
> +    }
> +
> +    public void load(List<MediaWrapper> mediaList, int position, boolean forceAudio) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void) null, "load",
> +                new Class<?>[]{List.class, int.class, boolean.class},
> +                new Object[]{mediaList, position, forceAudio});
> +    }
> +
> +    public void append(MediaWrapper media) {
> +        ArrayList<MediaWrapper> arrayList = new ArrayList<MediaWrapper>();
> +        arrayList.add(media);
> +        append(arrayList);
> +    }
> +
> +    public void append(List<MediaWrapper> mediaList) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void) null, "append",
> +                new Class<?>[]{List.class},
> +                new Object[]{mediaList});
> +    }
> +
> +    public void moveItem(int positionStart, int positionEnd) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "moveItem",
> +                new Class<?>[] { int.class, int.class },
> +                new Object[] { positionStart, positionEnd } );
> +    }
> +
> +    public void remove(int position) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "remove",
> +                new Class<?>[] { int.class },
> +                new Object[] { position } );
> +    }
> +
> +    public void removeLocation(String location) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "removeLocation",
> +                new Class<?>[] { String.class },
> +                new Object[] { location } );
> +    }
> +
> +    @SuppressWarnings("unchecked")
> +    public List<MediaWrapper> getMedias() {
> +        return remoteProcedureCall(mAudioServiceBinder, List.class, null, "getMedias", null, null);
> +    }
> +
> +    @SuppressWarnings("unchecked")
> +    public List<String> getMediaLocations() {
> +        List<String> def = new ArrayList<String>();
> +        return remoteProcedureCall(mAudioServiceBinder, List.class, def, "getMediaLocations", null, null);
> +    }
> +
> +    public String getCurrentMediaLocation() {
> +        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getCurrentMediaLocation", null, null);
> +    }
> +
> +    public MediaWrapper getCurrentMediaWrapper() {
> +        return remoteProcedureCall(mAudioServiceBinder, MediaWrapper.class, (MediaWrapper)null, "getCurrentMediaWrapper", null, null);
> +    }
> +
> +    public void stop() {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "stop", null, null);
> +    }
> +
> +    public void showWithoutParse(int u) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "showWithoutParse",
> +                new Class<?>[] { int.class },
> +                new Object[] { u } );
> +    }
> +
> +    public void playIndex(int i) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "playIndex",
> +                new Class<?>[] { int.class },
> +                new Object[] { i } );
> +    }
> +
> +    @Override
> +    public String getAlbum() {
> +        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getAlbum", null, null);
> +    }
> +
> +    @Override
> +    public String getArtist() {
> +        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getArtist", null, null);
> +    }
> +
> +    @Override
> +    public String getArtistPrev() {
> +        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getArtistPrev", null, null);
> +    }
> +
> +    @Override
> +    public String getArtistNext() {
> +        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getArtistNext", null, null);
> +    }
> +
> +    @Override
> +    public String getTitle() {
> +        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getTitle", null, null);
> +    }
> +
> +    @Override
> +    public String getTitlePrev() {
> +        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getTitlePrev", null, null);
> +    }
> +
> +    @Override
> +    public String getTitleNext() {
> +        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getTitleNext", null, null);
> +    }
> +
> +    @Override
> +    public boolean isPlaying() {
> +        return hasMedia() && remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "isPlaying", null, null);
> +    }
> +
> +    @Override
> +    public void pause() {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "pause", null, null);
> +    }
> +
> +    @Override
> +    public void play() {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "play", null, null);
> +    }
> +
> +    @Override
> +    public boolean hasMedia() {
> +        return remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "hasMedia", null, null);
> +    }
> +
> +    @Override
> +    public int getLength() {
> +        return remoteProcedureCall(mAudioServiceBinder, int.class, 0, "getLength", null, null);
> +    }
> +
> +    @Override
> +    public int getTime() {
> +        return remoteProcedureCall(mAudioServiceBinder, int.class, 0, "getTime", null, null);
> +    }
> +
> +    @Override
> +    public Bitmap getCover() {
> +        return remoteProcedureCall(mAudioServiceBinder, Bitmap.class, (Bitmap)null, "getCover", null, null);
> +    }
> +
> +    @Override
> +    public Bitmap getCoverPrev() {
> +        return remoteProcedureCall(mAudioServiceBinder, Bitmap.class, (Bitmap)null, "getCoverPrev", null, null);
> +    }
> +
> +    @Override
> +    public Bitmap getCoverNext() {
> +        return remoteProcedureCall(mAudioServiceBinder, Bitmap.class, (Bitmap)null, "getCoverNext", null, null);
> +    }
> +
> +    @Override
> +    public void next() {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "next", null, null);
> +    }
> +
> +    @Override
> +    public void previous() {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "previous", null, null);
> +    }
> +
> +    public void setTime(long time) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "setTime",
> +                new Class<?>[] { long.class },
> +                new Object[] { time } );
> +    }
> +
> +    @Override
> +    public boolean hasNext() {
> +        return remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "hasNext", null, null);
> +    }
> +
> +    @Override
> +    public boolean hasPrevious() {
> +        return remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "hasPrevious", null, null);
> +    }
> +
> +    @Override
> +    public void shuffle() {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "shuffle", null, null);
> +    }
> +
> +    @Override
> +    public void setRepeatType(PlaybackService.RepeatType t) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "setRepeatType",
> +                new Class<?>[] { int.class },
> +                new Object[] { t.ordinal() } );
> +    }
> +
> +    @Override
> +    public boolean isShuffling() {
> +        return remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "isShuffling", null, null);
> +    }
> +
> +    @Override
> +    public PlaybackService.RepeatType getRepeatType() {
> +        return PlaybackService.RepeatType.values()[
> +            remoteProcedureCall(mAudioServiceBinder, int.class, PlaybackService.RepeatType.None.ordinal(), "getRepeatType", null, null)
> +        ];
> +    }
> +
> +    @Override
> +    public void detectHeadset(boolean enable) {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, null, "detectHeadset",
> +                new Class<?>[] { boolean.class },
> +                new Object[] { enable } );
> +    }
> +
> +    @Override
> +    public float getRate() {
> +        return remoteProcedureCall(mAudioServiceBinder, Float.class, (float) 1.0, "getRate", null, null);
> +    }
> +
> +    @Override
> +    public void handleVout() {
> +        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "handleVout", null, null);
> +    }
> +}
> diff --git a/vlc-android/src/org/videolan/vlc/PlaybackServiceController.java b/vlc-android/src/org/videolan/vlc/PlaybackServiceController.java
> deleted file mode 100644
> index 9938777..0000000
> --- a/vlc-android/src/org/videolan/vlc/PlaybackServiceController.java
> +++ /dev/null
> @@ -1,536 +0,0 @@
> -/*****************************************************************************
> - * AudioServiceController.java
> - *****************************************************************************
> - * Copyright © 2011-2012 VLC authors and VideoLAN
> - *
> - * 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 2 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, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> - *****************************************************************************/
> -
> -package org.videolan.vlc;
> -
> -import android.content.ComponentName;
> -import android.content.Context;
> -import android.content.Intent;
> -import android.content.ServiceConnection;
> -import android.content.SharedPreferences;
> -import android.graphics.Bitmap;
> -import android.os.IBinder;
> -import android.os.RemoteException;
> -import android.preference.PreferenceManager;
> -import android.util.Log;
> -
> -import org.videolan.vlc.interfaces.IAudioPlayer;
> -import org.videolan.vlc.interfaces.IAudioPlayerControl;
> -import org.videolan.vlc.interfaces.IPlaybackService;
> -import org.videolan.vlc.interfaces.IPlaybackServiceCallback;
> -
> -import java.lang.reflect.InvocationTargetException;
> -import java.lang.reflect.Method;
> -import java.util.ArrayList;
> -import java.util.List;
> -
> -public class PlaybackServiceController implements IAudioPlayerControl {
> -    public static final String TAG = "VLC/PlaylistServiceCtrl";
> -
> -    private static PlaybackServiceController mInstance;
> -    private static boolean mIsBound = false;
> -    private IPlaybackService mAudioServiceBinder;
> -    private ServiceConnection mAudioServiceConnection;
> -    private final ArrayList<IAudioPlayer> mAudioPlayer;
> -    private final ArrayList<MediaPlayedListener> mMediaPlayedListener;
> -
> -    public interface MediaPlayedListener {
> -        public void onMediaPlayedAdded(MediaWrapper media, int index);
> -        public void onMediaPlayedRemoved(int index);
> -    }
> -
> -    private final IPlaybackServiceCallback mCallback = new IPlaybackServiceCallback.Stub() {
> -        @Override
> -        public void update() throws RemoteException {
> -            updateAudioPlayer();
> -        }
> -
> -        @Override
> -        public void updateProgress() throws RemoteException {
> -            updateProgressAudioPlayer();
> -        }
> -
> -        @Override
> -        public void onMediaPlayedAdded(MediaWrapper media, int index) throws RemoteException {
> -            updateMediaPlayedAdded(media, index);
> -        }
> -
> -        @Override
> -        public void onMediaPlayedRemoved(int index) throws RemoteException {
> -            updateMediaPlayedRemoved(index);
> -        }
> -    };
> -
> -    private PlaybackServiceController() {
> -        mAudioPlayer = new ArrayList<IAudioPlayer>();
> -        mMediaPlayedListener = new ArrayList<MediaPlayedListener>();
> -    }
> -
> -    public static PlaybackServiceController getInstance() {
> -        if (mInstance == null) {
> -            mInstance = new PlaybackServiceController();
> -        }
> -        return mInstance;
> -    }
> -
> -    /**
> -     * The connection listener interface for the audio service
> -     */
> -    public interface AudioServiceConnectionListener {
> -        public void onConnectionSuccess();
> -        public void onConnectionFailed();
> -    }
> -
> -    /**
> -     * Bind to audio service if it is running
> -     */
> -    public void bindAudioService(Context context) {
> -        bindAudioService(context, null);
> -    }
> -
> -    public void bindAudioService(Context context, final AudioServiceConnectionListener connectionListerner) {
> -        if (context == null) {
> -            Log.w(TAG, "bindAudioService() with null Context. Ooops" );
> -            return;
> -        }
> -        context = context.getApplicationContext();
> -
> -        if (!mIsBound) {
> -            Intent service = new Intent(context, PlaybackService.class);
> -
> -            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
> -            final boolean enableHS = prefs.getBoolean("enable_headset_detection", true);
> -
> -            // Setup audio service connection
> -            mAudioServiceConnection = new ServiceConnection() {
> -                @Override
> -                public void onServiceDisconnected(ComponentName name) {
> -                    Log.d(TAG, "Service Disconnected");
> -                    mAudioServiceBinder = null;
> -                    mIsBound = false;
> -                }
> -
> -                @Override
> -                public void onServiceConnected(ComponentName name, IBinder service) {
> -                    if (!mIsBound) // Can happen if unbind is called quickly before this callback
> -                        return;
> -                    Log.d(TAG, "Service Connected");
> -                    mAudioServiceBinder = IPlaybackService.Stub.asInterface(service);
> -
> -                    // Register controller to the service
> -                    try {
> -                        mAudioServiceBinder.addAudioCallback(mCallback);
> -                        mAudioServiceBinder.detectHeadset(enableHS);
> -                        if (connectionListerner != null)
> -                            connectionListerner.onConnectionSuccess();
> -                    } catch (RemoteException e) {
> -                        Log.e(TAG, "remote procedure call failed: addAudioCallback()");
> -                        if (connectionListerner != null)
> -                            connectionListerner.onConnectionFailed();
> -                    }
> -                    updateAudioPlayer();
> -                }
> -            };
> -
> -            mIsBound = context.bindService(service, mAudioServiceConnection, Context.BIND_AUTO_CREATE);
> -        } else {
> -            // Register controller to the service
> -            try {
> -                if (mAudioServiceBinder != null)
> -                    mAudioServiceBinder.addAudioCallback(mCallback);
> -                if (connectionListerner != null)
> -                    connectionListerner.onConnectionSuccess();
> -            } catch (RemoteException e) {
> -                Log.e(TAG, "remote procedure call failed: addAudioCallback()");
> -                if (connectionListerner != null)
> -                    connectionListerner.onConnectionFailed();
> -            }
> -        }
> -    }
> -
> -    public void unbindAudioService(Context context) {
> -        if (context == null) {
> -            Log.w(TAG, "unbindAudioService() with null Context. Ooops" );
> -            return;
> -        }
> -        context = context.getApplicationContext();
> -
> -        if (mIsBound) {
> -            mIsBound = false;
> -            try {
> -                if (mAudioServiceBinder != null)
> -                    mAudioServiceBinder.removeAudioCallback(mCallback);
> -            } catch (RemoteException e) {
> -                Log.e(TAG, "remote procedure call failed: removeAudioCallback()");
> -            }
> -            context.unbindService(mAudioServiceConnection);
> -            mAudioServiceBinder = null;
> -            mAudioServiceConnection = null;
> -        }
> -    }
> -
> -    /**
> -     * Add a MediaPlayedListener
> -     * @param li
> -     */
> -    public void addMediaPlayedListener(MediaPlayedListener li) {
> -        if (!mMediaPlayedListener.contains(li))
> -            mMediaPlayedListener.add(li);
> -    }
> -
> -    /**
> -     * Remove MediaPlayedListener from list
> -     * @param li
> -     */
> -    public void removeMediaPlayedListener(MediaPlayedListener li) {
> -        if (mMediaPlayedListener.contains(li))
> -            mMediaPlayedListener.remove(li);
> -    }
> -
> -    /**
> -     * Add a AudioPlayer
> -     * @param ap
> -     */
> -    public void addAudioPlayer(IAudioPlayer ap) {
> -        if (!mAudioPlayer.contains(ap))
> -            mAudioPlayer.add(ap);
> -    }
> -
> -    /**
> -     * Remove AudioPlayer from list
> -     * @param ap
> -     */
> -    public void removeAudioPlayer(IAudioPlayer ap) {
> -        if (mAudioPlayer.contains(ap))
> -            mAudioPlayer.remove(ap);
> -    }
> -
> -    /**
> -     * Update all AudioPlayer
> -     */
> -    private void updateAudioPlayer() {
> -        for (IAudioPlayer player : mAudioPlayer)
> -            player.update();
> -    }
> -
> -    /**
> -     * Update the progress of all AudioPlayers
> -     */
> -    private void updateProgressAudioPlayer() {
> -        for (IAudioPlayer player : mAudioPlayer)
> -            player.updateProgress();
> -    }
> -
> -    private void updateMediaPlayedAdded(MediaWrapper media, int index) {
> -        for (MediaPlayedListener listener : mMediaPlayedListener) {
> -            listener.onMediaPlayedAdded(media, index);
> -        }
> -    }
> -
> -    private void updateMediaPlayedRemoved(int index) {
> -        for (MediaPlayedListener listener : mMediaPlayedListener) {
> -            listener.onMediaPlayedRemoved(index);
> -        }
> -    }
> -
> -    /**
> -     * This is a handy utility function to call remote procedure calls from mAudioServiceBinder
> -     * to reduce code duplication across methods of AudioServiceController.
> -     *
> -     * @param instance The instance of IPlaybackService to call, usually mAudioServiceBinder
> -     * @param returnType Return type of the method being called
> -     * @param defaultValue Default value to return in case of null or exception
> -     * @param functionName The function name to call, e.g. "stop"
> -     * @param parameterTypes List of parameter types. Pass null if none.
> -     * @param parameters List of parameters. Must be in same order as parameterTypes. Pass null if none.
> -     * @return The results of the RPC or defaultValue if error
> -     */
> -    private <T> T remoteProcedureCall(IPlaybackService instance, Class<T> returnType, T defaultValue, String functionName, Class<?> parameterTypes[], Object parameters[]) {
> -        if(instance == null) {
> -            return defaultValue;
> -        }
> -
> -        try {
> -            Method m = IPlaybackService.class.getMethod(functionName, parameterTypes);
> -            @SuppressWarnings("unchecked")
> -            T returnVal = (T) m.invoke(instance, parameters);
> -            return returnVal;
> -        } catch(NoSuchMethodException e) {
> -            e.printStackTrace();
> -            return defaultValue;
> -        } catch (IllegalArgumentException e) {
> -            e.printStackTrace();
> -            return defaultValue;
> -        } catch (IllegalAccessException e) {
> -            e.printStackTrace();
> -            return defaultValue;
> -        } catch (InvocationTargetException e) {
> -            if(e.getTargetException() instanceof RemoteException) {
> -                Log.e(TAG, "remote procedure call failed: " + functionName + "()");
> -            }
> -            return defaultValue;
> -        }
> -    }
> -
> -    public void loadLocation(String mediaPath) {
> -        ArrayList < String > arrayList = new ArrayList<String>();
> -        arrayList.add(mediaPath);
> -        loadLocations(arrayList, 0);
> -    }
> -
> -
> -    public void load(MediaWrapper media, boolean forceAudio) {
> -        ArrayList<MediaWrapper> arrayList = new ArrayList<MediaWrapper>();
> -        arrayList.add(media);
> -        load(arrayList, 0, forceAudio);
> -    }
> -
> -    public void load(MediaWrapper media) {
> -        load(media, false);
> -    }
> -
> -    public void loadLocations(List<String> mediaPathList, int position) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void) null, "loadLocations",
> -                new Class<?>[]{List.class, int.class},
> -                new Object[]{mediaPathList, position});
> -    }
> -
> -    public void load(List<MediaWrapper> mediaList, int position) {
> -        load(mediaList, position, false);
> -    }
> -
> -    public void load(List<MediaWrapper> mediaList, int position, boolean forceAudio) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void) null, "load",
> -                new Class<?>[]{List.class, int.class, boolean.class},
> -                new Object[]{mediaList, position, forceAudio});
> -    }
> -
> -    public void append(MediaWrapper media) {
> -        ArrayList<MediaWrapper> arrayList = new ArrayList<MediaWrapper>();
> -        arrayList.add(media);
> -        append(arrayList);
> -    }
> -
> -    public void append(List<MediaWrapper> mediaList) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void) null, "append",
> -                new Class<?>[]{List.class},
> -                new Object[]{mediaList});
> -    }
> -
> -    public void moveItem(int positionStart, int positionEnd) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "moveItem",
> -                new Class<?>[] { int.class, int.class },
> -                new Object[] { positionStart, positionEnd } );
> -    }
> -
> -    public void remove(int position) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "remove",
> -                new Class<?>[] { int.class },
> -                new Object[] { position } );
> -    }
> -
> -    public void removeLocation(String location) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "removeLocation",
> -                new Class<?>[] { String.class },
> -                new Object[] { location } );
> -    }
> -
> -    @SuppressWarnings("unchecked")
> -    public List<MediaWrapper> getMedias() {
> -        return remoteProcedureCall(mAudioServiceBinder, List.class, null, "getMedias", null, null);
> -    }
> -
> -    @SuppressWarnings("unchecked")
> -    public List<String> getMediaLocations() {
> -        List<String> def = new ArrayList<String>();
> -        return remoteProcedureCall(mAudioServiceBinder, List.class, def, "getMediaLocations", null, null);
> -    }
> -
> -    public String getCurrentMediaLocation() {
> -        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getCurrentMediaLocation", null, null);
> -    }
> -
> -    public MediaWrapper getCurrentMediaWrapper() {
> -        return remoteProcedureCall(mAudioServiceBinder, MediaWrapper.class, (MediaWrapper)null, "getCurrentMediaWrapper", null, null);
> -    }
> -
> -    public void stop() {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "stop", null, null);
> -    }
> -
> -    public void showWithoutParse(int u) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "showWithoutParse",
> -                new Class<?>[] { int.class },
> -                new Object[] { u } );
> -    }
> -
> -    public void playIndex(int i) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "playIndex",
> -                new Class<?>[] { int.class },
> -                new Object[] { i } );
> -    }
> -
> -    @Override
> -    public String getAlbum() {
> -        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getAlbum", null, null);
> -    }
> -
> -    @Override
> -    public String getArtist() {
> -        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getArtist", null, null);
> -    }
> -
> -    @Override
> -    public String getArtistPrev() {
> -        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getArtistPrev", null, null);
> -    }
> -
> -    @Override
> -    public String getArtistNext() {
> -        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getArtistNext", null, null);
> -    }
> -
> -    @Override
> -    public String getTitle() {
> -        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getTitle", null, null);
> -    }
> -
> -    @Override
> -    public String getTitlePrev() {
> -        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getTitlePrev", null, null);
> -    }
> -
> -    @Override
> -    public String getTitleNext() {
> -        return remoteProcedureCall(mAudioServiceBinder, String.class, (String)null, "getTitleNext", null, null);
> -    }
> -
> -    @Override
> -    public boolean isPlaying() {
> -        return hasMedia() && remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "isPlaying", null, null);
> -    }
> -
> -    @Override
> -    public void pause() {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "pause", null, null);
> -    }
> -
> -    @Override
> -    public void play() {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "play", null, null);
> -    }
> -
> -    @Override
> -    public boolean hasMedia() {
> -        return remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "hasMedia", null, null);
> -    }
> -
> -    @Override
> -    public int getLength() {
> -        return remoteProcedureCall(mAudioServiceBinder, int.class, 0, "getLength", null, null);
> -    }
> -
> -    @Override
> -    public int getTime() {
> -        return remoteProcedureCall(mAudioServiceBinder, int.class, 0, "getTime", null, null);
> -    }
> -
> -    @Override
> -    public Bitmap getCover() {
> -        return remoteProcedureCall(mAudioServiceBinder, Bitmap.class, (Bitmap)null, "getCover", null, null);
> -    }
> -
> -    @Override
> -    public Bitmap getCoverPrev() {
> -        return remoteProcedureCall(mAudioServiceBinder, Bitmap.class, (Bitmap)null, "getCoverPrev", null, null);
> -    }
> -
> -    @Override
> -    public Bitmap getCoverNext() {
> -        return remoteProcedureCall(mAudioServiceBinder, Bitmap.class, (Bitmap)null, "getCoverNext", null, null);
> -    }
> -
> -    @Override
> -    public void next() {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "next", null, null);
> -    }
> -
> -    @Override
> -    public void previous() {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "previous", null, null);
> -    }
> -
> -    public void setTime(long time) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "setTime",
> -                new Class<?>[] { long.class },
> -                new Object[] { time } );
> -    }
> -
> -    @Override
> -    public boolean hasNext() {
> -        return remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "hasNext", null, null);
> -    }
> -
> -    @Override
> -    public boolean hasPrevious() {
> -        return remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "hasPrevious", null, null);
> -    }
> -
> -    @Override
> -    public void shuffle() {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "shuffle", null, null);
> -    }
> -
> -    @Override
> -    public void setRepeatType(PlaybackService.RepeatType t) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "setRepeatType",
> -                new Class<?>[] { int.class },
> -                new Object[] { t.ordinal() } );
> -    }
> -
> -    @Override
> -    public boolean isShuffling() {
> -        return remoteProcedureCall(mAudioServiceBinder, boolean.class, false, "isShuffling", null, null);
> -    }
> -
> -    @Override
> -    public PlaybackService.RepeatType getRepeatType() {
> -        return PlaybackService.RepeatType.values()[
> -            remoteProcedureCall(mAudioServiceBinder, int.class, PlaybackService.RepeatType.None.ordinal(), "getRepeatType", null, null)
> -        ];
> -    }
> -
> -    @Override
> -    public void detectHeadset(boolean enable) {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, null, "detectHeadset",
> -                new Class<?>[] { boolean.class },
> -                new Object[] { enable } );
> -    }
> -
> -    @Override
> -    public float getRate() {
> -        return remoteProcedureCall(mAudioServiceBinder, Float.class, (float) 1.0, "getRate", null, null);
> -    }
> -
> -    @Override
> -    public void handleVout() {
> -        remoteProcedureCall(mAudioServiceBinder, Void.class, (Void)null, "handleVout", null, null);
> -    }
> -}
> diff --git a/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.java b/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.java
> index 0555bbc..281f706 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/AudioPlayerContainerActivity.java
> @@ -39,7 +39,7 @@ import android.view.ViewGroup;
>  import android.widget.TextView;
>  
>  import org.videolan.vlc.BuildConfig;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.gui.audio.AudioPlayer;
>  import org.videolan.vlc.util.Util;
> @@ -53,7 +53,7 @@ public class AudioPlayerContainerActivity extends AppCompatActivity {
>      protected ActionBar mActionBar;
>      protected Toolbar mToolbar;
>      protected AudioPlayer mAudioPlayer;
> -    protected PlaybackServiceController mAudioController;
> +    protected PlaybackServiceClient mAudioController;
>      protected SlidingPaneLayout mSlidingPane;
>      protected View mAudioPlayerFilling;
>      protected SharedPreferences mSettings;
> @@ -83,7 +83,7 @@ public class AudioPlayerContainerActivity extends AppCompatActivity {
>          /* Set up the audio player */
>          mAudioPlayer = new AudioPlayer();
>          mAudioPlayer.setUserVisibleHint(false);
> -        mAudioController = PlaybackServiceController.getInstance();
> +        mAudioController = PlaybackServiceClient.getInstance();
>  
>          getSupportFragmentManager().beginTransaction()
>                  .replace(R.id.audio_player, mAudioPlayer)
> @@ -112,14 +112,14 @@ public class AudioPlayerContainerActivity extends AppCompatActivity {
>      protected void onResume() {
>          super.onResume();
>          mAudioController.addAudioPlayer(mAudioPlayer);
> -        PlaybackServiceController.getInstance().bindAudioService(this);
> +        PlaybackServiceClient.getInstance().bindAudioService(this);
>      }
>  
>      @Override
>      protected void onPause() {
>          super.onPause();
>          mAudioController.removeAudioPlayer(mAudioPlayer);
> -        PlaybackServiceController.getInstance().unbindAudioService(this);
> +        PlaybackServiceClient.getInstance().unbindAudioService(this);
>      }
>  
>      private void applyTheme() {
> diff --git a/vlc-android/src/org/videolan/vlc/gui/HistoryAdapter.java b/vlc-android/src/org/videolan/vlc/gui/HistoryAdapter.java
> index a69e4e0..a118d9b 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/HistoryAdapter.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/HistoryAdapter.java
> @@ -31,7 +31,7 @@ import android.widget.ImageView;
>  import android.widget.TextView;
>  
>  import org.videolan.vlc.MediaWrapper;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.VLCApplication;
>  import org.videolan.vlc.gui.audio.AudioUtil;
> @@ -39,17 +39,17 @@ import org.videolan.vlc.util.Util;
>  
>  import java.util.ArrayList;
>  
> -public class HistoryAdapter extends BaseAdapter implements PlaybackServiceController.MediaPlayedListener {
> +public class HistoryAdapter extends BaseAdapter implements PlaybackServiceClient.MediaPlayedListener {
>      public final static String TAG = "VLC/HistoryAdapter";
>  
>      private LayoutInflater mInflater;
> -    private final PlaybackServiceController mAudioController;
> +    private final PlaybackServiceClient mAudioController;
>      private final ArrayList<MediaWrapper> mMediaList;
>  
>      public HistoryAdapter(Context context) {
>          mInflater = LayoutInflater.from(context);
>  
> -        mAudioController = PlaybackServiceController.getInstance();
> +        mAudioController = PlaybackServiceClient.getInstance();
>  
>          mMediaList = new ArrayList<MediaWrapper>();
>  
> diff --git a/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.java b/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.java
> index 0c66079..ae8bd2e 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.java
> @@ -36,7 +36,7 @@ import android.widget.AdapterView.AdapterContextMenuInfo;
>  import android.widget.ListView;
>  
>  import org.videolan.libvlc.util.AndroidUtil;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.gui.browser.MediaBrowserFragment;
>  import org.videolan.vlc.interfaces.IRefreshable;
> @@ -124,7 +124,7 @@ public class HistoryFragment extends MediaBrowserFragment implements IRefreshabl
>      }
>  
>      private void playListIndex(int position) {
> -        PlaybackServiceController audioController = PlaybackServiceController.getInstance();
> +        PlaybackServiceClient audioController = PlaybackServiceClient.getInstance();
>  
>          audioController.playIndex(position);
>      }
> diff --git a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
> index 38fedc8..184650c 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
> @@ -50,10 +50,9 @@ import android.widget.LinearLayout;
>  import android.widget.ListView;
>  
>  import org.videolan.libvlc.util.HWDecoderUtil;
> -import org.videolan.libvlc.LibVLC;
>  import org.videolan.vlc.MediaDatabase;
>  import org.videolan.vlc.PlaybackService;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.gui.audio.AudioUtil;
>  import org.videolan.vlc.util.AndroidDevices;
> @@ -125,7 +124,7 @@ public class PreferencesActivity extends PreferenceActivity implements OnSharedP
>                  new OnPreferenceClickListener() {
>                      @Override
>                      public boolean onPreferenceClick(Preference preference) {
> -                        PlaybackServiceController.getInstance().detectHeadset(checkboxHS.isChecked());
> +                        PlaybackServiceClient.getInstance().detectHeadset(checkboxHS.isChecked());
>                          return true;
>                      }
>                  });
> @@ -375,22 +374,22 @@ public class PreferencesActivity extends PreferenceActivity implements OnSharedP
>      @Override
>      protected void onResume() {
>          super.onResume();
> -        PlaybackServiceController.getInstance().bindAudioService(this);
> +        PlaybackServiceClient.getInstance().bindAudioService(this);
>      }
>  
>      @Override
>      protected void onPause() {
>          super.onPause();
> -        PlaybackServiceController.getInstance().unbindAudioService(this);
> +        PlaybackServiceClient.getInstance().unbindAudioService(this);
>      }
>  
>      private void restartService(Context context) {
>          Intent service = new Intent(context, PlaybackService.class);
>  
> -        PlaybackServiceController.getInstance().unbindAudioService(PreferencesActivity.this);
> +        PlaybackServiceClient.getInstance().unbindAudioService(PreferencesActivity.this);
>          context.stopService(service);
>  
>          context.startService(service);
> -        PlaybackServiceController.getInstance().bindAudioService(PreferencesActivity.this);
> +        PlaybackServiceClient.getInstance().bindAudioService(PreferencesActivity.this);
>      }
>  }
> diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumFragment.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumFragment.java
> index 2a6e119..d9e50e3 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumFragment.java
> @@ -46,7 +46,7 @@ import android.widget.ListView;
>  
>  import org.videolan.libvlc.util.AndroidUtil;
>  import org.videolan.vlc.MediaWrapper;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.util.AndroidDevices;
>  
> @@ -56,7 +56,7 @@ public class AudioAlbumFragment extends Fragment implements AdapterView.OnItemCl
>  
>      public final static String TAG = "VLC/AudioAlbumFragment";
>  
> -    PlaybackServiceController mAudioController;
> +    PlaybackServiceClient mAudioController;
>  
>      private AlbumAdapter mAdapter;
>      private ArrayList<MediaWrapper> mMediaList;
> @@ -70,7 +70,7 @@ public class AudioAlbumFragment extends Fragment implements AdapterView.OnItemCl
>  
>          mAdapter.setContextPopupMenuListener(mContextPopupMenuListener);
>  
> -        mAudioController = PlaybackServiceController.getInstance();
> +        mAudioController = PlaybackServiceClient.getInstance();
>          if (savedInstanceState != null)
>              setMediaList(savedInstanceState.<MediaWrapper>getParcelableArrayList("list"), savedInstanceState.getString("title"));
>      }
> diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.java
> index 4d87f4e..a54e14c 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumsSongsFragment.java
> @@ -52,14 +52,12 @@ import com.android.widget.SlidingTabLayout;
>  import org.videolan.libvlc.util.AndroidUtil;
>  import org.videolan.vlc.MediaLibrary;
>  import org.videolan.vlc.MediaWrapper;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.VLCApplication;
> -import org.videolan.vlc.gui.dialogs.CommonDialogs;
>  import org.videolan.vlc.gui.SecondaryActivity;
>  import org.videolan.vlc.util.AndroidDevices;
>  import org.videolan.vlc.util.Util;
> -import org.videolan.vlc.util.VLCRunnable;
>  import org.videolan.vlc.util.WeakHandler;
>  import org.videolan.vlc.widget.SwipeRefreshLayout;
>  
> @@ -76,7 +74,7 @@ public class AudioAlbumsSongsFragment extends Fragment implements SwipeRefreshLa
>      private static final int DELETE_MEDIA = 0;
>      private static final int DELETE_DURATION = 3000;
>  
> -    PlaybackServiceController mAudioController;
> +    PlaybackServiceClient mAudioController;
>      private MediaLibrary mMediaLibrary;
>  
>      private SwipeRefreshLayout mSwipeRefreshLayout;
> @@ -108,7 +106,7 @@ public class AudioAlbumsSongsFragment extends Fragment implements SwipeRefreshLa
>          mAlbumsAdapter.setContextPopupMenuListener(mContextPopupMenuListener);
>          mSongsAdapter.setContextPopupMenuListener(mContextPopupMenuListener);
>  
> -        mAudioController = PlaybackServiceController.getInstance();
> +        mAudioController = PlaybackServiceClient.getInstance();
>          mMediaLibrary = MediaLibrary.getInstance();
>          if (savedInstanceState != null)
>              setMediaList(savedInstanceState.<MediaWrapper>getParcelableArrayList("list"), savedInstanceState.getString("title"));
> diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserFragment.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserFragment.java
> index 632d91d..cfdbe9c 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserFragment.java
> @@ -56,7 +56,7 @@ import org.videolan.libvlc.util.MediaBrowser;
>  import org.videolan.vlc.MediaDatabase;
>  import org.videolan.vlc.MediaLibrary;
>  import org.videolan.vlc.MediaWrapper;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.VLCApplication;
>  import org.videolan.vlc.gui.MainActivity;
> @@ -82,7 +82,7 @@ import java.util.concurrent.Executors;
>  public class AudioBrowserFragment extends MediaBrowserFragment implements SwipeRefreshLayout.OnRefreshListener, SlidingTabLayout.OnTabChangedListener, MediaBrowser.EventListener, IBrowser {
>      public final static String TAG = "VLC/AudioBrowserFragment";
>  
> -    private PlaybackServiceController mAudioController;
> +    private PlaybackServiceClient mAudioController;
>      private MediaLibrary mMediaLibrary;
>      private MediaBrowser mMediaBrowser;
>      private MainActivity mMainActivity;
> @@ -121,7 +121,7 @@ public class AudioBrowserFragment extends MediaBrowserFragment implements SwipeR
>      public void onCreate(Bundle savedInstanceState) {
>          super.onCreate(savedInstanceState);
>  
> -        mAudioController = PlaybackServiceController.getInstance();
> +        mAudioController = PlaybackServiceClient.getInstance();
>  
>          mMediaLibrary = MediaLibrary.getInstance();
>  
> diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.java b/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.java
> index f13510d..9d8f9bd 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.java
> @@ -52,7 +52,7 @@ import android.widget.ViewSwitcher;
>  
>  import org.videolan.vlc.MediaWrapper;
>  import org.videolan.vlc.PlaybackService;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.VLCApplication;
>  import org.videolan.vlc.gui.AudioPlayerContainerActivity;
> @@ -91,7 +91,7 @@ public class AudioPlayer extends Fragment implements IAudioPlayer, View.OnClickL
>  
>      ViewSwitcher mSwitcher;
>  
> -    private PlaybackServiceController mAudioController;
> +    private PlaybackServiceClient mAudioController;
>      private boolean mShowRemainingTime = false;
>      private boolean mPreviewingSeek = false;
>  
> @@ -112,7 +112,7 @@ public class AudioPlayer extends Fragment implements IAudioPlayer, View.OnClickL
>      public void onCreate(Bundle savedInstanceState) {
>          super.onCreate(savedInstanceState);
>  
> -        mAudioController = PlaybackServiceController.getInstance();
> +        mAudioController = PlaybackServiceClient.getInstance();
>  
>          mSongsListAdapter = new AudioPlaylistAdapter(getActivity());
>      }
> diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.java b/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.java
> index 76e98a5..350da67 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.java
> @@ -46,13 +46,12 @@ import android.view.View;
>  import android.view.ViewGroup;
>  import android.widget.TextView;
>  
> -import org.videolan.libvlc.LibVLC;
>  import org.videolan.libvlc.Media;
>  import org.videolan.libvlc.util.AndroidUtil;
>  import org.videolan.libvlc.util.MediaBrowser;
>  import org.videolan.vlc.MediaLibrary;
>  import org.videolan.vlc.MediaWrapper;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.VLCApplication;
>  import org.videolan.vlc.gui.SecondaryActivity;
> @@ -405,7 +404,7 @@ public abstract class BaseBrowserFragment extends MediaBrowserFragment implement
>                  Util.openMedia(getActivity(), (MediaWrapper) mAdapter.getItem(position));
>                  return true;
>              case R.id.directory_view_append:
> -                PlaybackServiceController.getInstance().append(mw);
> +                PlaybackServiceClient.getInstance().append(mw);
>                  return true;
>              case R.id.directory_view_delete:
>                  AlertDialog alertDialog = CommonDialogs.deleteMedia(
> @@ -425,7 +424,7 @@ public abstract class BaseBrowserFragment extends MediaBrowserFragment implement
>                  startActivity(i);
>                  return true;
>              case R.id.directory_view_play_audio:
> -                PlaybackServiceController.getInstance().load(mw);
> +                PlaybackServiceClient.getInstance().load(mw);
>                  return true;
>              case  R.id.directory_view_play_video:
>                  VideoPlayerActivity.start(getActivity(), mw.getUri());
> diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.java
> index 9291332..50e9284 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoGridFragment.java
> @@ -60,7 +60,7 @@ import org.videolan.vlc.MediaDatabase;
>  import org.videolan.vlc.MediaGroup;
>  import org.videolan.vlc.MediaLibrary;
>  import org.videolan.vlc.MediaWrapper;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.Thumbnailer;
>  import org.videolan.vlc.VLCApplication;
> @@ -113,7 +113,7 @@ public class VideoGridFragment extends MediaBrowserFragment implements ISortable
>      private VideoGridAnimator mAnimator;
>  
>      private MainActivity mMainActivity;
> -    private PlaybackServiceController mAudioController;
> +    private PlaybackServiceClient mAudioController;
>  
>      // Gridview position saved in onPause()
>      private int mGVFirstVisiblePos;
> @@ -125,7 +125,7 @@ public class VideoGridFragment extends MediaBrowserFragment implements ISortable
>      public void onCreate(Bundle savedInstanceState) {
>          super.onCreate(savedInstanceState);
>  
> -        mAudioController = PlaybackServiceController.getInstance();
> +        mAudioController = PlaybackServiceClient.getInstance();
>  
>          mVideoAdapter = new VideoListAdapter(this);
>          mMediaLibrary = MediaLibrary.getInstance();
> @@ -187,7 +187,7 @@ public class VideoGridFragment extends MediaBrowserFragment implements ISortable
>      public void onPause() {
>          super.onPause();
>          if (!(getActivity() instanceof MainActivity))
> -            PlaybackServiceController.getInstance().unbindAudioService(getActivity());
> +            PlaybackServiceClient.getInstance().unbindAudioService(getActivity());
>          mGVFirstVisiblePos = mGridView.getFirstVisiblePosition();
>          mMediaLibrary.setBrowser(null);
>          mMediaLibrary.removeUpdateHandler(mHandler);
> @@ -201,7 +201,7 @@ public class VideoGridFragment extends MediaBrowserFragment implements ISortable
>      public void onResume() {
>          super.onResume();
>          if (!(getActivity() instanceof MainActivity))
> -            PlaybackServiceController.getInstance().bindAudioService(getActivity());
> +            PlaybackServiceClient.getInstance().bindAudioService(getActivity());
>          else
>              mMainActivity = (MainActivity) getActivity();
>          mMediaLibrary.setBrowser(this);
> diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
> index 75e0a8f..d1bcdda 100644
> --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
> +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
> @@ -106,7 +106,7 @@ import org.videolan.vlc.BuildConfig;
>  import org.videolan.vlc.MediaDatabase;
>  import org.videolan.vlc.MediaWrapper;
>  import org.videolan.vlc.MediaWrapperListPlayer;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.VLCApplication;
>  import org.videolan.vlc.gui.dialogs.CommonDialogs;
> @@ -656,8 +656,8 @@ public class VideoPlayerActivity extends AppCompatActivity implements IVideoPlay
>          if (mBound)
>              return;
>          mBound = true;
> -        PlaybackServiceController.getInstance().bindAudioService(this,
> -                new PlaybackServiceController.AudioServiceConnectionListener() {
> +        PlaybackServiceClient.getInstance().bindAudioService(this,
> +                new PlaybackServiceClient.AudioServiceConnectionListener() {
>                      @Override
>                      public void onConnectionSuccess() {
>                          mAudioServiceReady = true;
> @@ -673,7 +673,7 @@ public class VideoPlayerActivity extends AppCompatActivity implements IVideoPlay
>                  });
>      }
>      private void unbindAudioService() {
> -        PlaybackServiceController.getInstance().unbindAudioService(this);
> +        PlaybackServiceClient.getInstance().unbindAudioService(this);
>          mAudioServiceReady = false;
>          mBound = false;
>      }
> @@ -750,7 +750,7 @@ public class VideoPlayerActivity extends AppCompatActivity implements IVideoPlay
>  
>          if(mSwitchingView) {
>              Log.d(TAG, "mLocation = \"" + mUri + "\"");
> -            PlaybackServiceController.getInstance().showWithoutParse(savedIndexPosition);
> +            PlaybackServiceClient.getInstance().showWithoutParse(savedIndexPosition);
>              unbindAudioService();
>              return;
>          }
> @@ -2799,7 +2799,7 @@ public class VideoPlayerActivity extends AppCompatActivity implements IVideoPlay
>              savedIndexPosition = openedPosition;
>          } else {
>              /* prepare playback */
> -            PlaybackServiceController.getInstance().stop(); // Stop the previous playback.
> +            PlaybackServiceClient.getInstance().stop(); // Stop the previous playback.
>              if (savedIndexPosition == -1 && mUri != null) {
>                  mMediaListPlayer.getMediaList().clear();
>                  final Media media = new Media(LibVLC(), mUri);
> diff --git a/vlc-android/src/org/videolan/vlc/util/Util.java b/vlc-android/src/org/videolan/vlc/util/Util.java
> index 5699eb9..055aff6 100644
> --- a/vlc-android/src/org/videolan/vlc/util/Util.java
> +++ b/vlc-android/src/org/videolan/vlc/util/Util.java
> @@ -43,7 +43,7 @@ import org.videolan.libvlc.Media;
>  import org.videolan.libvlc.util.AndroidUtil;
>  import org.videolan.vlc.MediaLibrary;
>  import org.videolan.vlc.MediaWrapper;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.VLCApplication;
>  import org.videolan.vlc.VLCCallbackTask;
> @@ -216,7 +216,7 @@ public class Util {
>              VLCCallbackTask task = new VLCCallbackTask(context) {
>                  @Override
>                  public void run() {
> -                    PlaybackServiceController c = PlaybackServiceController.getInstance();
> +                    PlaybackServiceClient c = PlaybackServiceClient.getInstance();
>                      c.load(media);
>                  }
>              };
> @@ -228,7 +228,7 @@ public class Util {
>          VLCCallbackTask task = new VLCCallbackTask(context){
>              @Override
>              public void run() {
> -                PlaybackServiceController c = PlaybackServiceController.getInstance();
> +                PlaybackServiceClient c = PlaybackServiceClient.getInstance();
>  
>                        /* Use the audio player by default. If a video track is
>                         * detected, then it will automatically switch to the video
> @@ -246,7 +246,7 @@ public class Util {
>          VLCCallbackTask task = new VLCCallbackTask(context){
>              @Override
>              public void run() {
> -                PlaybackServiceController c = PlaybackServiceController.getInstance();
> +                PlaybackServiceClient c = PlaybackServiceClient.getInstance();
>  
>                        /* Use the audio player by default. If a video track is
>                         * detected, then it will automatically switch to the video
> diff --git a/vlc-android/src/org/videolan/vlc/widget/AudioMediaSwitcher.java b/vlc-android/src/org/videolan/vlc/widget/AudioMediaSwitcher.java
> index 060bb1b..0afd6ff 100644
> --- a/vlc-android/src/org/videolan/vlc/widget/AudioMediaSwitcher.java
> +++ b/vlc-android/src/org/videolan/vlc/widget/AudioMediaSwitcher.java
> @@ -20,7 +20,7 @@
>  
>  package org.videolan.vlc.widget;
>  
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  
>  import android.content.Context;
>  import android.graphics.Bitmap;
> @@ -42,7 +42,7 @@ public abstract class AudioMediaSwitcher extends FlingViewGroup {
>      }
>  
>      public void updateMedia() {
> -        PlaybackServiceController audioController = PlaybackServiceController.getInstance();
> +        PlaybackServiceClient audioController = PlaybackServiceClient.getInstance();
>          if (audioController == null)
>              return;
>  
> diff --git a/vlc-android/tv/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.java b/vlc-android/tv/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.java
> index 8efd250..718bcc0 100644
> --- a/vlc-android/tv/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.java
> +++ b/vlc-android/tv/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.java
> @@ -26,7 +26,7 @@ import org.videolan.libvlc.util.AndroidUtil;
>  import org.videolan.vlc.MediaDatabase;
>  import org.videolan.vlc.MediaLibrary;
>  import org.videolan.vlc.MediaWrapper;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.gui.audio.AudioUtil;
>  import org.videolan.vlc.gui.tv.audioplayer.AudioPlayerActivity;
> @@ -46,7 +46,7 @@ import android.support.v17.leanback.widget.ListRowPresenter;
>  import android.support.v17.leanback.widget.OnActionClickedListener;
>  import android.widget.Toast;
>  
> -public class MediaItemDetailsFragment extends DetailsFragment implements PlaybackServiceController.AudioServiceConnectionListener {
> +public class MediaItemDetailsFragment extends DetailsFragment implements PlaybackServiceClient.AudioServiceConnectionListener {
>      private static final String TAG = "MediaItemDetailsFragment";
>      private static final int ID_PLAY = 1;
>      private static final int ID_LISTEN = 2;
> @@ -54,7 +54,7 @@ public class MediaItemDetailsFragment extends DetailsFragment implements Playbac
>      private static final int ID_FAVORITE_DELETE = 4;
>      private static final int ID_BROWSE = 5;
>      private ArrayObjectAdapter mRowsAdapter;
> -    private PlaybackServiceController mAudioController;
> +    private PlaybackServiceClient mAudioController;
>      private MediaItemDetails mMedia;
>      private MediaWrapper mMediaWrapper;
>      private MediaDatabase mDb;
> @@ -63,7 +63,7 @@ public class MediaItemDetailsFragment extends DetailsFragment implements Playbac
>      public void onCreate(Bundle savedInstanceState) {
>          super.onCreate(savedInstanceState);
>  
> -        mAudioController = PlaybackServiceController.getInstance();
> +        mAudioController = PlaybackServiceClient.getInstance();
>          buildDetails();
>      }
>  
> diff --git a/vlc-android/tv/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.java b/vlc-android/tv/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.java
> index 0614a11..1a6164a 100644
> --- a/vlc-android/tv/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.java
> +++ b/vlc-android/tv/src/org/videolan/vlc/gui/tv/audioplayer/AudioPlayerActivity.java
> @@ -26,7 +26,7 @@ import java.util.Collections;
>  import org.videolan.vlc.MediaLibrary;
>  import org.videolan.vlc.MediaWrapper;
>  import org.videolan.vlc.PlaybackService;
> -import org.videolan.vlc.PlaybackServiceController;
> +import org.videolan.vlc.PlaybackServiceClient;
>  import org.videolan.vlc.R;
>  import org.videolan.vlc.gui.DividerItemDecoration;
>  import org.videolan.vlc.gui.audio.AudioUtil;
> @@ -47,12 +47,12 @@ import android.widget.ImageView;
>  import android.widget.ProgressBar;
>  import android.widget.TextView;
>  
> -public class AudioPlayerActivity extends Activity implements PlaybackServiceController.AudioServiceConnectionListener, IAudioPlayer, View.OnFocusChangeListener {
> +public class AudioPlayerActivity extends Activity implements PlaybackServiceClient.AudioServiceConnectionListener, IAudioPlayer, View.OnFocusChangeListener {
>      public static final String TAG = "VLC/AudioPlayerActivity";
>  
>      public static final String MEDIA_LIST = "media_list";
>  
> -    private PlaybackServiceController mAudioController;
> +    private PlaybackServiceClient mAudioController;
>      private RecyclerView mRecyclerView;
>      private PlaylistAdapter mAdapter;
>      private LinearLayoutManager mLayoutManager;
> @@ -84,7 +84,7 @@ public class AudioPlayerActivity extends Activity implements PlaybackServiceCont
>          mAdapter = new PlaylistAdapter(this, mMediaList);
>          mRecyclerView.setAdapter(mAdapter);
>  
> -        mAudioController = PlaybackServiceController.getInstance();
> +        mAudioController = PlaybackServiceClient.getInstance();
>  
>          mAudioController.getRepeatType();
>          mTitleTv = (TextView)findViewById(R.id.media_title);
> -- 
> 2.1.4
> 
> _______________________________________________
> 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