invite list: fixes fallback avatars

- adds fallback avatars for invites
- uses fallback avatar image file for contacts and invites with
  only ringIds

Change-Id: Ia7b702b17533a7aeccb777b3d851420327392b63
Reviewed-by: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
diff --git a/src/delegates/ImageManipulationDelegate.h b/src/delegates/ImageManipulationDelegate.h
index 59acf1e..ebc1a0d 100644
--- a/src/delegates/ImageManipulationDelegate.h
+++ b/src/delegates/ImageManipulationDelegate.h
@@ -67,6 +67,7 @@
     private:
         //Helper
         QPixmap drawDefaultUserPixmap(const QSize& size, const char color, const char letter);
+        QPixmap drawDefaultUserPixmapUriOnly(const QSize& size, const char color);
         CGImageRef resizeCGImage(CGImageRef image, const QSize& size);
 
         QHash<QString, QPixmap> m_hDefaultUserPixmap;
diff --git a/src/delegates/ImageManipulationDelegate.mm b/src/delegates/ImageManipulationDelegate.mm
index c251015..f2014b6 100644
--- a/src/delegates/ImageManipulationDelegate.mm
+++ b/src/delegates/ImageManipulationDelegate.mm
@@ -204,12 +204,15 @@
 
     char letterForDefaultUserPixmap(const lrc::api::contact::Info& contact)
     {
-        if (!contact.profileInfo.alias.empty())
+        if (!contact.profileInfo.alias.empty()) {
             return std::toupper(contact.profileInfo.alias.at(0));
-        else if(contact.profileInfo.type == lrc::api::profile::Type::RING && !contact.registeredName.empty())
+        } else if((contact.profileInfo.type == lrc::api::profile::Type::RING ||
+                contact.profileInfo.type == lrc::api::profile::Type::PENDING) &&
+                  !contact.registeredName.empty()) {
             return std::toupper(contact.registeredName.at(0));
-        else
+        } else {
             return std::toupper(contact.profileInfo.uri.at(0));
+        }
     }
 
     QVariant ImageManipulationDelegate::conversationPhoto(const lrc::api::conversation::Info& conversation,
@@ -274,8 +277,16 @@
                 return pxm;
             } else {
                 char color = contact.profileInfo.uri.at(0);
-                char letter = letterForDefaultUserPixmap(contact);
-                return drawDefaultUserPixmap(size, color, letter);
+
+                if (!contact.profileInfo.alias.empty()) {
+                    return drawDefaultUserPixmap(size, color, std::toupper(contact.profileInfo.alias.at(0)));
+                } else if((contact.profileInfo.type == lrc::api::profile::Type::RING ||
+                           contact.profileInfo.type == lrc::api::profile::Type::PENDING) &&
+                          !contact.registeredName.empty()) {
+                    return drawDefaultUserPixmap(size, color, std::toupper(contact.registeredName.at(0)));
+                } else {
+                    return drawDefaultUserPixmapUriOnly(size, color);
+                }
             }
         } catch (const std::out_of_range& e) {
             return drawDefaultUserPixmap(size, '?', '?');
@@ -322,6 +333,36 @@
         return avatar;
     }
 
+    QPixmap ImageManipulationDelegate::drawDefaultUserPixmapUriOnly(const QSize& size,  const char color) {
+        // We start with a transparent avatar
+        QPixmap avatar(size);
+        avatar.fill(Qt::transparent);
+
+        // We pick a color based on the passed character
+        QColor avColor = ImageManipulationDelegate::avatarColors_[color % 16];
+
+        // We draw a circle with this color
+        QPainter painter(&avatar);
+        painter.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform);
+        painter.setPen(Qt::transparent);
+        painter.setBrush(avColor);
+        painter.drawEllipse(avatar.rect());
+
+        // Then we paint the avatar in the circle
+        QRect textRect = avatar.rect();
+        QImage defaultAvatarImage;
+        QRect rect = QRect(0, 0, size.width(), size.height());
+        NSURL *bundleURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
+        NSString *imagePath = [bundleURL.absoluteString stringByAppendingString:@"Contents/Resources/default_avatar_overlay.png"];
+        if (defaultAvatarImage.load(QString::fromNSString(imagePath).mid(7))) {
+            painter.drawImage(avatar.rect(), defaultAvatarImage);
+        } else {
+            painter.drawText(avatar.rect(), QString('?'), QTextOption(Qt::AlignCenter));
+        }
+
+        return avatar;
+    }
+
     CGImageRef ImageManipulationDelegate::resizeCGImage(CGImageRef image, const QSize& size) {
         // create context, keeping original image properties
         CGContextRef context = CGBitmapContextCreate(NULL, size.width(), size.height(),