ApplicationErrorReport.java revision e0ee6efb1e5bc6cf219555e333635ce98531bc85
1f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/*
2f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Copyright (C) 2008 The Android Open Source Project
3f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
4f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Licensed under the Apache License, Version 2.0 (the "License");
5f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * you may not use this file except in compliance with the License.
6f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * You may obtain a copy of the License at
7f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
8f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *      http://www.apache.org/licenses/LICENSE-2.0
9f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
10f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Unless required by applicable law or agreed to in writing, software
11f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * distributed under the License is distributed on an "AS IS" BASIS,
12f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * See the License for the specific language governing permissions and
14f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * limitations under the License.
15f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */
16f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
17f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipackage android.app;
18f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
19f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.os.Parcel;
20f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.os.Parcelable;
21f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.util.Printer;
22b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.PrintWriter;
23b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.StringWriter;
24f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
25f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/**
26f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application error.
27f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
28f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * A report has a type, which is one of
29f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <ul>
30f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash
31f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}.
32f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the
33f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}.
34f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}.
35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul>
36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * @hide
38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */
39f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
40f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable {
41f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Uninitialized error report.
43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_NONE = 0;
45f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
46f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
47f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application crash.
48f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
49f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_CRASH = 1;
50f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
51f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
52f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application that's not responding.
53f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
54f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_ANR = 2;
55f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
56f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
57f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Type of this report. Can be one of {@link #TYPE_NONE},
58f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * {@link #TYPE_CRASH} or {@link #TYPE_ANR}.
59f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
60f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int type;
61f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
62f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
63f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application.
64f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
65f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String packageName;
66f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
67f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
68f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application which installed the application this
69f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * report pertains to.
70f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * This identifies which Market the application came from.
71f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
72f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String installerPackageName;
73f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
74f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
75f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Process name of the application.
76f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
77f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String processName;
78f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
79f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
80f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Time at which the error occurred.
81f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
82f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public long time;
83f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
84f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
85e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     * Set if the app is on the system image.
86e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     */
87e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    public boolean systemApp;
88e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski
89e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    /**
90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_CRASH}, contains an instance
91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of CrashInfo describing the crash; otherwise null.
92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public CrashInfo crashInfo;
94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_ANR}, contains an instance
97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of AnrInfo describing the ANR; otherwise null.
98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public AnrInfo anrInfo;
100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
101f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
102f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an uninitialized instance of {@link ApplicationErrorReport}.
103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public ApplicationErrorReport() {
105f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
106f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
107f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
108f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an instance of {@link ApplicationErrorReport} initialized from
109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * a parcel.
110f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
111f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    ApplicationErrorReport(Parcel in) {
11228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        readFromParcel(in);
113f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
114f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void writeToParcel(Parcel dest, int flags) {
116f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeInt(type);
117f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(packageName);
118f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(installerPackageName);
119f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(processName);
120f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeLong(time);
121e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        dest.writeInt(systemApp ? 1 : 0);
122f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
123f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
124f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
125f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.writeToParcel(dest, flags);
126f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
127f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
128f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.writeToParcel(dest, flags);
129f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
130f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
131f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
132f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
133fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski    public void readFromParcel(Parcel in) {
13428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        type = in.readInt();
13528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        packageName = in.readString();
13628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        installerPackageName = in.readString();
13728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        processName = in.readString();
13828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        time = in.readLong();
139e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        systemApp = in.readInt() == 1;
14028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
14128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        switch (type) {
14228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_CRASH:
14328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = new CrashInfo(in);
14428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = null;
14528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
14628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_ANR:
14728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = new AnrInfo(in);
14828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = null;
14928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
15028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        }
15128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski    }
15228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
153f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
154f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application crash.
155f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
156f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class CrashInfo {
157f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
158f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class name of the exception that caused the crash.
159f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
160f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String exceptionClassName;
161f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
162f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
163f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         * Message stored in the exception.
164f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         */
165f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        public String exceptionMessage;
166f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski
167f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        /**
168f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * File which the exception was thrown from.
169f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
170f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwFileName;
171f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
172f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
173f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class which the exception was thrown from.
174f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
175f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwClassName;
176f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
177f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
178f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Method which the exception was thrown from.
179f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
180f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwMethodName;
181f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
182f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
1835a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         * Line number the exception was thrown from.
1845a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         */
1855a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        public int throwLineNumber;
1865a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski
1875a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        /**
188f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Stack trace.
189f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
190f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String stackTrace;
191f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
192f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
193f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of CrashInfo.
194f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
195f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo() {
196f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
197f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
198f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
199b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         * Create an instance of CrashInfo initialized from an exception.
200b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         */
201b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        public CrashInfo(Throwable tr) {
202b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StringWriter sw = new StringWriter();
203b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            tr.printStackTrace(new PrintWriter(sw));
204b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            stackTrace = sw.toString();
20560d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor            exceptionMessage = tr.getMessage();
206b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
207b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            // Populate fields with the "root cause" exception
208b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            while (tr.getCause() != null) {
209b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                tr = tr.getCause();
210b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                String msg = tr.getMessage();
211b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                if (msg != null && msg.length() > 0) {
212b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                    exceptionMessage = msg;
213b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                }
214b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            }
215b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
216b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            exceptionClassName = tr.getClass().getName();
217b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StackTraceElement trace = tr.getStackTrace()[0];
218b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwFileName = trace.getFileName();
219b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwClassName = trace.getClassName();
220b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwMethodName = trace.getMethodName();
221b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwLineNumber = trace.getLineNumber();
222b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        }
223b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
224b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        /**
225f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of CrashInfo initialized from a Parcel.
226f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
227f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo(Parcel in) {
228f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            exceptionClassName = in.readString();
229f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            exceptionMessage = in.readString();
230f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwFileName = in.readString();
231f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwClassName = in.readString();
232f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwMethodName = in.readString();
2335a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            throwLineNumber = in.readInt();
234f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            stackTrace = in.readString();
235f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
236f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
237f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
238f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save a CrashInfo instance to a parcel.
239f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
240f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
241f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(exceptionClassName);
242f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            dest.writeString(exceptionMessage);
243f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwFileName);
244f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwClassName);
245f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwMethodName);
2465a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            dest.writeInt(throwLineNumber);
247f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(stackTrace);
248f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
249f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
250f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
251f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump a CrashInfo instance to a Printer.
252f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
253f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
254f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "exceptionClassName: " + exceptionClassName);
255f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            pw.println(prefix + "exceptionMessage: " + exceptionMessage);
256f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwFileName: " + throwFileName);
257f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwClassName: " + throwClassName);
258f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwMethodName: " + throwMethodName);
2595a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            pw.println(prefix + "throwLineNumber: " + throwLineNumber);
260f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "stackTrace: " + stackTrace);
261f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
262f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
263f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
264f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
265f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application not responding error.
266f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
267f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class AnrInfo {
268f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
269f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Activity name.
270f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
271f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String activity;
272f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
273f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
274f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Description of the operation that timed out.
275f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
276f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String cause;
277f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
278f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
279f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Additional info, including CPU stats.
280f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
281f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String info;
282f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
283f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
284f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of AnrInfo.
285f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo() {
287f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
288f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
289f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
290f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of AnrInfo initialized from a Parcel.
291f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
292f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo(Parcel in) {
293f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            activity = in.readString();
294f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            cause = in.readString();
295f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            info = in.readString();
296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
297f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
298f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
299f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save an AnrInfo instance to a parcel.
300f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
301f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
302f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(activity);
303f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(cause);
304f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(info);
305f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
306f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
307f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
308f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump an AnrInfo instance to a Printer.
309f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
310f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
311f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "activity: " + activity);
312f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "cause: " + cause);
313f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "info: " + info);
314f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
315f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
316f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
317f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final Parcelable.Creator<ApplicationErrorReport> CREATOR
318f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            = new Parcelable.Creator<ApplicationErrorReport>() {
319f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport createFromParcel(Parcel source) {
320f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport(source);
321f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
322f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
323f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport[] newArray(int size) {
324f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport[size];
325f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
326f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    };
327f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
328f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int describeContents() {
329f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        return 0;
330f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
331f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
332f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
333f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Dump the report to a Printer.
334f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
335f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void dump(Printer pw, String prefix) {
336f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "type: " + type);
337f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "packageName: " + packageName);
338f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "installerPackageName: " + installerPackageName);
339f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "processName: " + processName);
340f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "time: " + time);
341e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        pw.println(prefix + "systemApp: " + systemApp);
342f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
343f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
344f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
345f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.dump(pw, prefix);
346f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
347f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
348f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.dump(pw, prefix);
349f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
350f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
351f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
352f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski}
353