/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.content; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.text.TextUtils; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.content.cache.EsMediaCache; import com.galaxy.meetup.client.android.service.ImageDownloader; import com.galaxy.meetup.client.util.ImageUtils; /** * * @author sihai * */ public class EsAvatarData { private static final String AVATAR_URL_PROJECTION[] = { "gaia_id", "avatar" }; private static int sBackgroundColor; private static Bitmap sDefaultAvatarMedium; private static Bitmap sDefaultAvatarMediumRound; private static Bitmap sDefaultAvatarSmall; private static Bitmap sDefaultAvatarSmallRound; private static Bitmap sDefaultAvatarTiny; private static Bitmap sDefaultAvatarTinyRound; private static final Map sFifeAbbrs; private static final Map sFifeHosts; private static int sMediumAvatarSize; public static boolean sRoundAvatarsEnabled = true; private static int sSmallAvatarSize; private static int sTinyAvatarSize; static { sFifeHosts = new HashMap(); sFifeAbbrs = new HashMap(); sFifeHosts.put("lh3.googleusercontent.com", "~3"); sFifeAbbrs.put("~3", "lh3.googleusercontent.com"); sFifeHosts.put("lh4.googleusercontent.com", "~4"); sFifeAbbrs.put("~4", "lh4.googleusercontent.com"); sFifeHosts.put("lh5.googleusercontent.com", "~5"); sFifeAbbrs.put("~5", "lh5.googleusercontent.com"); sFifeHosts.put("lh6.googleusercontent.com", "~6"); sFifeAbbrs.put("~6", "lh6.googleusercontent.com"); } public static String compressAvatarUrl(String s) { String result = null; int start = 0; if(TextUtils.isEmpty(s)) { return result; } if(s.startsWith("https://")) { start = 8; } else if(s.startsWith("http://")) { start = 7; } else if(s.startsWith("//")) { start = 2; } else { start = 0; } int i = s.length(); if(s.endsWith("/photo.jpg")) i -= 9; int j = s.indexOf('/', 8); String s1; if(j == -1) s1 = null; else s1 = (String)sFifeHosts.get(s.substring(8, j)); if(s1 != null) result = (new StringBuilder()).append(s1).append(s.substring(j, i)).toString(); else result = s.substring(8, i); return result; } private static int getAvatarBackgroundColor(Context context) { if(sBackgroundColor == 0) sBackgroundColor = context.getResources().getColor(R.color.avatar_background_color); return sBackgroundColor; } public static int getAvatarSizeInPx(Context context, int i) { int size = 0; switch(i) { case 0: size = getTinyAvatarSize(context); break; case 1: size = getSmallAvatarSize(context); break; case 2: size = getMediumAvatarSize(context); break; default: break; } return size; } public static int getAvatarUrlSignature(String s) { if(null == s) { return 1; } int hashCode = s.hashCode(); if(hashCode == 0 || hashCode == 1) hashCode = 2; return hashCode; } public static int getMediumAvatarSize(Context context) { if(sMediumAvatarSize == 0) sMediumAvatarSize = context.getApplicationContext().getResources().getDimensionPixelSize(R.dimen.medium_avatar_dimension); return sMediumAvatarSize; } public static Bitmap getMediumDefaultAvatar(Context context) { if(sDefaultAvatarMedium == null) sDefaultAvatarMedium = ((BitmapDrawable)context.getApplicationContext().getResources().getDrawable(R.drawable.ic_avatar)).getBitmap(); return sDefaultAvatarMedium; } public static Bitmap getMediumDefaultAvatar(Context context, boolean flag) { Bitmap bitmap; if(flag && sRoundAvatarsEnabled) { if(sDefaultAvatarMediumRound == null) sDefaultAvatarMediumRound = ImageUtils.getRoundedBitmap(context, getMediumDefaultAvatar(context)); bitmap = sDefaultAvatarMediumRound; } else { bitmap = getMediumDefaultAvatar(context); } return bitmap; } public static int getSmallAvatarSize(Context context) { if(sSmallAvatarSize == 0) sSmallAvatarSize = context.getApplicationContext().getResources().getDimensionPixelSize(R.dimen.avatar_dimension); return sSmallAvatarSize; } public static Bitmap getSmallDefaultAvatar(Context context) { if(sDefaultAvatarSmall == null) sDefaultAvatarSmall = ImageUtils.resizeToSquareBitmap(getMediumDefaultAvatar(context), getSmallAvatarSize(context), 0); return sDefaultAvatarSmall; } public static Bitmap getSmallDefaultAvatar(Context context, boolean flag) { Bitmap bitmap; if(flag && sRoundAvatarsEnabled) { if(sDefaultAvatarSmallRound == null) sDefaultAvatarSmallRound = ImageUtils.getRoundedBitmap(context, getSmallDefaultAvatar(context)); bitmap = sDefaultAvatarSmallRound; } else { bitmap = getSmallDefaultAvatar(context); } return bitmap; } public static int getTinyAvatarSize(Context context) { if(sTinyAvatarSize == 0) sTinyAvatarSize = context.getApplicationContext().getResources().getDimensionPixelSize(R.dimen.tiny_avatar_dimension); return sTinyAvatarSize; } public static Bitmap getTinyDefaultAvatar(Context context) { if(sDefaultAvatarTiny == null) sDefaultAvatarTiny = ImageUtils.resizeToSquareBitmap(getMediumDefaultAvatar(context), getTinyAvatarSize(context), 0); return sDefaultAvatarTiny; } public static Bitmap getTinyDefaultAvatar(Context context, boolean flag) { Bitmap bitmap; if(flag && sRoundAvatarsEnabled) { if(sDefaultAvatarTinyRound == null) sDefaultAvatarTinyRound = ImageUtils.getRoundedBitmap(context, getTinyDefaultAvatar(context)); bitmap = sDefaultAvatarTinyRound; } else { bitmap = getTinyDefaultAvatar(context); } return bitmap; } private static void loadAndroidContactAvatars(Context context, List list, HashMap hashmap) { // TODO } private static byte[] loadAvatar(Context context, EsAccount esaccount, String s, String s1, int i) { AvatarImageRequest avatarimagerequest; byte abyte0[]; avatarimagerequest = new AvatarImageRequest(s, s1, i, getAvatarSizeInPx(context, i)); abyte0 = EsMediaCache.getMedia(context, avatarimagerequest); if(null != abyte0) { return abyte0; } switch(i) { default: break; case 0: // '\0' abyte0 = loadAvatar(context, esaccount, s, s1, 2); if(abyte0 == null) abyte0 = loadAvatar(context, esaccount, s, s1, 1); if(abyte0 != null) { abyte0 = ImageUtils.resizeToSquareBitmap(abyte0, getTinyAvatarSize(context)); if(abyte0 != null) EsMediaCache.insertMedia(context, avatarimagerequest, abyte0); } break; case 1: // '\001' abyte0 = loadAvatar(context, esaccount, s, s1, 2); if(abyte0 != null) { abyte0 = ImageUtils.resizeToSquareBitmap(abyte0, getSmallAvatarSize(context)); if(abyte0 != null) EsMediaCache.insertMedia(context, avatarimagerequest, abyte0); } break; } if(abyte0 == null) ImageDownloader.downloadImage(context, esaccount, avatarimagerequest); return abyte0; } public static String loadAvatarUrl(Context context, EsAccount esaccount, String s) { Cursor cursor = null; try { cursor = EsDatabaseHelper.getDatabaseHelper(context, esaccount).getReadableDatabase().query("contacts", AVATAR_URL_PROJECTION, "gaia_id=?", new String[] { s }, null, null, null); if(cursor.moveToNext()) { String s2 = cursor.getString(1); if(!TextUtils.isEmpty(s2)) { return uncompressAvatarUrl(s2); } } return null; } finally { if(null != cursor) { cursor.close(); } } } public static Map loadAvatars(Context context, List list) { HashMap hashmap; EsAccount esaccount; hashmap = new HashMap(); esaccount = EsAccountsData.getActiveAccount(context); if(null == esaccount) { return hashmap; } loadGooglePlusAvatars(context, esaccount, list, hashmap); return hashmap; } private static void loadGooglePlusAvatars(Context context, EsAccount esaccount, List list, HashMap hashmap) { HashMap hashmap1; ArrayList arraylist = null; int i = list.size(); for(int j = 0; j < i; j++) { AvatarRequest avatarrequest1 = (AvatarRequest)list.get(j); if(avatarrequest1.getAvatarUrl() != null) continue; if(arraylist == null) arraylist = new ArrayList(); arraylist.add(avatarrequest1); } hashmap1 = null; if(null != arraylist) { hashmap1 = new HashMap(); SQLiteDatabase sqlitedatabase = EsDatabaseHelper.getDatabaseHelper(context, esaccount).getReadableDatabase(); int k = arraylist.size(); StringBuilder stringbuilder = new StringBuilder(); String as[] = new String[k]; stringbuilder.append("gaia_id IN ("); for(int l = 0; l < k; l++) { stringbuilder.append("?,"); as[l] = ((AvatarRequest)arraylist.get(l)).getGaiaId(); } stringbuilder.setLength(-1 + stringbuilder.length()); stringbuilder.append(')'); Cursor cursor = null; try { cursor = sqlitedatabase.query("contacts", AVATAR_URL_PROJECTION, stringbuilder.toString(), as, null, null, null); while(cursor.moveToNext()) hashmap1.put(cursor.getString(0), uncompressAvatarUrl(cursor.getString(1))); } finally { if(null != cursor) { cursor.close(); } } } Iterator iterator = list.iterator(); do { if(!iterator.hasNext()) break; AvatarRequest avatarrequest = (AvatarRequest)iterator.next(); String s = avatarrequest.getAvatarUrl(); if(s == null && hashmap1 != null) s = (String)hashmap1.get(avatarrequest.getGaiaId()); if(s == null) { hashmap.put(avatarrequest, null); } else { byte abyte0[] = loadAvatar(context, esaccount, avatarrequest.getGaiaId(), s, avatarrequest.getSize()); if(abyte0 != null) { if(avatarrequest.isRounded() && sRoundAvatarsEnabled) abyte0 = ImageUtils.getRoundedBitmap(context, abyte0); hashmap.put(avatarrequest, abyte0); } } } while(true); } public static String uncompressAvatarUrl(String s) { String s1; if(TextUtils.isEmpty(s)) { s1 = null; } else { StringBuilder stringbuilder = new StringBuilder(); stringbuilder.append("https://"); if(s.charAt(0) == '~') { int i = s.indexOf('/'); stringbuilder.append((String)sFifeAbbrs.get(s.substring(0, i))); stringbuilder.append(s.substring(i)); } else { stringbuilder.append(s); } if(s.endsWith("/")) stringbuilder.append("photo.jpg"); s1 = stringbuilder.toString(); } return s1; } }