blob: c3c87694ad973b99634770f13d2e4af7a4fbc3be [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.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
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.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;
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) {
setText(text);
setContentDescription(text);
super.setOnClickListener(this);
MasterImage.getImage().addGeometryListener(this);
invalidate();
}
@Override
public void onClick(View v) {
FilterShowActivity activity = (FilterShowActivity) getContext();
activity.showRepresentation(mFilterRepresentation);
}
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);
}
}
@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);
}
}
}