ApplicationErrorReport.java revision ae96f634eccf86ff80e339c9e9a2abbad3f2a02d
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;
30b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.PrintWriter;
31b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.StringWriter;
32f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
33f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/**
34f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application error.
35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * A report has a type, which is one of
37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <ul>
38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash
39f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}.
40f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the
41f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}.
42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}.
43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul>
44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
45f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * @hide
46f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */
47f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
48f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable {
4921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining error report receiver for system apps
5021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps";
5121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
5221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining default error report receiver
5321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default";
5421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
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    /**
77f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Type of this report. Can be one of {@link #TYPE_NONE},
7821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, or {@link #TYPE_BATTERY}.
79f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
80f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int type;
81f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
82f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
83f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application.
84f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
85f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String packageName;
86f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
87f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
88f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application which installed the application this
89f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * report pertains to.
90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * This identifies which Market the application came from.
91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String installerPackageName;
93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Process name of the application.
96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String processName;
98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Time at which the error occurred.
101f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
102f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public long time;
103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
105e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     * Set if the app is on the system image.
106e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     */
107e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    public boolean systemApp;
108e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski
109e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    /**
110f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_CRASH}, contains an instance
111f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of CrashInfo describing the crash; otherwise null.
112f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
113f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public CrashInfo crashInfo;
114f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
116f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_ANR}, contains an instance
117f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of AnrInfo describing the ANR; otherwise null.
118f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
119f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public AnrInfo anrInfo;
120f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
121f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
122151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * If this report is of type {@link #TYPE_BATTERY}, contains an instance
123151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * of BatteryInfo; otherwise null.
12421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
125151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public BatteryInfo batteryInfo;
12621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
12721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
128f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an uninitialized instance of {@link ApplicationErrorReport}.
129f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
130f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public ApplicationErrorReport() {
131f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
132f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
133f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
134f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an instance of {@link ApplicationErrorReport} initialized from
135f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * a parcel.
136f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
137f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    ApplicationErrorReport(Parcel in) {
13828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        readFromParcel(in);
139f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
140f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
14121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public static ComponentName getErrorReportReceiver(Context context,
14221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String packageName, int appFlags) {
14321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // check if error reporting is enabled in secure settings
14421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        int enabled = Settings.Secure.getInt(context.getContentResolver(),
14521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                Settings.Secure.SEND_ACTION_APP_ERROR, 0);
14621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (enabled == 0) {
14721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
14821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
14921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
15021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        PackageManager pm = context.getPackageManager();
15121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
15221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // look for receiver in the installer package
15321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        String candidate = pm.getInstallerPackageName(packageName);
15421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ComponentName result = getErrorReportReceiver(pm, packageName, candidate);
15521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (result != null) {
15621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return result;
15721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
15821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if the error app is on the system image, look for system apps
16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // error receiver
16121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if ((appFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
16221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY);
16321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            result = getErrorReportReceiver(pm, packageName, candidate);
16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (result != null) {
16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                return result;
16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
16721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if there is a default receiver, try that
17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY);
17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return getErrorReportReceiver(pm, packageName, candidate);
17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
17421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * Return activity in receiverPackage that handles ACTION_APP_ERROR.
17621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     *
177ae96f634eccf86ff80e339c9e9a2abbad3f2a02dMadan Ankapura     * @param pm PackageManager instance
17821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param errorPackage package which caused the error
17921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param receiverPackage candidate package to receive the error
18021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @return activity component within receiverPackage which handles
18121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * ACTION_APP_ERROR, or null if not found
18221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
18321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static ComponentName getErrorReportReceiver(PackageManager pm, String errorPackage,
18421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String receiverPackage) {
18521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage == null || receiverPackage.length() == 0) {
18621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
18721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
18821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
18921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // break the loop if it's the error report receiver package that crashed
19021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage.equals(errorPackage)) {
19121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
19221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
19421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        Intent intent = new Intent(Intent.ACTION_APP_ERROR);
19521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        intent.setPackage(receiverPackage);
19621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ResolveInfo info = pm.resolveActivity(intent, 0);
19721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (info == null || info.activityInfo == null) {
19821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
19921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
20021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return new ComponentName(receiverPackage, info.activityInfo.name);
20121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
20221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
203f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void writeToParcel(Parcel dest, int flags) {
204f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeInt(type);
205f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(packageName);
206f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(installerPackageName);
207f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(processName);
208f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeLong(time);
209e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        dest.writeInt(systemApp ? 1 : 0);
210f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
211f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
212f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
213f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.writeToParcel(dest, flags);
214f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
215f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
216f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.writeToParcel(dest, flags);
217f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
21821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
219151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.writeToParcel(dest, flags);
22021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
221f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
222f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
223f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
224fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski    public void readFromParcel(Parcel in) {
22528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        type = in.readInt();
22628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        packageName = in.readString();
22728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        installerPackageName = in.readString();
22828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        processName = in.readString();
22928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        time = in.readLong();
230e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        systemApp = in.readInt() == 1;
23128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
23228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        switch (type) {
23328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_CRASH:
23428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = new CrashInfo(in);
23528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = null;
236151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
23728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
23828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_ANR:
23928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = new AnrInfo(in);
24028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = null;
241151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
24221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
24321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
244151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = new BatteryInfo(in);
24521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                anrInfo = null;
24621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                crashInfo = null;
24728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
24828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        }
24928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski    }
25028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
251f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
252f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application crash.
253f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
254f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class CrashInfo {
255f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
256f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class name of the exception that caused the crash.
257f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
258f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String exceptionClassName;
259f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
260f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
261f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         * Message stored in the exception.
262f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         */
263f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        public String exceptionMessage;
264f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski
265f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        /**
266f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * File which the exception was thrown from.
267f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
268f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwFileName;
269f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
270f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
271f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class which the exception was thrown from.
272f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
273f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwClassName;
274f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
275f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
276f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Method which the exception was thrown from.
277f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
278f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwMethodName;
279f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
280f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
2815a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         * Line number the exception was thrown from.
2825a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         */
2835a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        public int throwLineNumber;
2845a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski
2855a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        /**
286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Stack trace.
287f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
288f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String stackTrace;
289f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
290f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
291f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of CrashInfo.
292f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
293f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo() {
294f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
295f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
297b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         * Create an instance of CrashInfo initialized from an exception.
298b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         */
299b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        public CrashInfo(Throwable tr) {
300b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StringWriter sw = new StringWriter();
301b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            tr.printStackTrace(new PrintWriter(sw));
302b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            stackTrace = sw.toString();
30360d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor            exceptionMessage = tr.getMessage();
304b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
305b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            // Populate fields with the "root cause" exception
306b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            while (tr.getCause() != null) {
307b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                tr = tr.getCause();
308b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                String msg = tr.getMessage();
309b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                if (msg != null && msg.length() > 0) {
310b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                    exceptionMessage = msg;
311b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                }
312b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            }
313b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
314b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            exceptionClassName = tr.getClass().getName();
315b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StackTraceElement trace = tr.getStackTrace()[0];
316b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwFileName = trace.getFileName();
317b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwClassName = trace.getClassName();
318b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwMethodName = trace.getMethodName();
319b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwLineNumber = trace.getLineNumber();
320b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        }
321b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
322b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        /**
323f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of CrashInfo initialized from a Parcel.
324f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
325f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo(Parcel in) {
326f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            exceptionClassName = in.readString();
327f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            exceptionMessage = in.readString();
328f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwFileName = in.readString();
329f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwClassName = in.readString();
330f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwMethodName = in.readString();
3315a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            throwLineNumber = in.readInt();
332f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            stackTrace = in.readString();
333f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
334f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
335f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
336f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save a CrashInfo instance to a parcel.
337f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
338f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
339f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(exceptionClassName);
340f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            dest.writeString(exceptionMessage);
341f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwFileName);
342f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwClassName);
343f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwMethodName);
3445a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            dest.writeInt(throwLineNumber);
345f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(stackTrace);
346f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
347f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
348f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
349f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump a CrashInfo instance to a Printer.
350f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
351f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
352f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "exceptionClassName: " + exceptionClassName);
353f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            pw.println(prefix + "exceptionMessage: " + exceptionMessage);
354f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwFileName: " + throwFileName);
355f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwClassName: " + throwClassName);
356f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwMethodName: " + throwMethodName);
3575a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            pw.println(prefix + "throwLineNumber: " + throwLineNumber);
358f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "stackTrace: " + stackTrace);
359f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
360f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
361f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
362f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
363f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application not responding error.
364f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
365f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class AnrInfo {
366f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
367f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Activity name.
368f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
369f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String activity;
370f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
371f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
372f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Description of the operation that timed out.
373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
374f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String cause;
375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
376f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
377f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Additional info, including CPU stats.
378f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String info;
380f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
381f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
382f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of AnrInfo.
383f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
384f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo() {
385f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
386f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
387f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
388f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of AnrInfo initialized from a Parcel.
389f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
390f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo(Parcel in) {
391f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            activity = in.readString();
392f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            cause = in.readString();
393f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            info = in.readString();
394f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
395f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
396f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
397f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save an AnrInfo instance to a parcel.
398f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
399f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
400f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(activity);
401f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(cause);
402f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(info);
403f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
404f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
405f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
406f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump an AnrInfo instance to a Printer.
407f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
408f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
409f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "activity: " + activity);
410f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "cause: " + cause);
411f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "info: " + info);
412f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
413f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
414f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
415151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    /**
416151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * Describes a battery usage report.
417151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     */
418151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public static class BatteryInfo {
419151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
420151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Percentage of the battery that was used up by the process.
421151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
422151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public int usagePercent;
423151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
424151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
425151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Duration in microseconds over which the process used the above
426151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * percentage of battery.
427151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
428151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public long durationMicros;
429151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
430151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
431151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump of various info impacting battery use.
432151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
433151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String usageDetails;
434151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
435151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
436151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Checkin details.
437151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
438151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String checkinDetails;
439151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
440151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
441151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an uninitialized instance of BatteryInfo.
442151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
443151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo() {
444151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
445151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
446151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
447151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an instance of BatteryInfo initialized from a Parcel.
448151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
449151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo(Parcel in) {
450151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usagePercent = in.readInt();
451151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            durationMicros = in.readLong();
452151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usageDetails = in.readString();
453151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            checkinDetails = in.readString();
454151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
455151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
456151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
457151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Save a BatteryInfo instance to a parcel.
458151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
459151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void writeToParcel(Parcel dest, int flags) {
460151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeInt(usagePercent);
461151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeLong(durationMicros);
462151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(usageDetails);
463151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(checkinDetails);
464151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
465151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
466151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
467151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump a BatteryInfo instance to a Printer.
468151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
469151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void dump(Printer pw, String prefix) {
470151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usagePercent: " + usagePercent);
471151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "durationMicros: " + durationMicros);
472151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usageDetails: " + usageDetails);
473151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "checkinDetails: " + checkinDetails);
474151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
475151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    }
476151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
477f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final Parcelable.Creator<ApplicationErrorReport> CREATOR
478f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            = new Parcelable.Creator<ApplicationErrorReport>() {
479f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport createFromParcel(Parcel source) {
480f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport(source);
481f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
482f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
483f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport[] newArray(int size) {
484f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport[size];
485f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
486f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    };
487f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
488f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int describeContents() {
489f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        return 0;
490f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
491f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
492f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
493f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Dump the report to a Printer.
494f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
495f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void dump(Printer pw, String prefix) {
496f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "type: " + type);
497f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "packageName: " + packageName);
498f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "installerPackageName: " + installerPackageName);
499f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "processName: " + processName);
500f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "time: " + time);
501e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        pw.println(prefix + "systemApp: " + systemApp);
502f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
503f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
504f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
505f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.dump(pw, prefix);
506f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
507f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
508f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.dump(pw, prefix);
509f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
51021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
511151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.dump(pw, prefix);
51221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
513f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
514f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
515f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski}
516