[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdeconnect-android] src/org/kde/kdeconnect/Plugins/MprisPlugin: Make the player status a per-player
From:       Aleix Pol <null () kde ! org>
Date:       2017-11-30 23:39:36
Message-ID: E1eKYQa-0004bR-VM () code ! kde ! org
[Download RAW message or body]

Git commit cc8330a079a17ef99cdf9ba4feab4f88fe8465f8 by Aleix Pol, on behalf of \
Matthijs Tijink. Committed on 30/11/2017 at 23:36.
Pushed by apol into branch 'master'.

Make the player status a per-player object in the MPRIS plugin

Summary:
This directly fixes a couple of bugs (where the UI was not updated in all cases) and \
will allow different code parts to use different players without clashing with each \
other.

This is required for sensible behaviour while using the media control notification \
(which I plan to work on).

Reviewers: #kde_connect, thomasp, albertvaka

Reviewed By: #kde_connect, thomasp, albertvaka

Subscribers: albertvaka, apol, thomasp

Differential Revision: https://phabricator.kde.org/D8942

M  +82   -120  src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisActivity.java
M  +185  -128  src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisPlugin.java

https://commits.kde.org/kdeconnect-android/cc8330a079a17ef99cdf9ba4feab4f88fe8465f8

diff --git a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisActivity.java \
b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisActivity.java index \
                3fabd6e..4feb947 100644
