blob: 1d042575ea1cebd63c47ebfc9da1977580fa15ec [file] [log] [blame]
/*
* Copyright (C) 2009 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.camera.gallery;
import com.android.camera.BitmapManager;
import com.android.camera.Util;
import android.content.ContentResolver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
class UriImage implements IImage {
private static final String TAG = "UriImage";
private final Uri mUri;
private final IImageList mContainer;
private final ContentResolver mContentResolver;
UriImage(IImageList container, ContentResolver cr, Uri uri) {
mContainer = container;
mContentResolver = cr;
mUri = uri;
}
public int getDegreesRotated() {
return 0;
}
public String getDataPath() {
return mUri.getPath();
}
private InputStream getInputStream() {
try {
if (mUri.getScheme().equals("file")) {
return new java.io.FileInputStream(mUri.getPath());
} else {
return mContentResolver.openInputStream(mUri);
}
} catch (FileNotFoundException ex) {
return null;
}
}
private ParcelFileDescriptor getPFD() {
try {
if (mUri.getScheme().equals("file")) {
String path = mUri.getPath();
return ParcelFileDescriptor.open(new File(path),
ParcelFileDescriptor.MODE_READ_ONLY);
} else {
return mContentResolver.openFileDescriptor(mUri, "r");
}
} catch (FileNotFoundException ex) {
return null;
}
}
public Bitmap fullSizeBitmap(int minSideLength, int maxNumberOfPixels) {
return fullSizeBitmap(minSideLength, maxNumberOfPixels,
IImage.ROTATE_AS_NEEDED, IImage.NO_NATIVE);
}
public Bitmap fullSizeBitmap(int minSideLength, int maxNumberOfPixels,
boolean rotateAsNeeded) {
return fullSizeBitmap(minSideLength, maxNumberOfPixels,
rotateAsNeeded, IImage.NO_NATIVE);
}
public Bitmap fullSizeBitmap(int minSideLength, int maxNumberOfPixels,
boolean rotateAsNeeded, boolean useNative) {
try {
ParcelFileDescriptor pfdInput = getPFD();
Bitmap b = Util.makeBitmap(minSideLength, maxNumberOfPixels,
pfdInput, useNative);
return b;
} catch (Exception ex) {
Log.e(TAG, "got exception decoding bitmap ", ex);
return null;
}
}
public Uri fullSizeImageUri() {
return mUri;
}
public InputStream fullSizeImageData() {
return getInputStream();
}
public Bitmap miniThumbBitmap() {
return thumbBitmap(IImage.ROTATE_AS_NEEDED);
}
public String getTitle() {
return mUri.toString();
}
public Bitmap thumbBitmap(boolean rotateAsNeeded) {
return fullSizeBitmap(THUMBNAIL_TARGET_SIZE, THUMBNAIL_MAX_NUM_PIXELS,
rotateAsNeeded);
}
private BitmapFactory.Options snifBitmapOptions() {
ParcelFileDescriptor input = getPFD();
if (input == null) return null;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapManager.instance().decodeFileDescriptor(
input.getFileDescriptor(), options);
return options;
} finally {
Util.closeSilently(input);
}
}
public String getMimeType() {
BitmapFactory.Options options = snifBitmapOptions();
return (options != null && options.outMimeType != null)
? options.outMimeType
: "";
}
public int getHeight() {
BitmapFactory.Options options = snifBitmapOptions();
return (options != null) ? options.outHeight : 0;
}
public int getWidth() {
BitmapFactory.Options options = snifBitmapOptions();
return (options != null) ? options.outWidth : 0;
}
public IImageList getContainer() {
return mContainer;
}
public long getDateTaken() {
return 0;
}
public boolean isReadonly() {
return true;
}
public boolean isDrm() {
return false;
}
public boolean rotateImageBy(int degrees) {
return false;
}
}