diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 9d2f317e..7691fa32 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -7,7 +7,7 @@ diff --git a/android/src/org/kde/kasts/KastsActivity.java b/android/src/org/kde/kasts/KastsActivity.java index 23a7451f..414d58bd 100755 --- a/android/src/org/kde/kasts/KastsActivity.java +++ b/android/src/org/kde/kasts/KastsActivity.java @@ -36,8 +36,11 @@ public class KastsActivity extends QtActivity class MediaData { public String title; - public long length; + public String author; + public String album; public long position; + public long duration; + public float playbackSpeed; // add more variables here } @@ -62,7 +65,7 @@ public class KastsActivity extends QtActivity //TODO Image mSession.setMetadata(metadata.build()); - mPBuilder.setState(PlaybackStateCompat.STATE_PLAYING, 100000, 1.0f); + mPBuilder.setState(PlaybackStateCompat.STATE_PLAYING, 100000, 1.0f); //TODO:Logically we should remove this statement?? Intent iPlay = new Intent(this, MediaSessionCallback.class); iPlay.setAction("ACTION_PLAY"); @@ -145,13 +148,6 @@ public class KastsActivity extends QtActivity mSession.release(); } - public static void setSessionState(int state) - { - //TODO: set state in mediadata - activity.updateNotification(); - - } - private class MediaSessionCallback extends MediaSessionCompat.Callback { private Context mContext; @@ -191,4 +187,49 @@ public class KastsActivity extends QtActivity } } + /* + * JNI METHODS + */ + + public static void setSessionState(int state) + { + //TODO: set state in mediadata + switch(state) + { + case 0: + mPBuilder.setState(PlaybackStateCompat.STATE_PLAYING, mediaData.position, mediaData.playbackSpeed); + case 1: + mPBuilder.setState(PlaybackStateCompat.STATE_PAUSED, mediaData.position, mediaData.playbackSpeed); + case 2: + mPBuilder.setState(PlaybackStateCompat.STATE_STOPPED, mediaData.position, mediaData.playbackSpeed); + } + activity.updateNotification(); + } + + public static void setMetadata(String title, String author, String album, long position, long duration, float rate) + { + mediaData.title = title; + mediaData.author = author; + mediaData.album = album; + mediaData.position = position; + mediaData.duration = duration; + mediaData.playbackSpeed = rate; + + activity.updateNotification(); + } + + public static void setPlaybackSpeed(int rate) + { + mediaData.playbackSpeed = rate; + } + + public static void setDuration(int duration) + { + mediaData.duration = duration; + } + + public static void setPosition(int position) + { + mediaData.position = position; + } } diff --git a/src/audiomanager.cpp b/src/audiomanager.cpp index b6027e9b..aeab9350 100644 --- a/src/audiomanager.cpp +++ b/src/audiomanager.cpp @@ -79,6 +79,7 @@ AudioManager::AudioManager(QObject *parent) connect(this, &AudioManager::logError, &ErrorLogModel::instance(), &ErrorLogModel::monitorErrorMessages); + // MediaSessionClient object. new MediaSessionClient(this); // Check if an entry was playing when the program was shut down and restore it diff --git a/src/mediasessionclient.cpp b/src/mediasessionclient.cpp index a9e0ae20..2577a26e 100644 --- a/src/mediasessionclient.cpp +++ b/src/mediasessionclient.cpp @@ -7,40 +7,122 @@ #include "mediasessionclient.h" #include "audiomanager.h" -#include #include MediaSessionClient::MediaSessionClient(AudioManager *audioPlayer, QObject *parent) : QObject(parent) , m_audioPlayer(audioPlayer) { - connect(m_audioPlayer, &AudioManager::playbackStateChanged, this, &MediaSessionClient::setState); + connect(m_audioPlayer, &AudioManager::playbackStateChanged, this, &MediaSessionClient::setSessionPlaybackState); + // Sets the current playback state. + connect(m_audioPlayer, &AudioManager::entryChanged, this, &MediaSessionClient::setSessionMetadata); + // Updates the android session's metadata. + connect(m_audioPlayer, &AudioManager::playbackRateChanged, this, &MediaSessionClient::setSessionRate); + // Sets the rate of the media playback. + connect(m_audioPlayer, &AudioManager::durationChanged, this, &MediaSessionClient::setSessionDuration); + // Sets the playback duration metadata. + connect(m_audioPlayer, &AudioManager::positionChanged, this, &MediaSessionClient::setSessionPosition); + // Sets the playback position metadata. + connect(m_audioPlayer, &AudioManager::playing, this, &MediaSessionClient::setPlaying); + // Sets the playback to playing. + connect(m_audioPlayer, &AudioManager::paused, this, &MediaSessionClient::setPaused); + // Sets the playback to paused. + connect(m_audioPlayer, &AudioManager::stopped, this, &MediaSessionClient::setStopped); + // Sets the playback to stopped. } -void MediaSessionClient::setState() +void MediaSessionClient::setSessionPlaybackState() { - qDebug() << m_audioPlayer->playbackState(); + qDebug() << "MediaSessionClient::setSessionPlaybackState called with state value = " << m_audioPlayer->playbackState(); + int status = -1; switch(m_audioPlayer->playbackState()) { - case QMediaPlayer::StoppedState : - QAndroidJniObject::callStaticMethod - ("org/kde/kasts/KastsActivity" - , "setSessionState" - , "(I)V" - , 2); - break; - case QMediaPlayer::PausedState : - QAndroidJniObject::callStaticMethod - ("org/kde/kasts/KastsActivity" - , "setSessionState" - , "(I)V" - , 1); - break; case QMediaPlayer::PlayingState : - QAndroidJniObject::callStaticMethod - ("org/kde/kasts/KastsActivity" - , "setSessionState" - , "(I)V" - , 0); + status = 0; + break; + case QMediaPlayer::PausedState : + status = 1; + break; + case QMediaPlayer::StoppedState : + status = 2; break; } + QAndroidJniObject::callStaticMethod("org/kde/kasts/KastsActivity", "setSessionState", "(I)V", status); +} + +void MediaSessionClient::setSessionMetadata() +{ + /* + * Sets the media session's metadata. This will be triggered every time there is state change ie. next, previous, etc. + */ + Entry *entry = m_audioPlayer->entry(); + + QString authorString = QStringLiteral(""); + if (entry->authors().count() > 0) { + for (auto &author : entry->authors()) { + authorString.append(QStringLiteral(", ")); + authorString.append(author->name()); + } + } + QAndroidJniObject title = QAndroidJniObject::fromString(entry->title()); + // Title string + QAndroidJniObject author = QAndroidJniObject::fromString(authorString); + // Author string + QAndroidJniObject album = QAndroidJniObject::fromString(QStringLiteral("Album")); + // Author string + qint64 duration = qint64(m_audioPlayer->duration()) * 1000; + // Playback duration + qint64 position = qint64(m_audioPlayer->position()) * 1000; + // Playback position + int rate = m_audioPlayer->playbackRate(); + // Playback rate + + QAndroidJniObject::callStaticMethod("org/kde/kasts/KastsActivity", "setMetadata","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J;J;F)V",title.object(), author.object(), album.object(), position, duration, rate); +} + +void MediaSessionClient::setSessionRate() +{ + /* + * Sets the media session's rate metadata. + */ + int rate = m_audioPlayer->playbackRate(); + QAndroidJniObject::callStaticMethod("org/kde/kasts/KastsActivity", "setPlaybackSpeed", "(I)V", rate); +} + +void MediaSessionClient::setSessionDuration() +{ + /* + * Sets the media session's playback duration. + */ + qint64 duration = qint64(m_audioPlayer->duration()) * 1000; + QAndroidJniObject::callStaticMethod("org/kde/kasts/KastsActivity", "setDuration", "(I)V", duration); +} + +void MediaSessionClient::setSessionPosition() +{ + /* + * Sets the media session's current playback position. + */ + qint64 position = qint64(m_audioPlayer->position()) * 1000; + QAndroidJniObject::callStaticMethod("org/kde/kasts/KastsActivity", "setPosition", "(I)V", position); +} + +void MediaSessionClient::setPlaying() +{ + /* + * Sets the media session's current playback state to playing. + */ +} + +void MediaSessionClient::setPaused() +{ + /* + * Sets the media session's current playback state to paused. + */ +} + +void MediaSessionClient::setStopped() +{ + /* + * Sets the media session's current playback state to stopped. + */ } diff --git a/src/mediasessionclient.h b/src/mediasessionclient.h index f3dba394..a7af3063 100644 --- a/src/mediasessionclient.h +++ b/src/mediasessionclient.h @@ -7,8 +7,10 @@ #pragma once #include +#include class AudioManager; +class Entry; class MediaSessionClient : public QObject { @@ -16,7 +18,14 @@ public: explicit MediaSessionClient(AudioManager *audioPlayer, QObject *parent = nullptr); private Q_SLOTS: - void setState(); + void setSessionPlaybackState(); + void setSessionMetadata(); + void setSessionRate(); + void setSessionDuration(); + void setSessionPosition(); + void setPlaying(); + void setPaused(); + void setStopped(); private: AudioManager *m_audioPlayer = nullptr;