client-qml: add initial commit

Change-Id: I32bfdd2a618aa7ac6181da2697e241667b010aab
diff --git a/src/mainview/components/OutgoingCallPage.qml b/src/mainview/components/OutgoingCallPage.qml
new file mode 100644
index 0000000..6148d46
--- /dev/null
+++ b/src/mainview/components/OutgoingCallPage.qml
@@ -0,0 +1,229 @@
+
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Layouts 1.14
+import QtQuick.Controls.Universal 2.12
+import net.jami.Models 1.0
+
+import "../../commoncomponents"
+
+Rectangle {
+    id: outgoingCallPageRect
+
+    property int buttonPreferredSize: 50
+    property string callStatusPresentation: "outgoing"
+    property string contactImgSource: ""
+    property string bestName: "Best Name"
+    property string bestId: "Best Id"
+
+    signal callCancelButtonIsClicked
+    signal backButtonIsClicked
+
+    function updateUI(accountId, convUid) {
+        contactImgSource = "data:image/png;base64," + ClientWrapper.utilsAdaptor.getContactImageString(
+                    accountId, convUid)
+        bestName = ClientWrapper.utilsAdaptor.getBestName(accountId, convUid)
+        var id = ClientWrapper.utilsAdaptor.getBestId(accountId, convUid)
+        bestId = (bestName !== id) ? id : ""
+    }
+
+    anchors.fill: parent
+
+    color: "black"
+
+
+    /*
+     * Prevent right click propagate to VideoCallPage.
+     */
+    MouseArea {
+        anchors.fill: parent
+        propagateComposedEvents: false
+        acceptedButtons: Qt.RightButton
+    }
+
+    TintedButton {
+        id: backTintedButton
+
+        anchors.top: outgoingCallPageRect.top
+        anchors.topMargin: 10
+        anchors.left: outgoingCallPageRect.left
+        anchors.leftMargin: 5
+
+        width: 30
+        height: 30
+
+        tintColor: JamiTheme.buttonTintedBlue
+        normalPixmapSource: "qrc:/images/icons/ic_arrow_back_white_24dp.png"
+        selectedPixmapSource: "qrc:/images/icons/ic_arrow_back_white_24dp.png"
+
+        onClicked: {
+            outgoingCallPageRect.backButtonIsClicked()
+        }
+    }
+
+    ColumnLayout {
+        id: outgoingCallPageRectColumnLayout
+
+        anchors.fill: parent
+
+        Image {
+            id: contactImg
+
+            Layout.alignment: Qt.AlignCenter
+
+            Layout.preferredWidth: 100
+            Layout.preferredHeight: 100
+
+            fillMode: Image.PreserveAspectFit
+            source: contactImgSource
+            asynchronous: true
+        }
+
+        Rectangle {
+            id: outgoingCallPageTextRect
+
+            Layout.alignment: Qt.AlignCenter
+            Layout.topMargin: 5
+
+            Layout.preferredWidth: outgoingCallPageRect.width
+            Layout.preferredHeight: jamiBestNameText.height + jamiBestIdText.height
+                                    + callStatusText.height + spinnerImage.height + 20
+
+            color: "transparent"
+
+            ColumnLayout {
+                id: outgoingCallPageTextRectColumnLayout
+
+                Text {
+                    id: jamiBestNameText
+
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: outgoingCallPageTextRect.width
+                    Layout.preferredHeight: 50
+
+                    font.pointSize: JamiTheme.textFontSize + 3
+
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
+
+                    text: textMetricsjamiBestNameText.elidedText
+                    color: "white"
+
+                    TextMetrics {
+                        id: textMetricsjamiBestNameText
+                        font: jamiBestNameText.font
+                        text: bestName
+                        elideWidth: outgoingCallPageTextRect.width - 50
+                        elide: Qt.ElideMiddle
+                    }
+                }
+
+                Text {
+                    id: jamiBestIdText
+
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: outgoingCallPageTextRect.width
+                    Layout.preferredHeight: 30
+
+                    font.pointSize: JamiTheme.textFontSize
+
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
+
+                    text: textMetricsjamiBestIdText.elidedText
+                    color: Qt.lighter("white", 1.5)
+
+                    TextMetrics {
+                        id: textMetricsjamiBestIdText
+                        font: jamiBestIdText.font
+                        text: bestId
+                        elideWidth: outgoingCallPageTextRect.width - 50
+                        elide: Qt.ElideMiddle
+                    }
+                }
+
+                AnimatedImage {
+                    id: spinnerImage
+
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: 20
+                    Layout.preferredHeight: 5
+
+                    source: "qrc:/images/waiting.gif"
+                }
+
+                Text {
+                    id: callStatusText
+
+                    Layout.alignment: Qt.AlignCenter
+                    Layout.preferredWidth: outgoingCallPageTextRect.width
+                    Layout.preferredHeight: 30
+
+                    font.pointSize: JamiTheme.textFontSize
+
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
+
+                    text: callStatusPresentation + "..."
+                    color: Qt.lighter("white", 1.5)
+                }
+            }
+        }
+
+        ColumnLayout {
+            id: callCancelButtonColumnLayout
+
+            Layout.alignment: Qt.AlignCenter
+
+            HoverableButton {
+                id: callCancelButton
+
+                Layout.alignment: Qt.AlignCenter
+
+                Layout.preferredWidth: buttonPreferredSize
+                Layout.preferredHeight: buttonPreferredSize
+
+                backgroundColor: JamiTheme.declineButtonRed
+                onEnterColor: JamiTheme.declineButtonHoverRed
+                onPressColor: JamiTheme.declineButtonPressedRed
+                onReleaseColor: JamiTheme.declineButtonHoverRed
+                onExitColor: JamiTheme.declineButtonRed
+
+                buttonImageHeight: buttonPreferredSize / 2
+                buttonImageWidth: buttonPreferredSize / 2
+                source: "qrc:/images/icons/ic_close_white_24dp.png"
+                radius: 30
+
+                onClicked: {
+                    outgoingCallPageRect.callCancelButtonIsClicked()
+                }
+            }
+
+            Text {
+                id: cancelText
+
+                Layout.alignment: Qt.AlignCenter
+
+                font.pointSize: JamiTheme.textFontSize - 2
+                text: qsTr("Cancel")
+            }
+        }
+    }
+}