From 7b208aaad9c8727ae9d92323db8d9b0b82a010bd Mon Sep 17 00:00:00 2001 From: Benjamin Loison Date: Fri, 6 Mar 2026 20:40:38 +0100 Subject: [PATCH 1/2] Add NotificationListAPI medias --- .../termux/api/apis/NotificationListAPI.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/api/apis/NotificationListAPI.java b/app/src/main/java/com/termux/api/apis/NotificationListAPI.java index 388e3520..d0d5d4e1 100644 --- a/app/src/main/java/com/termux/api/apis/NotificationListAPI.java +++ b/app/src/main/java/com/termux/api/apis/NotificationListAPI.java @@ -15,6 +15,12 @@ import com.termux.api.util.ResultReturner.ResultJsonWriter; import com.termux.shared.logger.Logger; +import android.media.session.MediaSessionManager; +import android.media.MediaMetadata; +import android.media.session.PlaybackState; +import android.media.session.MediaController; +import java.util.List; +import android.content.ComponentName; public class NotificationListAPI { @@ -26,7 +32,11 @@ public static void onReceive(TermuxApiReceiver apiReceiver, final Context contex ResultReturner.returnData(apiReceiver, intent, new ResultJsonWriter() { @Override public void writeJson(JsonWriter out) throws Exception { - listNotifications(context, out); + if (!intent.hasExtra("media")) { + listNotifications(context, out); + } else { + listMedias(context, out); + } } }); } @@ -93,7 +103,34 @@ static void listNotifications(Context context, JsonWriter out) throws Exception out.endArray(); } + static void listMedias(Context context, JsonWriter out) throws Exception { + MediaSessionManager mediaSessionManager = (MediaSessionManager)context.getSystemService(Context.MEDIA_SESSION_SERVICE); + + ComponentName listenerComponent = new ComponentName(NotificationService.get(), NotificationService.class); + List controllers = mediaSessionManager.getActiveSessions(listenerComponent); + + out.beginArray(); + for (MediaController controller : controllers) { + MediaMetadata metadata = controller.getMetadata(); + PlaybackState state = controller.getPlaybackState(); + + if (metadata != null) { + out.beginObject() + .name("packageName").value(controller.getPackageName()) + .name("state").value(state.getState()) + .name("title").value(metadata.getString(MediaMetadata.METADATA_KEY_TITLE)) + .name("artist").value(metadata.getString(MediaMetadata.METADATA_KEY_ARTIST)) + .name("duration").value(metadata.getLong(MediaMetadata.METADATA_KEY_DURATION)) + .name("bufferedPosition").value(state.getBufferedPosition()) + .name("lastPositionUpdateTime").value(state.getLastPositionUpdateTime()) + .name("playbackSpeed").value(state.getPlaybackSpeed()) + .name("position").value(state.getPosition()); + out.endObject(); + } + } + out.endArray(); + } public static class NotificationService extends NotificationListenerService { static NotificationService _this; From a9e6f73f0858f8aa841d082e59f7fc8c9c657261 Mon Sep 17 00:00:00 2001 From: Benjamin Loison Date: Fri, 6 Mar 2026 22:39:43 +0100 Subject: [PATCH 2/2] Return TermuxNotificationList media state as String --- .../termux/api/apis/NotificationListAPI.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/api/apis/NotificationListAPI.java b/app/src/main/java/com/termux/api/apis/NotificationListAPI.java index d0d5d4e1..4428efab 100644 --- a/app/src/main/java/com/termux/api/apis/NotificationListAPI.java +++ b/app/src/main/java/com/termux/api/apis/NotificationListAPI.java @@ -118,7 +118,7 @@ static void listMedias(Context context, JsonWriter out) throws Exception { if (metadata != null) { out.beginObject() .name("packageName").value(controller.getPackageName()) - .name("state").value(state.getState()) + .name("state").value(getStateString(state.getState())) .name("title").value(metadata.getString(MediaMetadata.METADATA_KEY_TITLE)) .name("artist").value(metadata.getString(MediaMetadata.METADATA_KEY_ARTIST)) .name("duration").value(metadata.getLong(MediaMetadata.METADATA_KEY_DURATION)) @@ -132,6 +132,37 @@ static void listMedias(Context context, JsonWriter out) throws Exception { out.endArray(); } + static String getStateString(int state) { + switch(state) { + case PlaybackState.STATE_BUFFERING: + return "buffering"; + case PlaybackState.STATE_CONNECTING: + return "connecting"; + case PlaybackState.STATE_ERROR: + return "error"; + case PlaybackState.STATE_FAST_FORWARDING: + return "fast_forwarding"; + case PlaybackState.STATE_NONE: + return "none"; + case PlaybackState.STATE_PAUSED: + return "paused"; + case PlaybackState.STATE_PLAYING: + return "playing"; + case PlaybackState.STATE_REWINDING: + return "rewinding"; + case PlaybackState.STATE_SKIPPING_TO_NEXT: + return "skipping_to_next"; + case PlaybackState.STATE_SKIPPING_TO_PREVIOUS: + return "skipping_to_previous"; + case PlaybackState.STATE_SKIPPING_TO_QUEUE_ITEM: + return "skipping_to_queue_item"; + case PlaybackState.STATE_STOPPED: + return "stopped"; + default: + return "unknown"; + } + } + public static class NotificationService extends NotificationListenerService { static NotificationService _this;