blob: 49068be73bf0d265314ae3fcca114f7167eb08ca [file] [log] [blame]
// Copyright 2010 Google Inc. All Rights Reserved.
package com.android.gallery3d.ui;
import com.android.gallery3d.data.DataManager;
import com.android.gallery3d.data.MediaItem;
import com.android.gallery3d.data.MediaSet;
import java.util.ArrayList;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.os.Message;
public class PhotoView extends StateView implements SlotView.SlotTapListener {
public static final String KEY_SET_INDEX = "keySetIndex";
public static final String KEY_PHOTO_INDEX = "keyPhotoIndex";
private static final int ON_IMAGE_READY = 1;
private SynchronizedHandler mHandler;
private ImageViewer mImageViewer;
private Bitmap mScaledBitmaps[];
private Bitmap mBackupBitmap;
private int mSetIndex;
private int mPhotoIndex;
public PhotoView() {}
@Override
public void onStart(Bundle data) {
mHandler = new SynchronizedHandler(getGLRootView()) {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case ON_IMAGE_READY:
setImageViewer(new ImageViewer(
mContext, mScaledBitmaps,
mBackupBitmap));
break;
}
}
};
initializeData(data);
}
@Override
public void onPause() {
synchronized (getGLRootView()) {
mImageViewer.close();
}
}
private void initializeData(Bundle data) {
mSetIndex = data.getInt(KEY_SET_INDEX);
mPhotoIndex = data.getInt(KEY_PHOTO_INDEX);
MediaSet set = DataManager.getInstance().getSubMediaSet(mSetIndex);
MediaItem item = set.getMediaItem(mPhotoIndex);
item.setListener(new MyMediaItemListener());
item.requestImage(MediaItem.TYPE_FULL_IMAGE);
}
@Override
protected void onLayout(
boolean changed, int left, int top, int right, int bottom) {
if (mImageViewer != null) {
mImageViewer.layout(0, 0, right - left, bottom - top);
}
}
public void onSingleTapUp(int slotIndex) {
// TODO Auto-generated method stub
}
public void setImageViewer(ImageViewer imageViewer) {
// TODO modify ImageViewer to accepting a data model
removeComponent(mImageViewer);
mImageViewer = imageViewer;
addComponent(mImageViewer);
requestLayout();
}
private class MyMediaItemListener implements MediaItem.MediaItemListener {
private static final int BACKUP_SIZE = 512;
public MyMediaItemListener() {}
public void onImageCanceled(MediaItem abstractMediaItem, int type) {
// Do nothing
}
public void onImageError(MediaItem item, int type, Throwable error) {
// Do nothing
}
public void onImageReady(MediaItem item, int type, Bitmap bitmap) {
mScaledBitmaps = getScaledBitmaps(bitmap);
mBackupBitmap = getBackupBitmap(bitmap);
mHandler.sendEmptyMessage(ON_IMAGE_READY);
}
private Bitmap getBackupBitmap(Bitmap bitmap) {
Config config = bitmap.hasAlpha()
? Config.ARGB_8888 : Config.RGB_565;
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float scale = (float) BACKUP_SIZE / (width > height ? width : height);
width = (int) (width * scale + 0.5f);
height = (int) (height * scale + 0.5f);
Bitmap result = Bitmap.createBitmap(width, height, config);
Canvas canvas = new Canvas(result);
canvas.scale(scale, scale);
canvas.drawBitmap(bitmap, 0, 0, null);
return result;
}
private Bitmap[] getScaledBitmaps(Bitmap bitmap) {
Config config = bitmap.hasAlpha()
? Config.ARGB_8888 : Config.RGB_565;
int width = bitmap.getWidth() / 2;
int height = bitmap.getHeight() / 2;
ArrayList<Bitmap> list = new ArrayList<Bitmap>();
list.add(bitmap);
while (width > BACKUP_SIZE || height > BACKUP_SIZE) {
Bitmap half = Bitmap.createBitmap(width, height, config);
Canvas canvas = new Canvas(half);
canvas.scale(0.5f, 0.5f);
canvas.drawBitmap(bitmap, 0, 0, null);
width /= 2;
height /= 2;
bitmap = half;
list.add(bitmap);
}
return list.toArray(new Bitmap[list.size()]);
}
}
}