From b07f7afe9221f671535400e8a20c6795dd432fd9 Mon Sep 17 00:00:00 2001
From: Ming Rui Zhang <mingrui.zhang@savoirfairelinux.com>
Date: Thu, 27 Aug 2020 16:46:22 -0400
Subject: [PATCH] mainview: fix crash when deleting account

Fix the deletion crash issue and remove redundant account changed
signals.

Gitlab: #17
Change-Id: I1858fa051fd5171e1261dbc35d361631dc3ea01d
---
 src/accountadapter.cpp                             |  4 ++--
 src/conversationsadapter.cpp                       | 12 +++++++++++-
 src/lrcinstance.h                                  |  3 ++-
 src/mainview/MainView.qml                          | 14 --------------
 src/mainview/components/AccountComboBox.qml        |  5 -----
 .../components/ConversationSmartListView.qml       |  8 --------
 src/mainview/components/SidePanel.qml              |  6 ------
 src/messagesadapter.cpp                            |  8 --------
 src/messagesadapter.h                              |  1 -
 .../CurrentAccountSettingsScrollPage.qml           |  1 -
 .../CurrentSIPAccountSettingScrollPage.qml         |  1 -
 src/smartlistmodel.cpp                             |  2 --
 12 files changed, 15 insertions(+), 50 deletions(-)

diff --git a/src/accountadapter.cpp b/src/accountadapter.cpp
index 9038999e8..2358ece9a 100644
--- a/src/accountadapter.cpp
+++ b/src/accountadapter.cpp
@@ -335,10 +335,10 @@ AccountAdapter::setSelectedAccount(const QString &accountId)
 {
     LRCInstance::setSelectedAccountId(accountId);
 
-    backToWelcomePage();
-
     connectAccount(accountId);
     emit accountSignalsReconnect(accountId);
+
+    backToWelcomePage();
 }
 
 void
diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp
index e077108d3..8d7bb3de7 100644
--- a/src/conversationsadapter.cpp
+++ b/src/conversationsadapter.cpp
@@ -44,6 +44,13 @@ ConversationsAdapter::initQmlObject()
             [this](const QString &accountId, lrc::api::conversation::Info convInfo) {
                 emit showChatView(accountId, convInfo.uid);
             });
+
+    connect(&LRCInstance::instance(), &LRCInstance::currentAccountChanged,
+            [this]() {
+                accountChangedSetUp(LRCInstance::getCurrAccId());
+            });
+
+    connectConversationModel();
 }
 
 void
@@ -124,9 +131,12 @@ void
 ConversationsAdapter::accountChangedSetUp(const QString &accountId)
 {
     // Should be called when current account is changed.
-    auto &accountInfo = LRCInstance::accountModel().getAccountInfo(accountId);
+    conversationSmartListModel_->setAccount(accountId);
+
+    auto& accountInfo = LRCInstance::accountModel().getAccountInfo(accountId);
     currentTypeFilter_ = accountInfo.profileInfo.type;
     LRCInstance::getCurrentConversationModel()->setFilter(accountInfo.profileInfo.type);
+    updateConversationsFilterWidget();
 
     connectConversationModel();
 }
diff --git a/src/lrcinstance.h b/src/lrcinstance.h
index cc28bad83..eafa7324d 100644
--- a/src/lrcinstance.h
+++ b/src/lrcinstance.h
@@ -270,12 +270,13 @@ public:
     setSelectedAccountId(const QString &accountId = {})
     {
         instance().selectedAccountId_ = accountId;
-        emit instance().currentAccountChanged();
         QSettings settings("jami.net", "Jami");
         settings.setValue(SettingsKey::selectedAccount, accountId);
 
         // Last selected account should be set as preferred.
         accountModel().setTopAccount(accountId);
+
+        emit instance().currentAccountChanged();
     };
 
     static const QString &
