ApplicationErrorReport.java revision 5b747191ff8ad43a54d41faf50436271d1d7fcc8
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
1921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.ComponentName;
2021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.Context;
2121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.Intent;
2221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.pm.ApplicationInfo;
2321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.pm.PackageManager;
2421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.pm.ResolveInfo;
25f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.os.Parcel;
26f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.os.Parcelable;
2721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.os.SystemProperties;
2821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.provider.Settings;
29f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.util.Printer;
305b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick
31b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.PrintWriter;
32b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.StringWriter;
33f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
34f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/**
35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application error.
36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * A report has a type, which is one of
38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <ul>
39f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash
40f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}.
41f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the
42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}.
43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}.
44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul>
45f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
46f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * @hide
47f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */
48f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
49f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable {
5021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining error report receiver for system apps
5121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps";
5221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
5321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining default error report receiver
5421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default";
5521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
56f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
57f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Uninitialized error report.
58f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
59f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_NONE = 0;
60f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
61f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
62f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application crash.
63f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
64f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_CRASH = 1;
65f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
66f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
67f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application that's not responding.
68f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
69f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_ANR = 2;
70f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
71f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
7221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * An error report about an application that's consuming too much battery.
7321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
7421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public static final int TYPE_BATTERY = 3;
7521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
7621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
7746d42387464a651268648659e91d022566d4844cBrad Fitzpatrick     * An error report about a StrictMode violation.
7846d42387464a651268648659e91d022566d4844cBrad Fitzpatrick     */
7946d42387464a651268648659e91d022566d4844cBrad Fitzpatrick    public static final int TYPE_STRICT_MODE_VIOLATION = 4;
8046d42387464a651268648659e91d022566d4844cBrad Fitzpatrick
8146d42387464a651268648659e91d022566d4844cBrad Fitzpatrick    /**
82f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Type of this report. Can be one of {@link #TYPE_NONE},
8321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, or {@link #TYPE_BATTERY}.
84f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
85f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int type;
86f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
87f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
88f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application.
89f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String packageName;
91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application which installed the application this
94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * report pertains to.
95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * This identifies which Market the application came from.
96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String installerPackageName;
98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Process name of the application.
101f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
102f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String processName;
103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
105f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Time at which the error occurred.
106f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
107f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public long time;
108f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
110e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     * Set if the app is on the system image.
111e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     */
112e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    public boolean systemApp;
113e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski
114e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    /**
115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_CRASH}, contains an instance
116f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of CrashInfo describing the crash; otherwise null.
117f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
118f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public CrashInfo crashInfo;
119f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
120f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
121f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_ANR}, contains an instance
122f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of AnrInfo describing the ANR; otherwise null.
123f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
124f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public AnrInfo anrInfo;
125f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
126f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
127151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * If this report is of type {@link #TYPE_BATTERY}, contains an instance
128151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * of BatteryInfo; otherwise null.
12921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
130151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public BatteryInfo batteryInfo;
13121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
13221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
133f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an uninitialized instance of {@link ApplicationErrorReport}.
134f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
135f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public ApplicationErrorReport() {
136f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
137f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
138f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
139f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an instance of {@link ApplicationErrorReport} initialized from
140f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * a parcel.
141f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
142f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    ApplicationErrorReport(Parcel in) {
14328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        readFromParcel(in);
144f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
145f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
14621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public static ComponentName getErrorReportReceiver(Context context,
14721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String packageName, int appFlags) {
14821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // check if error reporting is enabled in secure settings
14921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        int enabled = Settings.Secure.getInt(context.getContentResolver(),
15021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                Settings.Secure.SEND_ACTION_APP_ERROR, 0);
15121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (enabled == 0) {
15221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
15321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
15421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
15521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        PackageManager pm = context.getPackageManager();
15621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
15721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // look for receiver in the installer package
15821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        String candidate = pm.getInstallerPackageName(packageName);
15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ComponentName result = getErrorReportReceiver(pm, packageName, candidate);
16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (result != null) {
16121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return result;
16221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
16321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if the error app is on the system image, look for system apps
16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // error receiver
16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if ((appFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
16721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY);
16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            result = getErrorReportReceiver(pm, packageName, candidate);
16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (result != null) {
17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                return result;
17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
17421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if there is a default receiver, try that
17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY);
17621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return getErrorReportReceiver(pm, packageName, candidate);
17721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
17821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
17921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
18021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * Return activity in receiverPackage that handles ACTION_APP_ERROR.
18121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     *
18221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param pm PackageManager isntance
18321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param errorPackage package which caused the error
18421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param receiverPackage candidate package to receive the error
18521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @return activity component within receiverPackage which handles
18621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * ACTION_APP_ERROR, or null if not found
18721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
18821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static ComponentName getErrorReportReceiver(PackageManager pm, String errorPackage,
18921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String receiverPackage) {
19021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage == null || receiverPackage.length() == 0) {
19121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
19221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
19421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // break the loop if it's the error report receiver package that crashed
19521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage.equals(errorPackage)) {
19621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
19721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
19821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
19921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        Intent intent = new Intent(Intent.ACTION_APP_ERROR);
20021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        intent.setPackage(receiverPackage);
20121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ResolveInfo info = pm.resolveActivity(intent, 0);
20221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (info == null || info.activityInfo == null) {
20321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
20421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
20521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return new ComponentName(receiverPackage, info.activityInfo.name);
20621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
20721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
208f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void writeToParcel(Parcel dest, int flags) {
209f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeInt(type);
210f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(packageName);
211f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(installerPackageName);
212f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(processName);
213f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeLong(time);
214e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        dest.writeInt(systemApp ? 1 : 0);
215f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
216f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
217f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
218f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.writeToParcel(dest, flags);
219f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
220f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
221f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.writeToParcel(dest, flags);
222f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
22321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
224151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.writeToParcel(dest, flags);
22521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
226f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
227f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
228f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
229fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski    public void readFromParcel(Parcel in) {
23028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        type = in.readInt();
23128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        packageName = in.readString();
23228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        installerPackageName = in.readString();
23328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        processName = in.readString();
23428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        time = in.readLong();
235e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        systemApp = in.readInt() == 1;
23628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
23728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        switch (type) {
23828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_CRASH:
23928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = new CrashInfo(in);
24028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = null;
241151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
24228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
24328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_ANR:
24428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = new AnrInfo(in);
24528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = null;
246151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
24721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
24821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
249151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = new BatteryInfo(in);
25021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                anrInfo = null;
25121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                crashInfo = null;
25228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
25328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        }
25428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski    }
25528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
256f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
257f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application crash.
258143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick     *
259143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick     * <p>This is also used to marshal around stack traces of ANRs and
260143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick     * StrictMode violations which aren't necessarily crashes, but have
261143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick     * a lot in common.
262f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
263f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class CrashInfo {
264f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
265f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class name of the exception that caused the crash.
266f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
267f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String exceptionClassName;
268f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
269f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
270f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         * Message stored in the exception.
271f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         */
272f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        public String exceptionMessage;
273f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski
274f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        /**
275f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * File which the exception was thrown from.
276f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
277f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwFileName;
278f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
279f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
280f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class which the exception was thrown from.
281f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
282f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwClassName;
283f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
284f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
285f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Method which the exception was thrown from.
286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
287f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwMethodName;
288f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
289f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
2905a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         * Line number the exception was thrown from.
2915a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         */
2925a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        public int throwLineNumber;
2935a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski
2945a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        /**
295f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Stack trace.
296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
297f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String stackTrace;
298f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
299f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
300143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick         * For StrictMode violations, the wall time duration of the
301143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick         * violation, when known.
302143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick         */
303143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick        public long durationMillis = -1;
304143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick
305143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick        /**
306f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of CrashInfo.
307f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
308f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo() {
309f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
310f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
311f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
312b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         * Create an instance of CrashInfo initialized from an exception.
313b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         */
314b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        public CrashInfo(Throwable tr) {
315b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StringWriter sw = new StringWriter();
316b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            tr.printStackTrace(new PrintWriter(sw));
317b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            stackTrace = sw.toString();
31860d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor            exceptionMessage = tr.getMessage();
319b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
320b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            // Populate fields with the "root cause" exception
321b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            while (tr.getCause() != null) {
322b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                tr = tr.getCause();
323b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                String msg = tr.getMessage();
324b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                if (msg != null && msg.length() > 0) {
325b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                    exceptionMessage = msg;
326b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                }
327b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            }
328b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
329b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            exceptionClassName = tr.getClass().getName();
330b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StackTraceElement trace = tr.getStackTrace()[0];
331b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwFileName = trace.getFileName();
332b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwClassName = trace.getClassName();
333b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwMethodName = trace.getMethodName();
334b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwLineNumber = trace.getLineNumber();
335b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        }
336b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
337b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        /**
338f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of CrashInfo initialized from a Parcel.
339f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
340f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo(Parcel in) {
341f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            exceptionClassName = in.readString();
342f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            exceptionMessage = in.readString();
343f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwFileName = in.readString();
344f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwClassName = in.readString();
345f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwMethodName = in.readString();
3465a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            throwLineNumber = in.readInt();
347f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            stackTrace = in.readString();
348143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick            durationMillis = in.readLong();
349f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
350f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
351f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
352f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save a CrashInfo instance to a parcel.
353f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
354f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
355f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(exceptionClassName);
356f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            dest.writeString(exceptionMessage);
357f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwFileName);
358f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwClassName);
359f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwMethodName);
3605a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            dest.writeInt(throwLineNumber);
361f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(stackTrace);
362143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick            dest.writeLong(durationMillis);
363f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
364f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
365f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
366f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump a CrashInfo instance to a Printer.
367f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
368f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
369f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "exceptionClassName: " + exceptionClassName);
370f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            pw.println(prefix + "exceptionMessage: " + exceptionMessage);
371f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwFileName: " + throwFileName);
372f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwClassName: " + throwClassName);
373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwMethodName: " + throwMethodName);
3745a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            pw.println(prefix + "throwLineNumber: " + throwLineNumber);
375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "stackTrace: " + stackTrace);
376143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick            if (durationMillis != -1) {
377143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick                pw.println(prefix + "durationMillis: " + durationMillis);
378143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick            }
379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
380f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
381f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
382f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
383f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application not responding error.
384f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
385f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class AnrInfo {
386f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
387f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Activity name.
388f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
389f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String activity;
390f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
391f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
392f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Description of the operation that timed out.
393f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
394f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String cause;
395f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
396f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
397f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Additional info, including CPU stats.
398f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
399f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String info;
400f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
401f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
402f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of AnrInfo.
403f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
404f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo() {
405f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
406f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
407f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
408f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of AnrInfo initialized from a Parcel.
409f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
410f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo(Parcel in) {
411f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            activity = in.readString();
412f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            cause = in.readString();
413f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            info = in.readString();
414f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
415f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
416f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
417f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save an AnrInfo instance to a parcel.
418f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
419f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
420f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(activity);
421f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(cause);
422f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(info);
423f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
424f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
425f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
426f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump an AnrInfo instance to a Printer.
427f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
428f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
429f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "activity: " + activity);
430f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "cause: " + cause);
431f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "info: " + info);
432f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
433f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
434f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
435151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    /**
436151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * Describes a battery usage report.
437151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     */
438151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public static class BatteryInfo {
439151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
440151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Percentage of the battery that was used up by the process.
441151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
442151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public int usagePercent;
443151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
444151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
445151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Duration in microseconds over which the process used the above
446151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * percentage of battery.
447151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
448151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public long durationMicros;
449151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
450151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
451151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump of various info impacting battery use.
452151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
453151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String usageDetails;
454151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
455151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
456151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Checkin details.
457151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
458151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String checkinDetails;
459151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
460151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
461151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an uninitialized instance of BatteryInfo.
462151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
463151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo() {
464151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
465151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
466151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
467151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an instance of BatteryInfo initialized from a Parcel.
468151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
469151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo(Parcel in) {
470151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usagePercent = in.readInt();
471151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            durationMicros = in.readLong();
472151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usageDetails = in.readString();
473151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            checkinDetails = in.readString();
474151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
475151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
476151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
477151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Save a BatteryInfo instance to a parcel.
478151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
479151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void writeToParcel(Parcel dest, int flags) {
480151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeInt(usagePercent);
481151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeLong(durationMicros);
482151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(usageDetails);
483151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(checkinDetails);
484151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
485151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
486151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
487151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump a BatteryInfo instance to a Printer.
488151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
489151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void dump(Printer pw, String prefix) {
490151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usagePercent: " + usagePercent);
491151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "durationMicros: " + durationMicros);
492151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usageDetails: " + usageDetails);
493151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "checkinDetails: " + checkinDetails);
494151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
495151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    }
496151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
497f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final Parcelable.Creator<ApplicationErrorReport> CREATOR
498f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            = new Parcelable.Creator<ApplicationErrorReport>() {
499f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport createFromParcel(Parcel source) {
500f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport(source);
501f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
502f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
503f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport[] newArray(int size) {
504f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport[size];
505f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
506f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    };
507f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
508f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int describeContents() {
509f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        return 0;
510f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
511f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
512f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
513f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Dump the report to a Printer.
514f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
515f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void dump(Printer pw, String prefix) {
516f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "type: " + type);
517f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "packageName: " + packageName);
518f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "installerPackageName: " + installerPackageName);
519f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "processName: " + processName);
520f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "time: " + time);
521e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        pw.println(prefix + "systemApp: " + systemApp);
522f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
523f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
524f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
525f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.dump(pw, prefix);
526f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
527f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
528f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.dump(pw, prefix);
529f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
53021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
531151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.dump(pw, prefix);
53221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
533f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
534f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
535f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski}
536