use PartDatabase to look up thumbnails async

// FREEBIE

Closes #2286
This commit is contained in:
Jake McGinty
2014-12-30 01:36:51 -08:00
committed by Moxie Marlinspike
parent 3e6e28e688
commit 12845da91a
15 changed files with 284 additions and 188 deletions

View File

@@ -31,11 +31,14 @@ import android.util.Log;
import android.widget.ImageView;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MmsDatabase;
import org.thoughtcrime.securesms.util.BitmapDecodingException;
import org.thoughtcrime.securesms.util.BitmapUtil;
import org.thoughtcrime.securesms.util.LRUCache;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.MediaUtil.ThumbnailData;
import org.thoughtcrime.securesms.util.SmilUtil;
import org.thoughtcrime.securesms.util.Util;
import org.w3c.dom.smil.SMILDocument;
import org.w3c.dom.smil.SMILMediaElement;
import org.w3c.dom.smil.SMILRegionElement;
@@ -81,9 +84,19 @@ public class ImageSlide extends Slide {
try {
Bitmap thumbnailBitmap;
long startDecode = System.currentTimeMillis();
Log.w(TAG, (part.getThumbnailUri() == null ? "generating" : "fetching pre-generated") + " thumbnail");
if (part.getThumbnailUri() != null) thumbnailBitmap = BitmapFactory.decodeStream(PartAuthority.getPartStream(context, masterSecret, part.getThumbnailUri()));
else thumbnailBitmap = BitmapUtil.createScaledBitmap(context, masterSecret, getUri(), maxWidth, maxHeight);
if (part.getDataUri() != null && part.getId() > -1) {
thumbnailBitmap = BitmapFactory.decodeStream(DatabaseFactory.getPartDatabase(context)
.getThumbnailStream(masterSecret, part.getId()));
} else if (part.getDataUri() != null) {
Log.w(TAG, "generating thumbnail for new part");
ThumbnailData thumbnailData = MediaUtil.generateThumbnail(context, masterSecret,
part.getDataUri(), Util.toIsoString(part.getContentType()));
thumbnailBitmap = thumbnailData.getBitmap();
part.setThumbnail(thumbnailBitmap);
} else {
throw new FileNotFoundException("no data location specified");
}
Log.w(TAG, "thumbnail decode/generate time: " + (System.currentTimeMillis() - startDecode) + "ms");
@@ -91,11 +104,8 @@ public class ImageSlide extends Slide {
thumbnailCache.put(part.getDataUri(), new SoftReference<>(thumbnail));
return thumbnail;
} catch (FileNotFoundException e) {
Log.w("ImageSlide", e);
return context.getResources().getDrawable(R.drawable.ic_missing_thumbnail_picture);
} catch (BitmapDecodingException e) {
Log.w("ImageSlide", e);
} catch (IOException | BitmapDecodingException e) {
Log.w(TAG, e);
return context.getResources().getDrawable(R.drawable.ic_missing_thumbnail_picture);
}
}

View File

@@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.database.PartDatabase;
import org.thoughtcrime.securesms.providers.PartProvider;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class PartAuthority {
@@ -33,7 +34,7 @@ public class PartAuthority {
}
public static InputStream getPartStream(Context context, MasterSecret masterSecret, Uri uri)
throws FileNotFoundException
throws IOException
{
PartDatabase partDatabase = DatabaseFactory.getPartDatabase(context);
int match = uriMatcher.match(uri);

View File

@@ -37,11 +37,11 @@ public class PartParser {
return bodyText;
}
public static PduBody getNonTextParts(PduBody body) {
public static PduBody getSupportedMediaParts(PduBody body) {
PduBody stripped = new PduBody();
for (int i=0;i<body.getPartsNum();i++) {
if (!ContentType.isTextType(Util.toIsoString(body.getPart(i).getContentType()))) {
if (isDisplayableMedia(Util.toIsoString(body.getPart(i).getContentType()))) {
stripped.addPart(body.getPart(i));
}
}
@@ -49,20 +49,23 @@ public class PartParser {
return stripped;
}
public static int getDisplayablePartCount(PduBody body) {
public static int getSupportedMediaPartCount(PduBody body) {
int partCount = 0;
for (int i=0;i<body.getPartsNum();i++) {
String contentType = Util.toIsoString(body.getPart(i).getContentType());
if (ContentType.isImageType(contentType) ||
ContentType.isAudioType(contentType) ||
ContentType.isVideoType(contentType))
{
if (isDisplayableMedia(contentType)) {
partCount++;
}
}
return partCount;
}
private static boolean isDisplayableMedia(String contentType) {
return ContentType.isImageType(contentType) ||
ContentType.isAudioType(contentType) ||
ContentType.isVideoType(contentType);
}
}

View File

@@ -80,6 +80,8 @@ public abstract class Slide {
imageView.setImageDrawable(getThumbnail(imageView.getWidth(), imageView.getHeight()));
}
public Bitmap getGeneratedThumbnail() { return null; }
public boolean hasImage() {
return false;
}

View File

@@ -18,9 +18,9 @@ package org.thoughtcrime.securesms.mms;
import android.content.Context;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.dom.smil.parser.SmilXmlSerializer;
import org.thoughtcrime.securesms.util.SmilUtil;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;