1 /* 2 * Copyright (C) 2012 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 */ 16 package com.android.ide.eclipse.adt.internal.editors.layout.properties; 17 18 import static com.android.SdkConstants.ATTR_CONTENT_DESCRIPTION; 19 import static com.android.SdkConstants.ATTR_HINT; 20 import static com.android.SdkConstants.ATTR_TEXT; 21 22 import com.android.annotations.NonNull; 23 import com.android.annotations.Nullable; 24 25 import java.util.HashSet; 26 import java.util.Set; 27 28 /** Extra metadata about properties not available from the descriptors (yet) */ 29 class PropertyMetadata { isAdvanced(@onNull String name)30 static boolean isAdvanced(@NonNull String name) { 31 return sAdvanced.contains(name); 32 } 33 isPreferred(@onNull String name)34 static boolean isPreferred(@NonNull String name) { 35 return sPreferred.contains(name); 36 } 37 38 @Nullable getCategory(@onNull String name)39 static String getCategory(@NonNull String name) { 40 //return sCategories.get(name); 41 assert false : "Disabled to save memory since this method is not currently used."; 42 return null; 43 } 44 45 private static final int ADVANCED_MAP_SIZE = 134; 46 private static final Set<String> sAdvanced = new HashSet<String>(ADVANCED_MAP_SIZE); 47 static { 48 // This metadata about which attributes are "advanced" was generated as follows: 49 // First, I ran the sdk/attribute_stats project with the --list argument to dump out 50 // *all* referenced XML attributes found in layouts, run against a bunch of 51 // sample Android code (development/samples, packages/apps, vendor, etc. 52 // 53 // Then I iterated over the LayoutDescriptors' ViewElementDescriptors' 54 // AttributeDescriptors, and basically diffed the two: any attribute descriptor name 55 // which was *not* found in any of the representative layouts is added here 56 // as an advanced property. 57 // 58 // Then I manually edited in some attributes that were referenced in the sample 59 // layouts but which I still consider to be advanced: 60 // -- nothing right now 61 62 // I also manually *removed* some entries from the below list: 63 // drawableBottom (the others, drawableTop, drawableLeft and drawableRight were all 64 // NOT on the list so keep bottom off for symmetry) 65 // rating (useful when you deal with a RatingsBar component) 66 67 68 // Automatically generated, see above: 69 sAdvanced.add("alwaysDrawnWithCache"); 70 sAdvanced.add("animationCache"); 71 sAdvanced.add("animationDuration"); 72 sAdvanced.add("animationResolution"); 73 sAdvanced.add("baseline"); 74 sAdvanced.add("bufferType"); 75 sAdvanced.add("calendarViewShown"); 76 sAdvanced.add("completionHint"); 77 sAdvanced.add("completionHintView"); 78 sAdvanced.add("completionThreshold"); 79 sAdvanced.add("cursorVisible"); 80 sAdvanced.add("dateTextAppearance"); 81 sAdvanced.add("dial"); 82 sAdvanced.add("digits"); 83 sAdvanced.add("disableChildrenWhenDisabled"); 84 sAdvanced.add("disabledAlpha"); 85 sAdvanced.add("drawableAlpha"); 86 sAdvanced.add("drawableEnd"); 87 sAdvanced.add("drawableStart"); 88 sAdvanced.add("drawingCacheQuality"); 89 sAdvanced.add("dropDownAnchor"); 90 sAdvanced.add("dropDownHeight"); 91 sAdvanced.add("dropDownHorizontalOffset"); 92 sAdvanced.add("dropDownSelector"); 93 sAdvanced.add("dropDownVerticalOffset"); 94 sAdvanced.add("dropDownWidth"); 95 sAdvanced.add("editorExtras"); 96 sAdvanced.add("ems"); 97 sAdvanced.add("endYear"); 98 sAdvanced.add("eventsInterceptionEnabled"); 99 sAdvanced.add("fadeDuration"); 100 sAdvanced.add("fadeEnabled"); 101 sAdvanced.add("fadeOffset"); 102 sAdvanced.add("fadeScrollbars"); 103 sAdvanced.add("filterTouchesWhenObscured"); 104 sAdvanced.add("firstDayOfWeek"); 105 sAdvanced.add("flingable"); 106 sAdvanced.add("focusedMonthDateColor"); 107 sAdvanced.add("foregroundInsidePadding"); 108 sAdvanced.add("format"); 109 sAdvanced.add("gestureColor"); 110 sAdvanced.add("gestureStrokeAngleThreshold"); 111 sAdvanced.add("gestureStrokeLengthThreshold"); 112 sAdvanced.add("gestureStrokeSquarenessThreshold"); 113 sAdvanced.add("gestureStrokeType"); 114 sAdvanced.add("gestureStrokeWidth"); 115 sAdvanced.add("hand_hour"); 116 sAdvanced.add("hand_minute"); 117 sAdvanced.add("hapticFeedbackEnabled"); 118 sAdvanced.add("id"); 119 sAdvanced.add("imeActionId"); 120 sAdvanced.add("imeActionLabel"); 121 sAdvanced.add("indeterminateDrawable"); 122 sAdvanced.add("indeterminateDuration"); 123 sAdvanced.add("inputMethod"); 124 sAdvanced.add("interpolator"); 125 sAdvanced.add("isScrollContainer"); 126 sAdvanced.add("keepScreenOn"); 127 sAdvanced.add("layerType"); 128 sAdvanced.add("layoutDirection"); 129 sAdvanced.add("maxDate"); 130 sAdvanced.add("minDate"); 131 sAdvanced.add("mode"); 132 sAdvanced.add("numeric"); 133 sAdvanced.add("paddingEnd"); 134 sAdvanced.add("paddingStart"); 135 sAdvanced.add("persistentDrawingCache"); 136 sAdvanced.add("phoneNumber"); 137 sAdvanced.add("popupBackground"); 138 sAdvanced.add("popupPromptView"); 139 sAdvanced.add("privateImeOptions"); 140 sAdvanced.add("quickContactWindowSize"); 141 //sAdvanced.add("rating"); 142 sAdvanced.add("requiresFadingEdge"); 143 sAdvanced.add("rotation"); 144 sAdvanced.add("rotationX"); 145 sAdvanced.add("rotationY"); 146 sAdvanced.add("saveEnabled"); 147 sAdvanced.add("scaleX"); 148 sAdvanced.add("scaleY"); 149 sAdvanced.add("scrollX"); 150 sAdvanced.add("scrollY"); 151 sAdvanced.add("scrollbarAlwaysDrawHorizontalTrack"); 152 sAdvanced.add("scrollbarDefaultDelayBeforeFade"); 153 sAdvanced.add("scrollbarFadeDuration"); 154 sAdvanced.add("scrollbarSize"); 155 sAdvanced.add("scrollbarThumbHorizontal"); 156 sAdvanced.add("scrollbarThumbVertical"); 157 sAdvanced.add("scrollbarTrackHorizontal"); 158 sAdvanced.add("scrollbarTrackVertical"); 159 sAdvanced.add("secondaryProgress"); 160 sAdvanced.add("selectedDateVerticalBar"); 161 sAdvanced.add("selectedWeekBackgroundColor"); 162 sAdvanced.add("selectionDivider"); 163 sAdvanced.add("selectionDividerHeight"); 164 sAdvanced.add("showWeekNumber"); 165 sAdvanced.add("shownWeekCount"); 166 sAdvanced.add("solidColor"); 167 sAdvanced.add("soundEffectsEnabled"); 168 sAdvanced.add("spinnerMode"); 169 sAdvanced.add("spinnersShown"); 170 sAdvanced.add("startYear"); 171 sAdvanced.add("switchMinWidth"); 172 sAdvanced.add("switchPadding"); 173 sAdvanced.add("switchTextAppearance"); 174 sAdvanced.add("textColorHighlight"); 175 sAdvanced.add("textCursorDrawable"); 176 sAdvanced.add("textDirection"); 177 sAdvanced.add("textEditNoPasteWindowLayout"); 178 sAdvanced.add("textEditPasteWindowLayout"); 179 sAdvanced.add("textEditSideNoPasteWindowLayout"); 180 sAdvanced.add("textEditSidePasteWindowLayout"); 181 sAdvanced.add("textEditSuggestionItemLayout"); 182 sAdvanced.add("textIsSelectable"); 183 sAdvanced.add("textOff"); 184 sAdvanced.add("textOn"); 185 sAdvanced.add("textScaleX"); 186 sAdvanced.add("textSelectHandle"); 187 sAdvanced.add("textSelectHandleLeft"); 188 sAdvanced.add("textSelectHandleRight"); 189 sAdvanced.add("thumbOffset"); 190 sAdvanced.add("thumbTextPadding"); 191 sAdvanced.add("tint"); 192 sAdvanced.add("track"); 193 sAdvanced.add("transformPivotX"); 194 sAdvanced.add("transformPivotY"); 195 sAdvanced.add("translationX"); 196 sAdvanced.add("translationY"); 197 sAdvanced.add("uncertainGestureColor"); 198 sAdvanced.add("unfocusedMonthDateColor"); 199 sAdvanced.add("unselectedAlpha"); 200 sAdvanced.add("verticalScrollbarPosition"); 201 sAdvanced.add("weekDayTextAppearance"); 202 sAdvanced.add("weekNumberColor"); 203 sAdvanced.add("weekSeparatorLineColor"); 204 sAdvanced.size()205 assert sAdvanced.size() == ADVANCED_MAP_SIZE : sAdvanced.size(); 206 207 } 208 209 private static final int PREFERRED_MAP_SIZE = 7; 210 private static final Set<String> sPreferred = new HashSet<String>(PREFERRED_MAP_SIZE); 211 static { 212 // Manual registrations of attributes that should be treated as preferred if 213 // they are available on a widget even if they don't show up in the top 10% of 214 // usages (which the view metadata provides) 215 sPreferred.add(ATTR_TEXT); 216 sPreferred.add(ATTR_CONTENT_DESCRIPTION); 217 sPreferred.add(ATTR_HINT); 218 sPreferred.add("indeterminate"); 219 sPreferred.add("progress"); 220 sPreferred.add("rating"); 221 sPreferred.add("max"); sPreferred.size()222 assert sPreferred.size() == PREFERRED_MAP_SIZE : sPreferred.size(); 223 } 224 225 /* 226 private static final int CATEGORY_MAP_SIZE = 62; 227 private static final Map<String, String> sCategories = 228 new HashMap<String, String>(CATEGORY_MAP_SIZE); 229 static { 230 sCategories.put("requiresFadingEdge", "Scrolling"); 231 sCategories.put("fadingEdgeLength", "Scrolling"); 232 sCategories.put("scrollbarSize", "Scrolling"); 233 sCategories.put("scrollbarThumbVertical", "Scrolling"); 234 sCategories.put("scrollbarThumbHorizontal", "Scrolling"); 235 sCategories.put("scrollbarTrackHorizontal", "Scrolling"); 236 sCategories.put("scrollbarTrackVertical", "Scrolling"); 237 sCategories.put("scrollbarAlwaysDrawHorizontalTrack", "Scrolling"); 238 sCategories.put("scrollbarAlwaysDrawVerticalTrack", "Scrolling"); 239 sCategories.put("scrollViewStyle", "Scrolling"); 240 sCategories.put("scrollbars", "Scrolling"); 241 sCategories.put("scrollingCache", "Scrolling"); 242 sCategories.put("scrollHorizontally", "Scrolling"); 243 sCategories.put("scrollbarFadeDuration", "Scrolling"); 244 sCategories.put("scrollbarDefaultDelayBeforeFade", "Scrolling"); 245 sCategories.put("fastScrollEnabled", "Scrolling"); 246 sCategories.put("smoothScrollbar", "Scrolling"); 247 sCategories.put("isScrollContainer", "Scrolling"); 248 sCategories.put("fadeScrollbars", "Scrolling"); 249 sCategories.put("overScrollMode", "Scrolling"); 250 sCategories.put("overScrollHeader", "Scrolling"); 251 sCategories.put("overScrollFooter", "Scrolling"); 252 sCategories.put("verticalScrollbarPosition", "Scrolling"); 253 sCategories.put("fastScrollAlwaysVisible", "Scrolling"); 254 sCategories.put("fastScrollThumbDrawable", "Scrolling"); 255 sCategories.put("fastScrollPreviewBackgroundLeft", "Scrolling"); 256 sCategories.put("fastScrollPreviewBackgroundRight", "Scrolling"); 257 sCategories.put("fastScrollTrackDrawable", "Scrolling"); 258 sCategories.put("fastScrollOverlayPosition", "Scrolling"); 259 sCategories.put("horizontalScrollViewStyle", "Scrolling"); 260 sCategories.put("fastScrollTextColor", "Scrolling"); 261 sCategories.put("scrollbarSize", "Scrolling"); 262 sCategories.put("scrollbarSize", "Scrolling"); 263 sCategories.put("scrollbarSize", "Scrolling"); 264 sCategories.put("scrollbarSize", "Scrolling"); 265 sCategories.put("scrollbarSize", "Scrolling"); 266 267 // TODO: All the styles: radioButtonStyle, ratingBarStyle, progressBarStyle, ... 268 269 sCategories.put("focusable", "Focus"); 270 sCategories.put("focusableInTouchMode", "Focus"); 271 sCategories.put("nextFocusLeft", "Focus"); 272 sCategories.put("nextFocusRight", "Focus"); 273 sCategories.put("nextFocusUp", "Focus"); 274 sCategories.put("nextFocusDown", "Focus"); 275 sCategories.put("descendantFocusability", "Focus"); 276 sCategories.put("selectAllOnFocus", "Focus"); 277 sCategories.put("nextFocusForward", "Focus"); 278 sCategories.put("colorFocusedHighlight", "Focus"); 279 280 sCategories.put("rotation", "Transforms"); 281 sCategories.put("scrollX", "Transforms"); 282 sCategories.put("scrollY", "Transforms"); 283 sCategories.put("rotationX", "Transforms"); 284 sCategories.put("rotationY", "Transforms"); 285 sCategories.put("transformPivotX", "Transforms"); 286 sCategories.put("transformPivotY", "Transforms"); 287 sCategories.put("translationX", "Transforms"); 288 sCategories.put("translationY", "Transforms"); 289 sCategories.put("scaleX", "Transforms"); 290 sCategories.put("scaleY", "Transforms"); 291 292 sCategories.put("width", "Size"); 293 sCategories.put("height", "Size"); 294 sCategories.put("minWidth", "Size"); 295 sCategories.put("minHeight", "Size"); 296 297 sCategories.put("longClickable", "Clicks"); 298 sCategories.put("onClick", "Clicks"); 299 sCategories.put("clickable", "Clicks"); 300 sCategories.put("hapticFeedbackEnabled", "Clicks"); 301 302 sCategories.put("duplicateParentState", "State"); 303 sCategories.put("addStatesFromChildren", "State"); 304 305 assert sCategories.size() == CATEGORY_MAP_SIZE : sCategories.size(); 306 } 307 */ 308 309 // private static final int PRIO_CLZ_LAYOUT = 1000; 310 // private static final int PRIO_CLZ_TEXT = 2000; 311 // private static final int PRIO_CLZ_DRAWABLE = 3000; 312 // private static final int PRIO_CLZ_ANIMATION = 4000; 313 // private static final int PRIO_CLZ_FOCUS = 5000; 314 // 315 // private static final int PRIORITY_MAP_SIZE = 100; 316 // private static final Map<String, Integer> sPriorities = 317 // new HashMap<String, Integer>(PRIORITY_MAP_SIZE); 318 // static { 319 // // TODO: I should put all the properties roughly based on their original order: this 320 // // will correspond to the rough order they came in with 321 // // TODO: How can I make similar complex properties show up adjacent; e.g. min and max 322 // sPriorities.put("min", PRIO_CLZ_LAYOUT); 323 // sPriorities.put("max", PRIO_CLZ_LAYOUT); 324 // 325 // assert sPriorities.size() == PRIORITY_MAP_SIZE : sPriorities.size(); 326 // } 327 328 // TODO: Emit metadata into a file 329 } 330