Action.java revision 00259461be82e601b58d3e970afbf0c012c5f3e7
1/*
2 * Copyright (C) 2013 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
17package com.android.gallery3d.filtershow.category;
18
19import android.content.Context;
20import android.graphics.Bitmap;
21import android.graphics.BitmapFactory;
22import android.graphics.Canvas;
23import android.graphics.Matrix;
24import android.graphics.Paint;
25import android.graphics.Rect;
26import android.graphics.RectF;
27import com.android.gallery3d.filtershow.cache.RenderingRequest;
28import com.android.gallery3d.filtershow.cache.RenderingRequestCaller;
29import com.android.gallery3d.filtershow.filters.FilterRepresentation;
30import com.android.gallery3d.filtershow.imageshow.MasterImage;
31import com.android.gallery3d.filtershow.presets.ImagePreset;
32
33public class Action implements RenderingRequestCaller {
34
35    private static final String LOGTAG = "Action";
36    private FilterRepresentation mRepresentation;
37    private String mName;
38    private Rect mImageFrame;
39    private Bitmap mImage;
40    private CategoryAdapter mAdapter;
41    public static final int FULL_VIEW = 0;
42    public static final int CROP_VIEW = 1;
43    private int mType = CROP_VIEW;
44    private Bitmap mPortraitImage;
45    private Bitmap mOverlayBitmap;
46    private Context mContext;
47
48    public Action(Context context, FilterRepresentation representation, int type) {
49        mContext = context;
50        setRepresentation(representation);
51        setType(type);
52    }
53
54    public Action(Context context, FilterRepresentation representation) {
55        this(context, representation, CROP_VIEW);
56    }
57
58    public FilterRepresentation getRepresentation() {
59        return mRepresentation;
60    }
61
62    public void setRepresentation(FilterRepresentation representation) {
63        mRepresentation = representation;
64        mName = representation.getName();
65    }
66
67    public String getName() {
68        return mName;
69    }
70
71    public void setName(String name) {
72        mName = name;
73    }
74
75    public void setImageFrame(Rect imageFrame) {
76        if (mImageFrame != null && mImageFrame.equals(imageFrame)) {
77            return;
78        }
79        Bitmap bitmap = MasterImage.getImage().getLargeThumbnailBitmap();
80        if (bitmap != null) {
81            mImageFrame = imageFrame;
82            int w = mImageFrame.width();
83            int h = mImageFrame.height();
84            if (mType == CROP_VIEW) {
85                w /= 2;
86            }
87            Bitmap bitmapCrop = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
88            drawCenteredImage(bitmap, bitmapCrop, true);
89
90            postNewIconRenderRequest(bitmapCrop);
91        }
92    }
93
94    public Bitmap getImage() {
95        return mImage;
96    }
97
98    public void setImage(Bitmap image) {
99        mImage = image;
100    }
101
102    public void setAdapter(CategoryAdapter adapter) {
103        mAdapter = adapter;
104    }
105
106    public void setType(int type) {
107        mType = type;
108    }
109
110    private void postNewIconRenderRequest(Bitmap bitmap) {
111        if (bitmap != null && mRepresentation != null) {
112            ImagePreset preset = new ImagePreset();
113            preset.addFilter(mRepresentation);
114            RenderingRequest.post(bitmap,
115                    preset, RenderingRequest.ICON_RENDERING, this);
116        }
117    }
118
119    private void drawCenteredImage(Bitmap source, Bitmap destination, boolean scale) {
120        RectF image = new RectF(0, 0, source.getWidth(), source.getHeight());
121        int border = 0;
122        if (!scale) {
123            border = destination.getWidth() - destination.getHeight();
124            if (border < 0) {
125                border = 0;
126            }
127        }
128        RectF frame = new RectF(border, 0,
129                destination.getWidth() - border,
130                destination.getHeight());
131        Matrix m = new Matrix();
132        m.setRectToRect(frame, image, Matrix.ScaleToFit.CENTER);
133        image.set(frame);
134        m.mapRect(image);
135        m.setRectToRect(image, frame, Matrix.ScaleToFit.FILL);
136        Canvas canvas = new Canvas(destination);
137        canvas.drawBitmap(source, m, new Paint());
138    }
139
140    @Override
141    public void available(RenderingRequest request) {
142        mImage = request.getBitmap();
143        if (mImage == null) {
144            return;
145        }
146        if (mRepresentation.getOverlayId() != 0 && mOverlayBitmap == null) {
147            mOverlayBitmap = BitmapFactory.decodeResource(
148                    mContext.getResources(),
149                    mRepresentation.getOverlayId());
150        }
151        if (mOverlayBitmap != null) {
152            if (getRepresentation().getPriority() == FilterRepresentation.TYPE_BORDER) {
153                Canvas canvas = new Canvas(mImage);
154                canvas.drawBitmap(mOverlayBitmap, new Rect(0, 0, mOverlayBitmap.getWidth(), mOverlayBitmap.getHeight()),
155                        new Rect(0, 0, mImage.getWidth(), mImage.getHeight()), new Paint());
156            } else {
157                Canvas canvas = new Canvas(mImage);
158                canvas.drawARGB(128, 0, 0, 0);
159                drawCenteredImage(mOverlayBitmap, mImage, false);
160            }
161        }
162        if (mAdapter != null) {
163            mAdapter.notifyDataSetChanged();
164        }
165    }
166
167    public void setPortraitImage(Bitmap portraitImage) {
168        mPortraitImage = portraitImage;
169    }
170
171    public Bitmap getPortraitImage() {
172        return mPortraitImage;
173    }
174
175    public Bitmap getOverlayBitmap() {
176        return mOverlayBitmap;
177    }
178
179    public void setOverlayBitmap(Bitmap overlayBitmap) {
180        mOverlayBitmap = overlayBitmap;
181    }
182}
183