aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/thedevstack/conversationsplus/services/AvatarService.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/thedevstack/conversationsplus/services/AvatarService.java')
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/services/AvatarService.java160
1 files changed, 132 insertions, 28 deletions
diff --git a/src/main/java/de/thedevstack/conversationsplus/services/AvatarService.java b/src/main/java/de/thedevstack/conversationsplus/services/AvatarService.java
index 1cbda222..11ff36da 100644
--- a/src/main/java/de/thedevstack/conversationsplus/services/AvatarService.java
+++ b/src/main/java/de/thedevstack/conversationsplus/services/AvatarService.java
@@ -13,27 +13,28 @@ import java.util.List;
import java.util.Locale;
import de.thedevstack.android.logcat.Logging;
-import de.thedevstack.conversationsplus.Config;
import de.thedevstack.conversationsplus.ConversationsPlusApplication;
+import de.thedevstack.conversationsplus.utils.AvatarUtil;
+import de.thedevstack.conversationsplus.utils.ImageUtil;
+import de.thedevstack.conversationsplus.utils.UiUpdateHelper;
+import de.thedevstack.conversationsplus.utils.XmppSendUtil;
+import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacketGenerator;
+import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacketParser;
+import de.thedevstack.conversationsplus.Config;
import de.thedevstack.conversationsplus.R;
import de.thedevstack.conversationsplus.entities.Account;
import de.thedevstack.conversationsplus.entities.Bookmark;
import de.thedevstack.conversationsplus.entities.Contact;
import de.thedevstack.conversationsplus.entities.Conversation;
import de.thedevstack.conversationsplus.entities.ListItem;
+import de.thedevstack.conversationsplus.entities.Message;
import de.thedevstack.conversationsplus.entities.MucOptions;
import de.thedevstack.conversationsplus.generator.IqGenerator;
import de.thedevstack.conversationsplus.persistance.DatabaseBackend;
import de.thedevstack.conversationsplus.ui.UiCallback;
-import de.thedevstack.conversationsplus.utils.AvatarUtil;
-import de.thedevstack.conversationsplus.utils.ImageUtil;
import de.thedevstack.conversationsplus.utils.UIHelper;
-import de.thedevstack.conversationsplus.utils.UiUpdateHelper;
-import de.thedevstack.conversationsplus.utils.XmppSendUtil;
import de.thedevstack.conversationsplus.xml.Element;
import de.thedevstack.conversationsplus.xmpp.OnIqPacketReceived;
-import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacketGenerator;
-import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacketParser;
import de.thedevstack.conversationsplus.xmpp.pep.Avatar;
import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
@@ -75,6 +76,36 @@ public class AvatarService {
return avatar;
}
+ public Bitmap get(final MucOptions.User user, final int size, boolean cachedOnly) {
+ Contact c = user.getContact();
+ if (c != null && (c.getProfilePhoto() != null || c.getAvatar() != null)) {
+ return get(c, size, cachedOnly);
+ } else {
+ return getImpl(user, size, cachedOnly);
+ }
+ }
+
+ private Bitmap getImpl(final MucOptions.User user, final int size, boolean cachedOnly) {
+ final String KEY = key(user, size);
+ Bitmap avatar = ImageUtil.getBitmapFromCache(KEY);
+ if (avatar != null || cachedOnly) {
+ return avatar;
+ }
+ if (user.getAvatar() != null) {
+ avatar = AvatarUtil.getAvatar(user.getAvatar(), size);
+ }
+ if (avatar == null) {
+ Contact contact = user.getContact();
+ if (contact != null) {
+ avatar = get(contact, size, cachedOnly);
+ } else {
+ avatar = get(user.getName(), size, cachedOnly);
+ }
+ }
+ ImageUtil.addBitmapToCache(KEY, avatar);
+ return avatar;
+ }
+
public void clear(Contact contact) {
synchronized (this.sizes) {
for (Integer size : sizes) {
@@ -93,6 +124,16 @@ public class AvatarService {
+ contact.getJid() + "_" + String.valueOf(size);
}
+ private String key(MucOptions.User user, int size) {
+ synchronized (this.sizes) {
+ if (!this.sizes.contains(size)) {
+ this.sizes.add(size);
+ }
+ }
+ return PREFIX_CONTACT + "_" + user.getAccount().getJid().toBareJid() + "_"
+ + user.getFullJid() + "_" + String.valueOf(size);
+ }
+
public Bitmap get(ListItem item, int size) {
return get(item,size,false);
}
@@ -138,7 +179,7 @@ public class AvatarService {
if (bitmap != null || cachedOnly) {
return bitmap;
}
- final List<MucOptions.User> users = new ArrayList<>(mucOptions.getUsers());
+ final List<MucOptions.User> users = mucOptions.getUsers();
int count = users.size();
bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
@@ -146,11 +187,10 @@ public class AvatarService {
if (count == 0) {
String name = mucOptions.getConversation().getName();
- final String letter = name.isEmpty() ? "X" : name.substring(0,1);
- final int color = UIHelper.getColorForName(name);
- drawTile(canvas, letter, color, 0, 0, size, size);
+ drawTile(canvas, name, 0, 0, size, size);
} else if (count == 1) {
- drawTile(canvas, users.get(0), 0, 0, size, size);
+ drawTile(canvas, users.get(0), 0, 0, size / 2 - 1, size);
+ drawTile(canvas, mucOptions.getConversation().getAccount(), size / 2 + 1, 0, size, size);
} else if (count == 2) {
drawTile(canvas, users.get(0), 0, 0, size / 2 - 1, size);
drawTile(canvas, users.get(1), size / 2 + 1, 0, size, size);
@@ -195,9 +235,13 @@ public class AvatarService {
}
public Bitmap get(Account account, int size) {
+ return get(account, size, false);
+ }
+
+ public Bitmap get(Account account, int size, boolean cachedOnly) {
final String KEY = key(account, size);
Bitmap avatar = ImageUtil.getBitmapFromCache(KEY);
- if (avatar != null) {
+ if (avatar != null || cachedOnly) {
return avatar;
}
avatar = AvatarUtil.getAvatar(account.getAvatar(), size);
@@ -208,6 +252,24 @@ public class AvatarService {
return avatar;
}
+ public Bitmap get(Message message, int size, boolean cachedOnly) {
+ final Conversation conversation = message.getConversation();
+ if (message.getStatus() == Message.STATUS_RECEIVED) {
+ Contact c = message.getContact();
+ if (c != null && (c.getProfilePhoto() != null || c.getAvatar() != null)) {
+ return get(c, size, cachedOnly);
+ } else if (message.getConversation().getMode() == Conversation.MODE_MULTI){
+ MucOptions.User user = conversation.getMucOptions().findUser(message.getCounterpart().getResourcepart());
+ if (user != null) {
+ return getImpl(user,size,cachedOnly);
+ }
+ }
+ return get(UIHelper.getMessageDisplayName(message), size, cachedOnly);
+ } else {
+ return get(conversation.getAccount(), size, cachedOnly);
+ }
+ }
+
public void clear(Account account) {
synchronized (this.sizes) {
for (Integer size : sizes) {
@@ -216,6 +278,14 @@ public class AvatarService {
}
}
+ public void clear(MucOptions.User user) {
+ synchronized (this.sizes) {
+ for (Integer size : sizes) {
+ ImageUtil.removeBitmapFromCache(key(user, size));
+ }
+ }
+ }
+
private String key(Account account, int size) {
synchronized (this.sizes) {
if (!this.sizes.contains(size)) {
@@ -239,9 +309,7 @@ public class AvatarService {
bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
final String trimmedName = name.trim();
- final String letter = trimmedName.isEmpty() ? "X" : trimmedName.substring(0,1);
- final int color = UIHelper.getColorForName(name);
- drawTile(canvas, letter, color, 0, 0, size, size);
+ drawTile(canvas, trimmedName, 0, 0, size, size);
ImageUtil.addBitmapToCache(KEY, bitmap);
return bitmap;
}
@@ -255,7 +323,7 @@ public class AvatarService {
return PREFIX_GENERIC + "_" + name + "_" + String.valueOf(size);
}
- private void drawTile(Canvas canvas, String letter, int tileColor,
+ private boolean drawTile(Canvas canvas, String letter, int tileColor,
int left, int top, int right, int bottom) {
letter = letter.toUpperCase(Locale.getDefault());
Paint tilePaint = new Paint(), textPaint = new Paint();
@@ -271,10 +339,11 @@ public class AvatarService {
textPaint.getTextBounds(letter, 0, 1, rect);
float width = textPaint.measureText(letter);
canvas.drawText(letter, (right + left) / 2 - width / 2, (top + bottom)
- / 2 + rect.height() / 2, textPaint);
+ / 2 + rect.height() / 2, textPaint);
+ return true;
}
- private void drawTile(Canvas canvas, MucOptions.User user, int left,
+ private boolean drawTile(Canvas canvas, MucOptions.User user, int left,
int top, int right, int bottom) {
Contact contact = user.getContact();
if (contact != null) {
@@ -284,24 +353,59 @@ public class AvatarService {
} else if (contact.getAvatar() != null) {
uri = AvatarUtil.getAvatarUri(contact.getAvatar());
}
+ if (drawTile(canvas, uri, left, top, right, bottom)) {
+ return true;
+ }
+ } else if (user.getAvatar() != null) {
+ Uri uri = AvatarUtil.getAvatarUri(user.getAvatar());
+ if (drawTile(canvas, uri, left, top, right, bottom)) {
+ return true;
+ }
+ }
+ String name = contact != null ? contact.getDisplayName() : user.getName();
+ drawTile(canvas, name, left, top, right, bottom);
+ return true;
+ }
+
+ private boolean drawTile(Canvas canvas, Account account, int left, int top, int right, int bottom) {
+ String avatar = account.getAvatar();
+ if (avatar != null) {
+ Uri uri = AvatarUtil.getAvatarUri(avatar);
if (uri != null) {
- Bitmap bitmap = ImageUtil.cropCenter(uri, bottom - top, right - left);
- if (bitmap != null) {
- drawTile(canvas, bitmap, left, top, right, bottom);
- return;
+ if (drawTile(canvas, uri, left, top, right, bottom)) {
+ return true;
}
}
}
- String name = contact != null ? contact.getDisplayName() : user.getName();
- final String letter = name.isEmpty() ? "X" : name.substring(0,1);
- final int color = UIHelper.getColorForName(name);
- drawTile(canvas, letter, color, left, top, right, bottom);
+ return drawTile(canvas, account.getJid().toBareJid().toString(), left, top, right, bottom);
+ }
+
+ private boolean drawTile(Canvas canvas, String name, int left, int top, int right, int bottom) {
+ if (name != null) {
+ final String letter = name.isEmpty() ? "X" : name.substring(0, 1);
+ final int color = UIHelper.getColorForName(name);
+ drawTile(canvas, letter, color, left, top, right, bottom);
+ return true;
+ }
+ return false;
+ }
+
+ private boolean drawTile(Canvas canvas, Uri uri, int left, int top, int right, int bottom) {
+ if (uri != null) {
+ Bitmap bitmap = ImageUtil.cropCenter(uri, bottom - top, right - left);
+ if (bitmap != null) {
+ drawTile(canvas, bitmap, left, top, right, bottom);
+ return true;
+ }
+ }
+ return false;
}
- private void drawTile(Canvas canvas, Bitmap bm, int dstleft, int dsttop,
+ private boolean drawTile(Canvas canvas, Bitmap bm, int dstleft, int dsttop,
int dstright, int dstbottom) {
Rect dst = new Rect(dstleft, dsttop, dstright, dstbottom);
canvas.drawBitmap(bm, null, dst, null);
+ return true;
}
public void publishAvatar(final Account account,