2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-31 22:25:08 +00:00

Replace Handlers by lightweight callbacks

This commit is contained in:
Albert Vaca Cintora
2023-03-22 20:52:39 +01:00
committed by Albert Vaca Cintora
parent b8cbd2b382
commit 118e045990
3 changed files with 69 additions and 86 deletions

View File

@@ -14,9 +14,6 @@ import android.content.SharedPreferences;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.media.AudioManager; import android.media.AudioManager;
import android.os.Build; import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.service.notification.StatusBarNotification; import android.service.notification.StatusBarNotification;
import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.MediaMetadataCompat;
@@ -77,13 +74,6 @@ public class MprisMediaSession implements
private Context context; private Context context;
private MediaSessionCompat mediaSession; private MediaSessionCompat mediaSession;
//Callback for mpris plugin updates
private final Handler mediaNotificationHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
updateMediaNotification();
}
};
//Callback for control via the media session API //Callback for control via the media session API
private final MediaSessionCompat.Callback mediaSessionCallback = new MediaSessionCompat.Callback() { private final MediaSessionCompat.Callback mediaSessionCallback = new MediaSessionCompat.Callback() {
@Override @Override
@@ -134,8 +124,8 @@ public class MprisMediaSession implements
context = _context; context = _context;
mprisDevices.add(device); mprisDevices.add(device);
mpris.setPlayerListUpdatedHandler("media_notification", mediaNotificationHandler); mpris.setPlayerListUpdatedHandler("media_notification", this::updateMediaNotification);
mpris.setPlayerStatusUpdatedHandler("media_notification", mediaNotificationHandler); mpris.setPlayerStatusUpdatedHandler("media_notification", this::updateMediaNotification);
NotificationReceiver.RunCommand(context, service -> { NotificationReceiver.RunCommand(context, service -> {

View File

@@ -9,7 +9,6 @@ import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -213,80 +212,71 @@ public class MprisNowPlayingFragment extends Fragment implements VolumeKeyListen
BackgroundService.RunWithPlugin(requireContext(), deviceId, MprisPlugin.class, mpris -> { BackgroundService.RunWithPlugin(requireContext(), deviceId, MprisPlugin.class, mpris -> {
targetPlayer = mpris.getPlayerStatus(targetPlayerName); targetPlayer = mpris.getPlayerStatus(targetPlayerName);
mpris.setPlayerStatusUpdatedHandler("activity", new Handler() { mpris.setPlayerStatusUpdatedHandler("activity", () -> requireActivity().runOnUiThread(() -> updatePlayerStatus(mpris)));
@Override mpris.setPlayerListUpdatedHandler("activity", () -> {
public void handleMessage(Message msg) { final List<String> playerList = mpris.getPlayerList();
requireActivity().runOnUiThread(() -> updatePlayerStatus(mpris)); final ArrayAdapter<String> adapter = new ArrayAdapter<>(requireContext(),
} android.R.layout.simple_spinner_item,
}); playerList.toArray(ArrayUtils.EMPTY_STRING_ARRAY)
);
mpris.setPlayerListUpdatedHandler("activity", new Handler() { adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
@Override requireActivity().runOnUiThread(() -> {
public void handleMessage(Message msg) { mprisControlBinding.playerSpinner.setAdapter(adapter);
final List<String> playerList = mpris.getPlayerList();
final ArrayAdapter<String> adapter = new ArrayAdapter<>(requireContext(),
android.R.layout.simple_spinner_item,
playerList.toArray(ArrayUtils.EMPTY_STRING_ARRAY)
);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); if (playerList.isEmpty()) {
requireActivity().runOnUiThread(() -> { mprisControlBinding.noPlayers.setVisibility(View.VISIBLE);
mprisControlBinding.playerSpinner.setAdapter(adapter); mprisControlBinding.playerSpinner.setVisibility(View.GONE);
mprisControlBinding.nowPlayingTextview.setText("");
} else {
mprisControlBinding.noPlayers.setVisibility(View.GONE);
mprisControlBinding.playerSpinner.setVisibility(View.VISIBLE);
}
if (playerList.isEmpty()) { mprisControlBinding.playerSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
mprisControlBinding.noPlayers.setVisibility(View.VISIBLE); @Override
mprisControlBinding.playerSpinner.setVisibility(View.GONE); public void onItemSelected(AdapterView<?> arg0, View arg1, int pos, long id) {
mprisControlBinding.nowPlayingTextview.setText("");
} else {
mprisControlBinding.noPlayers.setVisibility(View.GONE);
mprisControlBinding.playerSpinner.setVisibility(View.VISIBLE);
}
mprisControlBinding.playerSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { if (pos >= playerList.size()) return;
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int pos, long id) {
if (pos >= playerList.size()) return; String player = playerList.get(pos);
if (targetPlayer != null && player.equals(targetPlayer.getPlayer())) {
String player = playerList.get(pos); return; //Player hasn't actually changed
if (targetPlayer != null && player.equals(targetPlayer.getPlayer())) {
return; //Player hasn't actually changed
}
targetPlayer = mpris.getPlayerStatus(player);
updatePlayerStatus(mpris);
if (targetPlayer != null && targetPlayer.isPlaying()) {
MprisMediaSession.getInstance().playerSelected(targetPlayer);
}
} }
targetPlayer = mpris.getPlayerStatus(player);
updatePlayerStatus(mpris);
@Override if (targetPlayer != null && targetPlayer.isPlaying()) {
public void onNothingSelected(AdapterView<?> arg0) { MprisMediaSession.getInstance().playerSelected(targetPlayer);
targetPlayer = null;
}
});
if (targetPlayer == null) {
//If no player is selected, try to select a playing player
targetPlayer = mpris.getPlayingPlayer();
}
//Try to select the specified player
if (targetPlayer != null) {
int targetIndex = adapter.getPosition(targetPlayer.getPlayer());
if (targetIndex >= 0) {
mprisControlBinding.playerSpinner.setSelection(targetIndex);
} else {
targetPlayer = null;
} }
} }
//If no player selected, select the first one (if any)
if (targetPlayer == null && !playerList.isEmpty()) { @Override
targetPlayer = mpris.getPlayerStatus(playerList.get(0)); public void onNothingSelected(AdapterView<?> arg0) {
mprisControlBinding.playerSpinner.setSelection(0); targetPlayer = null;
} }
updatePlayerStatus(mpris);
}); });
}
if (targetPlayer == null) {
//If no player is selected, try to select a playing player
targetPlayer = mpris.getPlayingPlayer();
}
//Try to select the specified player
if (targetPlayer != null) {
int targetIndex = adapter.getPosition(targetPlayer.getPlayer());
if (targetIndex >= 0) {
mprisControlBinding.playerSpinner.setSelection(targetIndex);
} else {
targetPlayer = null;
}
}
//If no player selected, select the first one (if any)
if (targetPlayer == null && !playerList.isEmpty()) {
targetPlayer = mpris.getPlayerStatus(playerList.get(0));
mprisControlBinding.playerSpinner.setSelection(0);
}
updatePlayerStatus(mpris);
});
}); });
}); });
} }

