Home | History | Annotate | Download | only in properties
      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 {
     30     static boolean isAdvanced(@NonNull String name) {
     31         return sAdvanced.contains(name);
     32     }
     33 
     34     static boolean isPreferred(@NonNull String name) {
     35         return sPreferred.contains(name);
     36     }
     37 
     38     @Nullable
     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 
    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");
    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