--- /dev/null
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ *
+ * 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 QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+import QtMultimedia 5.5
+import AGL.Demo.Controls 1.0
+import 'models'
+import 'api' as API
+
+Item {
+ id: root
+
+ function getTime() {
+ return new Date().getTime()
+ }
+
+ // Elapsed time in hh:mm:ss format
+ function getElapsedTimeString(startTime) {
+ var seconds = Math.floor((getTime() - startTime) / 1000);
+ var time = new Date(null);
+ time.setSeconds(seconds);
+ return time.toISOString().substr(11, 8);
+ }
+
+ Timer {
+ id: callTimer
+ interval: 1000
+ repeat: true
+ property var startTime
+ onTriggered: callStatusLabel.text = getElapsedTimeString(startTime)
+ }
+
+ API.Telephony {
+ id: telephony
+ url: bindingAddress
+ property string callStatus: "disconnected"
+ property string callClipColp: ""
+
+ onCallStatusChanged: {
+ if (callStatus == "incoming") {
+ soundmgr.connect("calling")
+ //ringtone.active = true
+ //rejectButton.active = true
+ //callStatusLabel.text = "Incoming call from " + callClipColp
+ } else if (callStatus == "dialing") {
+ callStatusLabel.text = "Dialing " + callClipColp
+ } else if (callStatus == "active") {
+ rejectButton.active = false
+ callTimer.startTime = getTime()
+ callTimer.restart()
+ } else if (callStatus == "disconnected") {
+ ringtone.active = false
+ rejectButton.active = false
+ callButton.checked = false
+ callTimer.stop()
+ callStatusLabel.text = ""
+ soundmgr.disconnect()
+ }
+ }
+ }
+ API.BindingSoundManager {
+ id: soundmgr
+ onApproved: {
+ console.log("Sound Right Approved")
+ switch(telephony.callStatus){
+ case "dialing":
+ case "active":
+ case "disconnected":
+ telephony.dial(number.text)
+ break; // WARNING! these cases are not tested excluding incomming
+ case "incoming":
+ ringtone.active = true
+ rejectButton.active = true
+ callStatusLabel.text = "Incoming call from " + telephony.callClipColp
+
+ break;
+ default:
+ break;
+ }
+ }
+ onDenied: {
+ console.log("Sound Right Denyed due to emergency")
+ }
+ onPaused:{
+ console.log("paused") // this doesn't come maybe
+ }
+ }
+
+ Loader {
+ id: ringtone
+ active: false
+ sourceComponent: Component {
+ SoundEffect {
+ loops: SoundEffect.Infinite
+ source: './Phone.wav'
+ category: 'phone'
+ Component.onCompleted: play()
+ }
+ }
+ }
+
+ signal showContacts
+ function call(contact) {
+ name.text = contact.name
+ number.text = contact.number
+ callButton.checked = true
+ }
+
+ ImageButton {
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.margins: 60
+ width: 172
+ height: 172
+ offImage: './images/HMI_Phone_Contacts-01.svg'
+ onClicked: root.showContacts()
+ }
+
+ ColumnLayout {
+ anchors.fill: parent
+ anchors.topMargin: 50
+ anchors.bottomMargin: 50
+ spacing: 20
+ ColumnLayout {
+ Layout.alignment: Qt.AlignHCenter
+ Label {
+ id: name
+ font.pixelSize: 40
+ color: '#59FF7F'
+ }
+ TextField {
+ id: number
+ readOnly: true
+
+ ImageButton {
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+ offImage: './images/HMI_Phone_Back_Icon.svg'
+ onClicked: {
+ if (number.text.length > 0)
+ number.text = number.text.substring(0, number.text.length - 1)
+ }
+ }
+ }
+ }
+
+ GridLayout {
+ Layout.alignment: Qt.AlignHCenter
+ columns: 3
+ columnSpacing: 30
+ rowSpacing: 30
+ Repeater {
+ model: ListModel {
+ ListElement { value: '1'; image: '1' }
+ ListElement { value: '2'; image: '2' }
+ ListElement { value: '3'; image: '3' }
+ ListElement { value: '4'; image: '4' }
+ ListElement { value: '5'; image: '5' }
+ ListElement { value: '6'; image: '6' }
+ ListElement { value: '7'; image: '7' }
+ ListElement { value: '8'; image: '8' }
+ ListElement { value: '9'; image: '9' }
+ ListElement { value: '*'; image: 'asterisk' }
+ ListElement { value: '0'; image: '0' }
+ ListElement { value: '#'; image: 'NumberSign' }
+ }
+ ImageButton {
+ onImage: './images/HMI_Phone_Button_%1_Active-01.svg'.arg(model.image)
+ offImage: './images/HMI_Phone_Button_%1_Inactive-01.svg'.arg(model.image)
+ onClicked: {
+ number.text += model.value
+ }
+ }
+ }
+ }
+
+ Label {
+ id: callStatusLabel
+ Layout.alignment: Qt.AlignHCenter
+ text: ""
+ }
+
+ ToggleButton {
+ id: callButton
+ 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")
+ opacity: active ? 1 : 0.25
+
+ onCheckedChanged: {
+ if (checked) {
+ if (!active) {
+ callButton.checked = false
+ return
+ }
+
+ var contact = {'name': name.text, 'number': number.text}
+ if (contact.name === '')
+ contact.name = 'Unknown'
+ history.insert(0, contact)
+ if (telephony.callStatus == "incoming") {
+ telephony.answer()
+ ringtone.active = false;
+ } else {
+ soundmgr.connect()
+ //telephony.dial(number.text)
+ }
+ } else {
+ name.text = ''
+ number.text = ''
+ telephony.hangup()
+ soundmgr.disconnect()
+ }
+ }
+ }
+
+ Loader {
+ id: rejectButton
+ Layout.alignment: Qt.AlignHCenter
+ active: false
+ sourceComponent: ImageButton {
+ offImage: './images/HMI_Phone_Hangup.svg'
+ onClicked: {
+ telephony.hangup()
+ soundmgr.disconnect()
+ }
+ }
+ }
+
+ ListView {
+ Layout.fillWidth: true
+ Layout.preferredHeight: 130
+ orientation: Qt.Horizontal
+ clip: true
+ model: CallHistoryModel { id: history }
+
+ delegate: MouseArea {
+ width: root.width / 2.5
+ height: ListView.view.height
+ RowLayout {
+ anchors.fill: parent
+ spacing: 20
+ Image {
+ source: './images/HMI_Phone_Contact_BlankPhoto.svg'
+ }
+ ColumnLayout {
+ Label {
+ Layout.fillWidth: true
+ color: '#59FF7F'
+ text: model.name
+ }
+
+ Label {
+ Layout.fillWidth: true
+ font.pixelSize: 30
+ text: model.number
+ }
+ }
+ }
+ onClicked: root.call(model)
+ }
+ }
+ }
+}