blob: b3a4148ebc78422b69ae7f7b5844761482b304f1 [file] [log] [blame]
/*
* Copyright (C) 2013 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.gallery3d.filtershow.category;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.FilterShowActivity;
import com.android.gallery3d.filtershow.filters.FilterDrawRepresentation;
import com.android.gallery3d.filtershow.filters.FilterUserPresetRepresentation;
import com.android.gallery3d.filtershow.pipeline.RenderingRequest;
import com.android.gallery3d.filtershow.pipeline.RenderingRequestCaller;
import com.android.gallery3d.filtershow.filters.FilterRepresentation;
import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.pipeline.ImagePreset;
public class Action implements RenderingRequestCaller {
private static final String LOGTAG = "Action";
private FilterRepresentation mRepresentation;
private String mName;
private Rect mImageFrame;
private Bitmap mImage;
private ArrayAdapter mAdapter;
public static final int FULL_VIEW = 0;
public static final int CROP_VIEW = 1;
public static final int ADD_ACTION = 2;
public static final int SPACER = 3;
private int mType = CROP_VIEW;
private Bitmap mPortraitImage;
private Bitmap mOverlayBitmap;
private FilterShowActivity mContext;
private boolean mCanBeRemoved = false;
private int mTextSize = 32;
private boolean mIsDoubleAction = false;
public Action(FilterShowActivity context, FilterRepresentation representation, int type,
boolean canBeRemoved) {
this(context, representation, type);
mCanBeRemoved = canBeRemoved;
mTextSize = context.getResources().getDimensionPixelSize(
R.dimen.category_panel_text_size);
}
public Action(FilterShowActivity context, FilterRepresentation representation, int type) {
this(context, type);
setRepresentation(representation);
}
public Action(FilterShowActivity context, int type) {
mContext = context;
setType(type);
mContext.registerAction(this);
}
public Action(FilterShowActivity context, FilterRepresentation representation) {
this(context, representation, CROP_VIEW);
}
public boolean isDoubleAction() {
return mIsDoubleAction;
}
public void setIsDoubleAction(boolean value) {
mIsDoubleAction = value;
}
public boolean canBeRemoved() {
return mCanBeRemoved;
}
public int getType() {
return mType;
}
public FilterRepresentation getRepresentation() {
return mRepresentation;
}
public void setRepresentation(FilterRepresentation representation) {
mRepresentation = representation;
mName = representation.getName();
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public void setImageFrame(Rect imageFrame, int orientation) {
if (mImageFrame != null && mImageFrame.equals(imageFrame)) {
return;
}
if (getType() == Action.ADD_ACTION) {
return;
}
Bitmap temp = MasterImage.getImage().getTemporaryThumbnailBitmap();
if (temp != null) {
mImage = temp;
}
Bitmap bitmap = MasterImage.getImage().getThumbnailBitmap();
if (bitmap != null) {
mImageFrame = imageFrame;
int w = mImageFrame.width();
int h = mImageFrame.height();
postNewIconRenderRequest(w, h);
}
}
public Bitmap getImage() {
return mImage;
}
public void setImage(Bitmap image) {
mImage = image;
}
public void setAdapter(ArrayAdapter adapter) {
mAdapter = adapter;
}
public void setType(int type) {
mType = type;
}
private void postNewIconRenderRequest(int w, int h) {
if (mRepresentation != null) {
ImagePreset preset = new ImagePreset();
preset.addFilter(mRepresentation);
RenderingRequest.postIconRequest(mContext, w, h, preset, this);
}
}
private void drawCenteredImage(Bitmap source, Bitmap destination, boolean scale) {
int minSide = Math.min(destination.getWidth(), destination.getHeight());
Matrix m = new Matrix();
float scaleFactor = minSide / (float) Math.min(source.getWidth(), source.getHeight());
float dx = (destination.getWidth() - source.getWidth() * scaleFactor) / 2.0f;
float dy = (destination.getHeight() - source.getHeight() * scaleFactor) / 2.0f;
if (mImageFrame.height() > mImageFrame.width()) {
// if portrait
dy -= mTextSize;
}
m.setScale(scaleFactor, scaleFactor);
m.postTranslate(dx, dy);
Canvas canvas = new Canvas(destination);
canvas.drawBitmap(source, m, new Paint(Paint.FILTER_BITMAP_FLAG));
}
@Override
public void available(RenderingRequest request) {
clearBitmap();
mImage = request.getBitmap();
if (mImage == null) {
mImageFrame = null;
return;
}
if (mRepresentation.getOverlayId() != 0 && mOverlayBitmap == null) {
mOverlayBitmap = BitmapFactory.decodeResource(
mContext.getResources(),
mRepresentation.getOverlayId());
}
if (mOverlayBitmap != null) {
if (getRepresentation().getFilterType() == FilterRepresentation.TYPE_BORDER) {
Canvas canvas = new Canvas(mImage);
canvas.drawBitmap(mOverlayBitmap, new Rect(0, 0, mOverlayBitmap.getWidth(), mOverlayBitmap.getHeight()),
new Rect(0, 0, mImage.getWidth(), mImage.getHeight()), new Paint());
} else {
Canvas canvas = new Canvas(mImage);
canvas.drawARGB(128, 0, 0, 0);
drawCenteredImage(mOverlayBitmap, mImage, false);
}
}
if (mAdapter != null) {
mAdapter.notifyDataSetChanged();
}
}
public void setPortraitImage(Bitmap portraitImage) {
mPortraitImage = portraitImage;
}
public Bitmap getPortraitImage() {
return mPortraitImage;
}
public Bitmap getOverlayBitmap() {
return mOverlayBitmap;
}
public void setOverlayBitmap(Bitmap overlayBitmap) {
mOverlayBitmap = overlayBitmap;
}
public void clearBitmap() {
if (mImage != null
&& mImage != MasterImage.getImage().getTemporaryThumbnailBitmap()) {
MasterImage.getImage().getBitmapCache().cache(mImage);
}
mImage = null;
}
}