155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/*
255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * you may not use this file except in compliance with the License.
655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * You may obtain a copy of the License at
755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * See the License for the specific language governing permissions and
1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * limitations under the License.
1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectpackage com.android.hierarchyviewer.scene;
1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.awt.Image;
2055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.util.ArrayList;
2155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.util.HashMap;
2255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.util.List;
2355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.util.Map;
2455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.util.regex.Pattern;
2555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
2655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectpublic class ViewNode {
2755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public String id;
2855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public String name;
2955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public List<Property> properties = new ArrayList<Property>();
3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public Map<String, Property> namedProperties = new HashMap<String, Property>();
3255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public ViewNode parent;
3455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public List<ViewNode> children = new ArrayList<ViewNode>();
3555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public Image image;
3755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int left;
3955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int top;
4055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int width;
4155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int height;
4255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int scrollX;
4355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int scrollY;
4455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int paddingLeft;
4555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int paddingRight;
4655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int paddingTop;
4755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int paddingBottom;
4855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int marginLeft;
4955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int marginRight;
5055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int marginTop;
5155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int marginBottom;
5255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int baseline;
5355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public boolean willNotDraw;
5455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public boolean hasMargins;
5555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
5655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    boolean hasFocus;
5755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    int index;
5855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
5955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public boolean decoded;
6055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public boolean filtered;
6155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
6255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private String shortName;
6355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private StateListener listener;
6455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
6555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    void decode() {
6655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        id = namedProperties.get("mID").value;
6755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
6855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        left = getInt("mLeft", 0);
6955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        top = getInt("mTop", 0);
7055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        width = getInt("getWidth()", 0);
7155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        height = getInt("getHeight()", 0);
7255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        scrollX = getInt("mScrollX", 0);
7355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        scrollY = getInt("mScrollY", 0);
7455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        paddingLeft = getInt("mPaddingLeft", 0);
7555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        paddingRight = getInt("mPaddingRight", 0);
7655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        paddingTop = getInt("mPaddingTop", 0);
7755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        paddingBottom = getInt("mPaddingBottom", 0);
7855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        marginLeft = getInt("layout_leftMargin", Integer.MIN_VALUE);
7955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        marginRight = getInt("layout_rightMargin", Integer.MIN_VALUE);
8055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        marginTop = getInt("layout_topMargin", Integer.MIN_VALUE);
8155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        marginBottom = getInt("layout_bottomMargin", Integer.MIN_VALUE);
8255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        baseline = getInt("getBaseline()", 0);
8355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        willNotDraw = getBoolean("willNotDraw()", false);
8455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        hasFocus = getBoolean("hasFocus()", false);
8555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        hasMargins = marginLeft != Integer.MIN_VALUE &&
8755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                marginRight != Integer.MIN_VALUE &&
8855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                marginTop != Integer.MIN_VALUE &&
8955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                marginBottom != Integer.MIN_VALUE;
9055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        decoded = true;
9255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
9355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private boolean getBoolean(String name, boolean defaultValue) {
9555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Property p = namedProperties.get(name);
9655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (p != null) {
9755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            try {
9855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return Boolean.parseBoolean(p.value);
9955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            } catch (NumberFormatException e) {
10055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return defaultValue;
10155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
10255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
10355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return defaultValue;
10455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
10555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private int getInt(String name, int defaultValue) {
10755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Property p = namedProperties.get(name);
10855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (p != null) {
10955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            try {
11055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return Integer.parseInt(p.value);
11155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            } catch (NumberFormatException e) {
11255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return defaultValue;
11355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
11455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
11555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return defaultValue;
11655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
11755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
11855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public void filter(Pattern pattern) {
11955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (pattern == null || pattern.pattern().length() == 0) {
12055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            filtered = false;
12155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else {
12255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            filtered = pattern.matcher(shortName).find() || pattern.matcher(id).find();
12355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
12455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        listener.nodeStateChanged(this);
12555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
12655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    void computeIndex() {
12855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        index = parent == null ? 0 : parent.children.indexOf(this);
12955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        listener.nodeIndexChanged(this);
13055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
13155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
13255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    void setShortName(String shortName) {
13355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        this.shortName = shortName;
13455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
13555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
13655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    void setStateListener(StateListener listener) {
13755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        this.listener = listener;
13855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
13955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
14055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @SuppressWarnings({"StringEquality"})
14155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
14255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public boolean equals(Object obj) {
14355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (obj == null) {
14455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return false;
14555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
14655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (getClass() != obj.getClass()) {
14755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return false;
14855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
14955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final ViewNode other = (ViewNode) obj;
15055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return !(this.name != other.name && (this.name == null || !this.name.equals(other.name)));
15155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
15255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
15355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
15455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public String toString() {
15555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return name;
15655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
15755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
15855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
15955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public int hashCode() {
16055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int hash = 5;
16155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        hash = 67 * hash + (this.name != null ? this.name.hashCode() : 0);
16255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return hash;
16355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
16455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
16555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static class Property {
16655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public String name;
16755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public String value;
16855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
16955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        @Override
17055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public String toString() {
17155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return name + '=' + value;
17255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
17355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
17455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        @SuppressWarnings({"StringEquality"})
17555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        @Override
17655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public boolean equals(Object obj) {
17755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (obj == null) {
17855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return false;
17955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
18055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (getClass() != obj.getClass()) {
18155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return false;
18255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
18355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            final Property other = (Property) obj;
18455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (this.name != other.name && (this.name == null || !this.name.equals(other.name))) {
18555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return false;
18655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
18755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return !(this.value != other.value && (this.value == null || !this.value.equals(other.value)));
18855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
18955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
19055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        @Override
19155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public int hashCode() {
19255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            int hash = 5;
19355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            hash = 61 * hash + (this.name != null ? this.name.hashCode() : 0);
19455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            hash = 61 * hash + (this.value != null ? this.value.hashCode() : 0);
19555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return hash;
19655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
19755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
19855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
19955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    interface StateListener {
20055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        void nodeStateChanged(ViewNode node);
20155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        void nodeIndexChanged(ViewNode node);
20255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
20355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
204