libqtappfw: bluetooth: switch from qml websockets to libqtappfw 29/13829/1
authorMatt Ranostay <matt.ranostay@konsulko.com>
Sat, 21 Apr 2018 01:08:16 +0000 (18:08 -0700)
committerMatt Ranostay <matt.ranostay@konsulko.com>
Sun, 22 Apr 2018 05:44:26 +0000 (22:44 -0700)
Switch agl-service-bluetooth access from QML websockets to proper
libqtappfw middleware.

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

index 438ff20..6f2fa81 100644 (file)
@@ -19,7 +19,6 @@ import QtQuick.Layouts 1.1
 import QtQuick.Controls 2.0
 import QtMultimedia 5.6
 import AGL.Demo.Controls 1.0
-import 'api' as API
 
 ApplicationWindow {
     id: root
@@ -42,6 +41,91 @@ ApplicationWindow {
         }
     }
 
+    Item {
+        id: bluetooth
+
+        property string deviceAddress: ""
+        property bool connected: false
+        property bool av_connected: false
+
+        property int position: 0
+        property int duration: 0
+
+        property string artist: ""
+        property string title: ""
+        property string state: "stopped"
+
+        // AVRCP Target UUID
+        property string avrcp_uuid: "0000110e-0000-1000-8000-00805f9b34fb"
+
+        function connect_profiles() {
+            var address = bluetooth.deviceAddress;
+            bluetooth_connection.connect(address, "a2dp")
+            bluetooth_connection.connect(address, "avrcp")
+        }
+
+        function disconnect_profiles() {
+            var address = bluetooth.deviceAddress;
+            bluetooth_connection.disconnect(address, "a2dp")
+            bluetooth_connection.disconnect(address, "avrcp")
+        }
+
+        function set_avrcp_controls(cmd) {
+            bluetooth_connection.set_avrcp_controls(bluetooth.deviceAddress, cmd)
+        }
+    }
+
+    Connections {
+        target: bluetooth_connection
+
+        onDeviceListEvent: {
+            var address = ""
+            for (var i = 0; i < data.list.length; i++) {
+                var item = data.list[i]
+                if (item.Connected == "True" && item.UUIDs.indexOf(bluetooth.avrcp_uuid) >= 0) {
+                    address = item.Address
+
+                    bluetooth.connected = true
+                    mediaplayer.pause()
+
+                    //NOTE: This hack is here for when MediaPlayer is started
+                    //      with an existing connection.
+                    bluetooth.av_connected = item.AVPConnected == "True" 
+                }
+            }
+            if (!address)
+                bluetooth.connected = false
+            else
+                bluetooth.deviceAddress = address
+        }
+
+        onDeviceUpdatedEvent: {
+            var metadata = data.Metadata
+
+            if (data.Connected == "False")
+                return
+
+            bluetooth.connected = data.Connected == "True"
+            bluetooth.av_connected = data.AVPConnected == "True"
+            bluetooth.deviceAddress = data.Address
+
+            if ('Position' in metadata)
+                bluetooth.position = metadata.Position
+
+            if ('Duration' in metadata)
+                bluetooth.duration = metadata.Duration
+
+            if ('Status' in metadata)
+                bluetooth.state = metadata.Status
+
+            if ('Artist' in metadata)
+                bluetooth.artist = metadata.Artist
+
+            if ('Title' in metadata)
+                bluetooth.title = metadata.Title
+        }
+    }
+
     Connections {
         target: mediaplayer
 
@@ -84,11 +168,6 @@ ApplicationWindow {
         }
     }
 
