From 4a163b01164de0f6e9a27bc079d9d22e1b96ca11 Mon Sep 17 00:00:00 2001 From: Swapnil Tripathi Date: Fri, 6 Aug 2021 15:08:57 +0530 Subject: [PATCH] Implemented native call to the android MediaSession. --- android/AndroidManifest.xml | 2 +- android/src/org/kde/kasts/MediaService.java | 27 ++++++++++++++++++ src/CMakeLists.txt | 1 + src/audiomanager.cpp | 3 ++ src/mediasessionclient.cpp | 31 +++++++++++++++++++-- src/mediasessionclient.h | 14 ++++++++-- 6 files changed, 73 insertions(+), 5 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 4dde538f..6b8960b4 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -7,7 +7,7 @@ diff --git a/android/src/org/kde/kasts/MediaService.java b/android/src/org/kde/kasts/MediaService.java index 840c6005..69a8169c 100644 --- a/android/src/org/kde/kasts/MediaService.java +++ b/android/src/org/kde/kasts/MediaService.java @@ -18,7 +18,33 @@ import android.util.Log; public class MediaService extends Service { public static final String TAG = "MediaService"; + private MediaSessionCompat mSession; + private PlaybackStateCompat.Builder mPBuilder; + + public void setSessionState(int state) + { + switch(state) { + case 0: { + mPBuilder.setActions(PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_STOP); + mPBuilder.setState(PlaybackStateCompat.STATE_PLAYING, + 0, 1.0f); + mSession.setPlaybackState(mPBuilder.build()); + } + case 1: { + mPBuilder.setActions(PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_STOP); + mPBuilder.setState(PlaybackStateCompat.STATE_PAUSED, + 0, 1.0f); + mSession.setPlaybackState(mPBuilder.build()); + } + case 2: { + mPBuilder.setActions(PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_STOP); + mPBuilder.setState(PlaybackStateCompat.STATE_STOPPED, + 0, 1.0f); + mSession.setPlaybackState(mPBuilder.build()); + } + } + } private class MediaSessionCallback extends MediaSessionCompat.Callback { private Context mContext; @@ -66,6 +92,7 @@ public class MediaService extends Service { MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); mSession.setCallback(new MediaSessionCallback(this)); + mPBuilder = new PlaybackStateCompat.Builder(); } @Override diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0cf194d6..fcda503d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -30,6 +30,7 @@ set(SRCS_base models/downloadmodel.cpp models/errorlogmodel.cpp models/podcastsearchmodel.cpp + mediasessionclient.cpp mpris2/mpris2.cpp powermanagementinterface.cpp sync/sync.cpp diff --git a/src/audiomanager.cpp b/src/audiomanager.cpp index 7450a3a3..ebfcb367 100644 --- a/src/audiomanager.cpp +++ b/src/audiomanager.cpp @@ -23,6 +23,7 @@ #include "models/errorlogmodel.h" #include "powermanagementinterface.h" #include "settingsmanager.h" +#include "mediasessionclient.h" class AudioManagerPrivate { @@ -73,6 +74,8 @@ AudioManager::AudioManager(QObject *parent) connect(this, &AudioManager::logError, &ErrorLogModel::instance(), &ErrorLogModel::monitorErrorMessages); + MediaSessionClient mClient(this); + // Check if an entry was playing when the program was shut down and restore it if (DataManager::instance().lastPlayingEntry() != QStringLiteral("none")) { setEntry(DataManager::instance().getEntry(DataManager::instance().lastPlayingEntry())); diff --git a/src/mediasessionclient.cpp b/src/mediasessionclient.cpp index 3cdabbaa..db7e889c 100644 --- a/src/mediasessionclient.cpp +++ b/src/mediasessionclient.cpp @@ -8,9 +8,36 @@ #include "audiomanager.h" #include +#include -MediaSessionClient::MediaSessionClient(QObject *parent) +MediaSessionClient::MediaSessionClient(AudioManager *audioPlayer, QObject *parent) : QObject(parent) + , m_audioPlayer(audioPlayer) { - //connections to be added here. + connect(m_audioPlayer, &AudioManager::playbackStateChanged, this, &MediaSessionClient::setState); +} + +void MediaSessionClient::setState() +{ + QDebug() << m_audioPlayer->playbackState(); + switch(m_audioPlayer->playbackState()) { + case QMediaPlayer::StoppedState : + QAndroidJniObject::callStaticMethod + ("org/kde/kasts/MediaService" + , "setSessionState" + , "(I)I" + , 2); + case QMediaPlayer::PausedState : + QAndroidJniObject::callStaticMethod + ("org/kde/kasts/MediaService" + , "setSessionState" + , "(I)I" + , 1); + case QMediaPlayer::PlayingState : + QAndroidJniObject::callStaticMethod + ("org/kde/kasts/MediaService" + , "setSessionState" + , "(I)I" + , 0); + } } diff --git a/src/mediasessionclient.h b/src/mediasessionclient.h index 023e7421..f3dba394 100644 --- a/src/mediasessionclient.h +++ b/src/mediasessionclient.h @@ -6,8 +6,18 @@ #pragma once -class MediaSessionClient +#include + +class AudioManager; + +class MediaSessionClient : public QObject { public: - explicit MediaSessionClient(QObject *parent = nullptr); + explicit MediaSessionClient(AudioManager *audioPlayer, QObject *parent = nullptr); + +private Q_SLOTS: + void setState(); + +private: + AudioManager *m_audioPlayer = nullptr; };