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