libqtappfw: mediaplayer: switch from qml websockets to libqtappfw 49/13749/2
authorMatt Ranostay <matt.ranostay@konsulko.com>
Tue, 3 Apr 2018 23:35:57 +0000 (16:35 -0700)
committerMatt Ranostay <matt.ranostay@konsulko.com>
Fri, 20 Apr 2018 20:28:14 +0000 (13:28 -0700)
Switch agl-service-mediaplayer access from QML websockets to proper
libqtappfw middleware.

Bug-AGL: SPEC-1375
Change-Id: I8ee638f11b2d63c42657545f501260da9dc94356
Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
app/MediaPlayer.qml
app/api/MediaPlayer.qml [deleted file]
app/app.pro
app/main.cpp
app/mediaplayer.qrc

index ebd5324..438ff20 100644 (file)
@@ -24,9 +24,64 @@ import 'api' as API
 ApplicationWindow {
     id: root
 
-    API.MediaPlayer {
+    Item {
         id: player
-        url: bindingAddress
+
+        property string title: ""
+        property string album: ""
+        property string artist: ""
+
+        property int duration: 0
+        property int position: 0
+
+        property string cover_art: ""
+        property string status: ""
+
+        function time2str(value) {
+            return Qt.formatTime(new Date(value), 'mm:ss')
+        }
+    }
+
+    Connections {
+        target: mediaplayer
+
+        onPlaylistChanged: {
+            playlist.clear()
+
+            for (var i = 0; i < playlist.list.length; i++) {
+                var item = playlist.list[i]
+
+                playlist_model.append({ "index": item.index, "artist": item.artist ? item.artist : '', "title": item.title ? item.title : '' })
+
+                if (item.selected) {
+                    playlistview.currentIndex = i
+                }
+            }
+        }
+
+        onMetadataChanged: {
+            player.title = metadata.title
+            player.album = metadata.album
+            player.artist = metadata.artist
+
+            if (metadata.duration) {
+                player.duration = metadata.duration
+            }
+
+            if (metadata.position) {
+                player.position = metadata.position
+            }
+
+            if (metadata.status) {
+                player.status = metadata.status
+            }
+
+            if (metadata.image) {
+                player.cover_art = metadata.image
+            }
+
+            playlistview.currentIndex = metadata.index
+        }
     }
 
     API.BluetoothManager {
@@ -45,7 +100,7 @@ ApplicationWindow {
     }
 
     ListModel {
-        id: playlist
+        id: playlist_model
     }
 
     ColumnLayout {
@@ -94,10 +149,10 @@ ApplicationWindow {
                             ToggleButton {
                                 id: loop
                                 visible: bluetooth.connected == false
-                                checked: player.loop_state
+                                //checked: player.loop_state
                                 offImage: './images/AGL_MediaPlayer_Loop_Inactive.svg'
                                 onImage: './images/AGL_MediaPlayer_Loop_Active.svg'
-                                onClicked: { player.loop(checked) }
+                                onClicked: { mediaplayer.loop(checked) }
                             }
                         }
                         ColumnLayout {
@@ -144,7 +199,7 @@ ApplicationWindow {
                             font.pixelSize: 32
                             text: bluetooth.av_connected ? player.time2str(bluetooth.duration) : player.time2str(player.duration)
                         }
-                        onPressedChanged: player.seek(value)
+                        onPressedChanged: mediaplayer.seek(value)
                     }
                     RowLayout {
                         Layout.fillHeight: true
@@ -163,7 +218,7 @@ ApplicationWindow {
                                     bluetooth.sendMediaCommand("Previous")
                                     bluetooth.position = 0
                                 } else {
-                                    player.previous()
+                                    mediaplayer.previous()
                                 }
                             }
                         }
@@ -174,16 +229,19 @@ ApplicationWindow {
                                 if (bluetooth.av_connected) {
                                     bluetooth.sendMediaCommand("Play")
                                 } else {
-                                    player.play()
+                                    mediaplayer.play()
                                 }
                             }
                             states: [
                                 State {
-                                    when: player.running === true
+                                    when: player.status == "playing"
                                     PropertyChanges {
                                         target: play
                                         offImage: './images/AGL_MediaPlayer_Player_Pause.svg'
-                                        onClicked: player.pause()
+                                        onClicked: {
+                                            player.status = ""
+                                            mediaplayer.pause()
+                                        }
                                     }
                                 },
                                 State {
@@ -204,7 +262,7 @@ ApplicationWindow {
                                 if (bluetooth.av_connected) {
                                     bluetooth.sendMediaCommand("Next")
                                 } else {
-                                    player.next()
+                                    mediaplayer.next()
                                 }
                             }
                         }
@@ -244,7 +302,7 @@ ApplicationWindow {
                     text: 'PLAYLIST'
                     opacity: 0.5
                 }
-                model: playlist
+                model: playlist_model
                 currentIndex: -1
 
                 delegate: MouseArea {
@@ -275,8 +333,7 @@ ApplicationWindow {
                         //}
                     }
                     onClicked: {
-                        player.pick_track(playlistview.model.get(index).index)
-                        player.play()
+                        mediaplayer.picktrack(playlistview.model.get(index).index)
                     }
                 }
 
diff --git a/app/api/MediaPlayer.qml b/app/api/MediaPlayer.qml
deleted file mode 100644 (file)
index 857135a..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2017 Konsulko Group
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import QtQuick 2.6
-import QtWebSockets 1.0
-
-WebSocket {
-    id: root
-    active: true
-    url: bindingAddress
-
-    property string statusString: "waiting..."
-    property string apiString: "mediaplayer"
-    property var verbs: []
-    property string payloadLength: "9999"
-    property string cover_art: ""
-    property string title: ""
-    property string artist: ""
-    property int duration: 0
-    property int position: 0
-    property int old_index: -1
-
-    property bool loop_state: false
-    property bool running: false
-
-    readonly property var msgid: {
-        "call": 2,
-        "retok": 3,
-        "reterr": 4,
-        "event": 5
-    }
-
-    onTextMessageReceived: {
-        var json = JSON.parse(message)
-        //console.debug("Raw response: " + message)
-        var request = json[2].request
-        var response = json[2].response
-        //console.debug("response: " + JSON.stringify(response))
-        switch (json[0]) {
-            case msgid.call:
-                break
-            case msgid.retok:
-                root.statusString = request.status
-                var verb = verbs.shift()
-                if (verb == "playlist") {
-                    console.debug("Media result returned")
-                    var media = response.list
-
-                    for (var i = 0; i < media.length; i++) {
-                        var item = media[i]
-                        playlist.append({ "index": item.index, "artist": item.artist ? item.artist : '', "title": item.title ? item.title : '' })
-                        if (item.selected) {
-                            playlistview.currentIndex = i
-                        }
-                    }
-                } else if (verb == "controls") {
-                    if (response) {
-                        root.running = response.playing
-                    }
-                } else if (verb == "metadata") {
-                    root.title = response.title ? response.title : ''
-                    root.artist = response.artist ? response.artist : ''
-
-                    root.cover_art = response.image ? response.image : ''
-                }
-                break
-            case msgid.reterr:
-                root.statusString = "Bad return value, binding probably not installed"
-                var verb = verbs.shift()
-                break
-            case msgid.event:
-                var payload = JSON.parse(JSON.stringify(json[2]))
-                var event = payload.event
-                if (event == "mediaplayer/playlist") {
-                    console.debug("Media playlist is updated")
-                    var media = json[2].data.list
-
-                    if (!root.running) {
-                        root.clearPlaylist()
-                    }
-
-                    playlist.clear()
-
-                    for (var i = 0; i < media.length; i++) {
-                        var item = media[i]
-
-                        playlist.append({ "index": item.index, "artist": item.artist ? item.artist : '', "title": item.title ? item.title : '' })
-                        if (item.selected) {
-                            playlistview.currentIndex = i
-                        }
-                    }
-
-                } else if (event == "mediaplayer/metadata") {
-                    var data = json[2].data
-
-                    if (data.status == "stopped") {
-                        root.running = false
-                        root.clearPlaylist()
-                        break
-                    }
-
-                    root.running = true
-                    root.position = data.position
-                    root.duration = data.duration
-
-                    playlistview.currentIndex = data.index
-
-                    if (playlistview.currentIndex != root.old_index) {
-                        sendSocketMessage("metadata", 'None')
-                        root.old_index = data.index
-                    }
-
-                    root.title = data.title ? data.title : ''
-                    root.artist = data.artist ? data.artist : ''
-                }
-                break
-        }
-    }
-
-    onStatusChanged: {
-        switch (status) {
-            case WebSocket.Open:
-            console.debug("onStatusChanged: Open")
-            sendSocketMessage("subscribe", { value: "metadata" })
-            sendSocketMessage("playlist", 'None')
-            sendSocketMessage("subscribe", { value: "playlist" })
-            sendSocketMessage("metadata", 'None')
-            break
-            case WebSocket.Error:
-            root.statusString = "WebSocket error: " + root.errorString
-            break
-        }
-    }
-
-    function sendSocketMessage(verb, parameter) {
-        var requestJson = [ msgid.call, payloadLength, apiString + '/'
-        + verb, parameter ]
-        console.debug("sendSocketMessage: " + JSON.stringify(requestJson))
-        verbs.push(verb)
-        sendTextMessage(JSON.stringify(requestJson))
-    }
-
-    function loop(value) {
-        sendSocketMessage("controls", { "value": "loop", "state": value })
-        root.loop_state = value
-    }
-
-    function next() {
-        sendSocketMessage("controls", { "value": "next" })
-    }
-
-    function previous() {
-        sendSocketMessage("controls", { "value": "previous" })
-    }
-
-    function play() {
-        sendSocketMessage("controls", { "value": "play" })
-    }
-
-    function pause() {
-        sendSocketMessage("controls", { "value": "pause" })
-    }
-
-    function pick_track(index) {
-        sendSocketMessage("controls", { "value": "pick-track", "index": index })
-    }
-
-    function seek(milliseconds) {
-        sendSocketMessage("controls", { "value": "seek", "position": milliseconds })
-    }
-
-    function stop() {
-        sendSocketMessage("controls", { "value": "stop" })
-    }
-
-    function clearPlaylist() {
-        root.position = ''
-        root.duration = ''
-        root.title = ''
-        root.artist = ''
-        root.cover_art = ''
-        root.old_index = -1
-        playlistview.currentIndex = -1
-    }
-
-    function time2str(value) {
-        return Qt.formatTime(new Date(value), 'mm:ss')
-    }
-}
index 9bdcaab..07da5c5 100644 (file)
@@ -1,10 +1,10 @@
 TARGET = mediaplayer
-QT = quickcontrols2
+QT = quickcontrols2 websockets
 
 SOURCES = main.cpp
 
 CONFIG += link_pkgconfig
-PKGCONFIG += libhomescreen qlibwindowmanager
+PKGCONFIG += libhomescreen qlibwindowmanager qtappfw
 
 RESOURCES += \
     mediaplayer.qrc \
index 145d9d1..928b825 100644 (file)
@@ -28,6 +28,7 @@
 #include <QQuickWindow>
 #include <libhomescreen.hpp>
 #include <qlibwindowmanager.h>
+#include <mediaplayer.h>
 
 int main(int argc, char *argv[])
 {
@@ -94,6 +95,7 @@ int main(int argc, char *argv[])
             }
         });
 
+        context->setContextProperty("mediaplayer", new Mediaplayer(bindingAddress));
         engine.load(QUrl(QStringLiteral("qrc:/MediaPlayer.qml")));
         QObject *root = engine.rootObjects().first();
         QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
index e4d5330..769d5b4 100644 (file)
@@ -2,6 +2,5 @@
     <qresource prefix="/">
         <file>MediaPlayer.qml</file>
        <file>api/BluetoothManager.qml</file>
-       <file>api/MediaPlayer.qml</file>
     </qresource>
 </RCC>