--- a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisActivity.java
+++ b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisActivity.java
@@ -51,7 +51,7 @@ public class MprisActivity extends ActionBarActivity {
     private String deviceId;
     private final Handler positionSeekUpdateHandler = new Handler();
     private Runnable positionSeekUpdateRunnable = null;
-    private String targetPlayer = null;
+    private MprisPlugin.MprisPlayer targetPlayer = null;
 
     private static String milisToProgress(long milis) {
         int length = (int)(milis / 1000); //From milis to seconds
@@ -69,7 +69,7 @@ public class MprisActivity extends ActionBarActivity {
         text.append(seconds);
         return text.toString();
     }
-    protected void connectToPlugin() {
+    protected void connectToPlugin(final String targetPlayerName) {
 
         BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() \
{  @Override
@@ -81,6 +81,7 @@ public class MprisActivity extends ActionBarActivity {
                     Log.e("MprisActivity", "device has no mpris plugin!");
                     return;
                 }
+                targetPlayer = mpris.getPlayerStatus(targetPlayerName);
 
                 mpris.setPlayerStatusUpdatedHandler("activity", new Handler() {
                     @Override
@@ -88,49 +89,7 @@ public class MprisActivity extends ActionBarActivity {
                         runOnUiThread(new Runnable() {
                             @Override
                             public void run() {
-                                String song = mpris.getCurrentSong();
-
-                                TextView nowPlaying = (TextView) \
                findViewById(R.id.now_playing_textview);
-                                if (!nowPlaying.getText().toString().equals(song)) {
-                                    nowPlaying.setText(song);
-                                }
-
-                                //Hacks for Spotify because it reports incorrect \
                info about what it supports
-                                boolean isSpotify = \
                "spotify".equals(mpris.getPlayer().toLowerCase());
-
-                                if (mpris.getLength() > -1 && mpris.getPosition() > \
                -1 && !isSpotify) {
-                                    ((TextView) \
                findViewById(R.id.time_textview)).setText(milisToProgress(mpris.getLength()));
                
-                                    SeekBar positionSeek = \
                (SeekBar)findViewById(R.id.positionSeek);
-                                    positionSeek.setMax((int)(mpris.getLength()));
-                                    \
                positionSeek.setProgress((int)(mpris.getPosition()));
-                                    \
                findViewById(R.id.progress_slider).setVisibility(View.VISIBLE);
-                                } else {
-                                    \
                findViewById(R.id.progress_slider).setVisibility(View.GONE);
-                                }
-
-                                int volume = mpris.getVolume();
-                                ((SeekBar) \
                findViewById(R.id.volume_seek)).setProgress(volume);
-
-                                boolean isPlaying = mpris.isPlaying();
-                                if (isPlaying) {
-                                    ((ImageButton) \
                findViewById(R.id.play_button)).setImageResource(android.R.drawable.ic_media_pause);
                
-                                    \
findViewById(R.id.play_button).setVisibility(mpris.isPauseAllowed() ? View.VISIBLE : \
                View.GONE);
-                                } else {
-                                    ((ImageButton) \
                findViewById(R.id.play_button)).setImageResource(android.R.drawable.ic_media_play);
                
-                                    \
findViewById(R.id.play_button).setVisibility(mpris.isPlayAllowed() ? View.VISIBLE : \
                View.GONE);
-                                }
-
-                                if (isSpotify) {
-                                    \
                findViewById(R.id.volume_layout).setVisibility(View.INVISIBLE);
-                                    \
                findViewById(R.id.rew_button).setVisibility(View.GONE);
-                                    \
                findViewById(R.id.ff_button).setVisibility(View.GONE);
-                                } else {
-                                    \
                findViewById(R.id.volume_layout).setVisibility(View.VISIBLE);
-                                    \
findViewById(R.id.rew_button).setVisibility(mpris.isSeekAllowed() ? View.VISIBLE : \
                View.GONE);
-                                    \
findViewById(R.id.ff_button).setVisibility(mpris.isSeekAllowed() ? View.VISIBLE : \
                View.GONE);
-                                }
-                                \
findViewById(R.id.next_button).setVisibility(mpris.isGoNextAllowed() ? View.VISIBLE : \
                View.GONE);
-                                \
findViewById(R.id.prev_button).setVisibility(mpris.isGoPreviousAllowed() ? \
View.VISIBLE : View.GONE); +                                \
updatePlayerStatus(mpris);  }
                         });
                     }
@@ -169,36 +128,28 @@ public class MprisActivity extends ActionBarActivity {
                                         if (pos >= playerList.size()) return;
 
                                         String player = playerList.get(pos);
-                                        if (player.equals(mpris.getPlayer())) {
+                                        if (targetPlayer != null && \
                player.equals(targetPlayer.getPlayer())) {
                                             return; //Player hasn't actually changed
                                         }
-                                        mpris.setPlayer(player);
-
-                                        //Clear values from previous player
-                                        ((TextView) \
                findViewById(R.id.now_playing_textview)).setText("");
-                                        ((TextView) \
                findViewById(R.id.time_textview)).setText(milisToProgress(0));
-                                        \
((SeekBar)findViewById(R.id.positionSeek)).setMax(0); +                               \
targetPlayer = mpris.getPlayerStatus(player); +                                       \
updatePlayerStatus(mpris);  }
 
                                     @Override
                                     public void onNothingSelected(AdapterView<?> \
                arg0) {
-                                        mpris.setPlayer(null);
+                                        targetPlayer = null;
                                     }
                                 });
 
                                 if (targetPlayer != null) {
-                                    int targetIndex = \
adapter.getPosition(targetPlayer); +                                    int \
targetIndex = adapter.getPosition(targetPlayer.getPlayer());  if (targetIndex >= 0) {
                                         spinner.setSelection(targetIndex);
-                                    }
-                                    targetPlayer = null;
-                                } else {
-                                    // restore last selected player
-                                    int position = \
                adapter.getPosition(mpris.getPlayer());
-                                    if (position >= 0) {
-                                        spinner.setSelection(position);
+                                    } else {
+                                        targetPlayer = null;
                                     }
                                 }
+                                updatePlayerStatus(mpris);
                             }
                         });
                     }
@@ -212,7 +163,7 @@ public class MprisActivity extends ActionBarActivity {
     private final BaseLinkProvider.ConnectionReceiver connectionReceiver = new \
BaseLinkProvider.ConnectionReceiver() {  @Override
         public void onConnectionReceived(NetworkPackage identityPackage, BaseLink \
                link) {
-            connectToPlugin();
+            connectToPlugin(null);
         }
 
         @Override
@@ -232,14 +183,59 @@ public class MprisActivity extends ActionBarActivity {
         });
     }
 
+    private void updatePlayerStatus(MprisPlugin mpris) {
+        MprisPlugin.MprisPlayer playerStatus = targetPlayer;
+        if (playerStatus == null) {
+            //No player with that name found, just display "empty" data
+            playerStatus = mpris.getEmptyPlayer();
+        }
+        String song = playerStatus.getCurrentSong();
+
+        TextView nowPlaying = (TextView) findViewById(R.id.now_playing_textview);
+        if (!nowPlaying.getText().toString().equals(song)) {
+            nowPlaying.setText(song);
+        }
+
+        if (playerStatus.isSeekAllowed()) {
+            ((TextView) \
findViewById(R.id.time_textview)).setText(milisToProgress(playerStatus.getLength())); \
+            SeekBar positionSeek = (SeekBar)findViewById(R.id.positionSeek); +       \
positionSeek.setMax((int)(playerStatus.getLength())); +            \
positionSeek.setProgress((int)(playerStatus.getPosition())); +            \
findViewById(R.id.progress_slider).setVisibility(View.VISIBLE); +        } else {
+            findViewById(R.id.progress_slider).setVisibility(View.GONE);
+        }
+
+        int volume = playerStatus.getVolume();
+        ((SeekBar) findViewById(R.id.volume_seek)).setProgress(volume);
+
+        boolean isPlaying = playerStatus.isPlaying();
+        if (isPlaying) {
+            ((ImageButton) \
findViewById(R.id.play_button)).setImageResource(android.R.drawable.ic_media_pause); \
+            findViewById(R.id.play_button).setVisibility(playerStatus.isPauseAllowed() \
? View.VISIBLE : View.GONE); +        } else {
+            ((ImageButton) \
findViewById(R.id.play_button)).setImageResource(android.R.drawable.ic_media_play); + \
findViewById(R.id.play_button).setVisibility(playerStatus.isPlayAllowed() ? \
View.VISIBLE : View.GONE); +        }
+
+        findViewById(R.id.volume_layout).setVisibility(playerStatus.isSetVolumeAllowed() \
? View.VISIBLE : View.INVISIBLE); +        \
findViewById(R.id.rew_button).setVisibility(playerStatus.isSeekAllowed() ? \
View.VISIBLE : View.GONE); +        \
findViewById(R.id.ff_button).setVisibility(playerStatus.isSeekAllowed() ? \
View.VISIBLE : View.GONE); +        \
findViewById(R.id.next_button).setVisibility(playerStatus.isGoNextAllowed() ? \
View.VISIBLE : View.GONE); +        \
findViewById(R.id.prev_button).setVisibility(playerStatus.isGoPreviousAllowed() ? \
View.VISIBLE : View.GONE); +    }
+
     /**
      * Change current volume with provided step.
      *
-     * @param mpris multimedia controller
      * @param step  step size volume change
      */
-    private void updateVolume(MprisPlugin mpris, int step) {
-        final int currentVolume = mpris.getVolume();
+    private void updateVolume(int step) {
+        if (targetPlayer == null) {
+            return;
+        }
+        final int currentVolume = targetPlayer.getVolume();
+
         if(currentVolume < 100 || currentVolume > 0) {
             int newVolume = currentVolume + step;
             if(newVolume > 100) {
@@ -247,7 +243,7 @@ public class MprisActivity extends ActionBarActivity {
             } else if (newVolume <0 ) {
                 newVolume = 0;
             }
-            mpris.setVolume(newVolume);
+            targetPlayer.setVolume(newVolume);
         }
     }
 
@@ -255,26 +251,10 @@ public class MprisActivity extends ActionBarActivity {
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
             case KeyEvent.KEYCODE_VOLUME_UP:
-                BackgroundService.RunCommand(MprisActivity.this, new \
                BackgroundService.InstanceCallback() {
-                    @Override
-                    public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                        if (mpris == null) return;
-                        updateVolume(mpris, 5);
-                    }
-                });
+                updateVolume(5);
                 return true;
             case KeyEvent.KEYCODE_VOLUME_DOWN:
-                BackgroundService.RunCommand(MprisActivity.this, new \
                BackgroundService.InstanceCallback() {
-                    @Override
-                    public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                        if (mpris == null) return;
-                        updateVolume(mpris, -5);
-                    }
-                });
+                updateVolume(-5);
                 return true;
             default:
                 return super.onKeyDown(keyCode, event);
@@ -298,7 +278,7 @@ public class MprisActivity extends ActionBarActivity {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.mpris_control);
 
-        targetPlayer = getIntent().getStringExtra("player");
+        final String targetPlayerName = getIntent().getStringExtra("player");
         getIntent().removeExtra("player");
         deviceId = getIntent().getStringExtra("deviceId");
 
@@ -313,7 +293,7 @@ public class MprisActivity extends ActionBarActivity {
                 service.addConnectionListener(connectionReceiver);
             }
         });
-        connectToPlugin();
+        connectToPlugin(targetPlayerName);
 
         findViewById(R.id.play_button).setOnClickListener(new View.OnClickListener() \
{  @Override
@@ -321,10 +301,8 @@ public class MprisActivity extends ActionBarActivity {
                 BackgroundService.RunCommand(MprisActivity.this, new \
BackgroundService.InstanceCallback() {  @Override
                     public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                        if (mpris == null) return;
-                        mpris.sendAction("PlayPause");
+                        if (targetPlayer == null) return;
+                        targetPlayer.playPause();
                     }
                 });
             }
@@ -336,10 +314,8 @@ public class MprisActivity extends ActionBarActivity {
                 BackgroundService.RunCommand(MprisActivity.this, new \
BackgroundService.InstanceCallback() {  @Override
                     public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                        if (mpris == null) return;
-                        mpris.sendAction("Previous");
+                        if (targetPlayer == null) return;
+                        targetPlayer.previous();
                     }
                 });
             }
@@ -351,10 +327,8 @@ public class MprisActivity extends ActionBarActivity {
                 BackgroundService.RunCommand(MprisActivity.this, new \
BackgroundService.InstanceCallback() {  @Override
                     public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                        if (mpris == null) return;
-                        mpris.Seek(interval_time * -1);
+                        if (targetPlayer == null) return;
+                        targetPlayer.seek(interval_time * -1);
                     }
                 });
             }
