aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Gultsch <daniel.gultsch@rwth-aachen.de>2014-04-25 23:06:20 +0200
committerDaniel Gultsch <daniel.gultsch@rwth-aachen.de>2014-04-25 23:06:20 +0200
commit645139eb68cb966b90d36790e5b60c0bc6727c78 (patch)
tree9633c20bd4f2e5aa1906373bdea5a07b1aacd6fc
parentbf2d0d5596a08872230056d056241ee906962171 (diff)
couple of more optimazations on image loading
-rw-r--r--res/layout/conversation_list_row.xml1
-rw-r--r--res/layout/message_recieved.xml4
-rw-r--r--res/layout/message_sent.xml2
-rw-r--r--src/eu/siacs/conversations/persistance/FileBackend.java43
-rw-r--r--src/eu/siacs/conversations/ui/ConversationActivity.java35
-rw-r--r--src/eu/siacs/conversations/ui/ConversationFragment.java6
-rw-r--r--src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java16
7 files changed, 43 insertions, 64 deletions
diff --git a/res/layout/conversation_list_row.xml b/res/layout/conversation_list_row.xml
index 76016ada..dda09178 100644
--- a/res/layout/conversation_list_row.xml
+++ b/res/layout/conversation_list_row.xml
@@ -52,6 +52,7 @@
android:id="@+id/conversation_lastimage"
android:layout_width="fill_parent"
android:layout_height="36dp"
+ android:background="#333333"
android:scaleType="centerCrop" />
</LinearLayout>
diff --git a/res/layout/message_recieved.xml b/res/layout/message_recieved.xml
index 9893ef23..9f0c41e5 100644
--- a/res/layout/message_recieved.xml
+++ b/res/layout/message_recieved.xml
@@ -26,9 +26,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
- android:maxHeight="288dp"
- android:maxWidth="288dp"
android:paddingBottom="2dp"
+ android:scaleType="fitXY"
+ android:background="#333333"
/>
<TextView
diff --git a/res/layout/message_sent.xml b/res/layout/message_sent.xml
index f0950ef9..990df59b 100644
--- a/res/layout/message_sent.xml
+++ b/res/layout/message_sent.xml
@@ -26,6 +26,8 @@
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:paddingBottom="2dp"
+ android:scaleType="fitXY"
+ android:background="#333333"
/>
<TextView
diff --git a/src/eu/siacs/conversations/persistance/FileBackend.java b/src/eu/siacs/conversations/persistance/FileBackend.java
index 129176a4..c451b906 100644
--- a/src/eu/siacs/conversations/persistance/FileBackend.java
+++ b/src/eu/siacs/conversations/persistance/FileBackend.java
@@ -118,10 +118,10 @@ public class FileBackend {
.getAbsolutePath());
}
- public Bitmap getThumbnail(Message message, int size)
+ public Bitmap getThumbnail(Message message, int size, boolean cacheOnly)
throws FileNotFoundException {
Bitmap thumbnail = thumbnailCache.get(message.getUuid());
- if (thumbnail == null) {
+ if ((thumbnail == null)&&(!cacheOnly)) {
Bitmap fullsize = BitmapFactory.decodeFile(getJingleFile(message)
.getAbsolutePath());
if (fullsize == null) {
@@ -132,45 +132,6 @@ public class FileBackend {
}
return thumbnail;
}
-
- public void getThumbnailAsync(final Message message, final int size, ImageView imageView, TextView textView) {
-
- Bitmap thumbnail = thumbnailCache.get(message.getUuid());
- if (thumbnail == null) {
- final WeakReference<ImageView> image = new WeakReference<ImageView>(imageView);
- final WeakReference<TextView> text = new WeakReference<TextView>(textView);
- new Thread(new Runnable() {
-
- @Override
- public void run() {
- if (image.get()!=null) {
- image.get().setVisibility(View.GONE);
- }
- if (text.get()!=null) {
- text.get().setVisibility(View.VISIBLE);
- text.get().setText("loading image");
- }
- Bitmap fullsize = BitmapFactory.decodeFile(getJingleFile(message)
- .getAbsolutePath());
- if (fullsize!=null) {
- Bitmap thumbnail = resize(fullsize, size);
- thumbnailCache.put(message.getUuid(), thumbnail);
- if (image.get()!=null) {
- image.get().setVisibility(View.VISIBLE);
- image.get().setImageBitmap(thumbnail);
- }
- if (text.get()!=null) {
- text.get().setVisibility(View.GONE);
- }
- }
- }
- }).start();
- } else {
- textView.setVisibility(View.GONE);
- imageView.setVisibility(View.VISIBLE);
- imageView.setImageBitmap(thumbnail);
- }
- }
public void removeFiles(Conversation conversation) {
String prefix = context.getFilesDir().getAbsolutePath();
diff --git a/src/eu/siacs/conversations/ui/ConversationActivity.java b/src/eu/siacs/conversations/ui/ConversationActivity.java
index 32e3588b..91fde31e 100644
--- a/src/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/src/eu/siacs/conversations/ui/ConversationActivity.java
@@ -649,42 +649,51 @@ public class ConversationActivity extends XmppActivity {
private Message message = null;
public BitmapWorkerTask(ImageView imageView) {
- // Use a WeakReference to ensure the ImageView can be garbage collected
imageViewReference = new WeakReference<ImageView>(imageView);
}
- // Decode image in background.
@Override
protected Bitmap doInBackground(Message... params) {
message = params[0];
try {
- return xmppConnectionService.getFileBackend().getThumbnail(message, (int) (metrics.density * 288));
+ return xmppConnectionService.getFileBackend().getThumbnail(message, (int) (metrics.density * 288),false);
} catch (FileNotFoundException e) {
Log.d("xmppService","file not found!");
return null;
}
}
- // Once complete, see if ImageView is still around and set bitmap.
@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) {
- if (cancelPotentialWork(message, imageView)) {
- final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
- final AsyncDrawable asyncDrawable =
- new AsyncDrawable(getResources(), null, task);
- imageView.setImageDrawable(asyncDrawable);
- task.execute(message);
- }
+ Bitmap bm;
+ try {
+ bm = xmppConnectionService.getFileBackend().getThumbnail(message, (int) (metrics.density * 288), true);
+ } catch (FileNotFoundException e) {
+ bm = null;
+ }
+ if (bm!=null) {
+ imageView.setImageBitmap(bm);
+ } 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);
+ task.execute(message);
+ }
+ }
}
public static boolean cancelPotentialWork(Message message, ImageView imageView) {
@@ -692,16 +701,12 @@ public class ConversationActivity extends XmppActivity {
if (bitmapWorkerTask != null) {
final Message oldMessage = bitmapWorkerTask.message;
- // If bitmapData is not yet set or it differs from the new data
if (oldMessage == null || message != oldMessage) {
- // Cancel previous task
bitmapWorkerTask.cancel(true);
} else {
- // The same work is already in progress
return false;
}
}
- // No task associated with the ImageView, or an existing task was cancelled
return true;
}
diff --git a/src/eu/siacs/conversations/ui/ConversationFragment.java b/src/eu/siacs/conversations/ui/ConversationFragment.java
index d42b33c4..5ade8a53 100644
--- a/src/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/eu/siacs/conversations/ui/ConversationFragment.java
@@ -301,16 +301,16 @@ public class ConversationFragment extends Fragment {
viewHolder.image.setVisibility(View.VISIBLE);
String[] params = item.getBody().split(",");
if (params.length==3) {
- int target = (int) (metrics.density * 288);
+ double target = metrics.density * 288;
int w = Integer.parseInt(params[1]);
int h = Integer.parseInt(params[2]);
int scalledW;
int scalledH;
if (w <= h) {
scalledW = (int) (w / ((double) h / target));
- scalledH = target;
+ scalledH = (int) target;
} else {
- scalledW = target;
+ scalledW = (int) target;
scalledH = (int) (h / ((double) w / target));
}
viewHolder.image.setLayoutParams(new LinearLayout.LayoutParams(scalledW, scalledH));
diff --git a/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
index 0959031b..4f383f52 100644
--- a/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
+++ b/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
@@ -7,6 +7,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
+import android.graphics.BitmapFactory;
import android.util.Log;
import eu.siacs.conversations.entities.Account;
@@ -78,10 +79,16 @@ public class JingleConnection {
if (acceptedAutomatically) {
message.markUnread();
}
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeFile(file.getAbsolutePath(),options);
+ int imageHeight = options.outHeight;
+ int imageWidth = options.outWidth;
+ message.setBody(""+file.getSize()+","+imageWidth+","+imageHeight);
mXmppConnectionService.databaseBackend.createMessage(message);
mXmppConnectionService.markMessage(message, Message.STATUS_RECIEVED);
}
- Log.d("xmppService","sucessfully transmitted file. sha1:"+file.getSha1Sum());
+ Log.d("xmppService","sucessfully transmitted file. sha1:"+file.getSha1Sum()+" "+message.getBody());
}
};
@@ -197,7 +204,7 @@ public class JingleConnection {
public void init(Account account, JinglePacket packet) {
this.status = STATUS_INITIATED;
Conversation conversation = this.mXmppConnectionService.findOrCreateConversation(account, packet.getFrom().split("/")[0], false);
- this.message = new Message(conversation, "receiving image file", Message.ENCRYPTION_NONE);
+ this.message = new Message(conversation, "", Message.ENCRYPTION_NONE);
this.message.setType(Message.TYPE_IMAGE);
this.message.setStatus(Message.STATUS_RECEIVED_OFFER);
this.message.setJingleConnection(this);
@@ -230,6 +237,7 @@ public class JingleConnection {
}
if (supportedFile) {
this.file.setExpectedSize(Long.parseLong(fileSize.getContent()));
+ message.setBody(""+this.file.getExpectedSize());
conversation.getMessages().add(message);
if (this.file.getExpectedSize()<=this.mJingleConnectionManager.getAutoAcceptFileSize()) {
Log.d("xmppService","auto accepting file from "+packet.getFrom());
@@ -413,7 +421,7 @@ public class JingleConnection {
this.status = STATUS_TRANSMITTING;
if (connection.needsActivation()) {
if (connection.getCandidate().isOurs()) {
- Log.d("xmppService","candidate "+connection.getCandidate().getCid()+" was our proxy and needs activation");
+ Log.d("xmppService","candidate "+connection.getCandidate().getCid()+" was our proxy. going to activate");
IqPacket activation = new IqPacket(IqPacket.TYPE_SET);
activation.setTo(connection.getCandidate().getJid());
activation.query("http://jabber.org/protocol/bytestreams").setAttribute("sid", this.getSessionId());
@@ -430,6 +438,8 @@ public class JingleConnection {
}
}
});
+ } else {
+ Log.d("xmppService","candidate "+connection.getCandidate().getCid()+" was a proxy. waiting for other party to activate");
}
} else {
if (initiator.equals(account.getFullJid())) {