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; | package eu.siacs.conversations.ui.adapter; | ||||||
| 
 | 
 | ||||||
| import android.content.Context; | 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.LayoutInflater; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.view.ViewGroup; | import android.view.ViewGroup; | ||||||
| @ -9,7 +14,9 @@ import android.widget.CompoundButton; | |||||||
| import android.widget.ImageView; | import android.widget.ImageView; | ||||||
| import android.widget.TextView; | import android.widget.TextView; | ||||||
| 
 | 
 | ||||||
|  | import java.lang.ref.WeakReference; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.concurrent.RejectedExecutionException; | ||||||
| 
 | 
 | ||||||
| import eu.siacs.conversations.Config; | import eu.siacs.conversations.Config; | ||||||
| import eu.siacs.conversations.R; | 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.ManageAccountActivity; | ||||||
| import eu.siacs.conversations.ui.XmppActivity; | import eu.siacs.conversations.ui.XmppActivity; | ||||||
| import eu.siacs.conversations.ui.widget.Switch; | import eu.siacs.conversations.ui.widget.Switch; | ||||||
|  | import eu.siacs.conversations.utils.UIHelper; | ||||||
| 
 | 
 | ||||||
| public class AccountAdapter extends ArrayAdapter<Account> { | 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); | 		TextView statusView = (TextView) view.findViewById(R.id.account_status); | ||||||
| 		ImageView imageView = (ImageView) view.findViewById(R.id.account_image); | 		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())); | 		statusView.setText(getContext().getString(account.getStatus().getReadableId())); | ||||||
| 		switch (account.getStatus()) { | 		switch (account.getStatus()) { | ||||||
| 			case ONLINE: | 			case ONLINE: | ||||||
| @ -70,4 +78,88 @@ public class AccountAdapter extends ArrayAdapter<Account> { | |||||||
| 		}); | 		}); | ||||||
| 		return view; | 		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