aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoriNPUTmice <daniel@gultsch.de>2014-09-02 15:51:20 +0200
committeriNPUTmice <daniel@gultsch.de>2014-09-02 15:51:20 +0200
commit0ae852a6331a06b169152084719c0692db05ac5d (patch)
tree404964ed30f75dd6182245fdee4dd68934fdd485
parent2c9b2e6bf8dedf0a2a9eaae2d4eca1a3a251b00e (diff)
refactored share with activity
-rw-r--r--res/layout/share_with.xml55
-rw-r--r--res/menu/share_with.xml11
-rw-r--r--src/eu/siacs/conversations/services/XmppConnectionService.java16
-rw-r--r--src/eu/siacs/conversations/ui/ChooseContactActivity.java9
-rw-r--r--src/eu/siacs/conversations/ui/ConversationActivity.java113
-rw-r--r--src/eu/siacs/conversations/ui/ShareWithActivity.java203
-rw-r--r--src/eu/siacs/conversations/ui/XmppActivity.java113
-rw-r--r--src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java18
8 files changed, 266 insertions, 272 deletions
diff --git a/res/layout/share_with.xml b/res/layout/share_with.xml
index a578b2cbd..41b6033da 100644
--- a/res/layout/share_with.xml
+++ b/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> \ No newline at end of file
+</LinearLayout> \ No newline at end of file
diff --git a/res/menu/share_with.xml b/res/menu/share_with.xml
new file mode 100644
index 000000000..cbd15c119
--- /dev/null
+++ b/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> \ No newline at end of file
diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java
index 2656f7c6f..98f278bd2 100644
--- a/src/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/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) {
diff --git a/src/eu/siacs/conversations/ui/ChooseContactActivity.java b/src/eu/siacs/conversations/ui/ChooseContactActivity.java
index 83b20cb9b..449fc5467 100644
--- a/src/eu/siacs/conversations/ui/ChooseContactActivity.java
+++ b/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);
diff --git a/src/eu/siacs/conversations/ui/ConversationActivity.java b/src/eu/siacs/conversations/ui/ConversationActivity.java
index 6504f0569..fe345fc43 100644
--- a/src/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/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>() {
diff --git a/src/eu/siacs/conversations/ui/ShareWithActivity.java b/src/eu/siacs/conversations/ui/ShareWithActivity.java
index 57b4ba31c..93831654f 100644
--- a/src/eu/siacs/conversations/ui/ShareWithActivity.java
+++ b/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();
}
diff --git a/src/eu/siacs/conversations/ui/XmppActivity.java b/src/eu/siacs/conversations/ui/XmppActivity.java
index 11376eb74..174bab3a6 100644
--- a/src/eu/siacs/conversations/ui/XmppActivity.java
+++ b/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();
+ }
+ }
}
diff --git a/src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
index ecae62318..8f7eef8cd 100644
--- a/src/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
+++ b/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);