UriImage.java revision 7817979db0c52ffeacb951625b1e821eba303285
1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.data; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.ContentResolver; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Bitmap; 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Bitmap.Config; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.BitmapFactory.Options; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.BitmapRegionDecoder; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.net.Uri; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.os.ParcelFileDescriptor; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 274bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.app.GalleryApp; 284bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.common.BitmapUtils; 294bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.common.Utils; 304bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.util.ThreadPool.CancelListener; 314bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.util.ThreadPool.Job; 324bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.util.ThreadPool.JobContext; 334bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin 34d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Changimport java.io.FileInputStream; 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.FileNotFoundException; 36d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Changimport java.io.InputStream; 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.net.URI; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.net.URL; 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class UriImage extends MediaItem { 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "UriImage"; 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int STATE_INIT = 0; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int STATE_DOWNLOADING = 1; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int STATE_DOWNLOADED = 2; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int STATE_ERROR = -1; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final Uri mUri; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final String mContentType; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private DownloadCache.Entry mCacheEntry; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ParcelFileDescriptor mFileDescriptor; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mState = STATE_INIT; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mWidth; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mHeight; 56d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang private int mRotation; 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6021a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin public UriImage(GalleryApp application, Path path, Uri uri, String contentType) { 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super(path, nextVersionNumber()); 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mUri = uri; 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mApplication = Utils.checkNotNull(application); 6421a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin mContentType = contentType; 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Job<Bitmap> requestImage(int type) { 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return new BitmapJob(type); 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Job<BitmapRegionDecoder> requestLargeImage() { 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return new RegionDecoderJob(); 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void openFileOrDownloadTempFile(JobContext jc) { 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int state = openOrDownloadInner(jc); 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin synchronized (this) { 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mState = state; 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mState != STATE_DOWNLOADED) { 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mFileDescriptor != null) { 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Utils.closeSilently(mFileDescriptor); 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFileDescriptor = null; 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin notifyAll(); 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int openOrDownloadInner(JobContext jc) { 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String scheme = mUri.getScheme(); 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (ContentResolver.SCHEME_CONTENT.equals(scheme) 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin || ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme) 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin || ContentResolver.SCHEME_FILE.equals(scheme)) { 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 97d74016524fa899747411240daa453e5ca9cac219Ray Chen if (MIME_TYPE_JPEG.equalsIgnoreCase(mContentType)) { 98d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang InputStream is = mApplication.getContentResolver() 99d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang .openInputStream(mUri); 100d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang mRotation = Exif.getOrientation(is); 101d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang Utils.closeSilently(is); 102d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang } 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFileDescriptor = mApplication.getContentResolver() 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .openFileDescriptor(mUri, "r"); 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (jc.isCancelled()) return STATE_INIT; 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_DOWNLOADED; 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (FileNotFoundException e) { 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "fail to open: " + mUri, e); 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_ERROR; 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin URL url = new URI(mUri.toString()).toURL(); 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCacheEntry = mApplication.getDownloadCache().download(jc, url); 115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (jc.isCancelled()) return STATE_INIT; 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCacheEntry == null) { 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "download failed " + url); 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_ERROR; 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 120d74016524fa899747411240daa453e5ca9cac219Ray Chen if (MIME_TYPE_JPEG.equalsIgnoreCase(mContentType)) { 121d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang InputStream is = new FileInputStream(mCacheEntry.cacheFile); 122d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang mRotation = Exif.getOrientation(is); 123d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang Utils.closeSilently(is); 124d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang } 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFileDescriptor = ParcelFileDescriptor.open( 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCacheEntry.cacheFile, ParcelFileDescriptor.MODE_READ_ONLY); 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_DOWNLOADED; 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (Throwable t) { 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "download error", t); 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return STATE_ERROR; 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean prepareInputFile(JobContext jc) { 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin jc.setCancelListener(new CancelListener() { 1377817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCancel() { 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin synchronized (this) { 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin notifyAll(); 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin while (true) { 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin synchronized (this) { 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (jc.isCancelled()) return false; 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mState == STATE_INIT) { 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mState = STATE_DOWNLOADING; 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Then leave the synchronized block and continue. 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mState == STATE_ERROR) { 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mState == STATE_DOWNLOADED) { 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else /* if (mState == STATE_DOWNLOADING) */ { 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin wait(); 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (InterruptedException ex) { 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // ignored. 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin continue; 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // This is only reached for STATE_INIT->STATE_DOWNLOADING 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin openFileOrDownloadTempFile(jc); 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class RegionDecoderJob implements Job<BitmapRegionDecoder> { 1707817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public BitmapRegionDecoder run(JobContext jc) { 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!prepareInputFile(jc)) return null; 1734bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin BitmapRegionDecoder decoder = DecodeUtils.createBitmapRegionDecoder( 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin jc, mFileDescriptor.getFileDescriptor(), false); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mWidth = decoder.getWidth(); 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHeight = decoder.getHeight(); 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return decoder; 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class BitmapJob implements Job<Bitmap> { 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mType; 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected BitmapJob(int type) { 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mType = type; 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1884bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin @Override 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Bitmap run(JobContext jc) { 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!prepareInputFile(jc)) return null; 1914bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin int targetSize = MediaItem.getTargetSize(mType); 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Options options = new Options(); 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin options.inPreferredConfig = Config.ARGB_8888; 1944bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin Bitmap bitmap = DecodeUtils.decodeThumbnail(jc, 1954bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin mFileDescriptor.getFileDescriptor(), options, targetSize, mType); 1964bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (jc.isCancelled() || bitmap == null) { 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return null; 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mType == MediaItem.TYPE_MICROTHUMBNAIL) { 2024bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin bitmap = BitmapUtils.resizeAndCropCenter(bitmap, targetSize, true); 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 2044bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin bitmap = BitmapUtils.resizeDownBySideLength(bitmap, targetSize, true); 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return bitmap; 207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getSupportedOperations() { 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supported = SUPPORT_EDIT | SUPPORT_SETAS; 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (isSharable()) supported |= SUPPORT_SHARE; 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (BitmapUtils.isSupportedByRegionDecoder(mContentType)) { 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supported |= SUPPORT_FULL_IMAGE; 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return supported; 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean isSharable() { 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // We cannot grant read permission to the receiver since we put 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // the data URI in EXTRA_STREAM instead of the data part of an intent 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // And there are issues in MediaUploader and Bluetooth file sender to 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // share a general image data. So, we only share for local file. 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return ContentResolver.SCHEME_FILE.equals(mUri.getScheme()); 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getMediaType() { 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return MEDIA_TYPE_IMAGE; 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Uri getContentUri() { 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mUri; 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaDetails details = super.getDetails(); 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mWidth != 0 && mHeight != 0) { 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin details.addDetail(MediaDetails.INDEX_WIDTH, mWidth); 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin details.addDetail(MediaDetails.INDEX_HEIGHT, mHeight); 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 245d74016524fa899747411240daa453e5ca9cac219Ray Chen if (mContentType != null) { 246d74016524fa899747411240daa453e5ca9cac219Ray Chen details.addDetail(MediaDetails.INDEX_MIMETYPE, mContentType); 247d74016524fa899747411240daa453e5ca9cac219Ray Chen } 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (ContentResolver.SCHEME_FILE.equals(mUri.getScheme())) { 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String filePath = mUri.getPath(); 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin details.addDetail(MediaDetails.INDEX_PATH, filePath); 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaDetails.extractExifInfo(details, filePath); 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return details; 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public String getMimeType() { 258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mContentType; 259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 261f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 262f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void finalize() throws Throwable { 263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mFileDescriptor != null) { 265f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Utils.closeSilently(mFileDescriptor); 266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.finalize(); 269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 271bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 272bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 273bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang public int getWidth() { 274bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang return 0; 275bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 276bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 277bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 278bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang public int getHeight() { 279bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang return 0; 280bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 281d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang 282d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang @Override 283d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang public int getRotation() { 284d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang return mRotation; 285d6985f9ba58c11c29760f28be07ebd229a9b7a39Chih-Chung Chang } 286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 287