/* * 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 }