1 /*
2  * Copyright 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.notificationstudio.generator;
18 import static com.android.notificationstudio.model.EditableItem.ACTION1_ICON;
19 import static com.android.notificationstudio.model.EditableItem.ACTION1_TEXT;
20 import static com.android.notificationstudio.model.EditableItem.ACTION2_ICON;
21 import static com.android.notificationstudio.model.EditableItem.ACTION2_TEXT;
22 import static com.android.notificationstudio.model.EditableItem.ACTION3_ICON;
23 import static com.android.notificationstudio.model.EditableItem.ACTION3_TEXT;
24 import static com.android.notificationstudio.model.EditableItem.BIG_CONTENT_TITLE;
25 import static com.android.notificationstudio.model.EditableItem.BIG_TEXT;
26 import static com.android.notificationstudio.model.EditableItem.CONTENT_INFO;
27 import static com.android.notificationstudio.model.EditableItem.CONTENT_TEXT;
28 import static com.android.notificationstudio.model.EditableItem.CONTENT_TITLE;
29 import static com.android.notificationstudio.model.EditableItem.LARGE_ICON;
30 import static com.android.notificationstudio.model.EditableItem.LINES;
31 import static com.android.notificationstudio.model.EditableItem.NUMBER;
32 import static com.android.notificationstudio.model.EditableItem.PICTURE;
33 import static com.android.notificationstudio.model.EditableItem.PROGRESS;
34 import static com.android.notificationstudio.model.EditableItem.SMALL_ICON;
35 import static com.android.notificationstudio.model.EditableItem.STYLE;
36 import static com.android.notificationstudio.model.EditableItem.SUB_TEXT;
37 import static com.android.notificationstudio.model.EditableItem.SUMMARY_TEXT;
38 import static com.android.notificationstudio.model.EditableItem.USES_CHRON;
39 import static com.android.notificationstudio.model.EditableItem.WHEN;
40 
41 import android.content.Context;
42 
43 import com.android.notificationstudio.model.EditableItem;
44 import com.android.notificationstudio.model.EditableItemConstants;
45 
46 public class CodeGenerator implements EditableItemConstants {
47 
48     private static final String INDENT = "\n    ";
49     private static final String STYLE_INDENT = INDENT + "    ";
50 
generate(Context context)51     public static String generate(Context context) {
52 
53         StringBuilder sb = new StringBuilder("new Notification.Builder(context)");
54 
55         if (SMALL_ICON.hasValue())
56             sb.append(INDENT + ".setSmallIcon(" + getResourceVar(context, SMALL_ICON) + ")");
57         if (CONTENT_TITLE.hasValue())
58             sb.append(INDENT + ".setContentTitle(" + quote(CONTENT_TITLE) + ")");
59         if (CONTENT_TEXT.hasValue())
60             sb.append(INDENT + ".setContentText(" + quote(CONTENT_TEXT) + ")");
61         if (SUB_TEXT.hasValue())
62             sb.append(INDENT + ".setSubText(" + quote(SUB_TEXT) + ")");
63         if (LARGE_ICON.hasValue())
64             sb.append(INDENT + ".setLargeIcon(largeIconBitmap)");
65         if (CONTENT_INFO.hasValue())
66             sb.append(INDENT + ".setContentInfo(" + quote(CONTENT_INFO) + ")");
67         if (NUMBER.hasValue())
68             sb.append(INDENT + ".setNumber(" + NUMBER.getValueInt() + ")");
69         if (WHEN.hasValue())
70             sb.append(INDENT + ".setWhen(" + WHEN.getValueLong() + ")");
71         if (PROGRESS.hasValue() && PROGRESS.getValueBool())
72             sb.append(INDENT + ".setProgress(0, 0, true)");
73         if (USES_CHRON.hasValue())
74             sb.append(INDENT + ".setUsesChronometer(" + USES_CHRON.getValueBool() + ")");
75         if (ACTION1_ICON.hasValue())
76             generateAction(sb, ACTION1_ICON, ACTION1_TEXT, "action1PendingIntent");
77         if (ACTION2_ICON.hasValue())
78             generateAction(sb, ACTION2_ICON, ACTION2_TEXT, "action2PendingIntent");
79         if (ACTION3_ICON.hasValue())
80             generateAction(sb, ACTION3_ICON, ACTION3_TEXT, "action3PendingIntent");
81 
82         if (STYLE.hasValue())
83             generateStyle(sb);
84 
85         sb.append(INDENT + ".build();");
86         return sb.toString();
87     }
88 
generateStyle(StringBuilder sb)89     private static void generateStyle(StringBuilder sb) {
90         Integer styleValue = STYLE.getValueInt();
91         if (STYLE_BIG_PICTURE.equals(styleValue)) {
92             sb.append(INDENT + ".setStyle(new Notification.BigPictureStyle()");
93             if (PICTURE.hasValue())
94                 sb.append(STYLE_INDENT + ".bigPicture(pictureBitmap)");
95         }
96         if (STYLE_BIG_TEXT.equals(styleValue)) {
97             sb.append(INDENT + ".setStyle(new Notification.BigTextStyle()");
98             if (BIG_TEXT.hasValue())
99                 sb.append(STYLE_INDENT + ".bigText(" + quote(BIG_TEXT) + ")");
100         }
101         if (STYLE_INBOX.equals(styleValue)) {
102             sb.append(INDENT + ".setStyle(new Notification.InboxStyle()");
103             if (LINES.hasValue()) {
104                 for (String line : LINES.getValueString().split("\\n")) {
105                     sb.append(STYLE_INDENT + ".addLine(" + quote(line) + ")");
106                 }
107             }
108         }
109         if (BIG_CONTENT_TITLE.hasValue())
110             sb.append(STYLE_INDENT + ".setBigContentTitle(" + quote(BIG_CONTENT_TITLE) + ")");
111         if (SUMMARY_TEXT.hasValue())
112             sb.append(STYLE_INDENT + ".setSummaryText(" + quote(SUMMARY_TEXT) + ")");
113 
114         sb.append(")");
115     }
116 
generateAction(StringBuilder sb, EditableItem icon, EditableItem text, String intentName)117     private static void generateAction(StringBuilder sb,
118             EditableItem icon, EditableItem text, String intentName) {
119         sb.append(INDENT +
120             ".addAction(" + icon.getValueInt() + ", " + quote(text) + ", " + intentName + ")");
121     }
122 
quote(EditableItem text)123     private static String quote(EditableItem text) {
124         return quote(text.getValueString());
125     }
126 
quote(String text)127     private static String quote(String text) {
128         return text != null ? "\"" + text.replace("\"", "\\\"") + "\"" : "null";
129     }
130 
getResourceVar(Context context, EditableItem item)131     private static String getResourceVar(Context context, EditableItem item) {
132         int resId = item.getValueInt();
133         String packageName = context.getResources().getResourcePackageName(resId);
134         String type = context.getResources().getResourceTypeName(resId);
135         String entryName = context.getResources().getResourceEntryName(resId);
136         return packageName + ".R." + type + "." + entryName;
137     }
138 
139 }
140