diff --git a/src/mainview/MainView.qml b/src/mainview/MainView.qml
index a271fab10..5f50ed262 100644
--- a/src/mainview/MainView.qml
+++ b/src/mainview/MainView.qml
@@ -299,12 +299,6 @@ Window {
                     Connections {
                         target: ClientWrapper.accountAdaptor
 
-                        function onAccountSignalsReconnect(accountId) {
-                            CallAdapter.connectCallModel(accountId)
-                            mainViewWindowSidePanel.accountSignalsReconnect(accountId)
-                            ConversationsAdapter.accountChangedSetUp(accountId)
-                        }
-
                         function onUpdateConversationForAddedContact() {
                             mainViewWindowSidePanel.needToUpdateConversationForAddedContact()
                         }
@@ -334,10 +328,6 @@ Window {
                         }
                     }
 
-                    onNeedToUpdateSmartList: {
-                        mainViewWindowSidePanel.updateSmartList(accountId)
-                    }
-
                     onNeedToBackToWelcomePage: {
                         if (!inSettingsView)
                             mainViewWindowSidePanel.accountComboBoxNeedToShowWelcomePage()
@@ -525,10 +515,6 @@ Window {
             qrDialog.updateQrDialog()
         }
 
-        onAccountSignalsReconnect: {
-            MessagesAdapter.accountChangedSetUp(accountId)
-        }
-
         onNeedToUpdateConversationForAddedContact: {
             MessagesAdapter.updateConversationForAddedContact()
             mainViewWindowSidePanel.clearContactSearchBar()
diff --git a/src/mainview/components/AccountComboBox.qml b/src/mainview/components/AccountComboBox.qml
index dce72c8ca..6037d436f 100644
--- a/src/mainview/components/AccountComboBox.qml
+++ b/src/mainview/components/AccountComboBox.qml
@@ -28,7 +28,6 @@ ComboBox {
 
     signal accountChanged(int index)
     signal needToBackToWelcomePage()
-    signal needToUpdateSmartList(string accountId)
     signal newAccountButtonClicked
     signal settingBtnClicked
 
@@ -38,10 +37,6 @@ ComboBox {
         needToBackToWelcomePage()
     }
 
-    function updateSmartList(accountId) {
-        needToUpdateSmartList(accountId)
-    }
-
     // Refresh every item in accountListModel.
     function updateAccountListModel() {
         accountListModel.dataChanged(accountListModel.index(0, 0),
diff --git a/src/mainview/components/ConversationSmartListView.qml b/src/mainview/components/ConversationSmartListView.qml
index d16b96d81..eb7cd0d30 100644
--- a/src/mainview/components/ConversationSmartListView.qml
+++ b/src/mainview/components/ConversationSmartListView.qml
@@ -74,14 +74,6 @@ ListView {
         conversationSmartListView.needToBackToWelcomePage()
     }
 
-
-    /*
-     * Update smartlist to accountId.
-     */
-    function updateSmartList(accountId) {
-        conversationSmartListView.model.setAccount(accountId)
-    }
-
     ConversationSmartListContextMenu {
         id: smartListContextMenu
     }
diff --git a/src/mainview/components/SidePanel.qml b/src/mainview/components/SidePanel.qml
index 736fecb7e..c861e980b 100644
--- a/src/mainview/components/SidePanel.qml
+++ b/src/mainview/components/SidePanel.qml
@@ -34,7 +34,6 @@ Rectangle {
     signal conversationSmartListNeedToAccessMessageWebView(string currentUserDisplayName, string currentUserAlias, string currentUID, bool callStackViewShouldShow, bool isAudioOnly, string callStateStr)
     signal accountComboBoxNeedToShowWelcomePage()
     signal conversationSmartListViewNeedToShowWelcomePage
-    signal accountSignalsReconnect(string accountId)
     signal needToUpdateConversationForAddedContact
     signal needToAddNewAccount
 
@@ -115,11 +114,6 @@ Rectangle {
         conversationSmartListView.updateConversationSmartListView()
     }
 
-    function updateSmartList(accountId) {
-        conversationSmartListView.currentIndex = -1
-        conversationSmartListView.updateSmartList(accountId)
-    }
-
     /*
      * Intended -> since strange behavior will happen without this for stackview.
      */
diff --git a/src/messagesadapter.cpp b/src/messagesadapter.cpp
index 37b477f9e..1220aeb45 100644
--- a/src/messagesadapter.cpp
+++ b/src/messagesadapter.cpp
@@ -146,14 +146,6 @@ MessagesAdapter::sendContactRequest()
     }
 }
 
-void
-MessagesAdapter::accountChangedSetUp(const QString &accountId)
-{
-    Q_UNUSED(accountId)
-
-    connectConversationModel();
-}
-
 void
 MessagesAdapter::updateConversationForAddedContact()
 {
diff --git a/src/messagesadapter.h b/src/messagesadapter.h
index aaf11da72..7a0c2f9e4 100644
--- a/src/messagesadapter.h
+++ b/src/messagesadapter.h
@@ -35,7 +35,6 @@ public:
     Q_INVOKABLE void setupChatView(const QString &uid);
     Q_INVOKABLE void connectConversationModel();
     Q_INVOKABLE void sendContactRequest();
-    Q_INVOKABLE void accountChangedSetUp(const QString &accountId);
     Q_INVOKABLE void updateConversationForAddedContact();
 
     /*
diff --git a/src/settingsview/components/CurrentAccountSettingsScrollPage.qml b/src/settingsview/components/CurrentAccountSettingsScrollPage.qml
index f4fc28500..3a08cbf36 100644
--- a/src/settingsview/components/CurrentAccountSettingsScrollPage.qml
+++ b/src/settingsview/components/CurrentAccountSettingsScrollPage.qml
@@ -333,7 +333,6 @@ Rectangle {
         y: (parent.height - height) / 2
 
         onAccepted: {
-            ClientWrapper.accountAdaptor.setSelectedAccountId()
             ClientWrapper.accountAdaptor.setSelectedConvId()
 
             if(ClientWrapper.utilsAdaptor.getAccountListSize() > 0){
diff --git a/src/settingsview/components/CurrentSIPAccountSettingScrollPage.qml b/src/settingsview/components/CurrentSIPAccountSettingScrollPage.qml
index a4b67ec41..f7f07c35d 100644
--- a/src/settingsview/components/CurrentSIPAccountSettingScrollPage.qml
+++ b/src/settingsview/components/CurrentSIPAccountSettingScrollPage.qml
@@ -82,7 +82,6 @@ Rectangle {
         y: (parent.height - height) / 2
 
         onAccepted: {
-            ClientWrapper.accountAdaptor.setSelectedAccountId()
             ClientWrapper.accountAdaptor.setSelectedConvId()
 
             if(ClientWrapper.utilsAdaptor.getAccountListSize() > 0){
diff --git a/src/smartlistmodel.cpp b/src/smartlistmodel.cpp
index d7783984a..c3957cbb1 100644
--- a/src/smartlistmodel.cpp
+++ b/src/smartlistmodel.cpp
@@ -410,7 +410,5 @@ SmartListModel::flags(const QModelIndex &index) const
 void
 SmartListModel::setAccount(const QString &accountId)
 {
-    beginResetModel();
     accountId_ = accountId;
-    endResetModel();
 }
-- 
GitLab