diff options
author | Xavier Ducrohet <xav@android.com> | 2011-07-12 11:39:27 -0700 |
---|---|---|
committer | Xavier Ducrohet <xav@android.com> | 2011-07-12 11:49:22 -0700 |
commit | 0a49635b171f3ba366b1a7ebf28791c4661829bd (patch) | |
tree | 5130ff1f492eb1b37beac8a72b1075099738cec4 | |
parent | 77eaa10949dd47532e262f8e74ad5a1536a4952e (diff) | |
download | frameworks_base-0a49635b171f3ba366b1a7ebf28791c4661829bd.zip frameworks_base-0a49635b171f3ba366b1a7ebf28791c4661829bd.tar.gz frameworks_base-0a49635b171f3ba366b1a7ebf28791c4661829bd.tar.bz2 |
LayoutLib: Delegate for Display and IWindowManager implementation.
This allows ViewConfiguration to be properly implemented which is now
required for the rendering to happen.
Change-Id: I55629689fa8f5f874b43fcac2aa0789ce02d58f4
6 files changed, 639 insertions, 20 deletions
diff --git a/tools/layoutlib/bridge/src/android/view/Display_Delegate.java b/tools/layoutlib/bridge/src/android/view/Display_Delegate.java new file mode 100644 index 0000000..83f9cc2 --- /dev/null +++ b/tools/layoutlib/bridge/src/android/view/Display_Delegate.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 android.view; + +import com.android.layoutlib.bridge.android.BridgeWindowManager; +import com.android.layoutlib.bridge.impl.RenderAction; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + +import android.os.RemoteException; + +/** + * Delegate used to provide new implementation of a select few methods of {@link Display} + * + * Through the layoutlib_create tool, the original methods of Display have been replaced + * by calls to methods of the same name in this delegate class. + * + */ +public class Display_Delegate { + + // ---- Overridden methods ---- + + @LayoutlibDelegate + public static IWindowManager getWindowManager() { + return RenderAction.getCurrentContext().getIWindowManager(); + } + + // ---- Native methods ---- + + @LayoutlibDelegate + /*package*/ static int getDisplayCount() { + return 1; + } + + @LayoutlibDelegate + /** @hide Returns the actual screen size, not including any decor. */ + /*package*/ static int getRealWidth(Display theDisplay) { + // always dynamically query for the current window manager + return RenderAction.getCurrentContext().getIWindowManager().getMetrics().widthPixels; + } + + @LayoutlibDelegate + /** @hide Returns the actual screen size, not including any decor. */ + /*package*/ static int getRealHeight(Display theDisplay) { + // always dynamically query for the current window manager + return RenderAction.getCurrentContext().getIWindowManager().getMetrics().heightPixels; + } + + @LayoutlibDelegate + /** @hide special for when we are faking the screen size. */ + /*package*/ static int getRawWidth(Display theDisplay) { + // same as real since we're not faking compatibility mode. + return getRealWidth(theDisplay); + } + + @LayoutlibDelegate + /** @hide special for when we are faking the screen size. */ + /*package*/ static int getRawHeight(Display theDisplay) { + // same as real since we're not faking compatibility mode. + return getRealHeight(theDisplay); + } + + @LayoutlibDelegate + /*package*/ static int getOrientation(Display theDisplay) { + try { + // always dynamically query for the current window manager + return getWindowManager().getRotation(); + } catch (RemoteException e) { + // this will never been thrown since this is not a true RPC. + } + + return Surface.ROTATION_0; + } + + @LayoutlibDelegate + /*package*/ static void nativeClassInit() { + // not needed for now. + } + + @LayoutlibDelegate + /*package*/ static void init(Display theDisplay, int display) { + // always dynamically query for the current window manager + BridgeWindowManager wm = RenderAction.getCurrentContext().getIWindowManager(); + theDisplay.mDensity = wm.getMetrics().density; + theDisplay.mDpiX = wm.getMetrics().xdpi; + theDisplay.mDpiY = wm.getMetrics().ydpi; + } +} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index 47fa68e..69e0de9 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -64,6 +64,7 @@ import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.LayoutInflater; +import android.view.Surface; import android.view.View; import android.view.ViewGroup; @@ -91,7 +92,11 @@ public final class BridgeContext extends Activity { private final Object mProjectKey; private final DisplayMetrics mMetrics; private final RenderResources mRenderResources; + private final Configuration mConfig; private final ApplicationInfo mApplicationInfo; + private final IProjectCallback mProjectCallback; + + private final BridgeWindowManager mIWindowManager; private final Map<Object, Map<String, String>> mDefaultPropMaps = new IdentityHashMap<Object, Map<String,String>>(); @@ -105,7 +110,6 @@ public final class BridgeContext extends Activity { private Map<int[], Map<Integer, TypedArray>> mTypedArrayCache; private BridgeInflater mBridgeInflater; - private final IProjectCallback mProjectCallback; private BridgeContentResolver mContentResolver; private final Stack<BridgeXmlBlockParser> mParserStack = new Stack<BridgeXmlBlockParser>(); @@ -113,28 +117,25 @@ public final class BridgeContext extends Activity { /** * @param projectKey An Object identifying the project. This is used for the cache mechanism. * @param metrics the {@link DisplayMetrics}. - * @param themeName The name of the theme to use. - * @param projectResources the resources of the project. The map contains (String, map) pairs - * where the string is the type of the resource reference used in the layout file, and the - * map contains (String, {@link }) pairs where the key is the resource name, - * and the value is the resource value. - * @param frameworkResources the framework resources. The map contains (String, map) pairs - * where the string is the type of the resource reference used in the layout file, and the map - * contains (String, {@link ResourceValue}) pairs where the key is the resource name, and the - * value is the resource value. - * @param styleInheritanceMap + * @param renderResources the configured resources (both framework and projects) for this + * render. * @param projectCallback + * @param config the Configuration object for this render. * @param targetSdkVersion the targetSdkVersion of the application. */ public BridgeContext(Object projectKey, DisplayMetrics metrics, RenderResources renderResources, IProjectCallback projectCallback, + Configuration config, int targetSdkVersion) { mProjectKey = projectKey; mMetrics = metrics; mProjectCallback = projectCallback; mRenderResources = renderResources; + mConfig = config; + + mIWindowManager = new BridgeWindowManager(mConfig, metrics, Surface.ROTATION_0); mFragments.mCurState = Fragment.CREATED; mFragments.mActivity = this; @@ -151,13 +152,12 @@ public final class BridgeContext extends Activity { */ public void initResources() { AssetManager assetManager = AssetManager.getSystem(); - Configuration config = new Configuration(); mSystemResources = BridgeResources.initSystem( this, assetManager, mMetrics, - config, + mConfig, mProjectCallback); mTheme = mSystemResources.newTheme(); } @@ -197,6 +197,10 @@ public final class BridgeContext extends Activity { return mRenderResources; } + public BridgeWindowManager getIWindowManager() { + return mIWindowManager; + } + public Map<String, String> getDefaultPropMap(Object key) { return mDefaultPropMaps.get(key); } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java new file mode 100644 index 0000000..13cd9ec --- /dev/null +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java @@ -0,0 +1,455 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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.layoutlib.bridge.android; + +import com.android.internal.view.IInputContext; +import com.android.internal.view.IInputMethodClient; + +import android.content.res.CompatibilityInfo; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.Point; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.DisplayMetrics; +import android.view.Display; +import android.view.Display_Delegate; +import android.view.IApplicationToken; +import android.view.IOnKeyguardExitResult; +import android.view.IRotationWatcher; +import android.view.IWindowManager; +import android.view.IWindowSession; +import android.view.InputChannel; +import android.view.InputDevice; +import android.view.InputEvent; +import android.view.KeyEvent; +import android.view.MotionEvent; + +import java.util.List; + +/** + * Basic implementation of {@link IWindowManager} so that {@link Display} (and + * {@link Display_Delegate}) can return a valid instance. + */ +public class BridgeWindowManager implements IWindowManager { + + private final Configuration mConfig; + private final DisplayMetrics mMetrics; + private final int mRotation; + + public BridgeWindowManager(Configuration config, DisplayMetrics metrics, int rotation) { + mConfig = config; + mMetrics = metrics; + mRotation = rotation; + } + + // custom API. + + public DisplayMetrics getMetrics() { + return mMetrics; + } + + // ---- implementation of IWindowManager that we care about ---- + + public int getRotation() throws RemoteException { + return mRotation; + } + + public int getMaximumSizeDimension() throws RemoteException { + return 0; + } + + public void getDisplaySize(Point arg0) throws RemoteException { + } + + // ---- unused implementation of IWindowManager ---- + + public boolean canStatusBarHide() throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public void addAppToken(int arg0, IApplicationToken arg1, int arg2, int arg3, boolean arg4) + throws RemoteException { + // TODO Auto-generated method stub + + } + + public void addWindowToken(IBinder arg0, int arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void clearForcedDisplaySize() throws RemoteException { + // TODO Auto-generated method stub + + } + + public void closeSystemDialogs(String arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void disableKeyguard(IBinder arg0, String arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void executeAppTransition() throws RemoteException { + // TODO Auto-generated method stub + + } + + public void exitKeyguardSecurely(IOnKeyguardExitResult arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void freezeRotation() throws RemoteException { + // TODO Auto-generated method stub + + } + + public float getAnimationScale(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public float[] getAnimationScales() throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + public int getAppOrientation(IApplicationToken arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public int getDPadKeycodeState(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public int getDPadScancodeState(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + + public InputDevice getInputDevice(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + public int[] getInputDeviceIds() throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + public int getKeycodeState(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public int getKeycodeStateForDevice(int arg0, int arg1) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + + public int getPendingAppTransition() throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + + public int getScancodeState(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public int getScancodeStateForDevice(int arg0, int arg1) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public int getSwitchState(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public int getSwitchStateForDevice(int arg0, int arg1) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public int getTrackballKeycodeState(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public int getTrackballScancodeState(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public boolean hasKeys(int[] arg0, boolean[] arg1) throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public boolean inKeyguardRestrictedInputMode() throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public boolean injectInputEventNoWait(InputEvent arg0) throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public boolean injectKeyEvent(KeyEvent arg0, boolean arg1) throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public boolean injectPointerEvent(MotionEvent arg0, boolean arg1) throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public boolean injectTrackballEvent(MotionEvent arg0, boolean arg1) throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public boolean inputMethodClientHasFocus(IInputMethodClient arg0) throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public boolean isKeyguardLocked() throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public boolean isKeyguardSecure() throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public boolean isViewServerRunning() throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public InputChannel monitorInput(String arg0) throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + public void moveAppToken(int arg0, IBinder arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void moveAppTokensToBottom(List<IBinder> arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void moveAppTokensToTop(List<IBinder> arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public IWindowSession openSession(IInputMethodClient arg0, IInputContext arg1) + throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + public void overridePendingAppTransition(String arg0, int arg1, int arg2) + throws RemoteException { + // TODO Auto-generated method stub + + } + + public void pauseKeyDispatching(IBinder arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void prepareAppTransition(int arg0, boolean arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void reenableKeyguard(IBinder arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void removeAppToken(IBinder arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void removeWindowToken(IBinder arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void resumeKeyDispatching(IBinder arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public Bitmap screenshotApplications(IBinder arg0, int arg1, int arg2) throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + public void setAnimationScale(int arg0, float arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setAnimationScales(float[] arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setAppGroupId(IBinder arg0, int arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setAppOrientation(IApplicationToken arg0, int arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setAppStartingWindow(IBinder arg0, String arg1, int arg2, CompatibilityInfo arg3, + CharSequence arg4, int arg5, int arg6, int arg7, IBinder arg8, boolean arg9) + throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setAppVisibility(IBinder arg0, boolean arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setAppWillBeHidden(IBinder arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setEventDispatching(boolean arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setFocusedApp(IBinder arg0, boolean arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setForcedDisplaySize(int arg0, int arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setInTouchMode(boolean arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setNewConfiguration(Configuration arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setPointerSpeed(int arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setRotation(int arg0, boolean arg1, int arg2) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void setStrictModeVisualIndicatorPreference(String arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void showStrictModeViolation(boolean arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void startAppFreezingScreen(IBinder arg0, int arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public boolean startViewServer(int arg0) throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public void statusBarVisibilityChanged(int arg0) throws RemoteException { + // TODO Auto-generated method stub + + } + + public void stopAppFreezingScreen(IBinder arg0, boolean arg1) throws RemoteException { + // TODO Auto-generated method stub + + } + + public boolean stopViewServer() throws RemoteException { + // TODO Auto-generated method stub + return false; + } + + public void thawRotation() throws RemoteException { + // TODO Auto-generated method stub + + } + + public Configuration updateOrientationFromAppTokens(Configuration arg0, IBinder arg1) + throws RemoteException { + // TODO Auto-generated method stub + return null; + } + + public int watchRotation(IRotationWatcher arg0) throws RemoteException { + // TODO Auto-generated method stub + return 0; + } + + public IBinder asBinder() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java index 6194f5d..20f7195 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java @@ -27,10 +27,14 @@ import com.android.ide.common.rendering.api.Result; import com.android.ide.common.rendering.api.RenderResources.FrameworkResourceIdProvider; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.android.BridgeContext; +import com.android.resources.Density; import com.android.resources.ResourceType; +import com.android.resources.ScreenSize; +import android.content.res.Configuration; import android.os.HandlerThread_Delegate; import android.util.DisplayMetrics; +import android.view.ViewConfiguration; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; @@ -94,24 +98,29 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso // setup the display Metrics. DisplayMetrics metrics = new DisplayMetrics(); metrics.densityDpi = mParams.getDensity().getDpiValue(); - metrics.density = metrics.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT; - metrics.scaledDensity = metrics.density; - metrics.widthPixels = mParams.getScreenWidth(); - metrics.heightPixels = mParams.getScreenHeight(); - metrics.xdpi = mParams.getXdpi(); - metrics.ydpi = mParams.getYdpi(); + + metrics.density = metrics.noncompatDensity = + metrics.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT; + + metrics.scaledDensity = metrics.noncompatScaledDensity = metrics.density; + + metrics.widthPixels = metrics.noncompatWidthPixels = mParams.getScreenWidth(); + metrics.heightPixels = metrics.noncompatHeightPixels = mParams.getScreenHeight(); + metrics.xdpi = metrics.noncompatXdpi = mParams.getXdpi(); + metrics.ydpi = metrics.noncompatYdpi = mParams.getYdpi(); RenderResources resources = mParams.getResources(); // build the context mContext = new BridgeContext(mParams.getProjectKey(), metrics, resources, - mParams.getProjectCallback(), mParams.getTargetSdkVersion()); + mParams.getProjectCallback(), getConfiguration(), mParams.getTargetSdkVersion()); setUp(); return SUCCESS.createResult(); } + /** * Prepares the scene for action. * <p> @@ -233,6 +242,9 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso // quit HandlerThread created during this session. HandlerThread_Delegate.cleanUp(sCurrentContext); + // clear the stored ViewConfiguration since the map is per density and not per context. + ViewConfiguration.sConfigurations.clear(); + sCurrentContext = null; Bridge.setLog(null); @@ -281,6 +293,50 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso } } + private Configuration getConfiguration() { + Configuration config = new Configuration(); + + ScreenSize screenSize = mParams.getConfigScreenSize(); + if (screenSize != null) { + switch (screenSize) { + case SMALL: + config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_SMALL; + break; + case NORMAL: + config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_NORMAL; + break; + case LARGE: + config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_LARGE; + break; + case XLARGE: + config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_XLARGE; + break; + } + } + + Density density = mParams.getDensity(); + if (density == null) { + density = Density.MEDIUM; + } + + config.screenWidthDp = mParams.getScreenWidth() / density.getDpiValue(); + config.screenHeightDp = mParams.getScreenHeight() / density.getDpiValue(); + if (config.screenHeightDp < config.screenWidthDp) { + config.smallestScreenWidthDp = config.screenHeightDp; + } else { + config.smallestScreenWidthDp = config.screenWidthDp; + } + + // never run in compat mode: + config.compatScreenWidthDp = config.screenWidthDp; + config.compatScreenHeightDp = config.screenHeightDp; + + // TODO: fill in more config info. + + return config; + } + + // --- FrameworkResourceIdProvider methods @Override diff --git a/tools/layoutlib/bridge/tests/.classpath b/tools/layoutlib/bridge/tests/.classpath index 9cc2433..027bc67 100644 --- a/tools/layoutlib/bridge/tests/.classpath +++ b/tools/layoutlib/bridge/tests/.classpath @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> + <classpathentry kind="src" path="res"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry combineaccessrules="false" kind="src" path="/layoutlib_bridge"/> <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_PLAT_SRC/dalvik/libcore/xml/src/main/java"/> diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java index 233f72e..f385805 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java @@ -103,6 +103,7 @@ public final class CreateInfo implements ICreateInfo { "android.os.Handler#sendMessageAtTime", "android.os.HandlerThread#run", "android.os.Build#getString", + "android.view.Display#getWindowManager", "android.view.LayoutInflater#rInflate", "android.view.LayoutInflater#parseInclude", "android.view.View#isInEditMode", @@ -154,6 +155,7 @@ public final class CreateInfo implements ICreateInfo { "android.graphics.Xfermode", "android.os.SystemClock", "android.util.FloatMath", + "android.view.Display", "libcore.icu.ICU", }; |