-    API.BluetoothManager {
-        id: bluetooth
-        url: bindingAddress
-    }
-
     Timer {
         id: timer
         interval: 250
@@ -215,7 +294,7 @@ ApplicationWindow {
                             offImage: './images/AGL_MediaPlayer_BackArrow.svg'
                             onClicked: {
                                 if (bluetooth.av_connected) {
-                                    bluetooth.sendMediaCommand("Previous")
+                                    bluetooth.set_avrcp_controls("Previous")
                                     bluetooth.position = 0
                                 } else {
                                     mediaplayer.previous()
@@ -227,7 +306,7 @@ ApplicationWindow {
                             offImage: './images/AGL_MediaPlayer_Player_Play.svg'
                             onClicked: {
                                 if (bluetooth.av_connected) {
-                                    bluetooth.sendMediaCommand("Play")
+                                    bluetooth.set_avrcp_controls("Play")
                                 } else {
                                     mediaplayer.play()
                                 }
@@ -249,7 +328,7 @@ ApplicationWindow {
                                     PropertyChanges {
                                         target: play
                                         offImage: './images/AGL_MediaPlayer_Player_Pause.svg'
-                                        onClicked: bluetooth.sendMediaCommand("Pause")
+                                        onClicked: bluetooth.set_avrcp_controls("Pause")
                                     }
                                 }
 
@@ -260,7 +339,7 @@ ApplicationWindow {
                             offImage: './images/AGL_MediaPlayer_ForwardArrow.svg'
                             onClicked: {
                                 if (bluetooth.av_connected) {
-                                    bluetooth.sendMediaCommand("Next")
+                                    bluetooth.set_avrcp_controls("Next")
                                 } else {
                                     mediaplayer.next()
                                 }
diff --git a/app/api/BluetoothManager.qml b/app/api/BluetoothManager.qml
deleted file mode 100644 (file)
index ea33dfe..0000000
+++ /dev/null
@@ -1,183 +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: "Bluetooth-Manager"
-    property var verbs: []
-    property string payloadLength: "9999"
-
-    property string deviceAddress: ""
-    property bool connected: false
-    property bool av_connected: false
-
-    property int position: 0
-    property int duration: 0
-
-    property string artist: ""
-    property string title: ""
-    property string state: "stopped"
-
-    // AVRCP Target UUID
-    property string avrcp_uuid: "0000110e-0000-1000-8000-00805f9b34fb"
-
-    // A2DP Source
-    property string a2dp_uuid:  "0000110a-0000-1000-8000-00805f9b34fb"
-
-    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 address = ""
-
-                if (request.info == "BT - Scan Result is Displayed") {
-                    for (var i = 0; i < response.list.length; i++) {
-                        var data = list.response[i]
-                        if (data.Connected == "True" && data.UUIDs.indexOf(avrcp_uuid) >= 0) {
-                            address = data.Address
-                            console.debug("Connected Device: " + address)
-
-                            root.connected = true
-                            player.pause()
-
-                            //NOTE: This hack is here for when MediaPlayer is started
-                            //      with an existing connection.
-                            if (data.AVPConnected == "True") {
-                                root.av_connected = true
-                            }
-                        }
-                    }
-                    root.deviceAddress = address
-                    if (!address) {
-                        root.connected = false
-                    }
-                }
-                break
-            case msgid.reterr:
-                root.statusString = "Bad return value, binding probably not installed"
-                break
-            case msgid.event:
-                var payload = JSON.parse(JSON.stringify(json[2]))
-                var event = payload.event
-
-                if (event == "Bluetooth-Manager/connection") {
-                    sendSocketMessage("discovery_result", 'None')
-                } else if (event == "Bluetooth-Manager/device_updated") {
-                    var data = payload.data
-                    var metadata = data.Metadata
-
-                    if (root.deviceAddress == "")
-                        root.deviceAddress = data.Address
-
-                    if (root.deviceAddress != data.Address)
-                        break
-
-                    if (data.Connected == "False") {
-                        console.debug("Device Disconnected")
-                        sendSocketMessage("discovery_result", 'None')
-                        break
-                    }
-                    root.connected = data.Connected == "True"
-                    root.av_connected = data.AVPConnected == "True"
-
-                    if ('Position' in metadata) {
-                        console.debug("Position " + metadata.Position)
-                        root.position = metadata.Position
-                    }
-
-                    if ('Duration' in metadata) {
-                        console.debug("Duration " + metadata.Duration)
-                        root.duration = metadata.Duration
-                    }
-
-                    if ('Status' in metadata) {
-                        console.debug("Status " + metadata.Status)
-                        root.state = metadata.Status
-                    }
-
-                    if ('Artist' in metadata) {
-                        console.debug("Artist " + metadata.Artist)
-                        root.artist = metadata.Artist
-                    }
-
-                    if ('Title' in metadata) {
-                        console.debug("Title " + metadata.Title)
-                        root.title = metadata.Title
-                    }
-                }
-                break
-        }
-    }
-
-    onStatusChanged: {
-        switch (status) {
-            case WebSocket.Open:
-            console.debug("onStatusChanged: Open")
-            sendSocketMessage("subscribe", { value : "device_updated" })
-            sendSocketMessage("subscribe", { value : "connection" })
-            sendSocketMessage("discovery_result", '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)
-        root.sendTextMessage(JSON.stringify(requestJson))
-    }
-
-    function sendMediaCommand(state) {
-        var parameters = { "Address": deviceAddress, "value": state }
-        sendSocketMessage("set_avrcp_controls", parameters)
-    }
-
-    function connect_profiles() {
-        sendSocketMessage("connect", { "value": root.deviceAddress, "uuid": a2dp_uuid })
-        sendSocketMessage("connect", { "value": root.deviceAddress, "uuid": avrcp_uuid })
-    }
-
-    function disconnect_profiles() {
-        sendSocketMessage("disconnect", { "value": root.deviceAddress, "uuid": a2dp_uuid })
-        sendSocketMessage("disconnect", { "value": root.deviceAddress, "uuid": avrcp_uuid })
-    }
-}
index 928b825..8fa8117 100644 (file)
@@ -28,6 +28,7 @@
 #include <QQuickWindow>
 #include <libhomescreen.hpp>
 #include <qlibwindowmanager.h>
+#include <bluetooth.h>
 #include <mediaplayer.h>
 
 int main(int argc, char *argv[])
@@ -96,6 +97,7 @@ int main(int argc, char *argv[])
         });
 
         context->setContextProperty("mediaplayer", new Mediaplayer(bindingAddress));
+        context->setContextProperty("bluetooth_connection", new Bluetooth(bindingAddress));
         engine.load(QUrl(QStringLiteral("qrc:/MediaPlayer.qml")));
         QObject *root = engine.rootObjects().first();
         QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
index 769d5b4..d3fa02e 100644 (file)
@@ -1,6 +1,5 @@
 <RCC>
     <qresource prefix="/">
         <file>MediaPlayer.qml</file>
-       <file>api/BluetoothManager.qml</file>
     </qresource>
 </RCC>