refactored share with activity

iNPUTmice created

Change summary

res/layout/share_with.xml                                      |  55 
res/menu/share_with.xml                                        |  11 
src/eu/siacs/conversations/services/XmppConnectionService.java |  16 
src/eu/siacs/conversations/ui/ChooseContactActivity.java       |   9 
src/eu/siacs/conversations/ui/ConversationActivity.java        | 113 --
src/eu/siacs/conversations/ui/ShareWithActivity.java           | 203 +--
src/eu/siacs/conversations/ui/XmppActivity.java                | 113 ++
src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java |  18 
8 files changed, 266 insertions(+), 272 deletions(-)

Detailed changes

res/layout/share_with.xml 🔗

@@ -1,50 +1,13 @@
-<ScrollView  xmlns:android="http://schemas.android.com/apk/res/android"
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent" >
 
-<LinearLayout
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical" >
+    <ListView
+        android:id="@+id/choose_conversation_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        tools:listitem="@layout/conversation_list_row" />
 
-     <TextView
-                android:id="@+id/conversations_header"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/share_with_active_conversations"
-                style="@style/sectionHeader"
-                android:paddingLeft="8dp"
-                android:paddingTop="8dp"
-                android:paddingRight="8dp"/>
-  
-
-    <LinearLayout
-        android:id="@+id/conversations"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:divider="?android:dividerHorizontal"
-        android:showDividers="middle" >
-        
-    </LinearLayout>
-      <TextView
-                android:id="@+id/contacts_header"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/contacts"
-                style="@style/sectionHeader"
-                android:paddingLeft="8dp"
-                android:paddingTop="8dp"
-                android:paddingRight="8dp"/>
-          <LinearLayout
-        android:id="@+id/contacts"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:divider="?android:dividerHorizontal"
-        android:showDividers="middle" >
-        
-    </LinearLayout>
-</LinearLayout>
-</ScrollView>
+</LinearLayout>

res/menu/share_with.xml 🔗

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <item
+        android:id="@+id/action_add"
+        android:icon="@drawable/ic_action_new"
+        android:orderInCategory="10"
+        android:showAsAction="always"
+        android:title="@string/action_add"/>
+
+</menu>

src/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -784,10 +784,22 @@ public class XmppConnectionService extends Service {
 
 		return this.conversations;
 	}
