refactor: implement new lrc api

- use new lrc models for
 - smartlist
 - conversation view
 - account selector

Change-Id: I0a009d4e9be6f84100f49ba176d853e05364c351
diff --git a/callwidget.h b/callwidget.h
index f77d82e..9fb6178 100644
--- a/callwidget.h
+++ b/callwidget.h
@@ -1,8 +1,9 @@
 /**************************************************************************
-* Copyright (C) 2015-2017 by Savoir-faire Linux                           *
+* Copyright (C) 2015-2018 by Savoir-faire Linux                           *
 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
 * Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com>          *
 * Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com>          *
+* Author: Andreas Traczyk <andreas.traczyk@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    *
@@ -29,7 +30,9 @@
 
 #include "navwidget.h"
 #include "instantmessagingwidget.h"
+#include "smartlistmodel.h"
 
+// old LRC
 #include "callmodel.h"
 #include "video/renderer.h"
 #include "video/previewmanager.h"
@@ -37,7 +40,16 @@
 #include "categorizedhistorymodel.h"
 #include "media/textrecording.h"
 
-class SmartListDelegate;
+// new LRC
+#include "globalinstances.h"
+#include "api/newaccountmodel.h"
+#include "api/conversationmodel.h"
+#include "api/account.h"
+#include "api/contact.h"
+#include "api/contactmodel.h"
+#include "api/newcallmodel.h"
+
+class ConversationItemDelegate;
 class ImDelegate;
 class QPropertyAnimation;
 
@@ -52,18 +64,22 @@
 public:
     explicit CallWidget(QWidget* parent = 0);
     ~CallWidget();
-    void atExit();
     bool findRingAccount();
 
 public slots:
+    void on_ringContactLineEdit_returnPressed();
+
+public slots:
     void settingsButtonClicked();
     void showIMOutOfCall(const QModelIndex& nodeIdx);
-    void btnComBarVideoClicked();
-
-//UI SLOTS
-public slots:
-    void on_ringContactLineEdit_returnPressed();
-    inline void on_entered(const QModelIndex& i){if (i.isValid()) highLightedIndex_ = i;}
+    void slotAcceptInviteClicked(const QModelIndex& index);
+    void slotBlockInviteClicked(const QModelIndex& index);
+    void slotIgnoreInviteClicked(const QModelIndex& index);
+    void slotCustomContextMenuRequested(const QPoint & pos);
+    void slotShowCallView(const std::string & accountId, const lrc::api::conversation::Info & convInfo);
+    void slotShowIncomingCallView(const std::string & accountId, const lrc::api::conversation::Info & convInfo);
+    void slotShowChatView(const std::string & accountId, const lrc::api::conversation::Info & convInfo);
+    void update();
 
 private slots:
     void on_acceptButton_clicked();
@@ -82,55 +98,75 @@
     void on_pendingCRBackButton_clicked();
 
 private slots:
-    void callIncoming(Call* call);
-    void callStateChanged(Call* call, Call::State previousState);
-    void smartListCurrentChanged(const QModelIndex &currentIdx, const QModelIndex &previousIdx);
+    void smartListSelectionChanged(const QItemSelection  &selected, const QItemSelection  &deselected);
     void contactReqListCurrentChanged(const QModelIndex &currentIdx, const QModelIndex &previousIdx);
     void slotAccountMessageReceived(const QMap<QString,QString> message,ContactMethod* cm, media::Media::Direction dir);
-    void onIncomingMessage(::media::TextRecording* t, ContactMethod* cm);
-    void callChangedSlot();
-    void contactLineEdit_registeredNameFound(Account *account, NameDirectory::LookupStatus status, const QString& address, const QString& name);
-    void searchBtnClicked();
-    void selectedAccountChanged(const QModelIndex &current, const QModelIndex &previous);
-    void on_contactMethodComboBox_currentIndexChanged(int index);
-    void on_contactRequestList_clicked(const QModelIndex &index);
+    void onIncomingMessage(const std::string & convUid, uint64_t interactionId, const lrc::api::interaction::Info & interaction);
+    void currentAccountChanged(const QModelIndex &current);
 
 private:
-    Ui::CallWidget* ui;
-    Call* actualCall_;
-    Video::Renderer* videoRenderer_;
-    CallModel* callModel_;
-    int outputVolume_;
-    int inputVolume_;
+    void placeCall();
+    void conversationsButtonClicked();
+    void invitationsButtonClicked();
+    void setupOutOfCallIM();
+    void setupSmartListContextMenu(const QPoint &pos);
+    void setupQRCode(QString ringID);
+    void backToWelcomePage();
+    void triggerDeleteContactDialog(ContactMethod *cm, Account *ac);
+
+    // lrc
+    void selectConversation(const QModelIndex& index);
+    bool selectConversation(const lrc::api::conversation::Info& item,
+        lrc::api::ConversationModel& convModel);
+    void deselectConversation();
+    bool connectConversationModel();
+    void updateConversationView(const std::string& convUid);
+    void showConversationView();
+    void selectSmartlistItem(const std::string& convUid);
+    QImage imageForConv(const std::string & convUid);
+    void processContactLineEdit();
+    void hideMiniSpinner();
+    void updateConversationForNewContact(const std::string& convUid);
+    void updateSmartList();
+    void setSelectedAccount(const std::string & accountId);
+    void setConversationFilter(const QString& filter);
+    void setConversationFilter(lrc::api::profile::Type filter);
+    void updateConversationsFilterWidget();
+    const std::string& selectedAccountId();
+    const std::string& selectedConvUid();
+
     QMenu* menu_;
-    SmartListDelegate* smartListDelegate_;
-    QPersistentModelIndex highLightedIndex_;
+    ConversationItemDelegate* conversationItemDelegate_;
     ImDelegate* imDelegate_;
+
     QMetaObject::Connection imConnection_;
     QMetaObject::Connection imVisibleConnection_;
     QMetaObject::Connection callChangedConnection_;
     QMetaObject::Connection imClickedConnection_;
     QMetaObject::Connection crListSelectionConnection_;
-    QPropertyAnimation* pageAnim_;
-    QMenu* shareMenu_;
+
+    Ui::CallWidget* ui;
     QMovie* miniSpinner_;
 
     constexpr static int qrSize_ = 200;
 
-private:
-    void setActualCall(Call* value);
-    void placeCall();
-    void setupOutOfCallIM();
-    void setupSmartListMenu(const QPoint &pos);
-    void slidePage(QWidget* widget, bool toRight = false);
-    void callStateToView(Call* value);
-    void setupQRCode(QString ringID);
-    void searchContactLineEditEntry(const URI &uri);
-    bool uriNeedNameLookup(const URI uri_passed);
-    void processContactLineEdit();
-    static Account* getSelectedAccount();
-    static bool shouldDisplayInviteButton(ContactMethod& cm);
-    void backToWelcomePage();
-    void hideMiniSpinner();
-    void triggerDeleteContactDialog(ContactMethod *cm, Account *ac);
+    // lrc
+    Video::Renderer* videoRenderer_;
+    std::string lastConvUid_ {};
+    lrc::api::profile::Type currentTypeFilter_{};
+
+    std::unique_ptr<SmartListModel> smartListModel_;
+    std::unique_ptr<MessageModel> messageModel_;
+    QMetaObject::Connection modelSortedConnection_;
+    QMetaObject::Connection modelUpdatedConnection_;
+    QMetaObject::Connection filterChangedConnection_;
+    QMetaObject::Connection newConversationConnection_;
+    QMetaObject::Connection conversationRemovedConnection_;
+    QMetaObject::Connection newInteractionConnection_;
+    QMetaObject::Connection interactionStatusUpdatedConnection_;
+    QMetaObject::Connection conversationClearedConnection;
+    QMetaObject::Connection selectedCallChanged_;
+    QMetaObject::Connection smartlistSelectionConnection_;
+
+
 };