From c8008c5414d0cd7b58c6fffddc1f310e56bbd4c2 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Tue, 18 May 2021 12:46:54 -0400
Subject: [PATCH] fix: in-call chat view opening and closing

- fixes the in-call chat view requiring reselection to open
- fixes the in-call chat view staying open, on top of the principal
  chat view when a call ends

Gitlab: #415
Gitlab: #416
Change-Id: Idcfaaf263d5d53451dedf955ce441f0a705309a9
---
 src/mainview/components/AudioCallPage.qml     | 37 ++++++++-----------
 src/mainview/components/CallOverlay.qml       |  2 +
 src/mainview/components/CallStackView.qml     | 14 +++----
 .../components/CallViewContextMenu.qml        |  8 ++++
 src/mainview/components/VideoCallPage.qml     | 37 ++++++++-----------
 5 files changed, 49 insertions(+), 49 deletions(-)

diff --git a/src/mainview/components/AudioCallPage.qml b/src/mainview/components/AudioCallPage.qml
index 670aaf135..8d5cf229d 100644
--- a/src/mainview/components/AudioCallPage.qml
+++ b/src/mainview/components/AudioCallPage.qml
@@ -51,14 +51,22 @@ Rectangle {
                     closeInCallConversation)
     }
 
+    function openInCallConversation() {
+        if (linkedWebview) {
+            linkedWebview.resetMessagingHeaderBackButtonSource(false)
+            linkedWebview.setMessagingHeaderButtonsVisible(false)
+        }
+        inAudioCallMessageWebViewStack.visible = true
+        inAudioCallMessageWebViewStack.push(linkedWebview)
+    }
+
     function closeInCallConversation() {
-        if (inAudioCallMessageWebViewStack.visible) {
-            linkedWebview.resetMessagingHeaderBackButtonSource(
-                        true)
+        if (linkedWebview) {
+            linkedWebview.resetMessagingHeaderBackButtonSource(true)
             linkedWebview.setMessagingHeaderButtonsVisible(true)
-            inAudioCallMessageWebViewStack.visible = false
-            inAudioCallMessageWebViewStack.clear()
         }
+        inAudioCallMessageWebViewStack.visible = false
+        inAudioCallMessageWebViewStack.clear()
     }
 
     function closeContextMenuAndRelatedWindows() {
@@ -136,22 +144,9 @@ Rectangle {
                     }
 
                     onOverlayChatButtonClicked: {
-                        if (inAudioCallMessageWebViewStack.visible) {
-                            linkedWebview.resetMessagingHeaderBackButtonSource(
-                                        true)
-                            linkedWebview.setMessagingHeaderButtonsVisible(
-                                        true)
-                            inAudioCallMessageWebViewStack.visible = false
-                            inAudioCallMessageWebViewStack.clear()
-                        } else {
-                            linkedWebview.resetMessagingHeaderBackButtonSource(
-                                        false)
-                            linkedWebview.setMessagingHeaderButtonsVisible(
-                                        false)
-                            inAudioCallMessageWebViewStack.visible = true
-                            inAudioCallMessageWebViewStack.push(
-                                        linkedWebview)
-                        }
+                        inAudioCallMessageWebViewStack.visible ?
+                                    closeInCallConversation() :
+                                    openInCallConversation()
                     }
                 }
 
diff --git a/src/mainview/components/CallOverlay.qml b/src/mainview/components/CallOverlay.qml
index 2fbfa43a7..a3a5cba9d 100644
--- a/src/mainview/components/CallOverlay.qml
+++ b/src/mainview/components/CallOverlay.qml
@@ -44,6 +44,8 @@ Rectangle {
 
     signal overlayChatButtonClicked
 
+    onVisibleChanged: if (!visible) callViewContextMenu.close()
+
     function setRecording(localIsRecording) {
         callViewContextMenu.localIsRecording = localIsRecording
         recordingRect.visible = localIsRecording
diff --git a/src/mainview/components/CallStackView.qml b/src/mainview/components/CallStackView.qml
index 31d7816ff..b8b4eabd1 100644
--- a/src/mainview/components/CallStackView.qml
+++ b/src/mainview/components/CallStackView.qml
@@ -50,25 +50,25 @@ Rectangle {
     property string responsibleConvUid: ""
     property string responsibleAccountId: ""
 
+    // TODO: this should all be done by listening to
+    // parent visibility change or parent `Component.onDestruction`
     function needToCloseInCallConversationAndPotentialWindow() {
         // Close potential window, context menu releated windows.
-        if (!callStackMainView.currentItem)
-            return
-        if (callStackMainView.currentItem.stackNumber === CallStackView.AudioPageStack) {
+        if (audioCallPage) {
             audioCallPage.closeInCallConversation()
             audioCallPage.closeContextMenuAndRelatedWindows()
-        } else if (callStackMainView.currentItem.stackNumber === CallStackView.VideoPageStack) {
+        }
+        if (videoCallPage) {
             videoCallPage.closeInCallConversation()
             videoCallPage.closeContextMenuAndRelatedWindows()
         }
     }
 
     function setLinkedWebview(webViewId) {
-        if (callStackMainView.currentItem.stackNumber === CallStackView.AudioPageStack) {
+        if (audioCallPage)
             audioCallPage.setLinkedWebview(webViewId)
-        } else if (callStackMainView.currentItem.stackNumber === CallStackView.VideoPageStack) {
+        if (videoCallPage)
             videoCallPage.setLinkedWebview(webViewId)
-        }
     }
 
     function getItemFromStack(itemNumber) {
diff --git a/src/mainview/components/CallViewContextMenu.qml b/src/mainview/components/CallViewContextMenu.qml
index f8b8c86ea..9ea09aaa6 100644
--- a/src/mainview/components/CallViewContextMenu.qml
+++ b/src/mainview/components/CallViewContextMenu.qml
@@ -44,6 +44,14 @@ Item {
     signal pluginItemClicked
     signal transferCallButtonClicked
 
+    function close() {
+        // leave this debug line is a reminder of a design failure
+        console.debug("call view context menu close")
+        const menu = ContextMenuGenerator.getMenu()
+        if (menu)
+            menu.close()
+    }
+
     function openMenu(){
         ContextMenuGenerator.initMenu()
         if (isSIP){
diff --git a/src/mainview/components/VideoCallPage.qml b/src/mainview/components/VideoCallPage.qml
index 1f0a33b1a..b9ac3bb5b 100644
--- a/src/mainview/components/VideoCallPage.qml
+++ b/src/mainview/components/VideoCallPage.qml
@@ -63,14 +63,22 @@ Rectangle {
                     closeInCallConversation)
     }
 
+    function openInCallConversation() {
+        if (linkedWebview) {
+            linkedWebview.resetMessagingHeaderBackButtonSource(false)
+            linkedWebview.setMessagingHeaderButtonsVisible(false)
+        }
+        inVideoCallMessageWebViewStack.visible = true
+        inVideoCallMessageWebViewStack.push(linkedWebview)
+    }
+
     function closeInCallConversation() {
-        if (inVideoCallMessageWebViewStack.visible) {
-            linkedWebview.resetMessagingHeaderBackButtonSource(
-                        true)
+        if (linkedWebview) {
+            linkedWebview.resetMessagingHeaderBackButtonSource(true)
             linkedWebview.setMessagingHeaderButtonsVisible(true)
-            inVideoCallMessageWebViewStack.visible = false
-            inVideoCallMessageWebViewStack.clear()
         }
+        inVideoCallMessageWebViewStack.visible = false
+        inVideoCallMessageWebViewStack.clear()
     }
 
     function closeContextMenuAndRelatedWindows() {
@@ -200,22 +208,9 @@ Rectangle {
                     }
 
                     onOverlayChatButtonClicked: {
-                        if (inVideoCallMessageWebViewStack.visible) {
-                            linkedWebview.resetMessagingHeaderBackButtonSource(
-                                        true)
-                            linkedWebview.setMessagingHeaderButtonsVisible(
-                                        true)
-                            inVideoCallMessageWebViewStack.visible = false
-                            inVideoCallMessageWebViewStack.clear()
-                        } else {
-                            linkedWebview.resetMessagingHeaderBackButtonSource(
-                                        false)
-                            linkedWebview.setMessagingHeaderButtonsVisible(
-                                        false)
-                            inVideoCallMessageWebViewStack.visible = true
-                            inVideoCallMessageWebViewStack.push(
-                                        linkedWebview)
-                        }
+                        inVideoCallMessageWebViewStack.visible ?
+                                    closeInCallConversation() :
+                                    openInCallConversation()
                     }
                 }
 
-- 
GitLab