-
+	
 	public void populateWithOrderedConversations(List<Conversation> list) {
+		populateWithOrderedConversations(list,true);
+	}
+
+	public void populateWithOrderedConversations(List<Conversation> list, boolean includeConferences) {
 		list.clear();
-		list.addAll(getConversations());
+		if (includeConferences) {
+			list.addAll(getConversations());
+		} else {
+			for(Conversation conversation : getConversations()) {
+				if (conversation.getMode() == Conversation.MODE_SINGLE) {
+					list.add(conversation);
+				}
+			}
+		}
 		Collections.sort(list, new Comparator<Conversation>() {
 			@Override
 			public int compare(Conversation lhs, Conversation rhs) {

src/eu/siacs/conversations/ui/ChooseContactActivity.java 🔗

@@ -95,8 +95,13 @@ public class ChooseContactActivity extends XmppActivity {
 						InputMethodManager.HIDE_IMPLICIT_ONLY);
 				Intent request = getIntent();
 				Intent data = new Intent();
-				data.putExtra("contact", contacts.get(position).getJid());
-				data.putExtra("account", request.getStringExtra("account"));
+				ListItem mListItem = contacts.get(position);
+				data.putExtra("contact", mListItem.getJid());
+				String account = request.getStringExtra("account");
+				if (account==null && mListItem instanceof Contact) {
+					account = ((Contact) mListItem).getAccount().getJid();
+				}
+				data.putExtra("account", account);
 				data.putExtra("conversation",
 						request.getStringExtra("conversation"));
 				setResult(RESULT_OK, data);

src/eu/siacs/conversations/ui/ConversationActivity.java 🔗

@@ -1,10 +1,7 @@
 package eu.siacs.conversations.ui;
 
-import java.io.FileNotFoundException;
-import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.RejectedExecutionException;
 
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Contact;
@@ -15,7 +12,6 @@ import eu.siacs.conversations.ui.adapter.ConversationAdapter;
 import eu.siacs.conversations.utils.ExceptionHelper;
 import eu.siacs.conversations.utils.UIHelper;
 import android.net.Uri;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.provider.MediaStore;
@@ -28,13 +24,8 @@ import android.content.DialogInterface.OnClickListener;
 import android.content.IntentSender.SendIntentException;
 import android.content.Intent;
 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.support.v4.widget.SlidingPaneLayout;
 import android.support.v4.widget.SlidingPaneLayout.PanelSlideListener;
-import android.util.DisplayMetrics;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -46,7 +37,6 @@ import android.widget.CheckBox;
 import android.widget.ListView;
 import android.widget.PopupMenu;
 import android.widget.PopupMenu.OnMenuItemClickListener;
-import android.widget.ImageView;
 import android.widget.Toast;
 
 public class ConversationActivity extends XmppActivity {
@@ -108,7 +98,6 @@ public class ConversationActivity extends XmppActivity {
 	};
 
 	protected ConversationActivity activity = this;
-	private DisplayMetrics metrics;
 	private Toast prepareImageToast;
 
 	private Uri pendingImageUri = null;
@@ -139,9 +128,6 @@ public class ConversationActivity extends XmppActivity {
 
 	@Override
 	protected void onCreate(Bundle savedInstanceState) {
-
-		metrics = getResources().getDisplayMetrics();
-
 		super.onCreate(savedInstanceState);
 
 		setContentView(R.layout.fragment_conversations_overview);
@@ -772,105 +758,6 @@ public class ConversationActivity extends XmppActivity {
 		}
 	}
 
-	class BitmapWorkerTask extends AsyncTask<Message, Void, Bitmap> {
-		private final WeakReference<ImageView> imageViewReference;
-		private Message message = null;
-
-		public BitmapWorkerTask(ImageView imageView) {
-			imageViewReference = new WeakReference<ImageView>(imageView);
-		}
-
-		@Override
-		protected Bitmap doInBackground(Message... params) {
-			message = params[0];
-			try {
-				return xmppConnectionService.getFileBackend().getThumbnail(
-						message, (int) (metrics.density * 288), false);
-			} catch (FileNotFoundException e) {
-				return null;
-			}
-		}
-
-		@Override
-		protected void onPostExecute(Bitmap bitmap) {
-			if (imageViewReference != null && bitmap != null) {
-				final ImageView imageView = imageViewReference.get();
-				if (imageView != null) {
-					imageView.setImageBitmap(bitmap);
-					imageView.setBackgroundColor(0x00000000);
-				}
-			}
-		}
-	}
-
-	public void loadBitmap(Message message, ImageView imageView) {
-		Bitmap bm;
-		try {
-			bm = xmppConnectionService.getFileBackend().getThumbnail(message,
-					(int) (metrics.density * 288), true);
-		} catch (FileNotFoundException e) {
-			bm = null;
-		}
-		if (bm != null) {
-			imageView.setImageBitmap(bm);
-			imageView.setBackgroundColor(0x00000000);
-		} else {
-			if (cancelPotentialWork(message, imageView)) {
-				imageView.setBackgroundColor(0xff333333);
-				final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
-				final AsyncDrawable asyncDrawable = new AsyncDrawable(
-						getResources(), null, task);
-				imageView.setImageDrawable(asyncDrawable);
-				try {
-					task.execute(message);
-				} catch (RejectedExecutionException e) {
-					return;
-				}
-			}
-		}
-	}
-
-	public static boolean cancelPotentialWork(Message message,
-			ImageView imageView) {
-		final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
-
-		if (bitmapWorkerTask != null) {
-			final Message oldMessage = bitmapWorkerTask.message;
-			if (oldMessage == null || message != oldMessage) {
-				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>(
-					bitmapWorkerTask);
-		}
-
-		public BitmapWorkerTask getBitmapWorkerTask() {
-			return bitmapWorkerTaskReference.get();
-		}
-	}
-
 	public void encryptTextMessage(Message message) {
 		xmppConnectionService.getPgpEngine().encrypt(message,
 				new UiCallback<Message>() {

src/eu/siacs/conversations/ui/ShareWithActivity.java 🔗

@@ -1,37 +1,41 @@
 package eu.siacs.conversations.ui;
 
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
+import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Account;
-import eu.siacs.conversations.entities.Contact;
 import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.entities.Message;
-import eu.siacs.conversations.utils.UIHelper;
+import eu.siacs.conversations.ui.adapter.ConversationAdapter;
 import android.app.PendingIntent;
 import android.content.Intent;
-import android.content.SharedPreferences;
-import android.graphics.Bitmap;
 import android.net.Uri;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ListView;
 import android.widget.Toast;
 
 public class ShareWithActivity extends XmppActivity {
+	
+	private class Share {
+		public Uri uri;
+		public String account;
+		public String contact;
+		public String text;
+	}
+	
+	private Share share;
 
-	private LinearLayout conversations;
-	private LinearLayout contacts;
-	private boolean isImage = false;
+	private static final int REQUEST_START_NEW_CONVERSATION = 0x0501;
+	private ListView mListView;
+	private List<Conversation> mConversations = new ArrayList<Conversation>();
 
 	private UiCallback<Message> attachImageCallback = new UiCallback<Message>() {
 
@@ -52,111 +56,107 @@ public class ShareWithActivity extends XmppActivity {
 
 		}
 	};
+	
+	protected void onActivityResult(int requestCode, int resultCode,
+			final Intent data) {
+		super.onActivityResult(requestCode, resultCode, data);
+		if (requestCode == REQUEST_START_NEW_CONVERSATION
+				&& resultCode == RESULT_OK) {
+			share.contact = data.getStringExtra("contact");
+			share.account = data.getStringExtra("account");
+			Log.d(Config.LOGTAG,"contact: "+share.contact+" account:"+share.account);
+		}
+		if (xmppConnectionServiceBound && share != null && share.contact != null && share.account != null) {
+			share();
+		}
+	}
 
 	@Override
 	protected void onCreate(Bundle savedInstanceState) {
 
 		super.onCreate(savedInstanceState);
 
+		getActionBar().setDisplayHomeAsUpEnabled(false);
+		getActionBar().setHomeButtonEnabled(false);
+
 		setContentView(R.layout.share_with);
 		setTitle(getString(R.string.title_activity_sharewith));
 
-		contacts = (LinearLayout) findViewById(R.id.contacts);
-		conversations = (LinearLayout) findViewById(R.id.conversations);
+		mListView = (ListView) findViewById(R.id.choose_conversation_list);
+		ConversationAdapter mAdapter = new ConversationAdapter(this,
+				this.mConversations);
+		mListView.setAdapter(mAdapter);
+		mListView.setOnItemClickListener(new OnItemClickListener() {
 
+			@Override
+			public void onItemClick(AdapterView<?> arg0, View arg1,
+					int position, long arg3) {
+				Conversation conversation = mConversations.get(position);
+				if (conversation.getMode() == Conversation.MODE_SINGLE) {
+					share(mConversations.get(position));
+				}
+			}
+		});
+		
+		this.share = new Share();
 	}
-
-	public View createContactView(String name, String msgTxt, Bitmap bm) {
-		View view = (View) getLayoutInflater().inflate(R.layout.contact, null);
-		view.setBackgroundResource(R.drawable.greybackground);
-		TextView contactName = (TextView) view
-				.findViewById(R.id.contact_display_name);
-		contactName.setText(name);
-		TextView msg = (TextView) view.findViewById(R.id.contact_jid);
-		msg.setText(msgTxt);
-		ImageView imageView = (ImageView) view.findViewById(R.id.contact_photo);
-		imageView.setImageBitmap(bm);
-		return view;
+	
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu) {
+		getMenuInflater().inflate(R.menu.share_with, menu);
+		return true;
 	}
 
+	@Override
+	public boolean onOptionsItemSelected(MenuItem item) {
+		switch (item.getItemId()) {
+		case R.id.action_add:
+			Intent intent = new Intent(getApplicationContext(),
+					ChooseContactActivity.class);
+			startActivityForResult(intent, REQUEST_START_NEW_CONVERSATION);
+			return true;
+		}
+		return super.onOptionsItemSelected(item);
+	}
+	
+	@Override
+	public void onStart() {
+		super.onStart();
+		if (getIntent().getType() != null && getIntent().getType()
+				.startsWith("image/")) {
+			this.share.uri = (Uri) getIntent().getParcelableExtra(
+					Intent.EXTRA_STREAM);
+		} else {
+			this.share.text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
+		}
+	}
+	
 	@Override
 	void onBackendConnected() {
-		this.isImage = (getIntent().getType() != null && getIntent().getType()
-				.startsWith("image/"));
-		SharedPreferences preferences = PreferenceManager
-				.getDefaultSharedPreferences(this);
-		boolean useSubject = preferences.getBoolean("use_subject_in_muc", true);
-
-		Set<Contact> displayedContacts = new HashSet<Contact>();
-		conversations.removeAllViews();
-		List<Conversation> convList = new ArrayList<Conversation>();
-		xmppConnectionService.populateWithOrderedConversations(convList);
-		Collections.sort(convList, new Comparator<Conversation>() {
-			@Override
-			public int compare(Conversation lhs, Conversation rhs) {
-				return (int) (rhs.getLatestMessage().getTimeSent() - lhs
-						.getLatestMessage().getTimeSent());
-			}
-		});
-		for (final Conversation conversation : convList) {
-			if (!isImage || conversation.getMode() == Conversation.MODE_SINGLE) {
-				View view = createContactView(conversation.getName(useSubject),
-						conversation.getLatestMessage().getBody().trim(),
-						conversation.getImage(getApplicationContext(), 48));
-				view.setOnClickListener(new OnClickListener() {
-
-					@Override
-					public void onClick(View v) {
-						share(conversation);
-					}
-				});
-				conversations.addView(view);
-				displayedContacts.add(conversation.getContact());
-			}
+		if (xmppConnectionServiceBound &&  share != null && share.contact != null && share.account != null) {
+			share();
+			return;
 		}
-		contacts.removeAllViews();
-		List<Contact> contactsList = new ArrayList<Contact>();
-		for (Account account : xmppConnectionService.getAccounts()) {
-			for (Contact contact : account.getRoster().getContacts()) {
-				if (!displayedContacts.contains(contact)
-						&& (contact.showInRoster())) {
-					contactsList.add(contact);
-				}
+		xmppConnectionService.populateWithOrderedConversations(mConversations,
+				false);
+		for (Conversation conversation : mConversations) {
+			if (conversation.getMode() == Conversation.MODE_MULTI) {
+				mConversations.remove(conversation);
 			}
 		}
-
-		Collections.sort(contactsList, new Comparator<Contact>() {
-			@Override
-			public int compare(Contact lhs, Contact rhs) {
-				return lhs.getDisplayName().compareToIgnoreCase(
-						rhs.getDisplayName());
-			}
-		});
-
-		for (int i = 0; i < contactsList.size(); ++i) {
-			final Contact contact = contactsList.get(i);
-			View view = createContactView(contact.getDisplayName(),
-					contact.getJid(),
-					contact.getImage(48, getApplicationContext()));
-			view.setOnClickListener(new OnClickListener() {
-
-				@Override
-				public void onClick(View v) {
-					Conversation conversation = xmppConnectionService
-							.findOrCreateConversation(contact.getAccount(),
-									contact.getJid(), false);
-					share(conversation);
-				}
-			});
-			contacts.addView(view);
+	}
+	
+	private void share() {
+		Account account = xmppConnectionService.findAccountByJid(share.account);
+		if (account==null) {
+			return;
 		}
+		Conversation conversation = xmppConnectionService.findOrCreateConversation(account, share.contact, false);
+		share(conversation);
 	}
 
 	private void share(final Conversation conversation) {
-		String sharedText = null;
-		if (isImage) {
-			final Uri uri = (Uri) getIntent().getParcelableExtra(
-					Intent.EXTRA_STREAM);
+		if (share.uri != null) {
 			selectPresence(conversation, new OnPresenceSelected() {
 				@Override
 				public void onPresenceSelected() {
@@ -164,7 +164,7 @@ public class ShareWithActivity extends XmppActivity {
 							getText(R.string.preparing_image),
 							Toast.LENGTH_LONG).show();
 					ShareWithActivity.this.xmppConnectionService
-							.attachImageToConversation(conversation, uri,
+							.attachImageToConversation(conversation, share.uri,
 									attachImageCallback);
 					switchToConversation(conversation, null, true);
 					finish();
@@ -172,8 +172,7 @@ public class ShareWithActivity extends XmppActivity {
 			});
 
 		} else {
-			sharedText = getIntent().getStringExtra(Intent.EXTRA_TEXT);
-			switchToConversation(conversation, sharedText, true);
+			switchToConversation(conversation,this.share.text, true);
 			finish();
 		}
 

src/eu/siacs/conversations/ui/XmppActivity.java 🔗

@@ -1,5 +1,9 @@
 package eu.siacs.conversations.ui;
 
+import java.io.FileNotFoundException;
+import java.lang.ref.WeakReference;
+import java.util.concurrent.RejectedExecutionException;
+
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Account;
@@ -19,16 +23,23 @@ import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
 import android.content.IntentSender.SendIntentException;
+import android.content.res.Resources;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.IBinder;
+import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
+import android.widget.ImageView;
 
 public abstract class XmppActivity extends Activity {
 
@@ -44,6 +55,8 @@ public abstract class XmppActivity extends Activity {
 	protected int mWarningTextColor;
 	protected int mPrimaryColor;
 
+	private DisplayMetrics metrics;
+	
 	protected interface OnValueEdited {
 		public void onValueEdited(String value);
 	}
@@ -163,6 +176,7 @@ public abstract class XmppActivity extends Activity {
 	@Override
 	protected void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
+		metrics = getResources().getDisplayMetrics();
 		ExceptionHelper.init(getApplicationContext());
 		mPrimaryTextColor = getResources().getColor(R.color.primarytext);
 		mSecondaryTextColor = getResources().getColor(R.color.secondarytext);
@@ -389,4 +403,103 @@ public abstract class XmppActivity extends Activity {
 	public int getPrimaryColor() {
 		return this.mPrimaryColor;
 	}
+	
+	class BitmapWorkerTask extends AsyncTask<Message, Void, Bitmap> {
+		private final WeakReference<ImageView> imageViewReference;
+		private Message message = null;
+
+		public BitmapWorkerTask(ImageView imageView) {
+			imageViewReference = new WeakReference<ImageView>(imageView);
+		}
+
+		@Override
+		protected Bitmap doInBackground(Message... params) {
+			message = params[0];
+			try {
+				return xmppConnectionService.getFileBackend().getThumbnail(
+						message, (int) (metrics.density * 288), false);
+			} catch (FileNotFoundException e) {
+				return null;
+			}
+		}
+
+		@Override
+		protected void onPostExecute(Bitmap bitmap) {
+			if (imageViewReference != null && bitmap != null) {
+				final ImageView imageView = imageViewReference.get();
+				if (imageView != null) {
+					imageView.setImageBitmap(bitmap);
+					imageView.setBackgroundColor(0x00000000);
+				}
+			}
+		}
+	}
+
+	public void loadBitmap(Message message, ImageView imageView) {
+		Bitmap bm;
+		try {
+			bm = xmppConnectionService.getFileBackend().getThumbnail(message,
+					(int) (metrics.density * 288), true);
+		} catch (FileNotFoundException e) {
+			bm = null;
+		}
+		if (bm != null) {
+			imageView.setImageBitmap(bm);
+			imageView.setBackgroundColor(0x00000000);
+		} else {
+			if (cancelPotentialWork(message, imageView)) {
+				imageView.setBackgroundColor(0xff333333);
+				final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
+				final AsyncDrawable asyncDrawable = new AsyncDrawable(
+						getResources(), null, task);
+				imageView.setImageDrawable(asyncDrawable);
+				try {
+					task.execute(message);
+				} catch (RejectedExecutionException e) {
+					return;
+				}
+			}
+		}
+	}
+
+	public static boolean cancelPotentialWork(Message message,
+			ImageView imageView) {
+		final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
+
+		if (bitmapWorkerTask != null) {
+			final Message oldMessage = bitmapWorkerTask.message;
+			if (oldMessage == null || message != oldMessage) {
+				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>(
+					bitmapWorkerTask);
+		}
+
+		public BitmapWorkerTask getBitmapWorkerTask() {
+			return bitmapWorkerTaskReference.get();
+		}
+	}
 }

src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java 🔗

@@ -6,6 +6,7 @@ import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.entities.Message;
 import eu.siacs.conversations.ui.ConversationActivity;
+import eu.siacs.conversations.ui.XmppActivity;
 import eu.siacs.conversations.utils.UIHelper;
 import android.content.Context;
 import android.graphics.Color;
@@ -19,9 +20,9 @@ import android.widget.TextView;
 
 public class ConversationAdapter extends ArrayAdapter<Conversation> {
 
-	ConversationActivity activity;
+	private XmppActivity activity;
 
-	public ConversationAdapter(ConversationActivity activity,
+	public ConversationAdapter(XmppActivity activity,
 			List<Conversation> conversations) {
 		super(activity, 0, conversations);
 		this.activity = activity;
@@ -36,14 +37,17 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
 					parent, false);
 		}
 		Conversation conv = getItem(position);
-		if (!activity.getSlidingPaneLayout().isSlideable()) {
-			if (conv == activity.getSelectedConversation()) {
-				view.setBackgroundColor(0xffdddddd);
+		if (this.activity instanceof ConversationActivity) {
+			ConversationActivity activity = (ConversationActivity) this.activity;
+			if (!activity.getSlidingPaneLayout().isSlideable()) {
+				if (conv == activity.getSelectedConversation()) {
+					view.setBackgroundColor(0xffdddddd);
+				} else {
+					view.setBackgroundColor(Color.TRANSPARENT);
+				}
 			} else {
 				view.setBackgroundColor(Color.TRANSPARENT);
 			}
-		} else {
-			view.setBackgroundColor(Color.TRANSPARENT);
 		}
 		TextView convName = (TextView) view
 				.findViewById(R.id.conversation_name);