Integrated friendlistview with dev.
[situare] / src / situareservice / situareservice.cpp
index f801cd2..7397908 100644 (file)
    USA.
 */
 
+#include <QtAlgorithms>
 #include <QDebug>
 #include <QtGlobal>
 #include <QStringList>
+#include <QPixmap>
+#include <QNetworkReply>
 #include "situareservice.h"
 #include "situarecommon.h"
 #include "../cookiehandler/cookiehandler.h"
@@ -32,11 +35,14 @@ SituareService::SituareService(QObject *parent, QNetworkAccessManager *manager)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    connect(&m_facebookAuthentication, SIGNAL(credentialsReady()), SLOT(credentialsReady()));
-
     connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), SLOT(requestFinished(QNetworkReply*)));
 
-    m_credentials = m_facebookAuthentication.loginCredentials();
+    m_imageFetcher = new ImageFetcher(new QNetworkAccessManager(this), this);
+    connect(this, SIGNAL(fetchImage(QUrl)), m_imageFetcher, SLOT(fetchImage(QUrl)));
+    connect(m_imageFetcher, SIGNAL(imageReceived(QUrl,QPixmap)), this,
+            SLOT(imageReceived(QUrl, QPixmap)));
+
+    m_user = NULL;
 }
 
 SituareService::~SituareService()
@@ -44,6 +50,16 @@ SituareService::~SituareService()
     qDebug() << __PRETTY_FUNCTION__;
 
     delete m_networkManager;
+    m_networkManager = NULL;
+    if(m_user) {
+        delete m_user;
+        m_user = NULL;
+    }
+    delete m_imageFetcher;
+    m_imageFetcher = NULL;
+
+    qDeleteAll(m_friendsList.begin(), m_friendsList.end());
+    m_friendsList.clear();
 }
 
 void SituareService::fetchLocations()
@@ -219,16 +235,22 @@ void SituareService::requestFinished(QNetworkReply *reply)
     reply->deleteLater();
 }
 
-void SituareService::credentialsReady()
+void SituareService::credentialsReady(const FacebookCredentials &credentials)
 {
     qDebug() << __PRETTY_FUNCTION__;
-    m_credentials = m_facebookAuthentication.loginCredentials();
+    m_credentials = credentials;
+    
 }
 
 void SituareService::parseUserData(const QByteArray &jsonReply)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    m_visited = 0;
+    m_nbrOfImages = 0;
+    qDeleteAll(m_friendsList.begin(), m_friendsList.end());
+    m_friendsList.clear();
+
     QJson::Parser parser;
     bool ok;
 
@@ -239,8 +261,6 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
         exit (1);
     }
 
-    QList<User *> friendsList;
-
     QVariant userVariant = result.value("user");
     QMap<QString, QVariant> userMap = userVariant.toMap();
 
@@ -248,7 +268,7 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
 
     QUrl imageUrl = userMap["profile_pic"].toUrl();
 
-    User user = User(userMap["address"].toString(), coordinates, userMap["name"].toString(),
+    m_user = new User(userMap["address"].toString(), coordinates, userMap["name"].toString(),
                   userMap["note"].toString(), imageUrl, userMap["timestamp"].toString(),
                   true, userMap["uid"].toString());
 
@@ -261,12 +281,54 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
 
       QUrl imageUrl = friendMap["profile_pic"].toUrl();
 
+//      if (imageUrl.isEmpty())
+//          imageUrl = QUrl("http://static.ak.fbcdn.net/pics/q_silhouette.gif");
+
       User *user = new User(friendMap["address"].toString(), coordinates, friendMap["name"].toString(),
                             friendMap["note"].toString(), imageUrl, friendMap["timestamp"].toString(),
                             false, friendMap["uid"].toString(), distanceMap["units"].toString(),
                             distanceMap["value"].toDouble());
 
-      friendsList.append(user);
+      m_friendsList.append(user);
+    }
+    addProfileImages();
+}
+
+void SituareService::imageReceived(const QUrl &url, const QPixmap &image)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+    qDebug() << "Image URL: " << url << " size :" << image.size();
+
+    if(m_user->profileImageUrl() == url) {
+        m_user->setProfileImage(image);
+    }
+
+    for(int i=0;i<m_friendsList.count();i++) {
+        if(m_friendsList.at(i)->profileImageUrl() == url) {
+            m_friendsList.at(i)->setProfileImage(image);
+            m_nbrOfImages++; // indicates how many friend profile images has been downloaded
+        }
+    }
+
+    if(m_nbrOfImages == m_visited) {
+        qDebug() << "m_nbrOfImages: " << m_nbrOfImages << " m_visited: " << m_visited;
+        qDebug() << "emit userDataChanged";
+        emit userDataChanged(m_user, m_friendsList);
+    }
+}
+
+void SituareService::addProfileImages()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if(!m_user->profileImageUrl().isEmpty() && m_user->profileImageUrl().isValid()) {
+        emit fetchImage(m_user->profileImageUrl());
+    }
+
+    for(int i=0;i<m_friendsList.count();i++) {
+        if(!m_friendsList.at(i)->profileImageUrl().isEmpty() && m_user->profileImageUrl().isValid()) {
+            m_visited++; // indicates how many friends that have profile image
+            emit fetchImage(m_friendsList.at(i)->profileImageUrl());
+        }
     }
-    emit userDataChanged(user, friendsList);
 }