@@ -366,10 +340,8 @@ public class MprisActivity extends ActionBarActivity {
                 BackgroundService.RunCommand(MprisActivity.this, new \
BackgroundService.InstanceCallback() {  @Override
                     public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                        if (mpris == null) return;
-                        mpris.Seek(interval_time);
+                        if (targetPlayer == null) return;
+                        targetPlayer.seek(interval_time);
                     }
                 });
             }
@@ -381,10 +353,8 @@ public class MprisActivity extends ActionBarActivity {
                 BackgroundService.RunCommand(MprisActivity.this, new \
BackgroundService.InstanceCallback() {  @Override
                     public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                        if (mpris == null) return;
-                        mpris.sendAction("Next");
+                        if (targetPlayer == null) return;
+                        targetPlayer.next();
                     }
                 });
             }
@@ -404,10 +374,8 @@ public class MprisActivity extends ActionBarActivity {
                 BackgroundService.RunCommand(MprisActivity.this, new \
BackgroundService.InstanceCallback() {  @Override
                     public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                        if (mpris == null) return;
-                        mpris.setVolume(seekBar.getProgress());
+                        if (targetPlayer == null) return;
+                        targetPlayer.setVolume(seekBar.getProgress());
                     }
                 });
             }
@@ -421,12 +389,8 @@ public class MprisActivity extends ActionBarActivity {
                 BackgroundService.RunCommand(MprisActivity.this, new \
BackgroundService.InstanceCallback() {  @Override
                     public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        if (device != null) {
-                            MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                            if (mpris != null) {
-                                positionSeek.setProgress((int) \
                (mpris.getPosition()));
-                            }
+                        if (targetPlayer != null) {
+                            positionSeek.setProgress((int) \
(targetPlayer.getPosition()));  }
                         \
                positionSeekUpdateHandler.removeCallbacks(positionSeekUpdateRunnable);
                
                         \
positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 1000); @@ -453,10 \
                +417,8 @@ public class MprisActivity extends ActionBarActivity {
                 BackgroundService.RunCommand(MprisActivity.this, new \
BackgroundService.InstanceCallback() {  @Override
                     public void onServiceStart(BackgroundService service) {
-                        Device device = service.getDevice(deviceId);
-                        MprisPlugin mpris = device.getPlugin(MprisPlugin.class);
-                        if (mpris != null) {
-                            mpris.setPosition(seekBar.getProgress());
+                        if (targetPlayer != null) {
+                            targetPlayer.setPosition(seekBar.getProgress());
                         }
                         \
positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 200);  }
diff --git a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisPlugin.java \
b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisPlugin.java index 433bc4a..23403a8 \
                100644
--- a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisPlugin.java
+++ b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisPlugin.java
@@ -33,29 +33,146 @@ import org.kde.kdeconnect.Plugins.Plugin;
 import org.kde.kdeconnect_tp.R;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 
 public class MprisPlugin extends Plugin {
+    public class MprisPlayer {
+        private String player = "";
+        private boolean playing = false;
+        private String currentSong = "";
+        private int volume = 50;
+        private long length = -1;
+        private long lastPosition = 0;
+        private long lastPositionTime;
+        private boolean playAllowed = true;
+        private boolean pauseAllowed = true;
+        private boolean goNextAllowed = true;
+        private boolean goPreviousAllowed = true;
+        private boolean seekAllowed = true;
+
+        public MprisPlayer() {
+            lastPositionTime = System.currentTimeMillis();
+        }
+
+        public String getCurrentSong() {
+            return currentSong;
+        }
+
+        public String getPlayer() {
+            return player;
+        }
+
+        private boolean isSpotify() {
+            return getPlayer().toLowerCase().equals("spotify");
+        }
+
+        public int getVolume() {
+            return volume;
+        }
+
+        public long getLength(){ return length; }
+
+        public boolean isPlaying() {
+            return playing;
+        }
+
+        public boolean isPlayAllowed() {
+            return playAllowed;
+        }
+
+        public boolean isPauseAllowed() {
+            return pauseAllowed;
+        }
+
+        public boolean isGoNextAllowed() {
+            return goNextAllowed;
+        }
+
+        public boolean isGoPreviousAllowed() {
+            return goPreviousAllowed;
+        }
+
+        public boolean isSeekAllowed() {
+            return seekAllowed && getLength() >= 0 && getPosition() >= 0 && \
!isSpotify(); +        }
+
+        public boolean isSetVolumeAllowed() {
+            return !isSpotify();
+        }
+
+        public long getPosition(){
+            if(playing) {
+                return lastPosition + (System.currentTimeMillis() - \
lastPositionTime); +            } else {
+                return lastPosition;
+            }
+        }
+
+        public void playPause() {
+            if (isPauseAllowed() || isPlayAllowed()) {
+                MprisPlugin.this.sendCommand(getPlayer(), "action", "PlayPause");
+            }
+        }
+
+        public void play() {
+            if (isPlayAllowed()) {
+                MprisPlugin.this.sendCommand(getPlayer(), "action", "Play");
+            }
+        }
+
+        public void pause() {
+            if (isPauseAllowed()) {
+                MprisPlugin.this.sendCommand(getPlayer(), "action", "Pause");
+            }
+        }
+
+        public void stop() {
+            MprisPlugin.this.sendCommand(getPlayer(), "action", "Stop");
+        }
+
+        public void previous() {
+            if (isGoPreviousAllowed()) {
+                MprisPlugin.this.sendCommand(getPlayer(), "action", "Previous");
+            }
+        }
+
+        public void next() {
+            if (isGoNextAllowed()) {
+                MprisPlugin.this.sendCommand(getPlayer(), "action", "Next");
+            }
+        }
+
+        public void setVolume(int volume) {
+            if (isSetVolumeAllowed()) {
+                MprisPlugin.this.sendCommand(getPlayer(), "setVolume", volume);
+            }
+        }
+
+        public void setPosition(int position) {
+            if (isSeekAllowed()) {
+                MprisPlugin.this.sendCommand(getPlayer(), "SetPosition", position);
+
+                lastPosition = position;
+                lastPositionTime = System.currentTimeMillis();
+            }
+        }
+
+        public void seek(int offset) {
+            if (isSeekAllowed()) {
+                MprisPlugin.this.sendCommand(getPlayer(), "Seek", offset);
+            }
+        }
+    }
 
     public final static String PACKAGE_TYPE_MPRIS = "kdeconnect.mpris";
     public final static String PACKAGE_TYPE_MPRIS_REQUEST = \
"kdeconnect.mpris.request";  
-    private String player = "";
-    private boolean playing = false;
-    private String currentSong = "";
-    private int volume = 50;
-    private long length = -1;
-    private long lastPosition;
-    private long lastPositionTime;
-    private boolean playAllowed = true;
-    private boolean pauseAllowed = true;
-    private boolean goNextAllowed = true;
-    private boolean goPreviousAllowed = true;
-    private boolean seekAllowed = true;
+    private HashMap<String, MprisPlayer> players = new HashMap<>();
     private HashMap<String,Handler> playerStatusUpdated = new HashMap<>();
 
-    private List<String> playerList = new ArrayList<>();
     private HashMap<String,Handler> playerListUpdated = new HashMap<>();
 
     @Override
@@ -81,66 +198,46 @@ public class MprisPlugin extends Plugin {
     @Override
     public boolean onCreate() {
         requestPlayerList();
-        lastPositionTime = System.currentTimeMillis();
         return true;
     }
 
     @Override
     public void onDestroy() {
-        playerList.clear();
-    }
-
-    public void sendAction(String player, String action) {
-        NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MPRIS_REQUEST);
-        np.set("player", player);
-        np.set("action", action);
-        device.sendPackage(np);
-    }
-    public void sendAction(String action) {
-        sendAction(player, action);
+        players.clear();
     }
 
-    public void setVolume(int volume) {
+    private void sendCommand(String player, String method, String value) {
         NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MPRIS_REQUEST);
         np.set("player", player);
-        np.set("setVolume",volume);
+        np.set(method, value);
         device.sendPackage(np);
     }
 
-    public void setPosition(int position) {
+    private void sendCommand(String player, String method, int value) {
         NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MPRIS_REQUEST);
         np.set("player", player);
-        np.set("SetPosition", position);
-        device.sendPackage(np);
-        this.lastPosition = position;
-        this.lastPositionTime = System.currentTimeMillis();
-    }
-
-    public void Seek(int offset) {
-        NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MPRIS_REQUEST);
-        np.set("player", player);
-        np.set("Seek", offset);
+        np.set(method, value);
         device.sendPackage(np);
     }
 
     @Override
     public boolean onPackageReceived(NetworkPackage np) {
-
         if (np.has("nowPlaying") || np.has("volume") || np.has("isPlaying") || \
                np.has("length") || np.has("pos")) {
-            if (np.getString("player").equals(player)) {
-                currentSong = np.getString("nowPlaying", currentSong);
-                volume = np.getInt("volume", volume);
-                length = np.getLong("length", length);
+            MprisPlayer playerStatus = players.get(np.getString("player"));
+            if (playerStatus != null) {
+                playerStatus.currentSong = np.getString("nowPlaying", \
playerStatus.currentSong); +                playerStatus.volume = np.getInt("volume", \
playerStatus.volume); +                playerStatus.length = np.getLong("length", \
playerStatus.length);  if(np.has("pos")){
-                    lastPosition = np.getLong("pos", lastPosition);
-                    lastPositionTime = System.currentTimeMillis();
+                    playerStatus.lastPosition = np.getLong("pos", \
playerStatus.lastPosition); +                    playerStatus.lastPositionTime = \
System.currentTimeMillis();  }
-                playing = np.getBoolean("isPlaying", playing);
-                playAllowed = np.getBoolean("canPlay", playAllowed);
-                pauseAllowed = np.getBoolean("canPause", pauseAllowed);
-                goNextAllowed = np.getBoolean("canGoNext", goNextAllowed);
-                goPreviousAllowed = np.getBoolean("canGoPrevious", \
                goPreviousAllowed);
-                seekAllowed = np.getBoolean("canSeek", seekAllowed);
+                playerStatus.playing = np.getBoolean("isPlaying", \
playerStatus.playing); +                playerStatus.playAllowed = \
np.getBoolean("canPlay", playerStatus.playAllowed); +                \
playerStatus.pauseAllowed = np.getBoolean("canPause", playerStatus.pauseAllowed); +   \
playerStatus.goNextAllowed = np.getBoolean("canGoNext", playerStatus.goNextAllowed); \
+                playerStatus.goPreviousAllowed = np.getBoolean("canGoPrevious", \
playerStatus.goPreviousAllowed); +                playerStatus.seekAllowed = \
np.getBoolean("canSeek", playerStatus.seekAllowed);  for (String key : \
playerStatusUpdated.keySet()) {  try {
                         playerStatusUpdated.get(key).dispatchMessage(new Message());
@@ -155,18 +252,37 @@ public class MprisPlugin extends Plugin {
 
         List<String> newPlayerList = np.getStringList("playerList");
         if (newPlayerList != null) {
-            boolean equals = false;
-            if (newPlayerList.size() == playerList.size()) {
-                equals = true;
-                for (int i=0; i<newPlayerList.size(); i++) {
-                    if (!newPlayerList.get(i).equals(playerList.get(i))) {
-                        equals = false;
+            boolean equals = true;
+            for (String newPlayer : newPlayerList) {
+                if (!players.containsKey(newPlayer)) {
+                    equals = false;
+
+                    MprisPlayer player = new MprisPlayer();
+                    player.player = newPlayer;
+                    players.put(newPlayer, player);
+
+                    //Immediately ask for the data of this player
+                    requestPlayerStatus(newPlayer);
+                }
+            }
+            Iterator<HashMap.Entry<String, MprisPlayer>> iter = \
players.entrySet().iterator(); +            while (iter.hasNext()) {
+                String oldPlayer = iter.next().getKey();
+
+                boolean found = false;
+                for (String newPlayer : newPlayerList) {
+                    if (newPlayer.equals(oldPlayer)) {
+                        found = true;
                         break;
                     }
                 }
+
+                if (!found) {
+                    iter.remove();
+                    equals = false;
+                }
             }
             if (!equals) {
-                playerList = newPlayerList;
                 for (String key : playerListUpdated.keySet()) {
                     try {
                         playerListUpdated.get(key).dispatchMessage(new Message());
@@ -198,8 +314,8 @@ public class MprisPlugin extends Plugin {
         h.dispatchMessage(new Message());
 
         //Get the status if this is the first handler we have
-        if (playerListUpdated.size() == 1) {
-            requestPlayerStatus();
+        if (playerListUpdated.size() == 1 && !players.isEmpty()) {
+            requestPlayerStatus(getPlayerList().get(0));
         }
     }
 
@@ -214,77 +330,18 @@ public class MprisPlugin extends Plugin {
         }
     }
 
-    public void setPlayer(String player) {
-        if (player == null || player.equals(this.player)) return;
-        this.player = player;
-        currentSong = "";
-        volume = 50;
-        playing = false;
-        playAllowed = true;
-        pauseAllowed = true;
-        goNextAllowed = true;
-        goPreviousAllowed = true;
-        seekAllowed = true;
-        for (String key : playerStatusUpdated.keySet()) {
-            try {
-                playerStatusUpdated.get(key).dispatchMessage(new Message());
-            } catch(Exception e) {
-                e.printStackTrace();
-                Log.e("MprisControl","Exception");
-                playerStatusUpdated.remove(key);
-            }
-        }
-        requestPlayerStatus();
-    }
-
     public List<String> getPlayerList() {
-        return playerList;
-    }
-
-    public String getCurrentSong() {
-        return currentSong;
-    }
-
-    public String getPlayer() {
-        return player;
-    }
-
-    public int getVolume() {
-        return volume;
-    }
-
-    public long getLength(){ return length; }
-
-    public boolean isPlaying() {
-        return playing;
-    }
-
-    public boolean isPlayAllowed() {
-        return playAllowed;
-    }
-
-    public boolean isPauseAllowed() {
-        return pauseAllowed;
+        List<String> playerlist = new ArrayList<>(players.keySet());
+        Collections.sort(playerlist);
+        return playerlist;
     }
 
-    public boolean isGoNextAllowed() {
-        return goNextAllowed;
+    public MprisPlayer getPlayerStatus(String player) {
+        return players.get(player);
     }
 
-    public boolean isGoPreviousAllowed() {
-        return goPreviousAllowed;
-    }
-
-    public boolean isSeekAllowed() {
-        return seekAllowed;
-    }
-
-    public long getPosition(){
-        if(playing) {
-            return lastPosition + (System.currentTimeMillis() - lastPositionTime);
-        } else {
-            return lastPosition;
-        }
+    public MprisPlayer getEmptyPlayer() {
+        return new MprisPlayer();
     }
 
     private void requestPlayerList() {
@@ -293,9 +350,9 @@ public class MprisPlugin extends Plugin {
         device.sendPackage(np);
     }
 
-    private void requestPlayerStatus() {
+    private void requestPlayerStatus(String player) {
         NetworkPackage np = new NetworkPackage(PACKAGE_TYPE_MPRIS_REQUEST);
-        np.set("player",player);
+        np.set("player", player);
         np.set("requestNowPlaying",true);
         np.set("requestVolume",true);
         device.sendPackage(np);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic