/*******************************************************************************
* 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 java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.TreeMap;
import net.robotmedia.acv.logic.TrackingManager;
import net.robotmedia.acv.utils.FileUtils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
public class FolderComic extends Comic {
private ArrayList<String> orderedScreens;
protected FolderComic(String path) {
super(path);
File folder = new File(path);
if (folder.isDirectory()) {
String[] files = folder.list(new FilenameFilter() {
public boolean accept(File dir, String filename) {
String ext = FileUtils.getFileExtension(filename);
return FileUtils.isImage(ext);
}});
TreeMap<String, String> images = new TreeMap<String, String>();
for (int i = 0; i < files.length; i++) {
final File current = new File(folder, files[i]);
String currentPath = current.getPath();
String pathWithLeadinZeroes = this.addLeadingZeroes(currentPath);
images.put(pathWithLeadinZeroes, currentPath);
}
ArrayList<String> ordered = new ArrayList<String>(images.keySet());
orderedScreens = new ArrayList<String>(ordered.size());
for (int i = 0; i < ordered.size(); i++) {
orderedScreens.add(images.get(ordered.get(i)));
}
} else {
error();
}
}
@Override
public void destroy() {}
@Override
public int getLength() {
return orderedScreens != null ? orderedScreens.size() : 0;
}
@Override
public Drawable getScreen(int position) {
ImageState status = imageState.get(String.valueOf(position));
if (status == null) status = ImageState.UNKNOWN;
String filePath;
switch (status) {
case MODIFIED:
filePath = getTempFilePath(position);
return Drawable.createFromPath(filePath);
case ORIGINAL:
filePath = orderedScreens.get(position);
return Drawable.createFromPath(filePath);
default:
Bitmap bitmap = resampleAndSave(position, false);
if (bitmap == null) {
status = imageState.get(String.valueOf(position));
if (status == null) status = ImageState.UNKNOWN;
switch (status) {
case MODIFIED:
filePath = getTempFilePath(position);
return Drawable.createFromPath(filePath);
case ORIGINAL:
filePath = orderedScreens.get(position);
return Drawable.createFromPath(filePath);
default:
error();
return null;
}
} else {
return new BitmapDrawable(bitmap);
}
}
}
private synchronized Bitmap resampleAndSave(int position, boolean recycle) {
String filePath = orderedScreens.get(position);
BitmapFactory.decodeFile(filePath, 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(String.valueOf(position), ImageState.ORIGINAL);
bitmap = BitmapFactory.decodeFile(filePath);
} else {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = calculateSampleSize(width, height);
bitmap = BitmapFactory.decodeFile(filePath, options);
if (bitmap != null) {
final String tempFileName = getDefaultFileName(position);
saveBitmap(tempFileName, bitmap);
imageState.put(String.valueOf(position), ImageState.MODIFIED);
}
}
if (recycle && bitmap != null) {
bitmap.recycle();
}
return bitmap;
}
@Override
public Drawable getThumbnail(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public void prepareScreen(int position) {
if (position >= 0 && position < this.getLength()) {
ImageState status = imageState.get(String.valueOf(position));
if (status == null || status.equals(ImageState.UNKNOWN)) {
try {
resampleAndSave(position, true);
} catch (Exception e) {
e.printStackTrace();
TrackingManager.trackError("FolderComic.prepareScreen", e);
}
}
}
}
private String getTempFilePath(int position) {
final String tempFileName = getDefaultFileName(position);
return getTempFilePath(tempFileName);
}
@Override
public Uri getUri(int position) {
ImageState status = imageState.get(String.valueOf(position));
if (status == null) status = ImageState.UNKNOWN;
String filePath = null;
switch (status) {
case MODIFIED:
filePath = getTempFilePath(position);
break;
case ORIGINAL:
case UNKNOWN:
filePath = orderedScreens.get(position);
break;
}
return filePath != null ? Uri.fromFile(new File(filePath)) : null;
}
}