| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/org/documents/epl-v10.php |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.android.ide.eclipse.adt.internal.editors.layout.properties; |
| |
| import static com.android.SdkConstants.ATTR_CONTENT_DESCRIPTION; |
| import static com.android.SdkConstants.ATTR_HINT; |
| import static com.android.SdkConstants.ATTR_TEXT; |
| |
| import com.android.annotations.NonNull; |
| import com.android.annotations.Nullable; |
| |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| /** Extra metadata about properties not available from the descriptors (yet) */ |
| class PropertyMetadata { |
| static boolean isAdvanced(@NonNull String name) { |
| return sAdvanced.contains(name); |
| } |
| |
| static boolean isPreferred(@NonNull String name) { |
| return sPreferred.contains(name); |
| } |
| |
| @Nullable |
| static String getCategory(@NonNull String name) { |
| //return sCategories.get(name); |
| assert false : "Disabled to save memory since this method is not currently used."; |
| return null; |
| } |
| |
| private static final int ADVANCED_MAP_SIZE = 134; |
| private static final Set<String> sAdvanced = new HashSet<String>(ADVANCED_MAP_SIZE); |
| static { |
| // This metadata about which attributes are "advanced" was generated as follows: |
| // First, I ran the sdk/attribute_stats project with the --list argument to dump out |
| // *all* referenced XML attributes found in layouts, run against a bunch of |
| // sample Android code (development/samples, packages/apps, vendor, etc. |
| // |
| // Then I iterated over the LayoutDescriptors' ViewElementDescriptors' |
| // AttributeDescriptors, and basically diffed the two: any attribute descriptor name |
| // which was *not* found in any of the representative layouts is added here |
| // as an advanced property. |
| // |
| // Then I manually edited in some attributes that were referenced in the sample |
| // layouts but which I still consider to be advanced: |
| // -- nothing right now |
| |
| // I also manually *removed* some entries from the below list: |
| // drawableBottom (the others, drawableTop, drawableLeft and drawableRight were all |
| // NOT on the list so keep bottom off for symmetry) |
| // rating (useful when you deal with a RatingsBar component) |
| |
| |
| // Automatically generated, see above: |
| sAdvanced.add("alwaysDrawnWithCache"); |
| sAdvanced.add("animationCache"); |
| sAdvanced.add("animationDuration"); |
| sAdvanced.add("animationResolution"); |
| sAdvanced.add("baseline"); |
| sAdvanced.add("bufferType"); |
| sAdvanced.add("calendarViewShown"); |
| sAdvanced.add("completionHint"); |
| sAdvanced.add("completionHintView"); |
| sAdvanced.add("completionThreshold"); |
| sAdvanced.add("cursorVisible"); |
| sAdvanced.add("dateTextAppearance"); |
| sAdvanced.add("dial"); |
| sAdvanced.add("digits"); |
| sAdvanced.add("disableChildrenWhenDisabled"); |
| sAdvanced.add("disabledAlpha"); |
| sAdvanced.add("drawableAlpha"); |
| sAdvanced.add("drawableEnd"); |
| sAdvanced.add("drawableStart"); |
| sAdvanced.add("drawingCacheQuality"); |
| sAdvanced.add("dropDownAnchor"); |
| sAdvanced.add("dropDownHeight"); |
| sAdvanced.add("dropDownHorizontalOffset"); |
| sAdvanced.add("dropDownSelector"); |
| sAdvanced.add("dropDownVerticalOffset"); |
| sAdvanced.add("dropDownWidth"); |
| sAdvanced.add("editorExtras"); |
| sAdvanced.add("ems"); |
| sAdvanced.add("endYear"); |
| sAdvanced.add("eventsInterceptionEnabled"); |
| sAdvanced.add("fadeDuration"); |
| sAdvanced.add("fadeEnabled"); |
| sAdvanced.add("fadeOffset"); |
| sAdvanced.add("fadeScrollbars"); |
| sAdvanced.add("filterTouchesWhenObscured"); |
| sAdvanced.add("firstDayOfWeek"); |
| sAdvanced.add("flingable"); |
| sAdvanced.add("focusedMonthDateColor"); |
| sAdvanced.add("foregroundInsidePadding"); |
| sAdvanced.add("format"); |
| sAdvanced.add("gestureColor"); |
| sAdvanced.add("gestureStrokeAngleThreshold"); |
| sAdvanced.add("gestureStrokeLengthThreshold"); |
| sAdvanced.add("gestureStrokeSquarenessThreshold"); |
| sAdvanced.add("gestureStrokeType"); |
| sAdvanced.add("gestureStrokeWidth"); |
| sAdvanced.add("hand_hour"); |
| sAdvanced.add("hand_minute"); |
| sAdvanced.add("hapticFeedbackEnabled"); |
| sAdvanced.add("id"); |
| sAdvanced.add("imeActionId"); |
| sAdvanced.add("imeActionLabel"); |
| sAdvanced.add("indeterminateDrawable"); |
| sAdvanced.add("indeterminateDuration"); |
| sAdvanced.add("inputMethod"); |
| sAdvanced.add("interpolator"); |
| sAdvanced.add("isScrollContainer"); |
| sAdvanced.add("keepScreenOn"); |
| sAdvanced.add("layerType"); |
| sAdvanced.add("layoutDirection"); |
| sAdvanced.add("maxDate"); |
| sAdvanced.add("minDate"); |
| sAdvanced.add("mode"); |
| sAdvanced.add("numeric"); |
| sAdvanced.add("paddingEnd"); |
| sAdvanced.add("paddingStart"); |
| sAdvanced.add("persistentDrawingCache"); |
| sAdvanced.add("phoneNumber"); |
| sAdvanced.add("popupBackground"); |
| sAdvanced.add("popupPromptView"); |
| sAdvanced.add("privateImeOptions"); |
| sAdvanced.add("quickContactWindowSize"); |
| //sAdvanced.add("rating"); |
| sAdvanced.add("requiresFadingEdge"); |
| sAdvanced.add("rotation"); |
| sAdvanced.add("rotationX"); |
| sAdvanced.add("rotationY"); |
| sAdvanced.add("saveEnabled"); |
| sAdvanced.add("scaleX"); |
| sAdvanced.add("scaleY"); |
| sAdvanced.add("scrollX"); |
| sAdvanced.add("scrollY"); |
| sAdvanced.add("scrollbarAlwaysDrawHorizontalTrack"); |
| sAdvanced.add("scrollbarDefaultDelayBeforeFade"); |
| sAdvanced.add("scrollbarFadeDuration"); |
| sAdvanced.add("scrollbarSize"); |
| sAdvanced.add("scrollbarThumbHorizontal"); |
| sAdvanced.add("scrollbarThumbVertical"); |
| sAdvanced.add("scrollbarTrackHorizontal"); |
| sAdvanced.add("scrollbarTrackVertical"); |
| sAdvanced.add("secondaryProgress"); |
| sAdvanced.add("selectedDateVerticalBar"); |
| sAdvanced.add("selectedWeekBackgroundColor"); |
| sAdvanced.add("selectionDivider"); |
| sAdvanced.add("selectionDividerHeight"); |
| sAdvanced.add("showWeekNumber"); |
| sAdvanced.add("shownWeekCount"); |
| sAdvanced.add("solidColor"); |
| sAdvanced.add("soundEffectsEnabled"); |
| sAdvanced.add("spinnerMode"); |
| sAdvanced.add("spinnersShown"); |
| sAdvanced.add("startYear"); |
| sAdvanced.add("switchMinWidth"); |
| sAdvanced.add("switchPadding"); |
| sAdvanced.add("switchTextAppearance"); |
| sAdvanced.add("textColorHighlight"); |
| sAdvanced.add("textCursorDrawable"); |
| sAdvanced.add("textDirection"); |
| sAdvanced.add("textEditNoPasteWindowLayout"); |
| sAdvanced.add("textEditPasteWindowLayout"); |
| sAdvanced.add("textEditSideNoPasteWindowLayout"); |
| sAdvanced.add("textEditSidePasteWindowLayout"); |
| sAdvanced.add("textEditSuggestionItemLayout"); |
| sAdvanced.add("textIsSelectable"); |
| sAdvanced.add("textOff"); |
| sAdvanced.add("textOn"); |
| sAdvanced.add("textScaleX"); |
| sAdvanced.add("textSelectHandle"); |
| sAdvanced.add("textSelectHandleLeft"); |
| sAdvanced.add("textSelectHandleRight"); |
| sAdvanced.add("thumbOffset"); |
| sAdvanced.add("thumbTextPadding"); |
| sAdvanced.add("tint"); |
| sAdvanced.add("track"); |
| sAdvanced.add("transformPivotX"); |
| sAdvanced.add("transformPivotY"); |
| sAdvanced.add("translationX"); |
| sAdvanced.add("translationY"); |
| sAdvanced.add("uncertainGestureColor"); |
| sAdvanced.add("unfocusedMonthDateColor"); |
| sAdvanced.add("unselectedAlpha"); |
| sAdvanced.add("verticalScrollbarPosition"); |
| sAdvanced.add("weekDayTextAppearance"); |
| sAdvanced.add("weekNumberColor"); |
| sAdvanced.add("weekSeparatorLineColor"); |
| |
| assert sAdvanced.size() == ADVANCED_MAP_SIZE : sAdvanced.size(); |
| |
| } |
| |
| private static final int PREFERRED_MAP_SIZE = 7; |
| private static final Set<String> sPreferred = new HashSet<String>(PREFERRED_MAP_SIZE); |
| static { |
| // Manual registrations of attributes that should be treated as preferred if |
| // they are available on a widget even if they don't show up in the top 10% of |
| // usages (which the view metadata provides) |
| sPreferred.add(ATTR_TEXT); |
| sPreferred.add(ATTR_CONTENT_DESCRIPTION); |
| sPreferred.add(ATTR_HINT); |
| sPreferred.add("indeterminate"); |
| sPreferred.add("progress"); |
| sPreferred.add("rating"); |
| sPreferred.add("max"); |
| assert sPreferred.size() == PREFERRED_MAP_SIZE : sPreferred.size(); |
| } |
| |
| /* |
| private static final int CATEGORY_MAP_SIZE = 62; |
| private static final Map<String, String> sCategories = |
| new HashMap<String, String>(CATEGORY_MAP_SIZE); |
| static { |
| sCategories.put("requiresFadingEdge", "Scrolling"); |
| sCategories.put("fadingEdgeLength", "Scrolling"); |
| sCategories.put("scrollbarSize", "Scrolling"); |
| sCategories.put("scrollbarThumbVertical", "Scrolling"); |
| sCategories.put("scrollbarThumbHorizontal", "Scrolling"); |
| sCategories.put("scrollbarTrackHorizontal", "Scrolling"); |
| sCategories.put("scrollbarTrackVertical", "Scrolling"); |
| sCategories.put("scrollbarAlwaysDrawHorizontalTrack", "Scrolling"); |
| sCategories.put("scrollbarAlwaysDrawVerticalTrack", "Scrolling"); |
| sCategories.put("scrollViewStyle", "Scrolling"); |
| sCategories.put("scrollbars", "Scrolling"); |
| sCategories.put("scrollingCache", "Scrolling"); |
| sCategories.put("scrollHorizontally", "Scrolling"); |
| sCategories.put("scrollbarFadeDuration", "Scrolling"); |
| sCategories.put("scrollbarDefaultDelayBeforeFade", "Scrolling"); |
| sCategories.put("fastScrollEnabled", "Scrolling"); |
| sCategories.put("smoothScrollbar", "Scrolling"); |
| sCategories.put("isScrollContainer", "Scrolling"); |
| sCategories.put("fadeScrollbars", "Scrolling"); |
| sCategories.put("overScrollMode", "Scrolling"); |
| sCategories.put("overScrollHeader", "Scrolling"); |
| sCategories.put("overScrollFooter", "Scrolling"); |
| sCategories.put("verticalScrollbarPosition", "Scrolling"); |
| sCategories.put("fastScrollAlwaysVisible", "Scrolling"); |
| sCategories.put("fastScrollThumbDrawable", "Scrolling"); |
| sCategories.put("fastScrollPreviewBackgroundLeft", "Scrolling"); |
| sCategories.put("fastScrollPreviewBackgroundRight", "Scrolling"); |
| sCategories.put("fastScrollTrackDrawable", "Scrolling"); |
| sCategories.put("fastScrollOverlayPosition", "Scrolling"); |
| sCategories.put("horizontalScrollViewStyle", "Scrolling"); |
| sCategories.put("fastScrollTextColor", "Scrolling"); |
| sCategories.put("scrollbarSize", "Scrolling"); |
| sCategories.put("scrollbarSize", "Scrolling"); |
| sCategories.put("scrollbarSize", "Scrolling"); |
| sCategories.put("scrollbarSize", "Scrolling"); |
| sCategories.put("scrollbarSize", "Scrolling"); |
| |
| // TODO: All the styles: radioButtonStyle, ratingBarStyle, progressBarStyle, ... |
| |
| sCategories.put("focusable", "Focus"); |
| sCategories.put("focusableInTouchMode", "Focus"); |
| sCategories.put("nextFocusLeft", "Focus"); |
| sCategories.put("nextFocusRight", "Focus"); |
| sCategories.put("nextFocusUp", "Focus"); |
| sCategories.put("nextFocusDown", "Focus"); |
| sCategories.put("descendantFocusability", "Focus"); |
| sCategories.put("selectAllOnFocus", "Focus"); |
| sCategories.put("nextFocusForward", "Focus"); |
| sCategories.put("colorFocusedHighlight", "Focus"); |
| |
| sCategories.put("rotation", "Transforms"); |
| sCategories.put("scrollX", "Transforms"); |
| sCategories.put("scrollY", "Transforms"); |
| sCategories.put("rotationX", "Transforms"); |
| sCategories.put("rotationY", "Transforms"); |
| sCategories.put("transformPivotX", "Transforms"); |
| sCategories.put("transformPivotY", "Transforms"); |
| sCategories.put("translationX", "Transforms"); |
| sCategories.put("translationY", "Transforms"); |
| sCategories.put("scaleX", "Transforms"); |
| sCategories.put("scaleY", "Transforms"); |
| |
| sCategories.put("width", "Size"); |
| sCategories.put("height", "Size"); |
| sCategories.put("minWidth", "Size"); |
| sCategories.put("minHeight", "Size"); |
| |
| sCategories.put("longClickable", "Clicks"); |
| sCategories.put("onClick", "Clicks"); |
| sCategories.put("clickable", "Clicks"); |
| sCategories.put("hapticFeedbackEnabled", "Clicks"); |
| |
| sCategories.put("duplicateParentState", "State"); |
| sCategories.put("addStatesFromChildren", "State"); |
| |
| assert sCategories.size() == CATEGORY_MAP_SIZE : sCategories.size(); |
| } |
| */ |
| |
| // private static final int PRIO_CLZ_LAYOUT = 1000; |
| // private static final int PRIO_CLZ_TEXT = 2000; |
| // private static final int PRIO_CLZ_DRAWABLE = 3000; |
| // private static final int PRIO_CLZ_ANIMATION = 4000; |
| // private static final int PRIO_CLZ_FOCUS = 5000; |
| // |
| // private static final int PRIORITY_MAP_SIZE = 100; |
| // private static final Map<String, Integer> sPriorities = |
| // new HashMap<String, Integer>(PRIORITY_MAP_SIZE); |
| // static { |
| // // TODO: I should put all the properties roughly based on their original order: this |
| // // will correspond to the rough order they came in with |
| // // TODO: How can I make similar complex properties show up adjacent; e.g. min and max |
| // sPriorities.put("min", PRIO_CLZ_LAYOUT); |
| // sPriorities.put("max", PRIO_CLZ_LAYOUT); |
| // |
| // assert sPriorities.size() == PRIORITY_MAP_SIZE : sPriorities.size(); |
| // } |
| |
| // TODO: Emit metadata into a file |
| } |