/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.fasterphotos.data; import android.graphics.Bitmap; import android.media.ExifInterface; import android.net.Uri; import android.util.Log; import android.webkit.MimeTypeMap; import com.android.fastergallery.common.BitmapUtils; import java.io.File; import java.io.IOException; public class FileRetriever implements MediaRetriever { private static final String TAG = FileRetriever.class.getSimpleName(); @Override public File getLocalFile(Uri contentUri) { return new File(contentUri.getPath()); } @Override public MediaSize getFastImageSize(Uri contentUri, MediaSize size) { if (isVideo(contentUri)) { return null; } return MediaSize.TemporaryThumbnail; } @Override public byte[] getTemporaryImage(Uri contentUri, MediaSize fastImageSize) { try { ExifInterface exif = new ExifInterface(contentUri.getPath()); if (exif.hasThumbnail()) { return exif.getThumbnail(); } } catch (IOException e) { Log.w(TAG, "Unable to load exif for " + contentUri); } return null; } @Override public boolean getMedia(Uri contentUri, MediaSize imageSize, File tempFile) { if (imageSize == MediaSize.Original) { return false; // getLocalFile should always return the original. } if (imageSize == MediaSize.Thumbnail) { File preview = MediaCache.getInstance().getCachedFile(contentUri, MediaSize.Preview); if (preview != null) { // Just downsample the preview, it is faster. return MediaCacheUtils.downsample(preview, imageSize, tempFile); } } File highRes = new File(contentUri.getPath()); boolean success; if (!isVideo(contentUri)) { success = MediaCacheUtils.downsample(highRes, imageSize, tempFile); } else { // Video needs to extract the bitmap. Bitmap bitmap = BitmapUtils.createVideoThumbnail(highRes.getPath()); if (bitmap == null) { return false; } else if (imageSize == MediaSize.Thumbnail && !MediaCacheUtils.needsDownsample(bitmap, MediaSize.Preview) && MediaCacheUtils.writeToFile(bitmap, tempFile)) { // Opportunistically save preview MediaCache mediaCache = MediaCache.getInstance(); mediaCache.insertIntoCache(contentUri, MediaSize.Preview, tempFile); } // Now scale the image success = MediaCacheUtils.downsample(bitmap, imageSize, tempFile); } return success; } @Override public Uri normalizeUri(Uri contentUri, MediaSize size) { return contentUri; } @Override public MediaSize normalizeMediaSize(Uri contentUri, MediaSize size) { return size; } private static boolean isVideo(Uri uri) { MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString()); String mimeType = mimeTypeMap.getMimeTypeFromExtension(extension); return (mimeType != null && mimeType.startsWith("video/")); } }