blob: 96126c55c5f278938e2feeabc2af6df2f4ae9998 [file] [log] [blame]
/*
* Copyright (C) 2012 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.ui;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.FilterShowActivity;
import com.android.gallery3d.filtershow.cache.RenderingRequest;
import com.android.gallery3d.filtershow.cache.RenderingRequestCaller;
import com.android.gallery3d.filtershow.category.Action;
import com.android.gallery3d.filtershow.category.CategoryAdapter;
import com.android.gallery3d.filtershow.filters.FilterRepresentation;
import com.android.gallery3d.filtershow.imageshow.GeometryListener;
import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.presets.ImagePreset;
import com.android.gallery3d.filtershow.tools.IconFactory;
// TODO: merge back IconButton and FilterIconButton?
public class FilterIconButton extends IconButton implements View.OnClickListener,
RenderingRequestCaller, GeometryListener {
private static final String LOGTAG = "FilterIconButton";
private Bitmap mOverlayBitmap = null;
private boolean mOverlayOnly = false;
private FilterRepresentation mFilterRepresentation = null;
private Bitmap mIconBitmap = null;
private Action mAction;
private Paint mSelectPaint;
private int mSelectStroke;
private CategoryAdapter mAdapter;
public FilterIconButton(Context context) {
super(context);
}
public FilterIconButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FilterIconButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setup(String text, LinearLayout parent, CategoryAdapter adapter) {
mAdapter = adapter;
setText(text);
setContentDescription(text);
super.setOnClickListener(this);
Resources res = getContext().getResources();
MasterImage.getImage().addGeometryListener(this);
mSelectStroke = res.getDimensionPixelSize(R.dimen.thumbnail_margin);
mSelectPaint = new Paint();
mSelectPaint.setStyle(Paint.Style.FILL);
mSelectPaint.setColor(res.getColor(R.color.filtershow_category_selection));
invalidate();
}
@Override
public void onClick(View v) {
FilterShowActivity activity = (FilterShowActivity) getContext();
activity.showRepresentation(mFilterRepresentation);
mAdapter.setSelected(v);
}
public FilterRepresentation getFilterRepresentation() {
return mFilterRepresentation;
}
public void setAction(Action action) {
mAction = action;
if (action == null) {
return;
}
if (mAction.getPortraitImage() != null) {
mIconBitmap = mAction.getPortraitImage();
setIcon(mIconBitmap);
}
setFilterRepresentation(mAction.getRepresentation());
}
private void setFilterRepresentation(FilterRepresentation filterRepresentation) {
mFilterRepresentation = filterRepresentation;
if (mFilterRepresentation != null && mFilterRepresentation.getOverlayId() != 0) {
if (mAction.getOverlayBitmap() == null) {
mOverlayBitmap = BitmapFactory.decodeResource(getResources(),
mFilterRepresentation.getOverlayId());
mAction.setOverlayBitmap(mOverlayBitmap);
} else {
mOverlayBitmap = mAction.getOverlayBitmap();
}
}
mOverlayOnly = mFilterRepresentation.getOverlayOnly();
if (mOverlayOnly) {
assert(mOverlayBitmap != null);
setIcon(mOverlayBitmap);
}
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
if (mIconBitmap == null && !mOverlayOnly) {
postNewIconRenderRequest();
} else {
super.onDraw(canvas);
}
if (mAdapter.isSelected(this)) {
Drawable iconDrawable = getCompoundDrawables()[1];
if (iconDrawable != null) {
canvas.save();
int padding = getCompoundDrawablePadding();
canvas.translate(getScrollX() + padding + getPaddingLeft() - mSelectStroke - 1,
getScrollY() + padding + getPaddingTop() - mSelectStroke - 1);
Rect r = iconDrawable.getBounds();
SelectionRenderer.drawSelection(canvas, r.left, r.top,
r.right + 2 * mSelectStroke + 2, r.bottom + 2 * mSelectStroke + 2,
mSelectStroke, mSelectPaint);
canvas.restore();
}
}
}
@Override
public void available(RenderingRequest request) {
Bitmap bmap = request.getBitmap();
if (bmap == null) {
return;
}
if (mOverlayOnly) {
setIcon(mOverlayBitmap);
} else {
mIconBitmap = bmap;
if (mOverlayBitmap != null) {
// Draw overlay bitmap over icon
IconFactory.drawIcon(mIconBitmap, mOverlayBitmap, false);
}
setIcon(mIconBitmap);
if (mAction != null) {
mAction.setPortraitImage(mIconBitmap);
}
}
}
@Override
public void geometryChanged() {
if (mOverlayOnly) {
return;
}
mIconBitmap = null;
invalidate();
}
private void postNewIconRenderRequest() {
Bitmap dst = MasterImage.getImage().getThumbnailBitmap();
if (dst != null && mAction != null) {
ImagePreset mPreset = new ImagePreset();
mPreset.addFilter(mFilterRepresentation);
GeometryMetadata geometry = mPreset.mGeoData;
RectF bound = new RectF(0, 0, dst.getWidth(), dst.getHeight());
geometry.setCropBounds(bound);
geometry.setPhotoBounds(bound);
RenderingRequest.post(dst.copy(Bitmap.Config.ARGB_8888, true),
mPreset, RenderingRequest.ICON_RENDERING, this);
}
}
}