summaryrefslogtreecommitdiffstats
path: root/qml/bluetooth-settings
diff options
context:
space:
mode:
Diffstat (limited to 'qml/bluetooth-settings')
-rwxr-xr-xqml/bluetooth-settings/bluetooth-settings-app.qml404
-rwxr-xr-xqml/bluetooth-settings/component/images/trash.pngbin0 -> 1035 bytes
2 files changed, 404 insertions, 0 deletions
diff --git a/qml/bluetooth-settings/bluetooth-settings-app.qml b/qml/bluetooth-settings/bluetooth-settings-app.qml
new file mode 100755
index 0000000..31ba001
--- /dev/null
+++ b/qml/bluetooth-settings/bluetooth-settings-app.qml
@@ -0,0 +1,404 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import system 1.0
+import components 1.0
+import utils 1.0
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+
+import "../../doc/"
+import "../../imports/system/"
+
+ApplicationWindow {
+ visible: true
+ width: 1080
+ height: 1920
+ property string protocol: 'http://'
+ property string ipAddress: '127.0.0.1'
+ property string portNumber: Qt.application.arguments[1]
+ property string tokenString: Qt.application.arguments[2]
+ property string btAPI: '/api/Bluetooth-manager/'
+
+ property string btAPIpath: protocol + ipAddress + ':' + portNumber + btAPI
+ property var jsonObjectBT
+ property string currentState: 'idle'
+
+ function showRequestInfo(text) {
+ log.text = log.text + "\n" + text
+ console.log(text)
+ }
+
+ Text {
+ id: log
+ anchors.fill: parent
+ anchors.margins: 10
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ //text: "log"
+ }
+
+ GridLayout {
+ ExclusiveGroup {
+ id: btPowerGroup
+ }
+ visible: true
+
+ id: seekDeviceType
+ //x: 400
+ //y: 105
+ anchors.top: parent.top
+ anchors.topMargin: 30
+
+ //anchors.bottomMargin: -30 //-20
+ anchors.horizontalCenter: parent.horizontalCenter
+ //visible: !tuningMethodManualSwitchButton.checked
+
+ //anchors.top: functionalityCheckBoxGrid.bottom
+ columns: 13
+ rows: 1
+
+ columnSpacing: 60
+
+ Text {
+ text: qsTr("Bluetooth power")
+ }
+
+ RadioButton {
+ id: btPowerOFF
+ exclusiveGroup: btPowerGroup
+ checked: true
+ onClicked: {
+ console.log("OFF")
+ //console.log(networkPath)
+ btDeviceList.clear()
+ periodicRefresh.stop()
+ request(btAPIpath + 'stop_discovery', function (o) {
+ // log the json response
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ request(btAPIpath + 'power?value=0', function (o) {
+ // log the json response
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ currentState = 'idle'
+ }
+ Text {
+ text: qsTr("OFF")
+ anchors.left: parent.left
+ anchors.leftMargin: 30
+ }
+
+ }
+
+ RadioButton {
+ id: btPowerON
+ exclusiveGroup: btPowerGroup
+ onClicked: {
+
+ console.log("ON")
+ request(btAPIpath + 'power?value=1', function (o) {
+ console.log(o.responseText)
+ })
+ request(btAPIpath + 'start_discovery', function (o) {
+ console.log(o.responseText)
+ })
+ currentState = 'discovering'
+ //search_device()
+ periodicRefresh.start()
+ /*buttonScanText.text = "CANCEL"*/
+
+ }
+ Text {
+ text: qsTr("ON")
+ anchors.left: parent.left
+ anchors.leftMargin: 30
+ //color: checkBoxTextStyleBands.fontColor
+ //font.pixelSize: checkBoxTextStyleBands.fontSize
+ }
+ }
+ }
+ ListModel {
+ id: btDeviceList
+ }
+
+ Rectangle {
+ //id: buttonScan
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ anchors.margins: 80
+ width: buttonScan.width + 10
+ height: buttonScan.height + 10
+ //border.width: mouseArea.pressed ? 2 : 1
+ //radius: 5
+ //antialiasing: true
+ //color: "black"
+ color: "#222"
+ border.color: "white"
+
+ Button {
+ id: buttonScan
+ anchors.centerIn: parent
+ width: 100
+ text: "SEARCH"
+
+ MouseArea {
+ //id: mouseArea
+ anchors.fill: parent
+
+ onClicked: {
+ if (buttonScan.text == "SEARCH"){
+ request(btAPIpath + 'start_discovery', function (o) {
+
+ // log the json response
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ buttonScan.text = "CANCEL"
+ currentState = 'discovering'
+ periodicRefresh.start()
+ }else{
+ request(btAPIpath + 'stop_discovery', function (o) {
+
+ // log the json response
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ buttonScan.text = "SEARCH"
+ currentState = 'idle'
+ //periodicRefresh.stop() //in order to update the content from bluez
+ }
+ }
+ }
+ }
+ }
+
+ function request(url, callback) {
+ var xhr = new XMLHttpRequest()
+ xhr.onreadystatechange = (function (myxhr) {
+
+ return function () {
+ if (xhr.readyState == 4 && xhr.status == 200){
+ callback(myxhr)
+ }
+ }
+ })(xhr)
+ xhr.open('GET', url, false)
+ xhr.send('')
+ }
+
+ Component {
+ id:blueToothDevice
+
+ Rectangle {
+ height: 150
+ width: parent.width
+ color: "#222"
+
+ Column {
+ Text {
+ id: btName
+ text: deviceName
+ font.pointSize: 36
+ color: "#ffffff"
+ }
+
+ Text {
+ id: btAddr
+ text: deviceAddress
+ visible: false
+ }
+ Text {
+ text: {
+ if ((devicePairable === "True")
+ && (deviceConnect === "False"))
+ text = "paired"
+ else if ((devicePairable === "True")
+ && (deviceConnect === "True")
+ && (connectAVP) === "True")
+ text = "AV Connection"
+ else if ((devicePairable === "True")
+ && (deviceConnect === "True")
+ && (connectHFP) === "True")
+ text = "Handsfree Connection"
+ else
+ text = ""
+ }
+ font.pointSize: 18
+ color: "#ffffff"
+ font.italic: true
+ }
+ Text {
+ id: btPairable
+ text: devicePairable
+ visible: false
+ }
+ Text {
+ id: btConnectstatus
+ text: deviceConnect
+ visible: false
+ }
+
+ }
+
+ Button {
+ id: connectButton
+ anchors.top:parent.top
+ anchors.topMargin: 15
+ anchors.right: removeDevice.left
+ anchors.rightMargin: 10
+
+ text:(btConnectstatus.text == "True")? "Disconnect":((btPairable.text == "True")? "Connect":"Pair")
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ if (currentState == 'discovering'){
+ request(btAPIpath + 'stop_discovery', function (o) {
+ currentState = "idle"
+ console.log(o.responseText)
+ })
+ }
+ if (connectButton.text == "Pair"){
+ connectButton.text = "Connect"
+ request(btAPIpath + 'pair?value=' + btAddr.text, function (o) {
+ btPairable.text = "True"
+ console.log(o.responseText)
+ })
+ request(btAPIpath + 'set_property?Address=' + btAddr.text + '\&Property=Trusted\&value=true', function (o) {
+ console.log(o.responseText)
+ })
+ }
+ else if (connectButton.text == "Connect"){
+ connectButton.text = "Disconnect"
+ request(btAPIpath + 'connect?value=' + btAddr.text, function (o) {
+ console.log(o.responseText)
+ })
+ }
+ else if (connectButton.text == "Disconnect"){
+ request(btAPIpath + 'disconnect?value=' + btAddr.text, function (o) {
+ console.log(o.responseText)
+ })
+ connectButton.text = "Connect"
+ btDeviceList.remove(findDevice(btAddr.text))
+ }
+ }
+ }
+ }
+ Image{
+ id: removeDevice
+ anchors.top:parent.top
+ anchors.topMargin: 15
+ anchors.right: parent.right
+ anchors.rightMargin: 5
+ width: 25
+ height: 25
+ source: "component/images/trash.png"
+
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ request(btAPIpath + 'remove_device?value=' + btAddr.text, function (o) {
+ console.log(o.responseText)
+ })
+ btDeviceList.remove(findDevice(btAddr.text))
+ }
+ }
+ }
+ }
+ }
+
+
+ ListView {
+ width: parent.width
+ anchors.top: parent.top
+ anchors.topMargin: 200
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: 150
+ model: btDeviceList
+ delegate: blueToothDevice
+ clip: true
+ }
+
+ function findDevice(address){
+ for (var i = 0; i < jsonObjectBT.length; i++) {
+ if (address === jsonObjectBT[i].Address){
+ return i
+ }
+ }
+ }
+ function search_device(){
+ btDeviceList.clear()
+ request(btAPIpath + 'discovery_result', function (o) {
+
+ // log the json response
+ console.log(o.responseText)
+
+ // translate response into object
+ var jsonObject = eval('(' + o.responseText + ')')
+
+ jsonObjectBT = eval('(' + JSON.stringify(
+ jsonObject.response) + ')')
+
+ console.log("BT list refreshed")
+
+ //console.log(jsonObject.response)
+ for (var i = 0; i < jsonObjectBT.length; i++) {
+ btDeviceList.append({
+ deviceAddress: jsonObjectBT[i].Address,
+ deviceName: jsonObjectBT[i].Name,
+ devicePairable:jsonObjectBT[i].Paired,
+ deviceConnect: jsonObjectBT[i].Connected,
+ connectAVP: jsonObjectBT[i].AVPConnected,
+ connectHFP: jsonObjectBT[i].HFPConnected
+ })
+ }
+ })
+ }
+
+
+ //Timer for periodic refresh; this is BAD solution, need to figure out how to subscribe for events
+ Timer {
+ id: periodicRefresh
+ interval: (currentState == "idle")? 10000:5000 // 5seconds
+ onTriggered: {
+
+ btDeviceList.clear()
+
+ request(btAPIpath + 'discovery_result', function (o) {
+
+ // log the json response
+ console.log(o.responseText)
+
+ // translate response into object
+ var jsonObject = eval('(' + o.responseText + ')')
+
+ jsonObjectBT = eval('(' + JSON.stringify(
+ jsonObject.response) + ')')
+
+ console.log("BT list refreshed")
+
+ //console.log(jsonObject.response)
+ for (var i = 0; i < jsonObjectBT.length; i++) {
+ btDeviceList.append({
+ deviceAddress: jsonObjectBT[i].Address,
+ deviceName: jsonObjectBT[i].Name,
+ devicePairable:jsonObjectBT[i].Paired,
+ deviceConnect: jsonObjectBT[i].Connected,
+ connectAVP: jsonObjectBT[i].AVPConnected,
+ connectHFP: jsonObjectBT[i].HFPConnected
+ })
+ }
+ })
+
+ start()
+ }
+ }
+}
diff --git a/qml/bluetooth-settings/component/images/trash.png b/qml/bluetooth-settings/component/images/trash.png
new file mode 100755
index 0000000..6774448
--- /dev/null
+++ b/qml/bluetooth-settings/component/images/trash.png
Binary files differ