use async avatar loading in AccountAdapter
This commit is contained in:
		
							parent
							
								
									c3b2f33956
								
							
						
					
					
						commit
						cdf2bd07df
					
				| @ -1,6 +1,11 @@ | ||||
| package eu.siacs.conversations.ui.adapter; | ||||
| 
 | ||||
| import android.content.Context; | ||||
| 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.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| @ -9,7 +14,9 @@ import android.widget.CompoundButton; | ||||
| 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.Config; | ||||
| import eu.siacs.conversations.R; | ||||
| @ -17,6 +24,7 @@ import eu.siacs.conversations.entities.Account; | ||||
| import eu.siacs.conversations.ui.ManageAccountActivity; | ||||
| import eu.siacs.conversations.ui.XmppActivity; | ||||
| import eu.siacs.conversations.ui.widget.Switch; | ||||
| import eu.siacs.conversations.utils.UIHelper; | ||||
| 
 | ||||
| public class AccountAdapter extends ArrayAdapter<Account> { | ||||
| 
 | ||||
| @ -43,7 +51,7 @@ public class AccountAdapter extends ArrayAdapter<Account> { | ||||
| 		} | ||||
| 		TextView statusView = (TextView) view.findViewById(R.id.account_status); | ||||
| 		ImageView imageView = (ImageView) view.findViewById(R.id.account_image); | ||||
| 		imageView.setImageBitmap(activity.avatarService().get(account, activity.getPixel(48))); | ||||
| 		loadAvatar(account,imageView); | ||||
| 		statusView.setText(getContext().getString(account.getStatus().getReadableId())); | ||||
| 		switch (account.getStatus()) { | ||||
| 			case ONLINE: | ||||
| @ -70,4 +78,88 @@ public class AccountAdapter extends ArrayAdapter<Account> { | ||||
| 		}); | ||||
| 		return view; | ||||
| 	} | ||||
| 
 | ||||
| 	class BitmapWorkerTask extends AsyncTask<Account, Void, Bitmap> { | ||||
| 		private final WeakReference<ImageView> imageViewReference; | ||||
| 		private Account account = null; | ||||
| 
 | ||||
| 		public BitmapWorkerTask(ImageView imageView) { | ||||
| 			imageViewReference = new WeakReference<>(imageView); | ||||
| 		} | ||||
| 
 | ||||
| 		@Override | ||||
| 		protected Bitmap doInBackground(Account... params) { | ||||
| 			return activity.avatarService().get(params[0], activity.getPixel(48), isCancelled()); | ||||
| 		} | ||||
| 
 | ||||
| 		@Override | ||||
| 		protected void onPostExecute(Bitmap bitmap) { | ||||
| 			if (bitmap != null && !isCancelled()) { | ||||
| 				final ImageView imageView = imageViewReference.get(); | ||||
| 				if (imageView != null) { | ||||
| 					imageView.setImageBitmap(bitmap); | ||||
| 					imageView.setBackgroundColor(0x00000000); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public void loadAvatar(Account account, ImageView imageView) { | ||||
| 		if (cancelPotentialWork(account, imageView)) { | ||||
| 			final Bitmap bm = activity.avatarService().get(account,activity.getPixel(48),true); | ||||
| 			if (bm != null) { | ||||
| 				cancelPotentialWork(account, imageView); | ||||
| 				imageView.setImageBitmap(bm); | ||||
| 				imageView.setBackgroundColor(0x00000000); | ||||
| 			} else { | ||||
| 				imageView.setBackgroundColor(UIHelper.getColorForName(account.getDisplayName())); | ||||
| 				imageView.setImageDrawable(null); | ||||
| 				final BitmapWorkerTask task = new BitmapWorkerTask(imageView); | ||||
| 				final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task); | ||||
| 				imageView.setImageDrawable(asyncDrawable); | ||||
| 				try { | ||||
| 					task.execute(account); | ||||
| 				} catch (final RejectedExecutionException ignored) { | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public static boolean cancelPotentialWork(Account account, ImageView imageView) { | ||||
| 		final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); | ||||
| 
 | ||||
| 		if (bitmapWorkerTask != null) { | ||||
| 			final Account oldAccount = bitmapWorkerTask.account; | ||||
| 			if (oldAccount == null || account != oldAccount) { | ||||
| 				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
	 Daniel Gultsch
						Daniel Gultsch