2 package com.android.gallery3d.filtershow.imageshow;
4 import android.content.Context;
5 import android.graphics.Bitmap;
6 import android.graphics.Canvas;
7 import android.graphics.Paint;
8 import android.graphics.Rect;
9 import android.os.Handler;
10 import android.util.AttributeSet;
11 import android.view.MotionEvent;
12 import android.view.View;
13 import android.widget.ArrayAdapter;
14 import android.widget.SeekBar;
15 import android.widget.SeekBar.OnSeekBarChangeListener;
17 import com.android.gallery3d.R;
18 import com.android.gallery3d.filtershow.FilterShowActivity;
19 import com.android.gallery3d.filtershow.HistoryAdapter;
20 import com.android.gallery3d.filtershow.ImageStateAdapter;
21 import com.android.gallery3d.filtershow.PanelController;
22 import com.android.gallery3d.filtershow.cache.ImageLoader;
23 import com.android.gallery3d.filtershow.filters.ImageFilter;
24 import com.android.gallery3d.filtershow.presets.ImagePreset;
25 import com.android.gallery3d.filtershow.ui.SliderController;
26 import com.android.gallery3d.filtershow.ui.SliderListener;
30 public class ImageShow extends View implements SliderListener, OnSeekBarChangeListener {
32 private static final String LOGTAG = "ImageShow";
34 protected Paint mPaint = new Paint();
35 private static int mTextSize = 24;
36 private static int mTextPadding = 20;
38 protected ImagePreset mImagePreset = null;
39 protected ImageLoader mImageLoader = null;
40 private ImageFilter mCurrentFilter = null;
42 private Bitmap mBackgroundImage = null;
43 protected Bitmap mForegroundImage = null;
44 protected Bitmap mFilteredImage = null;
46 protected SliderController mSliderController = new SliderController();
48 private HistoryAdapter mHistoryAdapter = null;
49 private ImageStateAdapter mImageStateAdapter = null;
51 protected Rect mImageBounds = null;
52 protected float mImageRotation = 0;
53 protected float mImageRotationZoomFactor = 0;
55 private boolean mShowControls = false;
56 private boolean mShowOriginal = false;
57 private String mToast = null;
58 private boolean mShowToast = false;
59 private boolean mImportantToast = false;
61 protected float mTouchX = 0;
62 protected float mTouchY = 0;
64 private SeekBar mSeekBar = null;
65 private PanelController mController = null;
67 private final Handler mHandler = new Handler();
69 public void select() {
70 if (getCurrentFilter() != null) {
71 int parameter = getCurrentFilter().getParameter();
72 updateSeekBar(parameter);
76 public void updateSeekBar(int parameter) {
77 if (mSeekBar == null) {
80 int progress = parameter + 100;
81 mSeekBar.setProgress(progress);
82 if (getPanelController() != null) {
83 getPanelController().onNewValue(parameter);
87 public void unselect() {
91 public void resetParameter() {
93 mSliderController.reset();
96 public void setPanelController(PanelController controller) {
97 mController = controller;
100 public PanelController getPanelController() {
105 public void onNewValue(int value) {
106 if (getCurrentFilter() != null) {
107 getCurrentFilter().setParameter(value);
109 if (getImagePreset() != null) {
110 mImageLoader.resetImageForPreset(getImagePreset(), this);
111 getImagePreset().fillImageStateAdapter(mImageStateAdapter);
113 if (getPanelController() != null) {
114 getPanelController().onNewValue(value);
116 updateSeekBar(value);
121 public void onTouchDown(float x, float y) {
128 public void onTouchUp() {
131 public ImageShow(Context context, AttributeSet attrs) {
132 super(context, attrs);
133 mSliderController.setListener(this);
134 mHistoryAdapter = new HistoryAdapter(context, R.layout.filtershow_history_operation_row,
136 mImageStateAdapter = new ImageStateAdapter(context,
137 R.layout.filtershow_imagestate_row);
140 public ImageShow(Context context) {
142 mSliderController.setListener(this);
143 mHistoryAdapter = new HistoryAdapter(context, R.layout.filtershow_history_operation_row,
148 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
149 int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
150 int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
151 setMeasuredDimension(parentWidth, parentHeight);
152 mSliderController.setWidth(parentWidth);
153 mSliderController.setHeight(parentHeight);
156 public void setSeekBar(SeekBar seekBar) {
158 mSeekBar.setOnSeekBarChangeListener(this);
161 public void setCurrentFilter(ImageFilter filter) {
162 mCurrentFilter = filter;
165 public ImageFilter getCurrentFilter() {
166 return mCurrentFilter;
169 public void setAdapter(HistoryAdapter adapter) {
170 mHistoryAdapter = adapter;
173 public void showToast(String text) {
174 showToast(text, false);
177 public void showToast(String text, boolean important) {
180 mImportantToast = important;
183 mHandler.postDelayed(new Runnable() {
192 public Rect getImageBounds() {
196 public ImagePreset getImagePreset() {
200 public Bitmap getOriginalFrontBitmap() {
201 if (mImageLoader != null) {
202 return mImageLoader.getOriginalBitmapLarge();
207 public void drawToast(Canvas canvas) {
208 if (mShowToast && mToast != null) {
209 Paint paint = new Paint();
210 paint.setTextSize(128);
211 float textWidth = paint.measureText(mToast);
212 int toastX = (int) ((getWidth() - textWidth) / 2.0f);
213 int toastY = (int) (getHeight() / 3.0f);
215 paint.setARGB(255, 0, 0, 0);
216 canvas.drawText(mToast, toastX - 2, toastY - 2, paint);
217 canvas.drawText(mToast, toastX - 2, toastY, paint);
218 canvas.drawText(mToast, toastX, toastY - 2, paint);
219 canvas.drawText(mToast, toastX + 2, toastY + 2, paint);
220 canvas.drawText(mToast, toastX + 2, toastY, paint);
221 canvas.drawText(mToast, toastX, toastY + 2, paint);
222 if (mImportantToast) {
223 paint.setARGB(255, 200, 0, 0);
225 paint.setARGB(255, 255, 255, 255);
227 canvas.drawText(mToast, toastX, toastY, paint);
232 public void onDraw(Canvas canvas) {
233 drawBackground(canvas);
235 drawImage(canvas, mFilteredImage);
237 if (showTitle() && getImagePreset() != null) {
238 mPaint.setARGB(200, 0, 0, 0);
239 mPaint.setTextSize(mTextSize);
241 Rect textRect = new Rect(0, 0, getWidth(), mTextSize + mTextPadding);
242 canvas.drawRect(textRect, mPaint);
243 mPaint.setARGB(255, 200, 200, 200);
244 canvas.drawText(getImagePreset().name(), mTextPadding,
245 10 + mTextPadding, mPaint);
247 mPaint.setARGB(255, 150, 150, 150);
248 mPaint.setStrokeWidth(4);
249 canvas.drawLine(0, 0, getWidth(), 0, mPaint);
251 if (showControls()) {
252 mSliderController.onDraw(canvas);
258 public void getFilteredImage() {
259 Bitmap filteredImage = null;
260 if (mImageLoader != null) {
261 filteredImage = mImageLoader.getImageForPreset(this,
262 getImagePreset(), showHires());
265 if (filteredImage == null) {
266 // if no image for the current preset, use the previous one
267 filteredImage = mFilteredImage;
269 mFilteredImage = filteredImage;
272 if (mShowOriginal || mFilteredImage == null) {
273 mFilteredImage = mForegroundImage;
277 public void drawImage(Canvas canvas, Bitmap image) {
279 Rect s = new Rect(0, 0, image.getWidth(),
281 float ratio = image.getWidth()
282 / (float) image.getHeight();
283 float w = getWidth();
285 float ty = (getHeight() - h) / 2.0f;
288 if (ratio < 1.0f) { // portrait image
291 tx = (getWidth() - w) / 2.0f;
294 Rect d = new Rect((int) tx, (int) ty, (int) (w + tx),
298 canvas.drawBitmap(image, s, d, mPaint);
302 public void drawBackground(Canvas canvas) {
303 if (mBackgroundImage == null) {
304 mBackgroundImage = mImageLoader.getBackgroundBitmap(getResources());
306 if (mBackgroundImage != null) {
307 Rect s = new Rect(0, 0, mBackgroundImage.getWidth(),
308 mBackgroundImage.getHeight());
309 Rect d = new Rect(0, 0, getWidth(), getHeight());
310 canvas.drawBitmap(mBackgroundImage, s, d, mPaint);
314 public ImageShow setShowControls(boolean value) {
315 mShowControls = value;
317 if (mSeekBar != null) {
318 mSeekBar.setVisibility(View.VISIBLE);
321 if (mSeekBar != null) {
322 mSeekBar.setVisibility(View.INVISIBLE);
328 public boolean showControls() {
329 return mShowControls;
332 public boolean showHires() {
336 public boolean showTitle() {
340 public void setImagePreset(ImagePreset preset) {
341 setImagePreset(preset, true);
344 public void setImagePreset(ImagePreset preset, boolean addToHistory) {
345 mImagePreset = preset;
346 if (getImagePreset() != null) {
348 mHistoryAdapter.insert(getImagePreset(), 0);
350 getImagePreset().setEndpoint(this);
353 mImagePreset.fillImageStateAdapter(mImageStateAdapter);
357 public void setImageLoader(ImageLoader loader) {
358 mImageLoader = loader;
359 if (mImageLoader != null) {
360 mImageLoader.addListener(this);
364 public void updateImage() {
365 mForegroundImage = getOriginalFrontBitmap();
367 * if (mImageLoader != null) {
368 * mImageLoader.resetImageForPreset(getImagePreset(), this); }
372 * if (mForegroundImage != null) { Bitmap filteredImage =
373 * mForegroundImage.copy(mConfig, true);
374 * getImagePreset().apply(filteredImage); invalidate(); }
378 public void updateFilteredImage(Bitmap bitmap) {
379 mFilteredImage = bitmap;
382 public void saveImage(FilterShowActivity filterShowActivity, File file) {
383 mImageLoader.saveImage(getImagePreset(), filterShowActivity, file);
387 public boolean onTouchEvent(MotionEvent event) {
388 super.onTouchEvent(event);
389 mSliderController.onTouchEvent(event);
396 public ArrayAdapter getHistoryAdapter() {
397 return mHistoryAdapter;
400 public ArrayAdapter getImageStateAdapter() {
401 return mImageStateAdapter;
404 public void onItemClick(int position) {
405 setImagePreset(new ImagePreset(mHistoryAdapter.getItem(position)), false);
406 // we need a copy from the history
407 mHistoryAdapter.setCurrentPreset(position);
410 public void showOriginal(boolean show) {
411 mShowOriginal = show;
415 public float getImageRotation() {
416 return mImageRotation;
419 public float getImageRotationZoomFactor() {
420 return mImageRotationZoomFactor;
423 public void setImageRotation(float imageRotation,
424 float imageRotationZoomFactor) {
425 if (imageRotation != mImageRotation) {
428 mImageRotation = imageRotation;
429 mImageRotationZoomFactor = imageRotationZoomFactor;
433 public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) {
434 onNewValue(progress - 100);
438 public void onStartTrackingTouch(SeekBar arg0) {
439 // TODO Auto-generated method stub
444 public void onStopTrackingTouch(SeekBar arg0) {
445 // TODO Auto-generated method stub