CreateInfo.java revision af64556de0064eeb5a4d4e6d634c3f074f5f40ce
1/*
2 * Copyright (C) 2008 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
17package com.android.tools.layoutlib.create;
18
19import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
20
21/**
22 * Describes the work to be done by {@link AsmGenerator}.
23 */
24public final class CreateInfo implements ICreateInfo {
25
26    /**
27     * Returns the list of class from layoutlib_create to inject in layoutlib.
28     * The list can be empty but must not be null.
29     */
30    public Class<?>[] getInjectedClasses() {
31        return INJECTED_CLASSES;
32    }
33
34    /**
35     * Returns the list of methods to rewrite as delegates.
36     * The list can be empty but must not be null.
37     */
38    public String[] getDelegateMethods() {
39        return DELEGATE_METHODS;
40    }
41
42    /**
43     * Returns the list of classes on which to delegate all native methods.
44     * The list can be empty but must not be null.
45     */
46    public String[] getDelegateClassNatives() {
47        return DELEGATE_CLASS_NATIVES;
48    }
49
50    /**
51     * Returns The list of methods to stub out. Each entry must be in the form
52     * "package.package.OuterClass$InnerClass#MethodName".
53     * The list can be empty but must not be null.
54     * <p/>
55     * This usage is deprecated. Please use method 'delegates' instead.
56     */
57    public String[] getOverriddenMethods() {
58        return OVERRIDDEN_METHODS;
59    }
60
61    /**
62     * Returns the list of classes to rename, must be an even list: the binary FQCN
63     * of class to replace followed by the new FQCN.
64     * The list can be empty but must not be null.
65     */
66    public String[] getRenamedClasses() {
67        return RENAMED_CLASSES;
68    }
69
70    /**
71     * Returns the list of classes for which the methods returning them should be deleted.
72     * The array contains a list of null terminated section starting with the name of the class
73     * to rename in which the methods are deleted, followed by a list of return types identifying
74     * the methods to delete.
75     * The list can be empty but must not be null.
76     */
77    public String[] getDeleteReturns() {
78        return DELETE_RETURNS;
79    }
80
81    //-----
82
83    /**
84     * The list of class from layoutlib_create to inject in layoutlib.
85     */
86    private final static Class<?>[] INJECTED_CLASSES = new Class<?>[] {
87            OverrideMethod.class,
88            MethodListener.class,
89            MethodAdapter.class,
90            ICreateInfo.class,
91            CreateInfo.class,
92            LayoutlibDelegate.class
93        };
94
95    /**
96     * The list of methods to rewrite as delegates.
97     */
98    private final static String[] DELEGATE_METHODS = new String[] {
99        "android.app.Fragment#instantiate", //(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;",
100        "android.content.res.Resources$Theme#obtainStyledAttributes",
101        "android.content.res.Resources$Theme#resolveAttribute",
102        "android.graphics.BitmapFactory#finishDecode",
103        "android.os.Handler#sendMessageAtTime",
104        "android.os.HandlerThread#run",
105        "android.os.Build#getString",
106        "android.view.Display#getWindowManager",
107        "android.view.LayoutInflater#rInflate",
108        "android.view.LayoutInflater#parseInclude",
109        "android.view.View#isInEditMode",
110        "android.view.inputmethod.InputMethodManager#getInstance",
111        "com.android.internal.util.XmlUtils#convertValueToInt",
112        // TODO: comment out once DelegateClass is working
113    };
114
115    /**
116     * The list of classes on which to delegate all native methods.
117     */
118    private final static String[] DELEGATE_CLASS_NATIVES = new String[] {
119        "android.animation.PropertyValuesHolder",
120        "android.graphics.AvoidXfermode",
121        "android.graphics.Bitmap",
122        "android.graphics.BitmapFactory",
123        "android.graphics.BitmapShader",
124        "android.graphics.BlurMaskFilter",
125        "android.graphics.Canvas",
126        "android.graphics.ColorFilter",
127        "android.graphics.ColorMatrixColorFilter",
128        "android.graphics.ComposePathEffect",
129        "android.graphics.ComposeShader",
130        "android.graphics.CornerPathEffect",
131        "android.graphics.DashPathEffect",
132        "android.graphics.DiscretePathEffect",
133        "android.graphics.DrawFilter",
134        "android.graphics.EmbossMaskFilter",
135        "android.graphics.LayerRasterizer",
136        "android.graphics.LightingColorFilter",
137        "android.graphics.LinearGradient",
138        "android.graphics.MaskFilter",
139        "android.graphics.Matrix",
140        "android.graphics.NinePatch",
141        "android.graphics.Paint",
142        "android.graphics.PaintFlagsDrawFilter",
143        "android.graphics.Path",
144        "android.graphics.PathDashPathEffect",
145        "android.graphics.PathEffect",
146        "android.graphics.PixelXorXfermode",
147        "android.graphics.PorterDuffColorFilter",
148        "android.graphics.PorterDuffXfermode",
149        "android.graphics.RadialGradient",
150        "android.graphics.Rasterizer",
151        "android.graphics.Region",
152        "android.graphics.Shader",
153        "android.graphics.SumPathEffect",
154        "android.graphics.SweepGradient",
155        "android.graphics.Typeface",
156        "android.graphics.Xfermode",
157        "android.os.SystemClock",
158        "android.text.AndroidBidi",
159        "android.util.FloatMath",
160        "android.view.Display",
161        "libcore.icu.ICU",
162    };
163
164    /**
165     * The list of methods to stub out. Each entry must be in the form
166     *  "package.package.OuterClass$InnerClass#MethodName".
167     *  This usage is deprecated. Please use method 'delegates' instead.
168     */
169    private final static String[] OVERRIDDEN_METHODS = new String[] {
170    };
171
172    /**
173     *  The list of classes to rename, must be an even list: the binary FQCN
174     *  of class to replace followed by the new FQCN.
175     */
176    private final static String[] RENAMED_CLASSES =
177        new String[] {
178            "android.os.ServiceManager",            "android.os._Original_ServiceManager",
179            "android.view.SurfaceView",             "android.view._Original_SurfaceView",
180            "android.view.accessibility.AccessibilityManager", "android.view.accessibility._Original_AccessibilityManager",
181            "android.webkit.WebView",               "android.webkit._Original_WebView",
182        };
183
184    /**
185     * List of classes for which the methods returning them should be deleted.
186     * The array contains a list of null terminated section starting with the name of the class
187     * to rename in which the methods are deleted, followed by a list of return types identifying
188     * the methods to delete.
189     */
190    private final static String[] DELETE_RETURNS =
191        new String[] {
192            null };                         // separator, for next class/methods list.
193}
194
195