From f9cbfb636f6dce351f26e6b86dcb0080a32cd18d Mon Sep 17 00:00:00 2001 From: Matt Porter Date: Wed, 8 Nov 2017 11:12:52 -0500 Subject: Convert phone app to use libqtappfw's Telephony support Remove the QML/Javascript websocket and appfw message handling code. This is replaced with libqtappfw's Telephony class which handles all Telephony API binding communication in a separate thread. Bug-AGL: SPEC-1079 Change-Id: I06b352eaf4925fc144c59f8d8f689180376a1f35 Signed-off-by: Matt Porter --- app/Dialer.qml | 41 ++++++++++--------- app/api/Telephony.qml | 111 -------------------------------------------------- app/app.pro | 5 ++- app/main.cpp | 5 +++ app/phone.qrc | 1 - 5 files changed, 30 insertions(+), 133 deletions(-) delete mode 100644 app/api/Telephony.qml diff --git a/app/Dialer.qml b/app/Dialer.qml index be13ec5..f4a3272 100644 --- a/app/Dialer.qml +++ b/app/Dialer.qml @@ -1,5 +1,6 @@ /* * 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. @@ -20,7 +21,6 @@ import QtQuick.Controls 2.0 import QtMultimedia 5.5 import AGL.Demo.Controls 1.0 import 'models' -import 'api' as API Item { id: root @@ -42,32 +42,33 @@ Item { interval: 1000 repeat: true property var startTime - onTriggered: callStatusLabel.text = getElapsedTimeString(startTime) + onTriggered: callStateLabel.text = getElapsedTimeString(startTime) } - API.Telephony { - id: telephony - url: bindingAddress - property string callStatus: "disconnected" - property string callClipColp: "" + Connections { + target: telephony - onCallStatusChanged: { - if (callStatus == "incoming") { - ringtone.active = true + onConnectedChanged: { + // FIXME: keep dialpad inactive until connected + } + + onCallStateChanged: { + if (telephony.callState == "incoming") { rejectButton.active = true - callStatusLabel.text = "Incoming call from " + callClipColp - } else if (callStatus == "dialing") { - callStatusLabel.text = "Dialing " + callClipColp - } else if (callStatus == "active") { + ringtone.active = true + callStateLabel.text = "Incoming call from " + telephony.callClip + } else if (telephony.callState == "dialing") { + callStateLabel.text = "Dialing " + telephony.callColp + } else if (telephony.callState == "active") { rejectButton.active = false callTimer.startTime = getTime() callTimer.restart() - } else if (callStatus == "disconnected") { - ringtone.active = false + } else if (telephony.callState == "disconnected") { rejectButton.active = false callButton.checked = false callTimer.stop() - callStatusLabel.text = "" + ringtone.active = false + callStateLabel.text = "" } } } @@ -161,7 +162,7 @@ Item { } Label { - id: callStatusLabel + id: callStateLabel Layout.alignment: Qt.AlignHCenter text: "" } @@ -171,7 +172,7 @@ Item { Layout.alignment: Qt.AlignHCenter onImage: './images/HMI_Phone_Hangup.svg' offImage: './images/HMI_Phone_Call.svg' - property var active: (number.text.length > 0) || (telephony.callStatus == "incoming") || (telephony.callStatus == "active") + property var active: (number.text.length > 0) || (telephony.callState == "incoming") || (telephony.callState == "active") opacity: active ? 1 : 0.25 onCheckedChanged: { @@ -185,7 +186,7 @@ Item { if (contact.name === '') contact.name = 'Unknown' history.insert(0, contact) - if (telephony.callStatus == "incoming") { + if (telephony.callState == "incoming") { telephony.answer() ringtone.active = false; } else { diff --git a/app/api/Telephony.qml b/app/api/Telephony.qml deleted file mode 100644 index 2db2d0b..0000000 --- a/app/api/Telephony.qml +++ /dev/null @@ -1,111 +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: "telephony" - property var verbs: [] - property string payloadLength: "9999" - - readonly property var msgid: { - "call": 2, - "retok": 3, - "reterr": 4, - "event": 5 - } - - onTextMessageReceived: { - var json = JSON.parse(message) - var request = json[2].request - var response = json[2].response - switch (json[0]) { - case msgid.call: - break - case msgid.retok: - root.statusString = request.status - var verb = verbs.shift() - if (verb == "dial") { - console.debug("Dial response") - } else if (verb == "hangup") { - console.debug("Hangup response") - } - 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 - var data = payload.data - console.debug("event: " + event) - if (event == "telephony/incomingCall") { - callClipColp = data.clip - callStatus = "incoming" - } else if (event == "telephony/dialingCall") { - callClipColp = data.colp - callStatus = "dialing" - } else if (event == "telephony/terminatedCall") { - callStatus = "disconnected" - } else if (event == "telephony/callStateChanged") { - callStatus = data.state - } - break - } - } - - onStatusChanged: { - switch (status) { - case WebSocket.Open: - sendSocketMessage("subscribe", { value: "callStateChanged" }) - sendSocketMessage("subscribe", { value: "dialingCall" }) - sendSocketMessage("subscribe", { value: "incomingCall" }) - sendSocketMessage("subscribe", { value: "terminatedCall" }) - break - case WebSocket.Error: - root.statusString = "WebSocket error: " + root.errorString - break - } - } - - function sendSocketMessage(verb, parameter) { - var requestJson = [ msgid.call, payloadLength, apiString + '/' + verb, parameter ] - verbs.push(verb) - sendTextMessage(JSON.stringify(requestJson)) - } - - function dial(number) { - var parameterJson = { value: number } - sendSocketMessage("dial", parameterJson) - } - - function answer() { - var parameterJson = 'None' - sendSocketMessage("answer", parameterJson) - } - - function hangup() { - var parameterJson = 'None' - sendSocketMessage("hangup", parameterJson) - } -} diff --git a/app/app.pro b/app/app.pro index cc400a9..979c9f6 100644 --- a/app/app.pro +++ b/app/app.pro @@ -1,10 +1,13 @@ TARGET = phone -QT = quickcontrols2 +QT = quickcontrols2 websockets SOURCES = main.cpp SUBDIRS = telephony-binding +CONFIG += link_pkgconfig +PKGCONFIG += qtappfw + RESOURCES += \ phone.qrc \ images/images.qrc \ diff --git a/app/main.cpp b/app/main.cpp index 0fe4bf1..c0f9d5f 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -1,5 +1,6 @@ /* * 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. @@ -26,6 +27,8 @@ #include #endif +#include + int main(int argc, char *argv[]) { #ifdef HAVE_LIBHOMESCREEN @@ -63,6 +66,8 @@ int main(int argc, char *argv[]) bindingAddress.setQuery(query); QQmlContext *context = engine.rootContext(); context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress); + Telephony *telephony = new Telephony(bindingAddress); + context->setContextProperty("telephony", telephony); } engine.load(QUrl(QStringLiteral("qrc:/Phone.qml"))); diff --git a/app/phone.qrc b/app/phone.qrc index fccf1c8..50b3140 100644 --- a/app/phone.qrc +++ b/app/phone.qrc @@ -2,7 +2,6 @@ Phone.qml Dialer.qml - api/Telephony.qml models/CallHistoryModel.qml models/ContactsModel.qml models/qmldir -- cgit 1.2.3-korg