| /* |
| * 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); |
| } |
| } |
| } |