aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xeclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfo.java58
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java5
-rwxr-xr-xeclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java5
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ViewHierarchy.java10
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringTest.java2
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfoTest.java127
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManagerTest.java4
-rwxr-xr-xeclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactoryTest.java6
-rw-r--r--layoutlib_api/src/com/android/ide/common/rendering/api/Capability.java2
9 files changed, 175 insertions, 44 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfo.java
index 2bb8901..2a70dd0 100755
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfo.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfo.java
@@ -526,19 +526,41 @@ public class CanvasViewInfo implements IPropertySource {
* This method will build up a set of {@link CanvasViewInfo} that corresponds to the
* actual <b>selectable</b> views (which are also shown in the Outline).
*
+ * @param layoutlib5 if true, the {@link ViewInfo} hierarchy was created by layoutlib
+ * version 5 or higher, which means this algorithm can make certain assumptions
+ * (for example that {@code <merge>} siblings will provide {@link MergeCookie}
+ * references, so we don't have to search for them.)
* @param root the root {@link ViewInfo} to build from
* @return a {@link CanvasViewInfo} hierarchy
*/
- public static Pair<CanvasViewInfo,List<Rectangle>> create(ViewInfo root) {
- return new Builder().create(root);
+ public static Pair<CanvasViewInfo,List<Rectangle>> create(ViewInfo root, boolean layoutlib5) {
+ return new Builder(layoutlib5).create(root);
}
/** Builder object which walks over a tree of {@link ViewInfo} objects and builds
* up a corresponding {@link CanvasViewInfo} hierarchy. */
private static class Builder {
- private Map<UiViewElementNode,List<CanvasViewInfo>> mMergeNodeMap;
+ public Builder(boolean layoutlib5) {
+ mLayoutLib5 = layoutlib5;
+ }
- public Pair<CanvasViewInfo,List<Rectangle>> create(ViewInfo root) {
+ /**
+ * The mapping from nodes that have a {@code <merge>} as a parent in the node
+ * model to their corresponding views
+ */
+ private Map<UiViewElementNode, List<CanvasViewInfo>> mMergeNodeMap;
+
+ /**
+ * Whether the ViewInfos are provided by a layout library that is version 5 or
+ * later, since that will allow us to take several shortcuts
+ */
+ private boolean mLayoutLib5;
+
+ /**
+ * Creates a hierarchy of {@link CanvasViewInfo} objects and merge bounding
+ * rectangles from the given {@link ViewInfo} hierarchy
+ */
+ private Pair<CanvasViewInfo,List<Rectangle>> create(ViewInfo root) {
Object cookie = root.getCookie();
if (cookie == null) {
// Special case: If the root-most view does not have a view cookie,
@@ -717,10 +739,24 @@ public class CanvasViewInfo implements IPropertySource {
parentX += viewInfo.getLeft();
parentY += viewInfo.getTop();
+ List<ViewInfo> children = viewInfo.getChildren();
+
+ if (mLayoutLib5) {
+ for (ViewInfo child : children) {
+ Object cookie = child.getCookie();
+ if (cookie instanceof UiViewElementNode || cookie instanceof MergeCookie) {
+ CanvasViewInfo childView = createSubtree(view, child,
+ parentX, parentY);
+ view.addChild(childView);
+ } // else: null cookies, adapter item references, etc: No child views.
+ }
+
+ return view;
+ }
+
// See if we have any missing keys at this level
int missingNodes = 0;
int mergeNodes = 0;
- List<ViewInfo> children = viewInfo.getChildren();
for (ViewInfo child : children) {
// Only use children which have a ViewKey of the correct type.
// We can't interact with those when they have a null key or
@@ -751,7 +787,9 @@ public class CanvasViewInfo implements IPropertySource {
// embedded_layout rendering, or we are including a view with a <merge>
// as the root element.
- String containerName = view.getUiViewNode().getDescriptor().getXmlLocalName();
+ UiViewElementNode uiViewNode = view.getUiViewNode();
+ String containerName = uiViewNode != null
+ ? uiViewNode.getDescriptor().getXmlLocalName() : ""; //$NON-NLS-1$
if (containerName.equals(LayoutDescriptors.VIEW_INCLUDE)) {
// This is expected -- we don't WANT to get node keys for the content
// of an include since it's in a different file and should be treated
@@ -764,9 +802,11 @@ public class CanvasViewInfo implements IPropertySource {
// that there are <merge> tags which are doing surprising things
// to the view hierarchy
LinkedList<UiViewElementNode> unused = new LinkedList<UiViewElementNode>();
- for (UiElementNode child : view.getUiViewNode().getUiChildren()) {
- if (child instanceof UiViewElementNode) {
- unused.addLast((UiViewElementNode) child);
+ if (uiViewNode != null) {
+ for (UiElementNode child : uiViewNode.getUiChildren()) {
+ if (child instanceof UiViewElementNode) {
+ unused.addLast((UiViewElementNode) child);
+ }
}
}
for (ViewInfo child : children) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
index ad3292e..0a65865 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
@@ -1053,7 +1053,7 @@ public class GraphicalEditorPart extends EditorPart
new StaticRenderSession(
Result.Status.SUCCESS.createResult(),
null /*rootViewInfo*/, null /*image*/),
- null /*explodeNodes*/);
+ null /*explodeNodes*/, true /* layoutlib5 */);
return;
}
@@ -1339,7 +1339,8 @@ public class GraphicalEditorPart extends EditorPart
explodeNodes, null /*custom background*/, false /*no decorations*/, logger,
mIncludedWithin, renderingMode);
- canvas.setSession(session, explodeNodes);
+ boolean layoutlib5 = layoutLib.supports(Capability.EMBEDDED_LAYOUT);
+ canvas.setSession(session, explodeNodes, layoutlib5);
// update the UiElementNode with the layout info.
if (session != null && session.getResult().isSuccess() == false) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java
index 321ad01..b54e3d1 100755
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java
@@ -553,11 +553,12 @@ public class LayoutCanvas extends Canvas {
* {@link #showInvisibleViews(boolean)}) where individual invisible nodes
* are padded during certain interactions.
*/
- /* package */ void setSession(RenderSession session, Set<UiElementNode> explodedNodes) {
+ /* package */ void setSession(RenderSession session, Set<UiElementNode> explodedNodes,
+ boolean layoutlib5) {
// disable any hover
clearHover();
- mViewHierarchy.setSession(session, explodedNodes);
+ mViewHierarchy.setSession(session, explodedNodes, layoutlib5);
if (mViewHierarchy.isValid() && session != null) {
Image image = mImageOverlay.setImage(session.getImage(), session.isAlphaChannelImage());
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ViewHierarchy.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ViewHierarchy.java
index 8624cd3..10625bb 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ViewHierarchy.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ViewHierarchy.java
@@ -136,7 +136,8 @@ public class ViewHierarchy {
* {@link LayoutCanvas#showInvisibleViews}) where individual invisible
* nodes are padded during certain interactions.
*/
- /* package */ void setSession(RenderSession session, Set<UiElementNode> explodedNodes) {
+ /* package */ void setSession(RenderSession session, Set<UiElementNode> explodedNodes,
+ boolean layoutlib5) {
// replace the previous scene, so the previous scene must be disposed.
if (mSession != null) {
mSession.dispose();
@@ -157,7 +158,7 @@ public class ViewHierarchy {
// via drag & drop, etc.
if (hasMergeRoot()) {
ViewInfo mergeRoot = createMergeInfo(session);
- infos = CanvasViewInfo.create(mergeRoot);
+ infos = CanvasViewInfo.create(mergeRoot, layoutlib5);
} else {
infos = null;
}
@@ -165,11 +166,12 @@ public class ViewHierarchy {
if (rootList.size() > 1 && hasMergeRoot()) {
ViewInfo mergeRoot = createMergeInfo(session);
mergeRoot.setChildren(rootList);
- infos = CanvasViewInfo.create(mergeRoot);
+ infos = CanvasViewInfo.create(mergeRoot, layoutlib5);
} else {
ViewInfo root = rootList.get(0);
+
if (root != null) {
- infos = CanvasViewInfo.create(root);
+ infos = CanvasViewInfo.create(root, layoutlib5);
if (DUMP_INFO) {
dump(root, 0);
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringTest.java
index 18d56a1..661b553 100644
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringTest.java
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringTest.java
@@ -258,7 +258,7 @@ public class RefactoringTest extends AdtProjectTest {
UiViewElementNode model = createModel(null, element);
ViewInfo info = createInfos(model, relativePath);
- CanvasViewInfo rootView = CanvasViewInfo.create(info).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(info, true /* layoutlib5 */).getFirst();
TestLayoutEditor layoutEditor = new TestLayoutEditor(file, structuredDocument, null);
TestContext testInfo = createTestContext();
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfoTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfoTest.java
index 494346a..d336b35 100644
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfoTest.java
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfoTest.java
@@ -18,7 +18,9 @@ package com.android.ide.eclipse.adt.internal.editors.layout.gle2;
import com.android.ide.common.rendering.api.Capability;
import com.android.ide.common.rendering.api.MergeCookie;
+import com.android.ide.common.rendering.api.SessionParams;
import com.android.ide.common.rendering.api.ViewInfo;
+import com.android.ide.common.rendering.api.SessionParams.AdapterItemReference;
import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
@@ -65,6 +67,15 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testNormalCreate() throws Exception {
+ normal(true);
+ }
+
+ public void testNormalCreateLayoutLib5() throws Exception {
+ normal(false);
+ }
+
+ private void normal(boolean layoutlib5) {
+
// Normal view hierarchy, no null keys anywhere
UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
@@ -75,7 +86,7 @@ public class CanvasViewInfoTest extends TestCase {
ViewInfo child2 = new ViewInfo("Button", child2Node, 0, 20, 70, 25);
root.setChildren(Arrays.asList(child1, child2));
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
assertEquals("LinearLayout", rootView.getName());
assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
@@ -100,6 +111,15 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testShowIn() throws Exception {
+ showIn(false);
+ }
+
+ public void testShowInLayoutLib5() throws Exception {
+ showIn(true);
+ }
+
+ public void showIn(boolean layoutlib5) throws Exception {
+
// Test rendering of "Show Included In" (included content rendered
// within an outer content that has null keys)
@@ -112,7 +132,7 @@ public class CanvasViewInfoTest extends TestCase {
ViewInfo child21 = new ViewInfo("RadioButton", child21Node, 0, 20, 70, 25);
child2.setChildren(Arrays.asList(child21));
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
assertEquals("LinearLayout", rootView.getName());
assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
@@ -137,6 +157,8 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testIncludeTag() throws Exception {
+ boolean layoutlib5 = true;
+
// Test rendering of included views on layoutlib 5+ (e.g. has <include> tag)
UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
@@ -149,7 +171,7 @@ public class CanvasViewInfoTest extends TestCase {
ViewInfo child21 = new ViewInfo("RadioButton", null, 0, 20, 70, 25);
child2.setChildren(Arrays.asList(child21));
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
assertEquals("LinearLayout", rootView.getName());
assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
@@ -176,9 +198,10 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testNoIncludeTag() throws Exception {
+ boolean layoutlib5 = false;
+
// Test rendering of included views on layoutlib 4- (e.g. no <include> tag cookie
- // in
- // view info)
+ // in view info)
UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
ViewInfo root = new ViewInfo("LinearLayout", rootNode, 10, 10, 100, 100);
@@ -190,7 +213,7 @@ public class CanvasViewInfoTest extends TestCase {
ViewInfo child21 = new ViewInfo("RadioButton", null, 0, 20, 70, 25);
child2.setChildren(Arrays.asList(child21));
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
assertEquals("LinearLayout", rootView.getName());
assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
@@ -217,6 +240,8 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testMergeMatching() throws Exception {
+ boolean layoutlib5 = false;
+
// Test rendering of MULTIPLE included views or when there is no simple match
// between view info and ui element node children
@@ -232,7 +257,7 @@ public class CanvasViewInfoTest extends TestCase {
ViewInfo child21 = new ViewInfo("RadioButton", null, 0, 20, 70, 25);
child2.setChildren(Arrays.asList(child21));
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
assertEquals("LinearLayout", rootView.getName());
assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
@@ -272,6 +297,8 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testMerge() throws Exception {
+ boolean layoutlib5 = false;
+
// Test rendering of MULTIPLE included views or when there is no simple match
// between view info and ui element node children
@@ -286,7 +313,7 @@ public class CanvasViewInfoTest extends TestCase {
ViewInfo child21 = new ViewInfo("RadioButton", null, 0, 20, 70, 25);
child2.setChildren(Arrays.asList(child21));
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
assertEquals("LinearLayout", rootView.getName());
assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
@@ -313,6 +340,8 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testInsertMerge() throws Exception {
+ boolean layoutlib5 = false;
+
// Test rendering of MULTIPLE included views or when there is no simple match
// between view info and ui element node children
@@ -320,7 +349,7 @@ public class CanvasViewInfoTest extends TestCase {
UiViewElementNode rootNode = createNode(mergeNode, "android.widget.Button", false);
ViewInfo root = new ViewInfo("Button", rootNode, 10, 10, 100, 100);
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
assertEquals("merge", rootView.getName());
assertSame(rootView.getUiViewNode(), mergeNode);
@@ -340,6 +369,8 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testUnmatchedMissing() throws Exception {
+ boolean layoutlib5 = false;
+
UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
ViewInfo root = new ViewInfo("LinearLayout", rootNode, 0, 0, 100, 100);
List<ViewInfo> children = new ArrayList<ViewInfo>();
@@ -387,7 +418,7 @@ public class CanvasViewInfoTest extends TestCase {
}
root.setChildren(children);
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
// dump(root, 0);
@@ -412,6 +443,8 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testMergeCookies() throws Exception {
+ boolean layoutlib5 = true;
+
UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
ViewInfo root = new ViewInfo("LinearLayout", rootNode, 0, 0, 100, 100);
@@ -431,7 +464,7 @@ public class CanvasViewInfoTest extends TestCase {
}
root.setChildren(children);
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
assertEquals("LinearLayout", rootView.getName());
@@ -446,6 +479,8 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testMergeCookies2() throws Exception {
+ boolean layoutlib5 = true;
+
UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
ViewInfo root = new ViewInfo("LinearLayout", rootNode, 0, 0, 100, 100);
@@ -460,12 +495,13 @@ public class CanvasViewInfoTest extends TestCase {
ArrayList<ViewInfo> children = new ArrayList<ViewInfo>();
for (int i = 0; i < 10; i++) {
Object cookie = (i % 2) == 0 ? cookie1 : cookie2;
- ViewInfo childView = new ViewInfo("childView" + i, cookie, 0, i * 20, 50, (i + 1) * 20);
+ ViewInfo childView = new ViewInfo("childView" + i, cookie, 0, i * 20, 50,
+ (i + 1) * 20);
children.add(childView);
}
root.setChildren(children);
- Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root);
+ Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root, layoutlib5);
CanvasViewInfo rootView = result.getFirst();
List<Rectangle> bounds = result.getSecond();
assertNull(bounds);
@@ -495,6 +531,8 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testIncludeBounds() throws Exception {
+ boolean layoutlib5 = true;
+
UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
ViewInfo root = new ViewInfo("included", null, 0, 0, 100, 100);
@@ -509,12 +547,13 @@ public class CanvasViewInfoTest extends TestCase {
ArrayList<ViewInfo> children = new ArrayList<ViewInfo>();
for (int i = 0; i < 10; i++) {
Object cookie = (i % 2) == 0 ? cookie1 : cookie2;
- ViewInfo childView = new ViewInfo("childView" + i, cookie, 0, i * 20, 50, (i + 1) * 20);
+ ViewInfo childView = new ViewInfo("childView" + i, cookie, 0, i * 20, 50,
+ (i + 1) * 20);
children.add(childView);
}
root.setChildren(children);
- Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root);
+ Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root, layoutlib5);
CanvasViewInfo rootView = result.getFirst();
List<Rectangle> bounds = result.getSecond();
assertNotNull(rootView);
@@ -548,21 +587,27 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testIncludeBounds2() throws Exception {
+ includeBounds2(false);
+ }
+
+ public void testIncludeBounds2LayoutLib5() throws Exception {
+ includeBounds2(true);
+ }
+
+ public void includeBounds2(boolean layoutlib5) throws Exception {
+
UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
ViewInfo root = new ViewInfo("included", null, 0, 0, 100, 100);
UiViewElementNode node1 = createNode(rootNode, "childNode1", false);
UiViewElementNode node2 = createNode(rootNode, "childNode2", false);
- // Sets alternating merge cookies and checks whether the node sibling lists are
- // okay and merged correctly
-
ViewInfo childView1 = new ViewInfo("childView1", node1, 0, 20, 50, 40);
ViewInfo childView2 = new ViewInfo("childView2", node2, 0, 40, 50, 60);
root.setChildren(Arrays.asList(childView1, childView2));
- Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root);
+ Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root, layoutlib5);
CanvasViewInfo rootView = result.getFirst();
List<Rectangle> bounds = result.getSecond();
assertNotNull(rootView);
@@ -580,6 +625,8 @@ public class CanvasViewInfoTest extends TestCase {
}
public void testGestureOverlayView() throws Exception {
+ boolean layoutlib5 = true;
+
// Test rendering of included views on layoutlib 5+ (e.g. has <include> tag)
UiViewElementNode rootNode = createNode("android.gesture.GestureOverlayView", true);
@@ -590,7 +637,7 @@ public class CanvasViewInfoTest extends TestCase {
root.setChildren(Collections.singletonList(child));
ViewInfo grandChild = new ViewInfo("Button", grandChildNode, 0, 20, 70, 25);
child.setChildren(Collections.singletonList(grandChild));
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
assertNotNull(rootView);
assertEquals("GestureOverlayView", rootView.getName());
@@ -611,6 +658,46 @@ public class CanvasViewInfoTest extends TestCase {
assertFalse(grandChildView.isRoot());
}
+ public void testListView() throws Exception {
+ // For ListViews we get AdapterItemReferences as cookies. Ensure that this
+ // works properly.
+ //
+ // android.widget.FrameLayout [0,50,320,480] <FrameLayout>
+ // android.widget.ListView [0,0,320,430] <ListView>
+ // android.widget.LinearLayout [0,0,320,17] SessionParams$AdapterItemReference
+ // android.widget.TextView [0,0,73,17]
+ // android.widget.LinearLayout [0,18,320,35] SessionParams$AdapterItemReference
+ // android.widget.TextView [0,0,73,17]
+ // android.widget.LinearLayout [0,36,320,53] SessionParams$AdapterItemReference
+ // android.widget.TextView [0,0,73,17]
+ // ...
+
+ UiViewElementNode rootNode = createNode("FrameLayout", true);
+ UiViewElementNode childNode = createNode(rootNode, "ListView", false);
+ /*UiViewElementNode grandChildNode =*/ createNode(childNode, "LinearLayout", false);
+ /*UiViewElementNode greatGrandChildNode =*/ createNode(childNode, "TextView", false);
+ AdapterItemReference adapterItem = new SessionParams.AdapterItemReference("foo");
+
+ ViewInfo root = new ViewInfo("FrameLayout", rootNode, 0, 50, 320, 480);
+ ViewInfo child = new ViewInfo("ListView", childNode, 0, 0, 320, 430);
+ root.setChildren(Collections.singletonList(child));
+ ViewInfo grandChild = new ViewInfo("LinearLayout", adapterItem, 0, 0, 320, 17);
+ child.setChildren(Collections.singletonList(grandChild));
+ ViewInfo greatGrandChild = new ViewInfo("Button", null, 0, 0, 73, 17);
+ grandChild.setChildren(Collections.singletonList(greatGrandChild));
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, true /*layoutlib5*/).getFirst();
+ assertNotNull(rootView);
+
+ assertEquals("FrameLayout", rootView.getName());
+ assertEquals(1, rootView.getChildren().size());
+ assertSame(rootNode, rootView.getUiViewNode());
+
+ CanvasViewInfo childView = rootView.getChildren().get(0);
+ assertEquals("ListView", childView.getName());
+ assertEquals(0, childView.getChildren().size());
+ assertSame(childNode, childView.getUiViewNode());
+ }
+
/**
* Dumps out the given {@link ViewInfo} hierarchy to standard out.
* Useful during development.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManagerTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManagerTest.java
index db18762..b29f9f3 100644
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManagerTest.java
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManagerTest.java
@@ -53,7 +53,7 @@ public class SelectionManagerTest extends TestCase {
"android.widget.Button", false);
ViewInfo child2 = new ViewInfo("Button2", child2Node, 0, 20, 70, 25);
root.setChildren(Arrays.asList(child1, child2));
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, true /* layoutlib5 */).getFirst();
assertNotNull(rootView);
manager.selectMultiple(Arrays.asList(rootView, rootView.getChildren().get(0), rootView
@@ -104,7 +104,7 @@ public class SelectionManagerTest extends TestCase {
"android.widget.Button", false);
ViewInfo child2 = new ViewInfo("Button2", child2Node, 0, 20, 70, 25);
root.setChildren(Arrays.asList(child1, child2));
- CanvasViewInfo rootView = CanvasViewInfo.create(root).getFirst();
+ CanvasViewInfo rootView = CanvasViewInfo.create(root, true /* layoutlib5 */).getFirst();
assertNotNull(rootView);
manager.selectMultiple(Arrays.asList(rootView.getChildren().get(0)));
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactoryTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactoryTest.java
index 277089f..9f670cc 100755
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactoryTest.java
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactoryTest.java
@@ -48,7 +48,7 @@ public class NodeFactoryTest extends TestCase {
ViewElementDescriptor ved = new ViewElementDescriptor("xml", "com.example.MyJavaClass");
UiViewElementNode uiv = new UiViewElementNode(ved);
ViewInfo lvi = new ViewInfo("name", uiv, 10, 12, 110, 120);
- CanvasViewInfo cvi = CanvasViewInfo.create(lvi).getFirst();
+ CanvasViewInfo cvi = CanvasViewInfo.create(lvi, true /* layoutlib5 */).getFirst();
// Create a NodeProxy.
NodeProxy proxy = m.create(cvi);
@@ -95,7 +95,7 @@ public class NodeFactoryTest extends TestCase {
ViewElementDescriptor ved = new ViewElementDescriptor("xml", "com.example.MyJavaClass");
UiViewElementNode uiv = new UiViewElementNode(ved);
ViewInfo lvi = new ViewInfo("name", uiv, 10, 12, 110, 120);
- CanvasViewInfo cvi = CanvasViewInfo.create(lvi).getFirst();
+ CanvasViewInfo cvi = CanvasViewInfo.create(lvi, true /* layoutlib5 */).getFirst();
// NodeProxies are cached. Creating the same one twice returns the same proxy.
NodeProxy proxy1 = m.create(cvi);
@@ -107,7 +107,7 @@ public class NodeFactoryTest extends TestCase {
ViewElementDescriptor ved = new ViewElementDescriptor("xml", "com.example.MyJavaClass");
UiViewElementNode uiv = new UiViewElementNode(ved);
ViewInfo lvi = new ViewInfo("name", uiv, 10, 12, 110, 120);
- CanvasViewInfo cvi = CanvasViewInfo.create(lvi).getFirst();
+ CanvasViewInfo cvi = CanvasViewInfo.create(lvi, true /* layoutlib5 */).getFirst();
// NodeProxies are cached. Creating the same one twice returns the same proxy.
NodeProxy proxy1 = m.create(cvi);
diff --git a/layoutlib_api/src/com/android/ide/common/rendering/api/Capability.java b/layoutlib_api/src/com/android/ide/common/rendering/api/Capability.java
index 2f79038..6620571 100644
--- a/layoutlib_api/src/com/android/ide/common/rendering/api/Capability.java
+++ b/layoutlib_api/src/com/android/ide/common/rendering/api/Capability.java
@@ -24,7 +24,7 @@ public enum Capability {
/** Ability to render at full size, as required by the layout, and unbound by the screen */
UNBOUND_RENDERING,
/** Ability to override the background of the rendering with transparency using
- * {@link SessionParams#setCustomBackgroundColor(int)} */
+ * {@link SessionParams#setOverrideBgColor(int)} */
CUSTOM_BACKGROUND_COLOR,
/** Ability to call {@link RenderSession#render()} and {@link RenderSession#render(long)}. */
RENDER,