User data optimization. Only changed profile images will be downloaded, except
authorlampehe-local <henri.lampela@ixonos.com>
Mon, 5 Jul 2010 12:43:09 +0000 (15:43 +0300)
committerlampehe-local <henri.lampela@ixonos.com>
Mon, 5 Jul 2010 12:43:09 +0000 (15:43 +0300)
silhouette. User data is now available for UI as soon as it is parsed. Images
are downloaded one by one after parsed data is in UI.

Reviewed by: Pekka Nissinen

src/map/frienditemshandler.cpp
src/situareservice/situareservice.cpp
src/situareservice/situareservice.h

index 6f81d35..8286f7f 100644 (file)
@@ -3,6 +3,7 @@
     Copyright (C) 2010  Ixonos Plc. Authors:
 
         Sami Rämö - sami.ramo@ixonos.com
+        Henri Lampela - henri.lampela@ixonos.com
 
     Situare is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License
index fa1af86..c046ebb 100644 (file)
@@ -311,14 +311,6 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
             return;
         } else if(result.contains("user")) {
 
-            qDeleteAll(m_friendsList.begin(), m_friendsList.end());
-            m_friendsList.clear();
-
-            if(m_user) {
-                delete m_user;
-                m_user = 0;
-            }
-
             QVariant userVariant = result.value("user");
             QMap<QString, QVariant> userMap = userVariant.toMap();
 
@@ -339,10 +331,12 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
                 address = location.join(", ");
             }
 
-            m_user = new User(address, coordinates, userMap["name"].toString(),
+            User user = User(address, coordinates, userMap["name"].toString(),
                           userMap["note"].toString(), imageUrl, userMap["timestamp"].toString(),
                           true, userMap["uid"].toString());
 
+            QList<User> tmpFriendsList;
+
             foreach (QVariant friendsVariant, result["friends"].toList()) {
               QMap<QString, QVariant> friendMap = friendsVariant.toMap();
               QVariant distance = friendMap["distance"];
@@ -365,18 +359,81 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
                   address = location.join(", ");
               }
 
-              User *user = new User(address, coordinates,
-                                    friendMap["name"].toString(),
-                                    friendMap["note"].toString(), imageUrl,
-                                    friendMap["timestamp"].toString(),
-                                    false, friendMap["uid"].toString(),
-                                    distanceMap["units"].toString(),
-                                    distanceMap["value"].toDouble());
+              User buddy = User(address, coordinates, friendMap["name"].toString(),
+                               friendMap["note"].toString(), imageUrl,
+                               friendMap["timestamp"].toString(),
+                               false, friendMap["uid"].toString(), distanceMap["units"].toString(),
+                               distanceMap["value"].toDouble());
+
+              tmpFriendsList.append(buddy);
+            }
+
+            QList<QUrl> imageUrlList; // url list for images
+
+            // set unchanged profile images or add new images to imageUrlList for downloading
+            if(m_user) {
+                if(m_user->profileImageUrl() != user.profileImageUrl()) {
+                    if(!user.profileImageUrl().isEmpty())
+                        imageUrlList.append(user.profileImageUrl());
+                } else {
+                    user.setProfileImage(m_user->profileImage());
+                }
+            } else {
+                if(!user.profileImageUrl().isEmpty())
+                    imageUrlList.append(user.profileImageUrl());
+            }
+
+            // clear old user object
+            if(m_user) {
+                delete m_user;
+                m_user = 0;
+            }
 
