From 3917a7db4e9e637698405901557c6f9826acc051 Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Thu, 7 Jan 2010 08:30:01 -0800 Subject: [PATCH] Move LayoutLib API library to sdk.git Change-Id: I8a54705a75d79c743e59c763ed2464408a836ebf --- layoutlib_api/.classpath | 7 + layoutlib_api/.gitignore | 2 + layoutlib_api/.project | 17 ++ layoutlib_api/Android.mk | 26 +++ .../layoutlib/api/IDensityBasedResourceValue.java | 47 +++++ .../com/android/layoutlib/api/ILayoutBridge.java | 212 +++++++++++++++++++++ .../src/com/android/layoutlib/api/ILayoutLog.java | 42 ++++ .../com/android/layoutlib/api/ILayoutResult.java | 101 ++++++++++ .../android/layoutlib/api/IProjectCallback.java | 74 +++++++ .../com/android/layoutlib/api/IResourceValue.java | 44 +++++ .../android/layoutlib/api/IStyleResourceValue.java | 35 ++++ .../com/android/layoutlib/api/IXmlPullParser.java | 36 ++++ 12 files changed, 643 insertions(+) create mode 100644 layoutlib_api/.classpath create mode 100644 layoutlib_api/.gitignore create mode 100644 layoutlib_api/.project create mode 100644 layoutlib_api/Android.mk create mode 100644 layoutlib_api/src/com/android/layoutlib/api/IDensityBasedResourceValue.java create mode 100644 layoutlib_api/src/com/android/layoutlib/api/ILayoutBridge.java create mode 100644 layoutlib_api/src/com/android/layoutlib/api/ILayoutLog.java create mode 100644 layoutlib_api/src/com/android/layoutlib/api/ILayoutResult.java create mode 100644 layoutlib_api/src/com/android/layoutlib/api/IProjectCallback.java create mode 100644 layoutlib_api/src/com/android/layoutlib/api/IResourceValue.java create mode 100644 layoutlib_api/src/com/android/layoutlib/api/IStyleResourceValue.java create mode 100644 layoutlib_api/src/com/android/layoutlib/api/IXmlPullParser.java diff --git a/layoutlib_api/.classpath b/layoutlib_api/.classpath new file mode 100644 index 000000000..a09ce5f22 --- /dev/null +++ b/layoutlib_api/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/layoutlib_api/.gitignore b/layoutlib_api/.gitignore new file mode 100644 index 000000000..fe99505dc --- /dev/null +++ b/layoutlib_api/.gitignore @@ -0,0 +1,2 @@ +bin + diff --git a/layoutlib_api/.project b/layoutlib_api/.project new file mode 100644 index 000000000..4e4ca3ba2 --- /dev/null +++ b/layoutlib_api/.project @@ -0,0 +1,17 @@ + + + layoutlib_api + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/layoutlib_api/Android.mk b/layoutlib_api/Android.mk new file mode 100644 index 000000000..d60987cf6 --- /dev/null +++ b/layoutlib_api/Android.mk @@ -0,0 +1,26 @@ +# +# Copyright (C) 2008 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. +# +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(call all-java-files-under,src) + +LOCAL_JAVA_LIBRARIES := \ + kxml2-2.3.0 + +LOCAL_MODULE := layoutlib_api + +include $(BUILD_HOST_JAVA_LIBRARY) diff --git a/layoutlib_api/src/com/android/layoutlib/api/IDensityBasedResourceValue.java b/layoutlib_api/src/com/android/layoutlib/api/IDensityBasedResourceValue.java new file mode 100644 index 000000000..57a776fef --- /dev/null +++ b/layoutlib_api/src/com/android/layoutlib/api/IDensityBasedResourceValue.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2008 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.api; + +/** + * Represents an Android Resources that has a density info attached to it. + */ +public interface IDensityBasedResourceValue extends IResourceValue { + + public static enum Density { + HIGH(240), + MEDIUM(160), + LOW(120), + NODPI(0); + + public final static int DEFAULT_DENSITY = 160; + + private final int mValue; + + Density(int value) { + mValue = value; + } + + public int getValue() { + return mValue; + } + } + + /** + * Returns the density associated to the resource. + */ + Density getDensity(); +} diff --git a/layoutlib_api/src/com/android/layoutlib/api/ILayoutBridge.java b/layoutlib_api/src/com/android/layoutlib/api/ILayoutBridge.java new file mode 100644 index 000000000..4dbcfdc4a --- /dev/null +++ b/layoutlib_api/src/com/android/layoutlib/api/ILayoutBridge.java @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2008 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.api; + +import java.util.Map; + +/** + * Entry point of the Layout Lib. Implementations of this interface provide a method to compute + * and render a layout. + *

