From 4fd15aa84316d02e548da721b9eb21e409c9504f Mon Sep 17 00:00:00 2001
From: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
Date: Tue, 12 Jan 2016 09:29:58 -0500
Subject: [PATCH] contactmethod: update lastUsed with text timestamp

ContactMethods were updated based on calls timestamps
This commit updates the last used timestamp when a new text message
is added to the contactmethod.

Tuleap: #202
Change-Id: I2e4ba288ca5004936d52f6848b931367fbf888f4
---
 src/contactmethod.cpp         | 34 ++++++++++++++++++----------------
 src/contactmethod.h           |  3 ++-
 src/media/textrecording.cpp   |  4 ++--
 src/private/textrecording_p.h |  2 +-
 4 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/src/contactmethod.cpp b/src/contactmethod.cpp
index 60600550..68331721 100644
--- a/src/contactmethod.cpp
+++ b/src/contactmethod.cpp
@@ -294,6 +294,15 @@ bool ContactMethod::setType(ContactMethod::Type t)
    return false;
 }
 
+///Update the last time used only if t is more recent than m_LastUsed
+void ContactMethod::setLastUsed(time_t t)
+{
+    if (t > d_ptr->m_LastUsed) {
+       d_ptr->m_LastUsed = t;
+       emit lastUsedChanged(t);
+    }
+}
+
 ///Set if this number is tracking presence information
 void ContactMethod::setTracked(bool track)
 {
@@ -490,7 +499,7 @@ QVariant ContactMethod::roleData(int role) const
          break;
       case static_cast<int>(Ring::Role::LastUsed):
       case static_cast<int>(Call::Role::Date):
-         cat = cat = !lastCall ? QVariant() : QDateTime::fromTime_t(lastCall->startTimeStamp());
+         cat = d_ptr->m_LastUsed <= 0 ? QVariant() : QDateTime::fromTime_t(d_ptr->m_LastUsed);
          break;
       case static_cast<int>(Ring::Role::Length):
       case static_cast<int>(Call::Role::Length):
@@ -498,16 +507,14 @@ QVariant ContactMethod::roleData(int role) const
          break;
       case static_cast<int>(Ring::Role::FormattedLastUsed):
       case static_cast<int>(Call::Role::FormattedDate):
-         cat = !lastCall ? QVariant() : HistoryTimeCategoryModel::timeToHistoryCategory(lastCall->startTimeStamp());
+      case static_cast<int>(Call::Role::FuzzyDate):
+         cat = HistoryTimeCategoryModel::timeToHistoryCategory(d_ptr->m_LastUsed);
          break;
       case static_cast<int>(Ring::Role::IndexedLastUsed):
-         return QVariant(static_cast<int>(HistoryTimeCategoryModel::timeToHistoryConst(lastCall->startTimeStamp())));
+         return QVariant(static_cast<int>(HistoryTimeCategoryModel::timeToHistoryConst(d_ptr->m_LastUsed)));
       case static_cast<int>(Call::Role::HasAVRecording):
          cat = cat = !lastCall ? QVariant() : lastCall->isAVRecording();
          break;
-      case static_cast<int>(Call::Role::FuzzyDate):
-         cat = cat = !lastCall ? QVariant() : HistoryTimeCategoryModel::timeToHistoryCategory(lastCall->startTimeStamp());
-         break;
       case static_cast<int>(Call::Role::ContactMethod):
       case static_cast<int>(Ring::Role::Object):
       case static_cast<int>(Role::Object):
@@ -576,17 +583,12 @@ void ContactMethod::addCall(Call* call)
 
    d_ptr->callAdded(call);
 
-   if (call->startTimeStamp() > d_ptr->m_LastUsed) {
-      d_ptr->m_LastUsed = call->startTimeStamp();
+   setLastUsed(call->startTimeStamp());
 
-      if (d_ptr->m_LastUsed)
-         emit lastUsedChanged(d_ptr->m_LastUsed);
-
-      //Notify the account directly. This avoid having to track all contact
-      //methods from there
-      if (d_ptr->m_pAccount && d_ptr->m_pAccount->d_ptr->m_LastUsed < d_ptr->m_LastUsed)
-         d_ptr->m_pAccount->d_ptr->m_LastUsed = d_ptr->m_LastUsed;
-   }
+   //Notify the account directly. This avoid having to track all contact
+   //methods from there
+   if (d_ptr->m_pAccount && d_ptr->m_pAccount->d_ptr->m_LastUsed < d_ptr->m_LastUsed)
+      d_ptr->m_pAccount->d_ptr->m_LastUsed = d_ptr->m_LastUsed;
 
    d_ptr->changed();
 
diff --git a/src/contactmethod.h b/src/contactmethod.h
index 83bb652c..b823fe5a 100644
--- a/src/contactmethod.h
+++ b/src/contactmethod.h
@@ -65,7 +65,7 @@ public:
    //Properties
    Q_PROPERTY(Account*          account          READ account           WRITE setAccount              )
    Q_PROPERTY(Person*           person           READ contact           WRITE setPerson               )
-   Q_PROPERTY(int               lastUsed         READ lastUsed                                        )
+   Q_PROPERTY(int               lastUsed         READ lastUsed          WRITE setLastUsed             )
    Q_PROPERTY(QString           uri              READ uri                                             )
    Q_PROPERTY(int               callCount        READ callCount                                       )
    Q_PROPERTY(QList<Call*>      calls            READ calls                                           )
@@ -143,6 +143,7 @@ public:
    void             setBookmarked(bool                bookmarked);
    void             setUid       (const QString&      uri       );
    bool             setType      (ContactMethod::Type t         );
+   void             setLastUsed  (time_t              t         );
 
    //Mutator
    Q_INVOKABLE void addCall(Call* call);
diff --git a/src/media/textrecording.cpp b/src/media/textrecording.cpp
index a8663cd3..c2a0d8f4 100644
--- a/src/media/textrecording.cpp
+++ b/src/media/textrecording.cpp
@@ -282,9 +282,8 @@ Media::TextRecording* Media::TextRecording::fromJson(const QList<QJsonObject>& i
    return t;
 }
 
-void Media::TextRecordingPrivate::insertNewMessage(const QMap<QString,QString>& message, const ContactMethod* cm, Media::Media::Direction direction)
+void Media::TextRecordingPrivate::insertNewMessage(const QMap<QString,QString>& message, ContactMethod* cm, Media::Media::Direction direction)
 {
-
     //Only create it if none was found on the disk
     if (!m_pCurrentGroup) {
         m_pCurrentGroup = new Serializable::Group();
@@ -356,6 +355,7 @@ void Media::TextRecordingPrivate::insertNewMessage(const QMap<QString,QString>&
    //Save the conversation
    q_ptr->save();
 
+   cm->setLastUsed(currentTime);
    emit q_ptr->messageInserted(message, const_cast<ContactMethod*>(cm), direction);
 }
 
diff --git a/src/private/textrecording_p.h b/src/private/textrecording_p.h
index e3ffedc2..52372434 100644
--- a/src/private/textrecording_p.h
+++ b/src/private/textrecording_p.h
@@ -161,7 +161,7 @@ public:
    QAbstractItemModel*         m_pTextMessagesModels {nullptr};
 
    //Helper
-   void insertNewMessage(const QMap<QString,QString>& message, const ContactMethod* cm, Media::Media::Direction direction);
+   void insertNewMessage(const QMap<QString,QString>& message, ContactMethod* cm, Media::Media::Direction direction);
    QHash<QByteArray,QByteArray> toJsons() const;
 
 private:
-- 
GitLab