-              m_friendsList.append(user);
+            // create new user object from temporary user object
+            m_user = new User(user);
+
+            // set unchanged profile images or add new images to imageUrlList for downloading
+            if(!m_friendsList.isEmpty()) {
+                foreach(User tmpBuddy, tmpFriendsList) {
+                    if(!tmpBuddy.profileImageUrl().isEmpty()) {
+                        bool found = false;
+                        foreach(User *buddy, m_friendsList) {
+                            if(tmpBuddy.profileImageUrl() == buddy->profileImageUrl()) {
+                                tmpBuddy.setProfileImage(buddy->profileImage());
+                                found = true;
+                                break;
+                            }
+                        }
+                        if(!found && !tmpBuddy.profileImageUrl().isEmpty())
+                            imageUrlList.append(tmpBuddy.profileImageUrl());
+                    }
+                }
+            } else {
+                foreach(User buddy, tmpFriendsList) {
+                    if(!buddy.profileImageUrl().isEmpty())
+                        imageUrlList.append(buddy.profileImageUrl());
+                }
             }
+
+            // clear old friendlist
+            qDeleteAll(m_friendsList.begin(), m_friendsList.end());
+            m_friendsList.clear();
+
+            // populate new friendlist with temporary friendlist's data
+            foreach(User tmpFriendItem, tmpFriendsList) {
+                User *friendItem = new User(tmpFriendItem);
+                m_friendsList.append(friendItem);
+            }
+            tmpFriendsList.clear();
+
             emit userDataChanged(m_user, m_friendsList);
-            addProfileImages();
+
+            // set silhouette image to imageUrlList for downloading
+            if(m_defaultImage)
+                imageUrlList.append(QUrl(SILHOUETTE_URL));
+
+            addProfileImages(imageUrlList);
+            imageUrlList.clear();
         } else {
             QVariant address = result.value("address");
             if(!address.toString().isEmpty()) {
@@ -404,11 +461,10 @@ void SituareService::imageReceived(const QUrl &url, const QPixmap &image)
             m_user->setProfileImage(AvatarImage::create(image, AvatarImage::Large));
             emit imageReady(m_user);
         }
-        for(int i=0;i < m_friendsList.count();i++) {
-            if(m_friendsList.at(i)->profileImageUrl().isEmpty()) {
-                m_friendsList.at(i)->setProfileImage(AvatarImage::create(image,
-                                                                         AvatarImage::Small));
-                emit imageReady(m_friendsList.at(i));
+        foreach(User *friendItem, m_friendsList) {
+            if(friendItem->profileImageUrl().isEmpty()) {
+                friendItem->setProfileImage(AvatarImage::create(image, AvatarImage::Small));
+                emit imageReady(friendItem);
             }
         }
     }
@@ -418,31 +474,20 @@ void SituareService::imageReceived(const QUrl &url, const QPixmap &image)
         emit imageReady(m_user);
     }
 
-    for(int i=0;i<m_friendsList.count();i++) {
-        if(m_friendsList.at(i)->profileImageUrl() == url) {
-            m_friendsList.at(i)->setProfileImage(AvatarImage::create(image, AvatarImage::Small));
-            emit imageReady(m_friendsList.at(i));
+    foreach(User *friendItem, m_friendsList) {
+        if(friendItem->profileImageUrl() == url) {
+            friendItem->setProfileImage(AvatarImage::create(image, AvatarImage::Small));
+            emit imageReady(friendItem);
         }
     }
 }
 
-void SituareService::addProfileImages()
+void SituareService::addProfileImages(const QList<QUrl> &imageUrlList)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    // reduce net traffic by sending only one download request for facebook silhouette image
-    if(m_defaultImage) {
-        emit fetchImage(QUrl(SILHOUETTE_URL));
-    }
-
-    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_friendsList.at(i)->profileImageUrl().isValid()) {
-           emit fetchImage(m_friendsList.at(i)->profileImageUrl());
-        }
+    foreach(QUrl url, imageUrlList) {
+        emit fetchImage(url);
     }
 }
 
index cacea93..bca22dc 100644 (file)
@@ -113,8 +113,9 @@ private:
     * @brief Requests ImageFetcher if user/friend has a profile image
     *        uses members: m_user and m_friendsList
     *
+    * @param imageUrlList list of image urls
     */
-    void addProfileImages();
+    void addProfileImages(const QList<QUrl> &imageUrlList);
 
     /**
     * @brief Forms a http cookie