Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.gallery3d.filtershow.ui;
     18 
     19 import android.content.Context;
     20 import android.content.res.Resources;
     21 import android.graphics.Bitmap;
     22 import android.graphics.BitmapFactory;
     23 import android.graphics.Canvas;
     24 import android.graphics.Color;
     25 import android.graphics.Paint;
     26 import android.graphics.Rect;
     27 import android.graphics.RectF;
     28 import android.graphics.drawable.Drawable;
     29 import android.util.AttributeSet;
     30 import android.view.View;
     31 import android.widget.LinearLayout;
     32 
     33 import com.android.gallery3d.R;
     34 import com.android.gallery3d.filtershow.FilterShowActivity;
     35 import com.android.gallery3d.filtershow.cache.RenderingRequest;
     36 import com.android.gallery3d.filtershow.cache.RenderingRequestCaller;
     37 import com.android.gallery3d.filtershow.category.Action;
     38 import com.android.gallery3d.filtershow.category.CategoryAdapter;
     39 import com.android.gallery3d.filtershow.filters.FilterRepresentation;
     40 import com.android.gallery3d.filtershow.imageshow.GeometryListener;
     41 import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
     42 import com.android.gallery3d.filtershow.imageshow.MasterImage;
     43 import com.android.gallery3d.filtershow.presets.ImagePreset;
     44 import com.android.gallery3d.filtershow.tools.IconFactory;
     45 
     46 // TODO: merge back IconButton and FilterIconButton?
     47 public class FilterIconButton extends IconButton implements View.OnClickListener,
     48         RenderingRequestCaller, GeometryListener {
     49     private static final String LOGTAG = "FilterIconButton";
     50     private Bitmap mOverlayBitmap = null;
     51     private boolean mOverlayOnly = false;
     52     private FilterRepresentation mFilterRepresentation = null;
     53     private Bitmap mIconBitmap = null;
     54     private Action mAction;
     55     private Paint mSelectPaint;
     56     private int mSelectStroke;
     57     private CategoryAdapter mAdapter;
     58     public FilterIconButton(Context context) {
     59         super(context);
     60     }
     61 
     62     public FilterIconButton(Context context, AttributeSet attrs) {
     63         super(context, attrs);
     64     }
     65 
     66     public FilterIconButton(Context context, AttributeSet attrs, int defStyle) {
     67         super(context, attrs, defStyle);
     68     }
     69 
     70     public void setup(String text, LinearLayout parent, CategoryAdapter adapter) {
     71         mAdapter = adapter;
     72         setText(text);
     73         setContentDescription(text);
     74         super.setOnClickListener(this);
     75         Resources res = getContext().getResources();
     76         MasterImage.getImage().addGeometryListener(this);
     77         mSelectStroke = res.getDimensionPixelSize(R.dimen.thumbnail_margin);
     78         mSelectPaint = new Paint();
     79         mSelectPaint.setStyle(Paint.Style.FILL);
     80         mSelectPaint.setColor(res.getColor(R.color.filtershow_category_selection));
     81         invalidate();
     82     }
     83 
     84     @Override
     85     public void onClick(View v) {
     86         FilterShowActivity activity = (FilterShowActivity) getContext();
     87         activity.showRepresentation(mFilterRepresentation);
     88         mAdapter.setSelected(v);
     89     }
     90 
     91     public FilterRepresentation getFilterRepresentation() {
     92         return mFilterRepresentation;
     93     }
     94 
     95     public void setAction(Action action) {
     96         mAction = action;
     97         if (action == null) {
     98             return;
     99         }
    100         if (mAction.getPortraitImage() != null) {
    101             mIconBitmap = mAction.getPortraitImage();
    102             setIcon(mIconBitmap);
    103         }
    104         setFilterRepresentation(mAction.getRepresentation());
    105     }
    106 
    107     private void setFilterRepresentation(FilterRepresentation filterRepresentation) {
    108         mFilterRepresentation = filterRepresentation;
    109         if (mFilterRepresentation != null && mFilterRepresentation.getOverlayId() != 0) {
    110             if (mAction.getOverlayBitmap() == null) {
    111                 mOverlayBitmap = BitmapFactory.decodeResource(getResources(),
    112                     mFilterRepresentation.getOverlayId());
    113                 mAction.setOverlayBitmap(mOverlayBitmap);
    114             } else {
    115                 mOverlayBitmap = mAction.getOverlayBitmap();
    116             }
    117         }
    118         mOverlayOnly = mFilterRepresentation.getOverlayOnly();
    119         if (mOverlayOnly) {
    120             assert(mOverlayBitmap != null);
    121             setIcon(mOverlayBitmap);
    122         }
    123         invalidate();
    124     }
    125 
    126     @Override
    127     protected void onDraw(Canvas canvas) {
    128         if (mIconBitmap == null && !mOverlayOnly) {
    129             postNewIconRenderRequest();
    130         } else {
    131             super.onDraw(canvas);
    132         }
    133         if (mAdapter.isSelected(this)) {
    134             Drawable iconDrawable = getCompoundDrawables()[1];
    135             if (iconDrawable != null) {
    136                 canvas.save();
    137                 int padding = getCompoundDrawablePadding();
    138                 canvas.translate(getScrollX() + padding + getPaddingLeft() - mSelectStroke - 1,
    139                         getScrollY() + padding + getPaddingTop() - mSelectStroke - 1);
    140                 Rect r = iconDrawable.getBounds();
    141                 SelectionRenderer.drawSelection(canvas, r.left, r.top,
    142                         r.right + 2 * mSelectStroke + 2, r.bottom + 2 * mSelectStroke + 2,
    143                         mSelectStroke, mSelectPaint);
    144                 canvas.restore();
    145             }
    146         }
    147     }
    148 
    149     @Override
    150     public void available(RenderingRequest request) {
    151         Bitmap bmap = request.getBitmap();
    152         if (bmap == null) {
    153             return;
    154         }
    155         if (mOverlayOnly) {
    156             setIcon(mOverlayBitmap);
    157         } else {
    158             mIconBitmap = bmap;
    159             if (mOverlayBitmap != null) {
    160                 // Draw overlay bitmap over icon
    161                 IconFactory.drawIcon(mIconBitmap, mOverlayBitmap, false);
    162             }
    163             setIcon(mIconBitmap);
    164             if (mAction != null) {
    165                 mAction.setPortraitImage(mIconBitmap);
    166             }
    167         }
    168     }
    169 
    170     @Override
    171     public void geometryChanged() {
    172         if (mOverlayOnly) {
    173             return;
    174         }
    175         mIconBitmap = null;
    176         invalidate();
    177     }
    178 
    179     private void postNewIconRenderRequest() {
    180         Bitmap dst = MasterImage.getImage().getThumbnailBitmap();
    181         if (dst != null && mAction != null) {
    182             ImagePreset mPreset = new ImagePreset();
    183             mPreset.addFilter(mFilterRepresentation);
    184 
    185             GeometryMetadata geometry = mPreset.mGeoData;
    186             RectF bound = new RectF(0, 0, dst.getWidth(), dst.getHeight());
    187             geometry.setCropBounds(bound);
    188             geometry.setPhotoBounds(bound);
    189 
    190             RenderingRequest.post(dst.copy(Bitmap.Config.ARGB_8888, true),
    191                     mPreset, RenderingRequest.ICON_RENDERING, this);
    192         }
    193     }
    194 }
    195