loading avatars in seperate tasks
This commit is contained in:
		
							parent
							
								
									9ff39a1a1e
								
							
						
					
					
						commit
						0485da8488
					
				| @ -38,10 +38,10 @@ public class AvatarService { | ||||
| 		this.mXmppConnectionService = service; | ||||
| 	} | ||||
| 
 | ||||
| 	public Bitmap get(final Contact contact, final int size) { | ||||
| 	private Bitmap get(final Contact contact, final int size, boolean cachedOnly) { | ||||
| 		final String KEY = key(contact, size); | ||||
| 		Bitmap avatar = this.mXmppConnectionService.getBitmapCache().get(KEY); | ||||
| 		if (avatar != null) { | ||||
| 		if (avatar != null || cachedOnly) { | ||||
| 			return avatar; | ||||
| 		} | ||||
| 		if (contact.getProfilePhoto() != null) { | ||||
| @ -51,7 +51,7 @@ public class AvatarService { | ||||
| 			avatar = mXmppConnectionService.getFileBackend().getAvatar(contact.getAvatar(), size); | ||||
| 		} | ||||
| 		if (avatar == null) { | ||||
|             avatar = get(contact.getDisplayName(), size); | ||||
|             avatar = get(contact.getDisplayName(), size, cachedOnly); | ||||
| 		} | ||||
| 		this.mXmppConnectionService.getBitmapCache().put(KEY, avatar); | ||||
| 		return avatar; | ||||
| @ -77,25 +77,33 @@ public class AvatarService { | ||||
| 	} | ||||
| 
 | ||||
| 	public Bitmap get(ListItem item, int size) { | ||||
| 		return get(item,size,false); | ||||
| 	} | ||||
| 
 | ||||
| 	public Bitmap get(ListItem item, int size, boolean cachedOnly) { | ||||
| 		if (item instanceof Contact) { | ||||
| 			return get((Contact) item, size); | ||||
| 			return get((Contact) item, size,cachedOnly); | ||||
| 		} else if (item instanceof Bookmark) { | ||||
| 			Bookmark bookmark = (Bookmark) item; | ||||
| 			if (bookmark.getConversation() != null) { | ||||
| 				return get(bookmark.getConversation(), size); | ||||
| 				return get(bookmark.getConversation(), size, cachedOnly); | ||||
| 			} else { | ||||
| 				return get(bookmark.getDisplayName(), size); | ||||
| 				return get(bookmark.getDisplayName(), size, cachedOnly); | ||||
| 			} | ||||
| 		} else { | ||||
| 			return get(item.getDisplayName(), size); | ||||
| 			return get(item.getDisplayName(), size, cachedOnly); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public Bitmap get(Conversation conversation, int size) { | ||||
| 		return get(conversation,size,false); | ||||
| 	} | ||||
| 
 | ||||
| 	public Bitmap get(Conversation conversation, int size, boolean cachedOnly) { | ||||
| 		if (conversation.getMode() == Conversation.MODE_SINGLE) { | ||||
| 			return get(conversation.getContact(), size); | ||||
| 			return get(conversation.getContact(), size, cachedOnly); | ||||
| 		} else { | ||||
| 			return get(conversation.getMucOptions(), size); | ||||
| 			return get(conversation.getMucOptions(), size, cachedOnly); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -107,10 +115,10 @@ public class AvatarService { | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public Bitmap get(MucOptions mucOptions, int size) { | ||||
| 	private Bitmap get(MucOptions mucOptions, int size,  boolean cachedOnly) { | ||||
| 		final String KEY = key(mucOptions, size); | ||||
| 		Bitmap bitmap = this.mXmppConnectionService.getBitmapCache().get(KEY); | ||||
| 		if (bitmap != null) { | ||||
| 		if (bitmap != null || cachedOnly) { | ||||
| 			return bitmap; | ||||
| 		} | ||||
| 		final List<MucOptions.User> users = new ArrayList<>(mucOptions.getUsers()); | ||||
| @ -179,7 +187,7 @@ public class AvatarService { | ||||
| 		avatar = mXmppConnectionService.getFileBackend().getAvatar( | ||||
| 				account.getAvatar(), size); | ||||
| 		if (avatar == null) { | ||||
| 			avatar = get(account.getJid().toBareJid().toString(), size); | ||||
| 			avatar = get(account.getJid().toBareJid().toString(), size,false); | ||||
| 		} | ||||
| 		mXmppConnectionService.getBitmapCache().put(KEY, avatar); | ||||
| 		return avatar; | ||||
| @ -204,10 +212,14 @@ public class AvatarService { | ||||
| 				+ String.valueOf(size); | ||||
| 	} | ||||
| 
 | ||||
| 	public Bitmap get(final String name, final int size) { | ||||
| 	public Bitmap get(String name, int size) { | ||||
| 		return get(name,size,false); | ||||
| 	} | ||||
| 
 | ||||
| 	public Bitmap get(final String name, final int size, boolean cachedOnly) { | ||||
| 		final String KEY = key(name, size); | ||||
| 		Bitmap bitmap = mXmppConnectionService.getBitmapCache().get(KEY); | ||||
| 		if (bitmap != null) { | ||||
| 		if (bitmap != null || cachedOnly) { | ||||
| 			return bitmap; | ||||
| 		} | ||||
| 		bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); | ||||
|  | ||||
| @ -1,8 +1,13 @@ | ||||
| package eu.siacs.conversations.ui.adapter; | ||||
| 
 | ||||
| import android.content.Context; | ||||
| import android.content.res.Resources; | ||||
| import android.graphics.Bitmap; | ||||
| import android.graphics.Color; | ||||
| import android.graphics.Typeface; | ||||
| import android.graphics.drawable.BitmapDrawable; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.os.AsyncTask; | ||||
| import android.util.Pair; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| @ -11,12 +16,13 @@ import android.widget.ArrayAdapter; | ||||
| import android.widget.ImageView; | ||||
| import android.widget.TextView; | ||||
| 
 | ||||
| import java.lang.ref.WeakReference; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.RejectedExecutionException; | ||||
| 
 | ||||
| import eu.siacs.conversations.R; | ||||
| import eu.siacs.conversations.entities.Conversation; | ||||
| import eu.siacs.conversations.entities.Downloadable; | ||||
| import eu.siacs.conversations.entities.DownloadableFile; | ||||
| import eu.siacs.conversations.entities.Message; | ||||
| import eu.siacs.conversations.ui.ConversationActivity; | ||||
| import eu.siacs.conversations.ui.XmppActivity; | ||||
| @ -98,8 +104,88 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> { | ||||
| 
 | ||||
| 		mTimestamp.setText(UIHelper.readableTimeDifference(activity,conversation.getLatestMessage().getTimeSent())); | ||||
| 		ImageView profilePicture = (ImageView) view.findViewById(R.id.conversation_image); | ||||
| 		profilePicture.setImageBitmap(activity.avatarService().get(conversation, activity.getPixel(56))); | ||||
| 		loadAvatar(conversation,profilePicture); | ||||
| 
 | ||||
| 		return view; | ||||
| 	} | ||||
| 
 | ||||
| 	class BitmapWorkerTask extends AsyncTask<Conversation, Void, Bitmap> { | ||||
| 		private final WeakReference<ImageView> imageViewReference; | ||||
| 		private Conversation conversation = null; | ||||
| 
 | ||||
| 		public BitmapWorkerTask(ImageView imageView) { | ||||
| 			imageViewReference = new WeakReference<>(imageView); | ||||
| 		} | ||||
| 
 | ||||
| 		@Override | ||||
| 		protected Bitmap doInBackground(Conversation... params) { | ||||
| 			return activity.avatarService().get(params[0], activity.getPixel(56)); | ||||
| 		} | ||||
| 
 | ||||
| 		@Override | ||||
| 		protected void onPostExecute(Bitmap bitmap) { | ||||
| 			if (bitmap != null) { | ||||
| 				final ImageView imageView = imageViewReference.get(); | ||||
| 				if (imageView != null) { | ||||
| 					imageView.setImageBitmap(bitmap); | ||||
| 					imageView.setBackgroundColor(0x00000000); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public void loadAvatar(Conversation conversation, ImageView imageView) { | ||||
| 		Bitmap bm = activity.avatarService().get(conversation,activity.getPixel(56),true); | ||||
| 		if (bm != null) { | ||||
| 			imageView.setImageBitmap(bm); | ||||
| 			imageView.setBackgroundColor(0x00000000); | ||||
| 		} else if (cancelPotentialWork(conversation, imageView)) { | ||||
| 			imageView.setBackgroundColor(0xff333333); | ||||
| 			final BitmapWorkerTask task = new BitmapWorkerTask(imageView); | ||||
| 			final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task); | ||||
| 			imageView.setImageDrawable(asyncDrawable); | ||||
| 			try { | ||||
| 				task.execute(conversation); | ||||
| 			} catch (final RejectedExecutionException ignored) { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public static boolean cancelPotentialWork(Conversation conversation, ImageView imageView) { | ||||
| 		final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); | ||||
| 
 | ||||
| 		if (bitmapWorkerTask != null) { | ||||
| 			final Conversation oldConversation = bitmapWorkerTask.conversation; | ||||
| 			if (oldConversation == null || conversation != oldConversation) { | ||||
| 				bitmapWorkerTask.cancel(true); | ||||
| 			} else { | ||||
| 				return false; | ||||
| 			} | ||||
| 		} | ||||
| 		return true; | ||||
| 	} | ||||
| 
 | ||||
| 	private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) { | ||||
| 		if (imageView != null) { | ||||
| 			final Drawable drawable = imageView.getDrawable(); | ||||
| 			if (drawable instanceof AsyncDrawable) { | ||||
| 				final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; | ||||
| 				return asyncDrawable.getBitmapWorkerTask(); | ||||
| 			} | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 
 | ||||
| 	static class AsyncDrawable extends BitmapDrawable { | ||||
| 		private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference; | ||||
| 
 | ||||
| 		public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) { | ||||
| 			super(res, bitmap); | ||||
| 			bitmapWorkerTaskReference = new WeakReference<>(bitmapWorkerTask); | ||||
| 		} | ||||
| 
 | ||||
| 		public BitmapWorkerTask getBitmapWorkerTask() { | ||||
| 			return bitmapWorkerTaskReference.get(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -1,15 +1,23 @@ | ||||
| package eu.siacs.conversations.ui.adapter; | ||||
| 
 | ||||
| import java.lang.ref.WeakReference; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.RejectedExecutionException; | ||||
| 
 | ||||
| import eu.siacs.conversations.Config; | ||||
| import eu.siacs.conversations.R; | ||||
| import eu.siacs.conversations.entities.Conversation; | ||||
| import eu.siacs.conversations.entities.ListItem; | ||||
| import eu.siacs.conversations.ui.XmppActivity; | ||||
| import eu.siacs.conversations.xmpp.jid.Jid; | ||||
| 
 | ||||
| import android.content.Context; | ||||
| import android.content.SharedPreferences; | ||||
| import android.content.res.Resources; | ||||
| import android.graphics.Bitmap; | ||||
| import android.graphics.drawable.BitmapDrawable; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.os.AsyncTask; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.util.Log; | ||||
| import android.view.LayoutInflater; | ||||
| @ -77,8 +85,7 @@ public class ListItemAdapter extends ArrayAdapter<ListItem> { | ||||
| 			tvJid.setText(""); | ||||
| 		} | ||||
| 		tvName.setText(item.getDisplayName()); | ||||
| 		picture.setImageBitmap(activity.avatarService().get(item, | ||||
| 				activity.getPixel(48))); | ||||
| 		loadAvatar(item,picture); | ||||
| 		return view; | ||||
| 	} | ||||
| 
 | ||||
| @ -90,4 +97,84 @@ public class ListItemAdapter extends ArrayAdapter<ListItem> { | ||||
| 		public void onTagClicked(String tag); | ||||
| 	} | ||||
| 
 | ||||
| 	class BitmapWorkerTask extends AsyncTask<ListItem, Void, Bitmap> { | ||||
| 		private final WeakReference<ImageView> imageViewReference; | ||||
| 		private ListItem item = null; | ||||
| 
 | ||||
| 		public BitmapWorkerTask(ImageView imageView) { | ||||
| 			imageViewReference = new WeakReference<>(imageView); | ||||
| 		} | ||||
| 
 | ||||
| 		@Override | ||||
| 		protected Bitmap doInBackground(ListItem... params) { | ||||
| 			return activity.avatarService().get(params[0], activity.getPixel(48)); | ||||
| 		} | ||||
| 
 | ||||
| 		@Override | ||||
| 		protected void onPostExecute(Bitmap bitmap) { | ||||
| 			if (bitmap != null) { | ||||
| 				final ImageView imageView = imageViewReference.get(); | ||||
| 				if (imageView != null) { | ||||
| 					imageView.setImageBitmap(bitmap); | ||||
| 					imageView.setBackgroundColor(0x00000000); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public void loadAvatar(ListItem item, ImageView imageView) { | ||||
| 		Bitmap bm = activity.avatarService().get(item,activity.getPixel(56),true); | ||||
| 		if (bm != null) { | ||||
| 			imageView.setImageBitmap(bm); | ||||
| 			imageView.setBackgroundColor(0x00000000); | ||||
| 		} else if (cancelPotentialWork(item, imageView)) { | ||||
| 			imageView.setBackgroundColor(0xff333333); | ||||
| 			final BitmapWorkerTask task = new BitmapWorkerTask(imageView); | ||||
| 			final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task); | ||||
| 			imageView.setImageDrawable(asyncDrawable); | ||||
| 			try { | ||||
| 				task.execute(item); | ||||
| 			} catch (final RejectedExecutionException ignored) { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public static boolean cancelPotentialWork(ListItem item, ImageView imageView) { | ||||
| 		final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); | ||||
| 
 | ||||
| 		if (bitmapWorkerTask != null) { | ||||
| 			final ListItem oldItem = bitmapWorkerTask.item; | ||||
| 			if (oldItem == null || item != oldItem) { | ||||
| 				bitmapWorkerTask.cancel(true); | ||||
| 			} else { | ||||
| 				return false; | ||||
| 			} | ||||
| 		} | ||||
| 		return true; | ||||
| 	} | ||||
| 
 | ||||
| 	private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) { | ||||
| 		if (imageView != null) { | ||||
| 			final Drawable drawable = imageView.getDrawable(); | ||||
| 			if (drawable instanceof AsyncDrawable) { | ||||
| 				final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; | ||||
| 				return asyncDrawable.getBitmapWorkerTask(); | ||||
| 			} | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 
 | ||||
| 	static class AsyncDrawable extends BitmapDrawable { | ||||
| 		private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference; | ||||
| 
 | ||||
| 		public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) { | ||||
| 			super(res, bitmap); | ||||
| 			bitmapWorkerTaskReference = new WeakReference<>(bitmapWorkerTask); | ||||
| 		} | ||||
| 
 | ||||
| 		public BitmapWorkerTask getBitmapWorkerTask() { | ||||
| 			return bitmapWorkerTaskReference.get(); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 iNPUTmice
						iNPUTmice