From 9e908d9cd407778633af5337b2e98f7313bbbb86 Mon Sep 17 00:00:00 2001 From: Bobby Georgescu Date: Mon, 17 Jun 2013 13:38:30 -0700 Subject: Add support for importing videos in MTP importer Bug: 4099088 Change-Id: Ic3ac00cb730381dd2d7f4802aa8001a60e439748 --- src/com/android/gallery3d/ingest/ImportTask.java | 1 + .../android/gallery3d/ingest/MtpDeviceIndex.java | 37 +++++++++++++++++----- .../android/gallery3d/ingest/ui/MtpImageView.java | 11 ++++++- 3 files changed, 40 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/com/android/gallery3d/ingest/ImportTask.java b/src/com/android/gallery3d/ingest/ImportTask.java index d850bb8e1..7d2d641a5 100644 --- a/src/com/android/gallery3d/ingest/ImportTask.java +++ b/src/com/android/gallery3d/ingest/ImportTask.java @@ -65,6 +65,7 @@ public class ImportTask implements Runnable { List objectsNotImported = new LinkedList(); int visited = 0; int total = mObjectsToImport.size(); + mListener.onImportProgress(visited, total, null); File dest = new File(Environment.getExternalStorageDirectory(), mDestAlbumName); dest.mkdirs(); for (MtpObjectInfo object : mObjectsToImport) { diff --git a/src/com/android/gallery3d/ingest/MtpDeviceIndex.java b/src/com/android/gallery3d/ingest/MtpDeviceIndex.java index e873dd1ca..d30f94a87 100644 --- a/src/com/android/gallery3d/ingest/MtpDeviceIndex.java +++ b/src/com/android/gallery3d/ingest/MtpDeviceIndex.java @@ -26,8 +26,10 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Stack; /** @@ -62,6 +64,27 @@ import java.util.Stack; */ public class MtpDeviceIndex { + public static final int FORMAT_MOV = 0x300D; // For some reason this is not in MtpConstants + + public static final Set SUPPORTED_IMAGE_FORMATS; + public static final Set SUPPORTED_VIDEO_FORMATS; + + static { + SUPPORTED_IMAGE_FORMATS = new HashSet(); + SUPPORTED_IMAGE_FORMATS.add(MtpConstants.FORMAT_JFIF); + SUPPORTED_IMAGE_FORMATS.add(MtpConstants.FORMAT_EXIF_JPEG); + SUPPORTED_IMAGE_FORMATS.add(MtpConstants.FORMAT_PNG); + SUPPORTED_IMAGE_FORMATS.add(MtpConstants.FORMAT_GIF); + SUPPORTED_IMAGE_FORMATS.add(MtpConstants.FORMAT_BMP); + + SUPPORTED_VIDEO_FORMATS = new HashSet(); + SUPPORTED_VIDEO_FORMATS.add(MtpConstants.FORMAT_3GP_CONTAINER); + SUPPORTED_VIDEO_FORMATS.add(MtpConstants.FORMAT_AVI); + SUPPORTED_VIDEO_FORMATS.add(MtpConstants.FORMAT_MP4_CONTAINER); + SUPPORTED_VIDEO_FORMATS.add(MtpConstants.FORMAT_MPEG); + // TODO: add FORMAT_MOV once Media Scanner supports .mov files + } + @Override public int hashCode() { final int prime = 31; @@ -492,14 +515,12 @@ public class MtpDeviceIndex { for (int objectHandle : mDevice.getObjectHandles(storageId, 0, dirHandle)) { MtpObjectInfo objectInfo = mDevice.getObjectInfo(objectHandle); if (objectInfo == null) throw new IndexingException(); - switch (objectInfo.getFormat()) { - case MtpConstants.FORMAT_JFIF: - case MtpConstants.FORMAT_EXIF_JPEG: - addObject(objectInfo); - break; - case MtpConstants.FORMAT_ASSOCIATION: - pendingDirectories.add(objectHandle); - break; + int format = objectInfo.getFormat(); + if (format == MtpConstants.FORMAT_ASSOCIATION) { + pendingDirectories.add(objectHandle); + } else if (SUPPORTED_IMAGE_FORMATS.contains(format) + || SUPPORTED_VIDEO_FORMATS.contains(format)) { + addObject(objectInfo); } } } diff --git a/src/com/android/gallery3d/ingest/ui/MtpImageView.java b/src/com/android/gallery3d/ingest/ui/MtpImageView.java index 67414c6c4..a773f4485 100644 --- a/src/com/android/gallery3d/ingest/ui/MtpImageView.java +++ b/src/com/android/gallery3d/ingest/ui/MtpImageView.java @@ -27,12 +27,16 @@ import android.os.Message; import android.util.AttributeSet; import android.widget.ImageView; +import com.android.gallery3d.ingest.MtpDeviceIndex; import com.android.gallery3d.ingest.data.BitmapWithMetadata; import com.android.gallery3d.ingest.data.MtpBitmapFetch; import java.lang.ref.WeakReference; public class MtpImageView extends ImageView { + // We will use the thumbnail for images larger than this threshold + private static final int MAX_FULLSIZE_PREVIEW_SIZE = 8388608; // 8 megabytes + private int mObjectHandle; private int mGeneration; @@ -89,7 +93,12 @@ public class MtpImageView extends ImageView { } protected Object fetchMtpImageDataFromDevice(MtpDevice device, MtpObjectInfo info) { - return MtpBitmapFetch.getFullsize(device, info); + if (info.getCompressedSize() <= MAX_FULLSIZE_PREVIEW_SIZE + && MtpDeviceIndex.SUPPORTED_IMAGE_FORMATS.contains(info.getFormat())) { + return MtpBitmapFetch.getFullsize(device, info); + } else { + return new BitmapWithMetadata(MtpBitmapFetch.getThumbnail(device, info), 0); + } } private float mLastBitmapWidth; -- cgit v1.2.3