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.model; 18 19 import android.content.Context; 20 import android.content.res.Resources; 21 import android.graphics.Bitmap; 22 import android.graphics.BitmapFactory; 23 24 import com.android.notificationstudio.R; 25 26 public enum EditableItem implements EditableItemConstants { 27 28 PRESET(R.string.preset, TYPE_DROP_DOWN, CATEGORY_MAIN, 29 PRESET_BASIC, PRESET_EMAIL, PRESET_PHOTO, PRESET_CUSTOM), 30 SMALL_ICON(R.string.small_icon, TYPE_RESOURCE_ID, CATEGORY_MAIN, 31 SMALL_ICONS), 32 CONTENT_TITLE(R.string.content_title, TYPE_TEXT, CATEGORY_MAIN), 33 CONTENT_TEXT(R.string.content_text, TYPE_TEXT, CATEGORY_MAIN), 34 SUB_TEXT(R.string.sub_text, TYPE_TEXT, CATEGORY_MAIN), 35 LARGE_ICON(R.string.large_icon, TYPE_BITMAP, CATEGORY_MAIN), 36 CONTENT_INFO(R.string.content_info, TYPE_TEXT, CATEGORY_MAIN), 37 NUMBER(R.string.number, TYPE_INT, CATEGORY_MAIN), 38 WHEN(R.string.when, TYPE_DATETIME, CATEGORY_MAIN), 39 PROGRESS(R.string.progress, TYPE_BOOLEAN, CATEGORY_MAIN), 40 USES_CHRON(R.string.uses_chron, TYPE_BOOLEAN, CATEGORY_MAIN), 41 STYLE(R.string.style, TYPE_DROP_DOWN, CATEGORY_STYLE, 42 STYLE_NONE, STYLE_BIG_PICTURE, STYLE_BIG_TEXT, STYLE_INBOX), 43 PICTURE(R.string.picture, TYPE_BITMAP, CATEGORY_STYLE), 44 BIG_TEXT(R.string.big_text, TYPE_TEXT, CATEGORY_STYLE), 45 LINES(R.string.lines, TYPE_TEXT_LINES, CATEGORY_STYLE), 46 BIG_CONTENT_TITLE(R.string.big_content_title, TYPE_TEXT, CATEGORY_STYLE), 47 SUMMARY_TEXT(R.string.summary_text, TYPE_TEXT, CATEGORY_STYLE), 48 ACTION1_ICON(R.string.icon, TYPE_RESOURCE_ID, CATEGORY_ACTION1, 49 ACTION_ICONS), 50 ACTION1_TEXT(R.string.text, TYPE_TEXT, CATEGORY_ACTION1), 51 ACTION2_ICON(R.string.icon, TYPE_RESOURCE_ID, CATEGORY_ACTION2, 52 ACTION_ICONS), 53 ACTION2_TEXT(R.string.text, TYPE_TEXT, CATEGORY_ACTION2), 54 ACTION3_ICON(R.string.icon, TYPE_RESOURCE_ID, CATEGORY_ACTION3, 55 ACTION_ICONS), 56 ACTION3_TEXT(R.string.text, TYPE_TEXT, CATEGORY_ACTION3), 57 ; 58 59 private final int mCaptionId; 60 private final int mType; 61 private final int mCategoryId; 62 63 private Object[] mAvailableValues; 64 private Object mValue; 65 private boolean mVisible = true; 66 private Runnable mVisibilityListener; 67 68 private EditableItem(int captionId, int type, int categoryId, Object... availableValues) { 69 mCaptionId = captionId; 70 mType = type; 71 mCategoryId = categoryId; 72 mAvailableValues = availableValues; 73 } 74 75 // init 76 public static void initIfNecessary(Context context) { 77 if (PRESET.hasValue()) 78 return; 79 loadBitmaps(context, LARGE_ICON, LARGE_ICONS); 80 loadBitmaps(context, PICTURE, PICTURES); 81 PRESET.setValue(PRESET_BASIC); 82 } 83 84 private static void loadBitmaps(Context context, EditableItem item, int[] bitmapResIds) { 85 Object[] largeIconBitmaps = new Object[bitmapResIds.length]; 86 Resources res = context.getResources(); 87 for (int i = 0; i < bitmapResIds.length; i++) 88 largeIconBitmaps[i] = BitmapFactory.decodeResource(res, bitmapResIds[i]); 89 item.setAvailableValues(largeIconBitmaps); 90 } 91 92 // visibility 93 public boolean isVisible() { 94 return mVisible; 95 } 96 97 public void setVisible(boolean visible) { 98 if (mVisible == visible) 99 return; 100 mVisible = visible; 101 if (mVisibilityListener != null) 102 mVisibilityListener.run(); 103 } 104 105 public void setVisibilityListener(Runnable listener) { 106 mVisibilityListener = listener; 107 } 108 109 // value 110 111 public boolean hasValue() { 112 return mValue != null; 113 } 114 115 public void setValue(Object value) { 116 if (mValue == value) 117 return; 118 mValue = value; 119 if (this == STYLE) 120 applyStyle(); 121 if (this == PRESET && !PRESET_CUSTOM.equals(value)) 122 applyPreset(); 123 } 124 125 private void applyStyle() { 126 PICTURE.setVisible(STYLE_BIG_PICTURE.equals(mValue)); 127 BIG_TEXT.setVisible(STYLE_BIG_TEXT.equals(mValue)); 128 LINES.setVisible(STYLE_INBOX.equals(mValue)); 129 BIG_CONTENT_TITLE.setVisible(!STYLE_NONE.equals(mValue)); 130 SUMMARY_TEXT.setVisible(!STYLE_NONE.equals(mValue)); 131 } 132 133 private void applyPreset() { 134 for (EditableItem item : values()) 135 if (item != PRESET) 136 item.setValue(null); 137 STYLE.setValue(STYLE_NONE); 138 if (PRESET_BASIC.equals(mValue)) { 139 SMALL_ICON.setValue(android.R.drawable.stat_notify_chat); 140 CONTENT_TITLE.setValue("Basic title"); 141 CONTENT_TEXT.setValue("Basic text"); 142 } else if (PRESET_EMAIL.equals(mValue)) { 143 SMALL_ICON.setValue(R.drawable.ic_notification_multiple_mail_holo_dark); 144 LARGE_ICON.setValue(LARGE_ICON.getAvailableValues()[3]); 145 CONTENT_TITLE.setValue("3 new messages"); 146 CONTENT_TEXT.setValue("Alice, Bob, Chuck"); 147 STYLE.setValue(STYLE_INBOX); 148 LINES.setValue("Alice: Re: Something\n" + 149 "Bob: Did you get the memo?\n" + 150 "Chuck: Limited time offer!"); 151 } else if (PRESET_PHOTO.equals(mValue)) { 152 SMALL_ICON.setValue(android.R.drawable.ic_menu_camera); 153 LARGE_ICON.setValue(LARGE_ICON.getAvailableValues()[2]); 154 CONTENT_TITLE.setValue("Sunset on the rocks"); 155 CONTENT_TEXT.setValue("800x534 | 405.1K"); 156 SUMMARY_TEXT.setValue(CONTENT_TEXT.getValueString()); 157 STYLE.setValue(STYLE_BIG_PICTURE); 158 PICTURE.setValue(PICTURE.getAvailableValues()[0]); 159 ACTION1_ICON.setValue(android.R.drawable.ic_menu_share); 160 ACTION1_TEXT.setValue("Share"); 161 } 162 } 163 164 public Object getValue() { 165 return mValue; 166 } 167 168 public String getValueString() { 169 return (String) mValue; 170 } 171 172 public int getValueInt() { 173 return (Integer) mValue; 174 } 175 176 public long getValueLong() { 177 return (Long) mValue; 178 } 179 180 public boolean getValueBool() { 181 return (Boolean) mValue; 182 } 183 184 public Bitmap getValueBitmap() { 185 return (Bitmap) mValue; 186 } 187 188 // available values 189 190 public Object[] getAvailableValues() { 191 return mAvailableValues; 192 } 193 194 public Integer[] getAvailableValuesInteger() { 195 Integer[] integers = new Integer[mAvailableValues.length]; 196 System.arraycopy(mAvailableValues, 0, integers, 0, integers.length); 197 return integers; 198 } 199 200 public <T> void setAvailableValues(T... values) { 201 mAvailableValues = values; 202 } 203 204 public String getCaption(Context context) { 205 return context.getString(mCaptionId); 206 } 207 208 public String getCategory(Context context) { 209 return context.getString(mCategoryId); 210 } 211 212 public int getType() { 213 return mType; 214 } 215 216 } 217