+ *

{@link #getApiLevel()} gives the ability to know which methods are available. + *

+ * Changes in API level 4: + *

+ * Changes in API level 3: + * + * Changes in API level 2: + * + */ +public interface ILayoutBridge { + + final int API_CURRENT = 4; + + /** + * Returns the API level of the layout library. + * While no methods will ever be removed, some may become deprecated, and some new ones + * will appear. + *

If calling this method throws an {@link AbstractMethodError}, then the API level + * should be considered to be 1. + */ + int getApiLevel(); + + /** + * Initializes the Bridge object. + * @param fontOsLocation the location of the fonts. + * @param enumValueMap map attrName => { map enumFlagName => Integer value }. + * @return true if success. + * @since 1 + */ + boolean init(String fontOsLocation, Map> enumValueMap); + + /** + * Computes and renders a layout + * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the + * layout file. + * @param projectKey An Object identifying the project. This is used for the cache mechanism. + * @param screenWidth the screen width + * @param screenHeight the screen height + * @param renderFullSize if true, the rendering will render the full size needed by the + * layout. This size is never smaller than screenWidth x screenHeight. + * @param density the density factor for the screen. + * @param xdpi the screen actual dpi in X + * @param ydpi the screen actual dpi in Y + * @param themeName The name of the theme to use. + * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme. + * @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 IResourceValue}) 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 IResourceValue}) pairs where the key is the resource name, and the + * value is the resource value. + * @param projectCallback The {@link IProjectCallback} object to get information from + * the project. + * @param logger the object responsible for displaying warning/errors to the user. + * @return a new {@link ILayoutResult} object that contains the result of the layout. + * @since 4 + */ + ILayoutResult computeLayout(IXmlPullParser layoutDescription, + Object projectKey, + int screenWidth, int screenHeight, boolean renderFullSize, + int density, float xdpi, float ydpi, + String themeName, boolean isProjectTheme, + Map> projectResources, + Map> frameworkResources, + IProjectCallback projectCallback, ILayoutLog logger); + + /** + * Computes and renders a layout + * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the + * layout file. + * @param projectKey An Object identifying the project. This is used for the cache mechanism. + * @param screenWidth the screen width + * @param screenHeight the screen height + * @param density the density factor for the screen. + * @param xdpi the screen actual dpi in X + * @param ydpi the screen actual dpi in Y + * @param themeName The name of the theme to use. + * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme. + * @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 IResourceValue}) 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 IResourceValue}) pairs where the key is the resource name, and the + * value is the resource value. + * @param projectCallback The {@link IProjectCallback} object to get information from + * the project. + * @param logger the object responsible for displaying warning/errors to the user. + * @return a new {@link ILayoutResult} object that contains the result of the layout. + * @since 3 + */ + @Deprecated + ILayoutResult computeLayout(IXmlPullParser layoutDescription, + Object projectKey, + int screenWidth, int screenHeight, int density, float xdpi, float ydpi, + String themeName, boolean isProjectTheme, + Map> projectResources, + Map> frameworkResources, + IProjectCallback projectCallback, ILayoutLog logger); + + /** + * Computes and renders a layout + * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the + * layout file. + * @param projectKey An Object identifying the project. This is used for the cache mechanism. + * @param screenWidth the screen width + * @param screenHeight the screen height + * @param themeName The name of the theme to use. + * @param isProjectTheme true if the theme is a project theme, false if it is a framework theme. + * @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 IResourceValue}) 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 IResourceValue}) pairs where the key is the resource name, and the + * value is the resource value. + * @param projectCallback The {@link IProjectCallback} object to get information from + * the project. + * @param logger the object responsible for displaying warning/errors to the user. + * @return a new {@link ILayoutResult} object that contains the result of the layout. + * @deprecated Use {@link #computeLayout(IXmlPullParser, Object, int, int, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)} + * @since 2 + */ + @Deprecated + ILayoutResult computeLayout(IXmlPullParser layoutDescription, + Object projectKey, + int screenWidth, int screenHeight, String themeName, boolean isProjectTheme, + Map> projectResources, + Map> frameworkResources, + IProjectCallback projectCallback, ILayoutLog logger); + + /** + * Computes and renders a layout + * @param layoutDescription the {@link IXmlPullParser} letting the LayoutLib Bridge visit the + * layout file. + * @param projectKey An Object identifying the project. This is used for the cache mechanism. + * @param screenWidth + * @param screenHeight + * @param themeName The name of the theme to use. In order to differentiate project and platform + * themes sharing the same name, all project themes must be prepended with a '*' character. + * @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 IResourceValue}) 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 IResourceValue}) pairs where the key is the resource name, and the + * value is the resource value. + * @param projectCallback The {@link IProjectCallback} object to get information from + * the project. + * @param logger the object responsible for displaying warning/errors to the user. + * @return a new {@link ILayoutResult} object that contains the result of the layout. + * @deprecated Use {@link #computeLayout(IXmlPullParser, Object, int, int, int, float, float, String, boolean, Map, Map, IProjectCallback, ILayoutLog)} + * @since 1 + */ + @Deprecated + ILayoutResult computeLayout(IXmlPullParser layoutDescription, + Object projectKey, + int screenWidth, int screenHeight, String themeName, + Map> projectResources, + Map> frameworkResources, + IProjectCallback projectCallback, ILayoutLog logger); + + /** + * Clears the resource cache for a specific project. + *

This cache contains bitmaps and nine patches that are loaded from the disk and reused + * until this method is called. + *

The cache is not configuration dependent and should only be cleared when a + * resource changes (at this time only bitmaps and 9 patches go into the cache). + * @param projectKey the key for the project. + * @since 1 + */ + void clearCaches(Object projectKey); +} diff --git a/layoutlib_api/src/com/android/layoutlib/api/ILayoutLog.java b/layoutlib_api/src/com/android/layoutlib/api/ILayoutLog.java new file mode 100644 index 000000000..cae15d330 --- /dev/null +++ b/layoutlib_api/src/com/android/layoutlib/api/ILayoutLog.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2008 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.api; + +/** + * Callback interface to display warnings/errors that happened during the computation and + * rendering of the layout. + */ +public interface ILayoutLog { + + /** + * Displays a warning message. + * @param message the message to display. + */ + void warning(String message); + + /** + * Displays an error message. + * @param message the message to display. + */ + void error(String message); + + /** + * Displays an exception + * @param t the {@link Throwable} to display. + */ + void error(Throwable t); +} diff --git a/layoutlib_api/src/com/android/layoutlib/api/ILayoutResult.java b/layoutlib_api/src/com/android/layoutlib/api/ILayoutResult.java new file mode 100644 index 000000000..2d8a21012 --- /dev/null +++ b/layoutlib_api/src/com/android/layoutlib/api/ILayoutResult.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2008 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.api; + +import java.awt.image.BufferedImage; + +/** + * The result of a layout computation through + * {@link ILayoutLibBridge#computeLayout(IXmlPullParser, int, int, String, java.util.Map, java.util.Map, java.util.Map, IFontLoader, ILayoutLibLog, ICustomViewLoader)} + */ +public interface ILayoutResult { + /** + * Success return code + */ + final static int SUCCESS = 0; + + /** + * Error return code, in which case an error message is guaranteed to be defined. + * @See {@link #getErrorMessage()} + */ + final static int ERROR = 1; + + /** + * Returns the result code. + * @see #SUCCESS + * @see #ERROR + */ + int getSuccess(); + + /** + * Returns the {@link ILayoutViewInfo} object for the top level view. + */ + ILayoutViewInfo getRootView(); + + /** + * Returns the rendering of the full layout. + */ + BufferedImage getImage(); + + /** + * Returns the error message. + *

Only valid when {@link #getSuccess()} returns {@link #ERROR} + */ + String getErrorMessage(); + + /** + * Layout information for a specific view. + */ + public interface ILayoutViewInfo { + + /** + * Returns the list of children views. + */ + ILayoutViewInfo[] getChildren(); + + /** + * Returns the key associated with the node. + * @see IXmlPullParser#getViewKey() + */ + Object getViewKey(); + + /** + * Returns the name of the view. + */ + String getName(); + + /** + * Returns the left of the view bounds. + */ + int getLeft(); + + /** + * Returns the top of the view bounds. + */ + int getTop(); + + /** + * Returns the right of the view bounds. + */ + int getRight(); + + /** + * Returns the bottom of the view bounds. + */ + int getBottom(); + } +} diff --git a/layoutlib_api/src/com/android/layoutlib/api/IProjectCallback.java b/layoutlib_api/src/com/android/layoutlib/api/IProjectCallback.java new file mode 100644 index 000000000..5ad50822c --- /dev/null +++ b/layoutlib_api/src/com/android/layoutlib/api/IProjectCallback.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2008 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.api; + +/** + * Callback for project information needed by the Layout Library. + * Classes implementing this interface provide methods giving access to some project data, like + * resource resolution, namespace information, and instantiation of custom view. + */ +public interface IProjectCallback { + + /** + * Loads a custom view with the given constructor signature and arguments. + * @param name The fully qualified name of the class. + * @param constructorSignature The signature of the class to use + * @param constructorArgs The arguments to use on the constructor + * @return A newly instantiated android.view.View object. + * @throws ClassNotFoundException. + * @throws Exception + */ + @SuppressWarnings("unchecked") + Object loadView(String name, Class[] constructorSignature, Object[] constructorArgs) + throws ClassNotFoundException, Exception; + + /** + * Returns the namespace of the application. + *

This lets the Layout Lib load custom attributes for custom views. + */ + String getNamespace(); + + /** + * Resolves the id of a resource Id. + *

The resource id is the value of a R.<type>.<name>, and + * this method will return both the type and name of the resource. + * @param id the Id to resolve. + * @return an array of 2 strings containing the resource name and type, or null if the id + * does not match any resource. + */ + String[] resolveResourceValue(int id); + + /** + * Resolves the id of a resource Id of type int[] + *

The resource id is the value of a R.styleable.<name>, and this method will + * return the name of the resource. + * @param id the Id to resolve. + * @return the name of the resource or null if not found. + */ + String resolveResourceValue(int[] id); + + /** + * Returns the id of a resource. + *

The provided type and name must match an existing constant defined as + * R.<type>.<name>. + * @param type the type of the resource + * @param name the name of the resource + * @return an Integer containing the resource Id, or null if not found. + */ + Integer getResourceValue(String type, String name); + +} diff --git a/layoutlib_api/src/com/android/layoutlib/api/IResourceValue.java b/layoutlib_api/src/com/android/layoutlib/api/IResourceValue.java new file mode 100644 index 000000000..1da95089c --- /dev/null +++ b/layoutlib_api/src/com/android/layoutlib/api/IResourceValue.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2008 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.api; + +/** + * Represents an android resource with a name and a string value. + */ +public interface IResourceValue { + + /** + * Returns the type of the resource. For instance "drawable", "color", etc... + */ + String getType(); + + /** + * Returns the name of the resource, as defined in the XML. + */ + String getName(); + + /** + * Returns the value of the resource, as defined in the XML. This can be null + */ + String getValue(); + + /** + * Returns whether the resource is a framework resource (true) or a project + * resource (false). + */ + boolean isFramework(); +} diff --git a/layoutlib_api/src/com/android/layoutlib/api/IStyleResourceValue.java b/layoutlib_api/src/com/android/layoutlib/api/IStyleResourceValue.java new file mode 100644 index 000000000..2f17e69d3 --- /dev/null +++ b/layoutlib_api/src/com/android/layoutlib/api/IStyleResourceValue.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2008 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.api; + + +/** + * Represents an android style resources with a name and a list of children {@link IResourceValue}. + */ +public interface IStyleResourceValue extends IResourceValue { + + /** + * Returns the parent style name or null if unknown. + */ + String getParentStyle(); + + /** + * Find an item in the list by name + * @param name + */ + IResourceValue findItem(String name); +} diff --git a/layoutlib_api/src/com/android/layoutlib/api/IXmlPullParser.java b/layoutlib_api/src/com/android/layoutlib/api/IXmlPullParser.java new file mode 100644 index 000000000..cd43c56d5 --- /dev/null +++ b/layoutlib_api/src/com/android/layoutlib/api/IXmlPullParser.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2008 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.api; + +import com.android.layoutlib.api.ILayoutResult.ILayoutViewInfo; + +import org.xmlpull.v1.XmlPullParser; + +/** + * Extended version of {@link XmlPullParser} to use with + * {@link ILayoutLibBridge#computeLayout(XmlPullParser, int, int, String, java.util.Map, java.util.Map, java.util.Map, com.android.layoutlib.api.ILayoutLibBridge.IFontInfo)} + */ +public interface IXmlPullParser extends XmlPullParser { + + /** + * Returns a key for the current XML node. + *

This key will be passed back in the {@link ILayoutViewInfo} objects, allowing association + * of a particular XML node with its result from the layout computation. + */ + Object getViewKey(); +} + -- 2.11.0