1a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard/*
2a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Copyright (C) 2012 The Android Open Source Project
3a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *
4a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Licensed under the Apache License, Version 2.0 (the "License");
5a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * you may not use this file except in compliance with the License.
6a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * You may obtain a copy of the License at
7a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *
8a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *      http://www.apache.org/licenses/LICENSE-2.0
9a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *
10a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Unless required by applicable law or agreed to in writing, software
11a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * distributed under the License is distributed on an "AS IS" BASIS,
12a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * See the License for the specific language governing permissions and
14a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * limitations under the License.
15a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard */
160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpackage com.android.gallery3d.filtershow.imageshow;
180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.Context;
200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Bitmap;
2108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport android.graphics.Canvas;
2208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport android.graphics.Color;
2308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport android.graphics.Paint;
2408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport android.graphics.Rect;
250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.AttributeSet;
260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View;
2793dfe7a1df07a64701369b480578410efb740a27nicolasroard
2893dfe7a1df07a64701369b480578410efb740a27nicolasroardimport com.android.gallery3d.filtershow.FilterShowActivity;
2993dfe7a1df07a64701369b480578410efb740a27nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilter;
3093dfe7a1df07a64701369b480578410efb740a27nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePreset;
310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpublic class ImageSmallFilter extends ImageShow implements View.OnClickListener {
330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
34bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private static final String LOGTAG = "ImageSmallFilter";
350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private FilterShowActivity mController = null;
3631529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard    protected ImageFilter mImageFilter = null;
37bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    private boolean mShowTitle = true;
3893dfe7a1df07a64701369b480578410efb740a27nicolasroard    private boolean mSetBorder = false;
3908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    protected final Paint mPaint = new Paint();
4008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    protected boolean mIsSelected = false;
4108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
4208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    // TODO: move this to xml.
435ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard    protected static int mMargin = 12;
445ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard    protected static int mTextMargin = 8;
450a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard    protected static int mBackgroundColor = Color.BLUE;
4608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    protected final int mSelectedBackgroundColor = Color.WHITE;
4708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    protected final int mTextColor = Color.WHITE;
48af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford    private ImageSmallFilter mNullFilter;
490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
505ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard    public static void setMargin(int value) {
515ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        mMargin = value;
525ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard    }
535ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard
545ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard    public static void setTextMargin(int value) {
555ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard        mTextMargin = value;
565ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard    }
575ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard
580a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard    public static void setDefaultBackgroundColor(int value) {
590a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard        mBackgroundColor = value;
600a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard    }
610a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard
620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public ImageSmallFilter(Context context, AttributeSet attrs) {
630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        super(context, attrs);
640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setOnClickListener(this);
650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public ImageSmallFilter(Context context) {
680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        super(context);
690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        setOnClickListener(this);
700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void setImageFilter(ImageFilter filter) {
730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImageFilter = filter;
740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImagePreset = new ImagePreset();
75a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        mImagePreset.setName(filter.getName());
76e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford        filter.setImagePreset(mImagePreset);
770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mImagePreset.add(mImageFilter);
780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
8008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    @Override
8108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    public void setSelected(boolean value) {
8208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (mIsSelected != value) {
8308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            invalidate();
8408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
8508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mIsSelected = value;
8608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    }
8708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
8893dfe7a1df07a64701369b480578410efb740a27nicolasroard    public void setBorder(boolean value) {
8993dfe7a1df07a64701369b480578410efb740a27nicolasroard        mSetBorder = value;
9093dfe7a1df07a64701369b480578410efb740a27nicolasroard    }
9193dfe7a1df07a64701369b480578410efb740a27nicolasroard
920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void setController(FilterShowActivity activity) {
930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mController = activity;
940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
9693dfe7a1df07a64701369b480578410efb740a27nicolasroard    @Override
970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
10008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int h = mTextSize + mTextPadding;
10108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        setMeasuredDimension(parentHeight - h, parentHeight);
1020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
104af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford    /**
105af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford     * Setting the nullFilter implies that the behavior of the button is toggle
106af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford     *
107af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford     * @param nullFilter
108af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford     */
109af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford    public void setNulfilter(ImageSmallFilter nullFilter) {
110af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford        mNullFilter = nullFilter;
111af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford    }
112af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford
11393dfe7a1df07a64701369b480578410efb740a27nicolasroard    @Override
1140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void onClick(View v) {
1150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (mController != null) {
1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            if (mImageFilter != null) {
117af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                if (mIsSelected && mNullFilter != null) {
118af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                    mNullFilter.onClick(v);
119af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                }
120af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                else {
121af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                    mController.useImageFilter(this, mImageFilter, mSetBorder);
122af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                }
1230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            } else if (mImagePreset != null) {
124af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                if (mIsSelected && mNullFilter != null) {
125af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                    mNullFilter.onClick(v);
126af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                }
127af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                else {
128af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                    mController.useImagePreset(this, mImagePreset);
129af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford                }
1300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            }
1310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
1320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
13493dfe7a1df07a64701369b480578410efb740a27nicolasroard    @Override
13531529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard    public boolean updateGeometryFlags() {
136e533f65961ed601ded1803caeab6cef0a778d2f2nicolasroard        // We don't want to warn listeners here that the image size has changed, because
137e533f65961ed601ded1803caeab6cef0a778d2f2nicolasroard        // we'll be working with the small image...
13831529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard        return false;
1390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
141bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    public void setShowTitle(boolean value) {
142bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        mShowTitle = value;
143bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        invalidate();
144bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    }
145bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard
14693dfe7a1df07a64701369b480578410efb740a27nicolasroard    @Override
1479594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    public boolean showTitle() {
148bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        return mShowTitle;
1499594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard    }
1509594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard
15193dfe7a1df07a64701369b480578410efb740a27nicolasroard    @Override
1520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public boolean showControls() {
1530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return false;
1540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
1550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
15693dfe7a1df07a64701369b480578410efb740a27nicolasroard    @Override
1570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public boolean showHires() {
1580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return false;
1590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
16008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
16108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    @Override
16231529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard    public ImagePreset getImagePreset() {
16331529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard        return mImagePreset;
16431529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard    }
16531529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard
16631529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard    @Override
16731529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard    public void updateImagePresets(boolean force) {
16831529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard        ImagePreset preset = getImagePreset();
16931529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard        if (preset == null) {
17031529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard            return;
17131529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard        }
17231529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard    }
17331529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard
17431529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard    @Override
17508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    public void onDraw(Canvas canvas) {
17631529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard        requestFilteredImages();
17708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        canvas.drawColor(mBackgroundColor);
17843b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk        float textWidth = mPaint.measureText(mImageFilter.getName());
17908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int h = mTextSize + 2 * mTextPadding;
18008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int x = (int) ((getWidth() - textWidth) / 2);
18108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        int y = getHeight();
18208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (mIsSelected) {
18308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            mPaint.setColor(mSelectedBackgroundColor);
18495404c666640177abf72ca2278585a16f30cf390nicolasroard            canvas.drawRect(0, mMargin, getWidth(), getWidth() + mMargin, mPaint);
18508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
18695404c666640177abf72ca2278585a16f30cf390nicolasroard        Rect destination = new Rect(mMargin, 2*mMargin, getWidth() - mMargin, getWidth());
18731529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard        drawImage(canvas, getFilteredImage(), destination);
18808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mPaint.setTextSize(mTextSize);
18908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        mPaint.setColor(mTextColor);
19043b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk        canvas.drawText(mImageFilter.getName(), x, y - mTextMargin, mPaint);
19108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    }
19208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
19395404c666640177abf72ca2278585a16f30cf390nicolasroard    public void drawImage(Canvas canvas, Bitmap image, Rect destination) {
19408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        if (image != null) {
19508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            int iw = image.getWidth();
19608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            int ih = image.getHeight();
19795404c666640177abf72ca2278585a16f30cf390nicolasroard            int x = 0;
19895404c666640177abf72ca2278585a16f30cf390nicolasroard            int y = 0;
19995404c666640177abf72ca2278585a16f30cf390nicolasroard            int size = 0;
20095404c666640177abf72ca2278585a16f30cf390nicolasroard            Rect source = null;
20108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            if (iw > ih) {
20295404c666640177abf72ca2278585a16f30cf390nicolasroard                size = ih;
20395404c666640177abf72ca2278585a16f30cf390nicolasroard                x = (int) ((iw - size) / 2.0f);
20495404c666640177abf72ca2278585a16f30cf390nicolasroard                y = 0;
20595404c666640177abf72ca2278585a16f30cf390nicolasroard            } else {
20695404c666640177abf72ca2278585a16f30cf390nicolasroard                size = iw;
20795404c666640177abf72ca2278585a16f30cf390nicolasroard                x = 0;
20895404c666640177abf72ca2278585a16f30cf390nicolasroard                y = (int) ((ih - size) / 2.0f);
20908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard            }
21095404c666640177abf72ca2278585a16f30cf390nicolasroard            source = new Rect(x, y, x + size, y + size);
21195404c666640177abf72ca2278585a16f30cf390nicolasroard            canvas.drawBitmap(image, source, destination, mPaint);
21208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        }
21308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard    }
21408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard
2150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
216