• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.layoutopt.uix;
18 
19 import org.w3c.dom.Node;
20 
21 import java.util.List;
22 import java.util.ArrayList;
23 
24 import com.android.layoutopt.uix.groovy.LayoutAnalysisCategory;
25 
26 /**
27  * Contains the results of a layout analysis. Instances of this class are
28  * generated by {@link com.android.layoutopt.uix.LayoutAnalyzer}.
29  *
30  * @see com.android.layoutopt.uix.LayoutAnalyzer
31  */
32 public class LayoutAnalysis {
33     /**
34      * Default layout analysis used to describe a problem with the
35      * analysis process.
36      */
37     static final LayoutAnalysis ERROR = new LayoutAnalysis("");
38     static {
39         ERROR.mAnalyzed = false;
40         ERROR.addIssue("The layout could not be analyzed. Check if you specified a valid "
41                 + "XML layout, if the specified file exists, etc.");
42     }
43 
44     private final List<Issue> mIssues = new ArrayList<Issue>();
45     private String mName;
46     private boolean mAnalyzed;
47     private Node mNode;
48 
49     /**
50      * Creates a new analysis. An analysis is always considered invalid by default.
51      *
52      * @see #validate()
53      * @see #isValid()
54      */
LayoutAnalysis(String name)55     LayoutAnalysis(String name) {
56         mName = name;
57     }
58 
59     /**
60      * Returns the name of this analysis.
61      */
getName()62     public String getName() {
63         return mName;
64     }
65 
setName(String name)66     void setName(String name) {
67         mName = name;
68     }
69 
70     /**
71      * Adds an issue to the layout analysis.
72      *
73      * @param issue The issue to add.
74      */
addIssue(Issue issue)75     public void addIssue(Issue issue) {
76         mIssues.add(issue);
77     }
78 
79     /**
80      * Adds an issue to the layout analysis.
81      *
82      * @param description Description of the issue.
83      */
addIssue(String description)84     public void addIssue(String description) {
85         mIssues.add(new Issue(mNode, description));
86     }
87 
88     /**
89      * Adds an issue to the layout analysis.
90      *
91      * @param node The node containing the issue.
92      * @param description Description of the issue.
93      */
addIssue(Node node, String description)94     public void addIssue(Node node, String description) {
95         mIssues.add(new Issue(node, description));
96     }
97 
98     /**
99      * Returns the list of issues found during the analysis.
100      *
101      * @return A non-null array of {@link com.android.layoutopt.uix.LayoutAnalysis.Issue}.
102      */
getIssues()103     public Issue[] getIssues() {
104         return mIssues.toArray(new Issue[mIssues.size()]);
105     }
106 
107     /**
108      * Indicates whether the layout was analyzed. If this method returns false,
109      * a probleme occured during the analysis (missing file, invalid document, etc.)
110      *
111      * @return True if the layout was analyzed, false otherwise.
112      */
isValid()113     public boolean isValid() {
114         return mAnalyzed;
115     }
116 
117     /**
118      * Validates the analysis. This must be call before this analysis can
119      * be considered valid. Calling this method resets the current node to null.
120      *
121      * @see #setCurrentNode(org.w3c.dom.Node)
122      */
validate()123     void validate() {
124         mAnalyzed = true;
125         mNode = null;
126     }
127 
128     /**
129      * Sets the current node to be automatically added to created issues.
130      *
131      * @param node An XML node.
132      */
setCurrentNode(Node node)133     void setCurrentNode(Node node) {
134         mNode = node;
135     }
136 
137     /**
138      * Represents an issue discovered during the analysis process.
139      * An issue provides a human-readable description as well as optional solutions.
140      */
141     public static class Issue {
142         private final String mDescription;
143         private final Node mNode;
144 
145         /**
146          * Creates a new issue with the specified description.
147          *
148          * @param description The description of the issue.
149          */
Issue(String description)150         public Issue(String description) {
151             mNode = null;
152             if (description == null) {
153                 throw new IllegalArgumentException("The description must be non-null");
154             }
155             mDescription = description;
156         }
157 
158         /**
159          * Creates a new issue with the specified description.
160          *
161          * @param node The node in which the issue was found.
162          * @param description The description of the issue.
163          */
Issue(Node node, String description)164         public Issue(Node node, String description) {
165             mNode = node;
166             if (description == null) {
167                 throw new IllegalArgumentException("The description must be non-null");
168             }
169             mDescription = description;
170         }
171 
172         /**
173          * Describes this issue to the user.
174          *
175          * @return A String describing the issue, always non-null.
176          */
getDescription()177         public String getDescription() {
178             return mDescription;
179         }
180 
181 
182         /**
183          * Returns the start line of this node.
184          *
185          * @return The start line or -1 if the line is unknown.
186          */
getStartLine()187         public int getStartLine() {
188             return LayoutAnalysisCategory.getStartLine(mNode);
189         }
190 
191         /**
192          * Returns the end line of this node.
193          *
194          * @return The end line or -1 if the line is unknown.
195          */
getEndLine()196         public int getEndLine() {
197             return LayoutAnalysisCategory.getEndLine(mNode);
198         }
199     }
200 }
201