• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2005 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 android.os;
18 
19 import android.annotation.SystemApi;
20 import android.annotation.TestApi;
21 import android.content.Intent;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 import android.util.IntArray;
25 
26 import java.util.ArrayList;
27 
28 /**
29  * The arguments for an incident report.
30  * {@hide}
31  */
32 @SystemApi
33 @TestApi
34 public final class IncidentReportArgs implements Parcelable {
35 
36     private final IntArray mSections = new IntArray();
37     private final ArrayList<byte[]> mHeaders = new ArrayList<byte[]>();
38     private boolean mAll;
39 
40     /**
41      * Construct an incident report args with no fields.
42      */
IncidentReportArgs()43     public IncidentReportArgs() {
44     }
45 
46     /**
47      * Construct an incdent report args from the given parcel.
48      */
IncidentReportArgs(Parcel in)49     public IncidentReportArgs(Parcel in) {
50         readFromParcel(in);
51     }
52 
describeContents()53     public int describeContents() {
54         return 0;
55     }
56 
writeToParcel(Parcel out, int flags)57     public void writeToParcel(Parcel out, int flags) {
58         out.writeInt(mAll ? 1 : 0);
59 
60         int N = mSections.size();
61         out.writeInt(N);
62         for (int i=0; i<N; i++) {
63             out.writeInt(mSections.get(i));
64         }
65 
66         N = mHeaders.size();
67         out.writeInt(N);
68         for (int i=0; i<N; i++) {
69             out.writeByteArray(mHeaders.get(i));
70         }
71     }
72 
readFromParcel(Parcel in)73     public void readFromParcel(Parcel in) {
74         mAll = in.readInt() != 0;
75 
76         mSections.clear();
77         int N = in.readInt();
78         for (int i=0; i<N; i++) {
79             mSections.add(in.readInt());
80         }
81 
82         mHeaders.clear();
83         N = in.readInt();
84         for (int i=0; i<N; i++) {
85             mHeaders.add(in.createByteArray());
86         }
87     }
88 
89     public static final Parcelable.Creator<IncidentReportArgs> CREATOR
90             = new Parcelable.Creator<IncidentReportArgs>() {
91         public IncidentReportArgs createFromParcel(Parcel in) {
92             return new IncidentReportArgs(in);
93         }
94 
95         public IncidentReportArgs[] newArray(int size) {
96             return new IncidentReportArgs[size];
97         }
98     };
99 
100     /**
101      * Print this report as a string.
102      */
toString()103     public String toString() {
104         final StringBuilder sb = new StringBuilder("Incident(");
105         if (mAll) {
106             sb.append("all");
107         } else {
108             final int N = mSections.size();
109             if (N > 0) {
110                 sb.append(mSections.get(0));
111             }
112             for (int i=1; i<N; i++) {
113                 sb.append(" ");
114                 sb.append(mSections.get(i));
115             }
116         }
117         sb.append(", ");
118         sb.append(mHeaders.size());
119         sb.append(" headers)");
120         return sb.toString();
121     }
122 
123     /**
124      * Set this incident report to include all fields.
125      */
setAll(boolean all)126     public void setAll(boolean all) {
127         mAll = all;
128         if (all) {
129             mSections.clear();
130         }
131     }
132 
133     /**
134      * Add this section to the incident report.
135      */
addSection(int section)136     public void addSection(int section) {
137         if (!mAll) {
138             mSections.add(section);
139         }
140     }
141 
142     /**
143      * Returns whether the incident report will include all fields.
144      */
isAll()145     public boolean isAll() {
146         return mAll;
147     }
148 
149     /**
150      * Returns whether this section will be included in the incident report.
151      */
containsSection(int section)152     public boolean containsSection(int section) {
153         return mAll || mSections.indexOf(section) >= 0;
154     }
155 
sectionCount()156     public int sectionCount() {
157         return mSections.size();
158     }
159 
addHeader(byte[] header)160     public void addHeader(byte[] header) {
161         mHeaders.add(header);
162     }
163 
164     /**
165      * Parses an incident report config as described in the system setting.
166      *
167      * @see IncidentManager#reportIncident
168      */
parseSetting(String setting)169     public static IncidentReportArgs parseSetting(String setting)
170             throws IllegalArgumentException {
171         if (setting == null || setting.length() == 0) {
172             return null;
173         }
174         setting = setting.trim();
175         if (setting.length() == 0 || "disabled".equals(setting)) {
176             return null;
177         }
178 
179         final IncidentReportArgs args = new IncidentReportArgs();
180 
181         if ("all".equals(setting)) {
182             args.setAll(true);
183             return args;
184         } else if ("none".equals(setting)) {
185             return args;
186         }
187 
188         final String[] splits = setting.split(",");
189         final int N = splits.length;
190         for (int i=0; i<N; i++) {
191             final String str = splits[i].trim();
192             if (str.length() == 0) {
193                 continue;
194             }
195             int section;
196             try {
197                 section = Integer.parseInt(str);
198             } catch (NumberFormatException ex) {
199                 throw new IllegalArgumentException("Malformed setting. Bad integer at section"
200                         + " index " + i + ": section='" + str + "' setting='" + setting + "'");
201             }
202             if (section < 1) {
203                 throw new IllegalArgumentException("Malformed setting. Illegal section at"
204                         + " index " + i + ": section='" + str + "' setting='" + setting + "'");
205             }
206             args.addSection(section);
207         }
208 
209         return args;
210     }
211 }
212 
213