View File

@@ -227,14 +227,18 @@ public class MprisPlugin extends Plugin {
} }
} }
public interface Callback {
void callback();
}
public final static String DEVICE_ID_KEY = "deviceId"; public final static String DEVICE_ID_KEY = "deviceId";
private final static String PACKET_TYPE_MPRIS = "kdeconnect.mpris"; private final static String PACKET_TYPE_MPRIS = "kdeconnect.mpris";
private final static String PACKET_TYPE_MPRIS_REQUEST = "kdeconnect.mpris.request"; private final static String PACKET_TYPE_MPRIS_REQUEST = "kdeconnect.mpris.request";
private final ConcurrentHashMap<String, MprisPlayer> players = new ConcurrentHashMap<>(); private final ConcurrentHashMap<String, MprisPlayer> players = new ConcurrentHashMap<>();
private boolean supportAlbumArtPayload = false; private boolean supportAlbumArtPayload = false;
private final ConcurrentHashMap<String, Handler> playerStatusUpdated = new ConcurrentHashMap<>(); private final ConcurrentHashMap<String, Callback> playerStatusUpdated = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Handler> playerListUpdated = new ConcurrentHashMap<>(); private final ConcurrentHashMap<String, Callback> playerListUpdated = new ConcurrentHashMap<>();
@Override @Override
public String getDisplayName() { public String getDisplayName() {
@@ -349,7 +353,7 @@ public class MprisPlugin extends Plugin {
for (String key : playerStatusUpdated.keySet()) { for (String key : playerStatusUpdated.keySet()) {
try { try {
playerStatusUpdated.get(key).dispatchMessage(new Message()); playerStatusUpdated.get(key).callback();
} catch (Exception e) { } catch (Exception e) {
Log.e("MprisControl", "Exception", e); Log.e("MprisControl", "Exception", e);
playerStatusUpdated.remove(key); playerStatusUpdated.remove(key);
@@ -390,7 +394,7 @@ public class MprisPlugin extends Plugin {
if (!equals) { if (!equals) {
for (String key : playerListUpdated.keySet()) { for (String key : playerListUpdated.keySet()) {
try { try {
playerListUpdated.get(key).dispatchMessage(new Message()); playerListUpdated.get(key).callback();
} catch (Exception e) { } catch (Exception e) {
Log.e("MprisControl", "Exception", e); Log.e("MprisControl", "Exception", e);
playerListUpdated.remove(key); playerListUpdated.remove(key);
@@ -412,20 +416,19 @@ public class MprisPlugin extends Plugin {
return new String[]{PACKET_TYPE_MPRIS_REQUEST}; return new String[]{PACKET_TYPE_MPRIS_REQUEST};
} }
public void setPlayerStatusUpdatedHandler(String id, Handler h) { public void setPlayerStatusUpdatedHandler(String id, Callback h) {
playerStatusUpdated.put(id, h); playerStatusUpdated.put(id, h);
h.callback();
h.dispatchMessage(new Message());
} }
public void removePlayerStatusUpdatedHandler(String id) { public void removePlayerStatusUpdatedHandler(String id) {
playerStatusUpdated.remove(id); playerStatusUpdated.remove(id);
} }
public void setPlayerListUpdatedHandler(String id, Handler h) { public void setPlayerListUpdatedHandler(String id, Callback h) {
playerListUpdated.put(id, h); playerListUpdated.put(id, h);
h.dispatchMessage(new Message()); h.callback();
} }
public void removePlayerListUpdatedHandler(String id) { public void removePlayerListUpdatedHandler(String id) {
@@ -500,7 +503,7 @@ public class MprisPlugin extends Plugin {
if (players.values().stream().anyMatch(player -> url.equals(player.albumArtUrl))) { if (players.values().stream().anyMatch(player -> url.equals(player.albumArtUrl))) {
for (String key : playerStatusUpdated.keySet()) { for (String key : playerStatusUpdated.keySet()) {
try { try {
playerStatusUpdated.get(key).dispatchMessage(new Message()); playerStatusUpdated.get(key).callback();
} catch (Exception e) { } catch (Exception e) {
Log.e("MprisControl", "Exception", e); Log.e("MprisControl", "Exception", e);
playerStatusUpdated.remove(key); playerStatusUpdated.remove(key);