/* * Copyright (C) 2020 by Savoir-faire Linux * Author: Mingrui Zhang * * 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 . */ import QtQuick 2.14 import QtQuick.Window 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 "../js/incomingcallpagecreation.js" as IncomingCallPageCreation import "../js/videocallfullscreenwindowcontainercreation.js" as VideoCallFullScreenWindowContainerCreation Rectangle { id: callStackViewWindow anchors.fill: parent /* * When selected conversation is changed, * these values will also be changed. */ property string responsibleConvUid: "" property string responsibleAccountId: "" function needToCloseInCallConversationAndPotentialWindow() { audioCallPage.closeInCallConversation() videoCallPage.closeInCallConversation() /* * Close potential window, context menu releated windows. */ audioCallPage.closeContextMenuAndRelatedWindows() VideoCallFullScreenWindowContainerCreation.closeVideoCallFullScreenWindowContainer() videoCallPage.closeContextMenuAndRelatedWindows() } function setLinkedWebview(webViewId) { audioCallPage.setLinkedWebview(webViewId) videoCallPage.setLinkedWebview(webViewId) } function updateCorrspondingUI() { audioCallPage.updateUI(responsibleAccountId, responsibleConvUid) outgoingCallPage.updateUI(responsibleAccountId, responsibleConvUid) videoCallPage.updateUI(responsibleAccountId, responsibleConvUid) } function showAudioCallPage() { var itemToFind = callStackMainView.find(function (item) { return item.stackNumber === 0 }) if (!itemToFind) { callStackMainView.push(audioCallPage, StackView.Immediate) } else { callStackMainView.pop(itemToFind, StackView.Immediate) } audioCallPage.updateUI(responsibleAccountId, responsibleConvUid) } function showOutgoingCallPage(currentCallStatus) { var itemToFind = callStackMainView.find(function (item) { return item.stackNumber === 1 }) if (!itemToFind) { callStackMainView.push(outgoingCallPage, StackView.Immediate) } else { callStackMainView.pop(itemToFind, StackView.Immediate) } if (currentCallStatus) outgoingCallPage.callStatus = currentCallStatus } function showVideoCallPage(callId) { var itemToFind = callStackMainView.find(function (item) { return item.stackNumber === 2 }) if (!itemToFind) { callStackMainView.push(videoCallPage, StackView.Immediate) } else { callStackMainView.pop(itemToFind, StackView.Immediate) } videoCallPage.updateUI(responsibleAccountId, responsibleConvUid) videoCallPage.setDistantRendererId(callId) } Connections { target: CallAdapter function onShowOutgoingCallPage(accountId, convUid) { /* * Need to check whether it is the current selected conversation. */ if (responsibleConvUid === convUid && responsibleAccountId === accountId) { showOutgoingCallPage() } } function onShowIncomingCallPage(accountId, convUid) { /* * Check is done within the js. */ IncomingCallPageCreation.createincomingCallPageWindowObjects( accountId, convUid) IncomingCallPageCreation.showIncomingCallPageWindow(accountId, convUid) } function onClosePotentialIncomingCallPageWindow(accountId, convUid) { IncomingCallPageCreation.closeIncomingCallPageWindow(accountId, convUid) } function onShowAudioCallPage(accountId, convUid) { if (responsibleConvUid === convUid && responsibleAccountId === accountId) { showAudioCallPage() } } function onShowVideoCallPage(accountId, convUid, callId) { if (responsibleConvUid === convUid && responsibleAccountId === accountId) { showVideoCallPage(callId) } } function onCallStatusChanged(status, accountId, convUid) { if (responsibleConvUid === convUid && responsibleAccountId === accountId) { outgoingCallPage.callStatus = status } } function onUpdateParticipantsInfos(infos, accountId, callId) { var responsibleCallId = ClientWrapper.utilsAdaptor.getCallId(responsibleAccountId, responsibleConvUid) if (responsibleCallId === callId) { videoCallPage.handleParticipantsInfo(infos) } } } AudioCallPage { id: audioCallPage property int stackNumber: 0 } OutgoingCallPage { id: outgoingCallPage property int stackNumber: 1 onCallCancelButtonIsClicked: { CallAdapter.hangUpACall(responsibleAccountId, responsibleConvUid) } } VideoCallPage { id: videoCallPage property int stackNumber: 2 property bool isFullscreen: false onNeedToShowInFullScreen: { isFullscreen = !isFullscreen VideoCallFullScreenWindowContainerCreation.createvideoCallFullScreenWindowContainerObject() if (!VideoCallFullScreenWindowContainerCreation.checkIfVisible()) { VideoCallFullScreenWindowContainerCreation.setAsContainerChild( videoCallPage) VideoCallFullScreenWindowContainerCreation.showVideoCallFullScreenWindowContainer() } else { videoCallPage.parent = callStackMainView VideoCallFullScreenWindowContainerCreation.closeVideoCallFullScreenWindowContainer() } videoCallPage.handleParticipantsInfo(CallAdapter.getConferencesInfos()) } } StackView { id: callStackMainView anchors.fill: parent initialItem: outgoingCallPage } }