Add sample application[phone]
[staging/soundmanager.git] / sample / phone / app / Dialer.qml
diff --git a/sample/phone/app/Dialer.qml b/sample/phone/app/Dialer.qml
new file mode 100644 (file)
index 0000000..1314826
--- /dev/null
@@ -0,0 +1,280 @@
+/*
+ * 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)
+            }
+        }
+    }
+}