1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
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 */
16package com.android.assetstudiolib;
17
18import com.android.assetstudiolib.Util.Effect;
19import com.android.assetstudiolib.Util.FillEffect;
20import com.android.assetstudiolib.Util.ShadowEffect;
21
22import java.awt.Color;
23import java.awt.GradientPaint;
24import java.awt.Graphics2D;
25import java.awt.Rectangle;
26import java.awt.image.BufferedImage;
27import java.util.Map;
28
29/**
30 * Generate icons for the notifications bar
31 */
32public class NotificationIconGenerator extends GraphicGenerator {
33    /** Creates a new {@link NotificationIconGenerator} */
34    public NotificationIconGenerator() {
35    }
36
37    @Override
38    public BufferedImage generate(GraphicGeneratorContext context, Options options) {
39        Rectangle iconSizeMdpi;
40        Rectangle targetRectMdpi;
41        NotificationOptions notificationOptions = (NotificationOptions) options;
42        if (notificationOptions.version == Version.OLDER) {
43            iconSizeMdpi = new Rectangle(0, 0, 25, 25);
44            targetRectMdpi = new Rectangle(4, 4, 17, 17);
45        } else if (notificationOptions.version == Version.V11) {
46            iconSizeMdpi = new Rectangle(0, 0, 24, 24);
47            targetRectMdpi = new Rectangle(1, 1, 22, 22);
48        } else {
49            assert notificationOptions.version == Version.V9;
50            iconSizeMdpi = new Rectangle(0, 0, 16, 25);
51            targetRectMdpi = new Rectangle(0, 5, 16, 16);
52        }
53
54        final float scaleFactor = GraphicGenerator.getMdpiScaleFactor(options.density);
55        Rectangle imageRect = Util.scaleRectangle(iconSizeMdpi, scaleFactor);
56        Rectangle targetRect = Util.scaleRectangle(targetRectMdpi, scaleFactor);
57
58        BufferedImage outImage = Util.newArgbBufferedImage(imageRect.width, imageRect.height);
59        Graphics2D g = (Graphics2D) outImage.getGraphics();
60
61        BufferedImage tempImage = Util.newArgbBufferedImage(
62                imageRect.width, imageRect.height);
63        Graphics2D g2 = (Graphics2D) tempImage.getGraphics();
64
65        if (notificationOptions.version == Version.OLDER) {
66            BufferedImage mBackImage = context.loadImageResource(
67                    "/images/notification_stencil/"
68                            + notificationOptions.shape.id + '/' +
69                            notificationOptions.density.getResourceValue()
70                            + ".png");
71            g.drawImage(mBackImage, 0, 0, null);
72            BufferedImage top = options.sourceImage;
73            BufferedImage filled = Util.filledImage(top, Color.WHITE);
74            Util.drawCenterInside(g, filled, targetRect);
75        } else if (notificationOptions.version == Version.V11) {
76            Util.drawCenterInside(g2, options.sourceImage, targetRect);
77            Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
78                    new FillEffect(Color.WHITE),
79            });
80        } else {
81            assert notificationOptions.version == Version.V9;
82            Util.drawCenterInside(g2, options.sourceImage, targetRect);
83            Util.drawEffects(g, tempImage, 0, 0, new Effect[] {
84                    new FillEffect(
85                            new GradientPaint(
86                                    0, 0,
87                                    new Color(0x919191),
88                                    0, imageRect.height,
89                                    new Color(0x828282))),
90                    new ShadowEffect(
91                            0,
92                            1,
93                            0,
94                            Color.WHITE,
95                            0.10,
96                            true),
97            });
98        }
99
100        g.dispose();
101        g2.dispose();
102
103        return outImage;
104    }
105
106    @Override
107    public void generate(String category, Map<String, Map<String, BufferedImage>> categoryMap,
108            GraphicGeneratorContext context, Options baseOptions, String name) {
109        NotificationOptions options = (NotificationOptions) baseOptions;
110        if (options.minSdk < 9) {
111            options.version = Version.OLDER;
112            super.generate(options.version.getDisplayName(), categoryMap, context, options, name);
113        }
114        if (options.minSdk < 11) {
115            options.version = Version.V9;
116            super.generate(options.version.getDisplayName(), categoryMap, context, options, name);
117        }
118        options.version = Version.V11;
119        super.generate(options.minSdk < 11 ? options.version.getDisplayName() : null,
120                categoryMap, context, options, name);
121    }
122
123    @Override
124    protected String getIconFolder(Options options) {
125        String folder = super.getIconFolder(options);
126        Version version = ((NotificationOptions) options).version;
127        if (version == Version.V11 && options.minSdk < 11) {
128            return folder + "-v11"; //$NON-NLS-1$
129        } else if (version == Version.V9 && options.minSdk < 9) {
130            return folder + "-v9"; //$NON-NLS-1$
131        } else {
132            return folder;
133        }
134    }
135
136    /**
137     * Options specific to generating notification icons
138     */
139    public static class NotificationOptions extends GraphicGenerator.Options {
140        /**
141         * The shape to use for graphics behind the icon (for {@link Version#OLDER} only)
142         */
143        public Shape shape = Shape.SQUARE;
144
145        /**
146         * The version of the icon to generate - different styles are used for different
147         * versions of Android
148         */
149        public Version version = Version.V9;
150    }
151
152    /**
153     * The version of the icon to generate - different styles are used for different
154     * versions of Android
155     */
156    public enum Version {
157        /** Icon style used for -v9 and -v10 */
158        V9("V9"),
159
160        /** Icon style used for -v11 (Honeycomb) and later */
161        V11("V11"),
162
163        /** Icon style used for versions older than v9 */
164        OLDER("Other");
165
166        private final String mDisplayName;
167
168        Version(String displayName) {
169            mDisplayName = displayName;
170        }
171
172        /**
173         * Returns the display name for this version, typically shown as a
174         * category
175         *
176         * @return the display name, never null
177         */
178        public String getDisplayName() {
179            return mDisplayName;
180        }
181    }
182}
183