/******************************************************************************* * Copyright 2009 Robot Media SL * * 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 net.robotmedia.acv.comic; import java.io.File; import net.robotmedia.acv.utils.FileUtils; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Bitmap.Config; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; public class FileComic extends Comic { private Context context; private int resourceID; private boolean isResource = false; protected FileComic(Context context, int id) { super(""); isResource = true; this.resourceID = id; this.context = context; final String resourceName = context.getResources().getResourceEntryName(resourceID); this.setId(resourceName); } protected FileComic(String path) { super(path); String extension = FileUtils.getFileExtension(path); if (FileUtils.isImage(extension)) { File file = new File(path); if (file.isDirectory()) { error(); } } else { error(); } } @Override public void destroy() {} @Override public int getLength() { return 1; } @Override public Drawable getScreen(int position) { ImageState status = imageState.get(KEY_IMAGE_STATE); if (status == null) status = ImageState.UNKNOWN; switch (status) { case MODIFIED: final String fileName = getDefaultFileName(0); String filePath = getTempFilePath(fileName); return Drawable.createFromPath(filePath); case ORIGINAL: if (isResource) { return context.getResources().getDrawable(resourceID); } else { return Drawable.createFromPath(path); } default: Bitmap bitmap = resampleAndSave(); if (bitmap == null) { error(); return null; } else { return new BitmapDrawable(bitmap); } } } private static final String KEY_IMAGE_STATE = "0"; private Bitmap resampleAndSave() { if (isResource) { BitmapFactory.decodeResource(context.getResources(), resourceID, bounds); } else { BitmapFactory.decodeFile(path, bounds); } int width = bounds.outWidth; int height = bounds.outHeight; boolean landscape = height > width; int maxHeight = getMaxHeight(landscape); int maxWidth = getMaxWidth(landscape); Bitmap bitmap; boolean avoidResample = width <= maxWidth && height <= maxHeight; if (avoidResample) { imageState.put(KEY_IMAGE_STATE, ImageState.ORIGINAL); if (isResource) { bitmap = BitmapFactory.decodeResource(context.getResources(), resourceID); } else { bitmap = BitmapFactory.decodeFile(path); } } else { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Config.RGB_565; options.inSampleSize = calculateSampleSize(width, height); if (isResource) { bitmap =BitmapFactory.decodeResource(context.getResources(), resourceID, options); } else { bitmap = BitmapFactory.decodeFile(path, options); } if (bitmap != null) { final String fileName = getDefaultFileName(0); saveBitmap(fileName, bitmap); imageState.put(KEY_IMAGE_STATE, ImageState.MODIFIED); } } return bitmap; } @Override public Drawable getThumbnail(int position) { // TODO Auto-generated method stub return null; } @Override public void prepareScreen(int position) {} @Override public Uri getUri(int position) { ImageState status = imageState.get(KEY_IMAGE_STATE); if (status == null) status = ImageState.UNKNOWN; String filePath = null; switch (status) { case MODIFIED: final String fileName = getDefaultFileName(0); filePath = getTempFilePath(fileName); break; case ORIGINAL: case UNKNOWN: filePath = path; break; } return filePath != null ? Uri.fromFile(new File(filePath)) : null; } }