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;
27cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrickimport android.os.SystemClock;
2821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.os.SystemProperties;
2921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.provider.Settings;
30f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.util.Printer;
315b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick
32b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.PrintWriter;
33b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.StringWriter;
34f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/**
36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application error.
37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * A report has a type, which is one of
39f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <ul>
40f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash
41f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}.
42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the
43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}.
44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}.
45f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul>
46f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
47f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * @hide
48f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */
49f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
50f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable {
5121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining error report receiver for system apps
5221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps";
5321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
5421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining default error report receiver
5521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default";
5621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
57f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
58f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Uninitialized error report.
59f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
60f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_NONE = 0;
61f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
62f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
63f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application crash.
64f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
65f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_CRASH = 1;
66f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
67f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
68f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application that's not responding.
69f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
70f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_ANR = 2;
71f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
72f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
7321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * An error report about an application that's consuming too much battery.
7421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
7521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public static final int TYPE_BATTERY = 3;
7621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
7721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
78cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * A report from a user to a developer about a running service that the
79cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * user doesn't think should be running.
8014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     */
8114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    public static final int TYPE_RUNNING_SERVICE = 5;
8214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
8314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    /**
84f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Type of this report. Can be one of {@link #TYPE_NONE},
85cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, {@link #TYPE_BATTERY},
86cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * or {@link #TYPE_RUNNING_SERVICE}.
87f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
88f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int type;
89f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application.
92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String packageName;
94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application which installed the application this
97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * report pertains to.
98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * This identifies which Market the application came from.
99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String installerPackageName;
101f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
102f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Process name of the application.
104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
105f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String processName;
106f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
107f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
108f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Time at which the error occurred.
109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
110f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public long time;
111f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
112f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
113e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     * Set if the app is on the system image.
114e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     */
115e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    public boolean systemApp;
116e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski
117e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    /**
118f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_CRASH}, contains an instance
119f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of CrashInfo describing the crash; otherwise null.
120f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
121f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public CrashInfo crashInfo;
122f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
123f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
124f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_ANR}, contains an instance
125f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of AnrInfo describing the ANR; otherwise null.
126f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
127f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public AnrInfo anrInfo;
128f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
129f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
130151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * If this report is of type {@link #TYPE_BATTERY}, contains an instance
131151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * of BatteryInfo; otherwise null.
13221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
133151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public BatteryInfo batteryInfo;
134cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick
13521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
13614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     * If this report is of type {@link #TYPE_RUNNING_SERVICE}, contains an instance
13714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     * of RunningServiceInfo; otherwise null.
13814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     */
13914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    public RunningServiceInfo runningServiceInfo;
14014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
14114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    /**
142f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an uninitialized instance of {@link ApplicationErrorReport}.
143f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
144f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public ApplicationErrorReport() {
145f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
146f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
147f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
148f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an instance of {@link ApplicationErrorReport} initialized from
149f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * a parcel.
150f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
151f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    ApplicationErrorReport(Parcel in) {
15228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        readFromParcel(in);
153f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
154f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
15521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public static ComponentName getErrorReportReceiver(Context context,
15621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String packageName, int appFlags) {
15721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // check if error reporting is enabled in secure settings
15821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        int enabled = Settings.Secure.getInt(context.getContentResolver(),
15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                Settings.Secure.SEND_ACTION_APP_ERROR, 0);
16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (enabled == 0) {
16121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
16221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
16321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        PackageManager pm = context.getPackageManager();
16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // look for receiver in the installer package
16721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        String candidate = pm.getInstallerPackageName(packageName);
16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ComponentName result = getErrorReportReceiver(pm, packageName, candidate);
16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (result != null) {
17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return result;
17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if the error app is on the system image, look for system apps
17421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // error receiver
17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if ((appFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
17621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY);
17721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            result = getErrorReportReceiver(pm, packageName, candidate);
17821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (result != null) {
17921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                return result;
18021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
18121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
18221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
18321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if there is a default receiver, try that
18421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY);
18521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return getErrorReportReceiver(pm, packageName, candidate);
18621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
18721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
18821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
18921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * Return activity in receiverPackage that handles ACTION_APP_ERROR.
19021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     *
19121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param pm PackageManager isntance
19221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param errorPackage package which caused the error
19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param receiverPackage candidate package to receive the error
19421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @return activity component within receiverPackage which handles
19521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * ACTION_APP_ERROR, or null if not found
19621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
19721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static ComponentName getErrorReportReceiver(PackageManager pm, String errorPackage,
19821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String receiverPackage) {
19921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage == null || receiverPackage.length() == 0) {
20021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
20121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
20221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
20321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // break the loop if it's the error report receiver package that crashed
20421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage.equals(errorPackage)) {
20521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
20621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
20721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
20821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        Intent intent = new Intent(Intent.ACTION_APP_ERROR);
20921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        intent.setPackage(receiverPackage);
21021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ResolveInfo info = pm.resolveActivity(intent, 0);
21121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (info == null || info.activityInfo == null) {
21221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
21321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
21421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return new ComponentName(receiverPackage, info.activityInfo.name);
21521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
21621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
217f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void writeToParcel(Parcel dest, int flags) {
218f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeInt(type);
219f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(packageName);
220f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(installerPackageName);
221f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(processName);
222f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeLong(time);
223e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        dest.writeInt(systemApp ? 1 : 0);
224f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
225f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
226f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
227f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.writeToParcel(dest, flags);
228f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
229f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
230f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.writeToParcel(dest, flags);
231f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
23221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
233151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.writeToParcel(dest, flags);
23421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
23514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            case TYPE_RUNNING_SERVICE:
23614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo.writeToParcel(dest, flags);
23714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                break;
238f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
239f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
240f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
241fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski    public void readFromParcel(Parcel in) {
24228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        type = in.readInt();
24328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        packageName = in.readString();
24428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        installerPackageName = in.readString();
24528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        processName = in.readString();
24628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        time = in.readLong();
247e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        systemApp = in.readInt() == 1;
24828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
24928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        switch (type) {
25028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_CRASH:
25128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = new CrashInfo(in);
25228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = null;
253151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
25414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = null;
25528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
25628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_ANR:
25728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = new AnrInfo(in);
25828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = null;
259151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
26014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = null;
26121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
26221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
263151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = new BatteryInfo(in);
26421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                anrInfo = null;
26521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                crashInfo = null;
26614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = null;
26714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                break;
26814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            case TYPE_RUNNING_SERVICE:
26914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                batteryInfo = null;
27014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                anrInfo = null;
27114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                crashInfo = null;
27214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = new RunningServiceInfo(in);
27328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
27428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        }
27528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski    }
27628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
277f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
278f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application crash.
279f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
280f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class CrashInfo {
281f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
282f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class name of the exception that caused the crash.
283f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
284f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String exceptionClassName;
285f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
287f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         * Message stored in the exception.
288f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         */
289f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        public String exceptionMessage;
290f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski
291f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        /**
292f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * File which the exception was thrown from.
293f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
294f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwFileName;
295f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
297f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class which the exception was thrown from.
298f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
299f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwClassName;
300f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
301f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
302f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Method which the exception was thrown from.
303f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
304f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwMethodName;
305f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
306f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
3075a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         * Line number the exception was thrown from.
3085a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         */
3095a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        public int throwLineNumber;
3105a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski
3115a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        /**
312f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Stack trace.
313f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
314f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String stackTrace;
315f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
316f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
317f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of CrashInfo.
318f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
319f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo() {
320f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
321f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
322f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
323b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         * Create an instance of CrashInfo initialized from an exception.
324b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         */
325b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        public CrashInfo(Throwable tr) {
326b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StringWriter sw = new StringWriter();
327b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            tr.printStackTrace(new PrintWriter(sw));
328b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            stackTrace = sw.toString();
32960d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor            exceptionMessage = tr.getMessage();
330b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
331b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            // Populate fields with the "root cause" exception
332b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            while (tr.getCause() != null) {
333b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                tr = tr.getCause();
334b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                String msg = tr.getMessage();
335b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                if (msg != null && msg.length() > 0) {
336b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                    exceptionMessage = msg;
337b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                }
338b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            }
339b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
340b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            exceptionClassName = tr.getClass().getName();
341b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StackTraceElement trace = tr.getStackTrace()[0];
342b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwFileName = trace.getFileName();
343b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwClassName = trace.getClassName();
344b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwMethodName = trace.getMethodName();
345b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            throwLineNumber = trace.getLineNumber();
346b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        }
347b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
348b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        /**
349f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of CrashInfo initialized from a Parcel.
350f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
351f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo(Parcel in) {
352f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            exceptionClassName = in.readString();
353f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            exceptionMessage = in.readString();
354f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwFileName = in.readString();
355f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwClassName = in.readString();
356f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwMethodName = in.readString();
3575a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            throwLineNumber = in.readInt();
358f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            stackTrace = in.readString();
359f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
360f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
361f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
362f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save a CrashInfo instance to a parcel.
363f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
364f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
365f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(exceptionClassName);
366f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            dest.writeString(exceptionMessage);
367f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwFileName);
368f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwClassName);
369f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwMethodName);
3705a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            dest.writeInt(throwLineNumber);
371f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(stackTrace);
372f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
374f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump a CrashInfo instance to a Printer.
376f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
377f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
378f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "exceptionClassName: " + exceptionClassName);
379f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            pw.println(prefix + "exceptionMessage: " + exceptionMessage);
380f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwFileName: " + throwFileName);
381f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwClassName: " + throwClassName);
382f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwMethodName: " + throwMethodName);
3835a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            pw.println(prefix + "throwLineNumber: " + throwLineNumber);
384f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "stackTrace: " + stackTrace);
385f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
386f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
387f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
388f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
389f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application not responding error.
390f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
391f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class AnrInfo {
392f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
393f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Activity name.
394f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
395f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String activity;
396f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
397f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
398f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Description of the operation that timed out.
399f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
400f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String cause;
401f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
402f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
403f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Additional info, including CPU stats.
404f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
405f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String info;
406f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
407f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
408f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of AnrInfo.
409f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
410f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo() {
411f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
412f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
413f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
414f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of AnrInfo initialized from a Parcel.
415f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
416f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo(Parcel in) {
417f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            activity = in.readString();
418f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            cause = in.readString();
419f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            info = in.readString();
420f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
421f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
422f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
423f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save an AnrInfo instance to a parcel.
424f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
425f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
426f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(activity);
427f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(cause);
428f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(info);
429f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
430f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
431f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
432f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump an AnrInfo instance to a Printer.
433f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
434f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
435f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "activity: " + activity);
436f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "cause: " + cause);
437f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "info: " + info);
438f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
439f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
440f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
441151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    /**
442151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * Describes a battery usage report.
443151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     */
444151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public static class BatteryInfo {
445151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
446151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Percentage of the battery that was used up by the process.
447151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
448151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public int usagePercent;
449151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
450151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
451151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Duration in microseconds over which the process used the above
452151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * percentage of battery.
453151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
454151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public long durationMicros;
455151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
456151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
457151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump of various info impacting battery use.
458151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
459151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String usageDetails;
460151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
461151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
462151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Checkin details.
463151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
464151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String checkinDetails;
465151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
466151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
467151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an uninitialized instance of BatteryInfo.
468151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
469151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo() {
470151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
471151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
472151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
473151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an instance of BatteryInfo initialized from a Parcel.
474151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
475151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo(Parcel in) {
476151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usagePercent = in.readInt();
477151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            durationMicros = in.readLong();
478151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usageDetails = in.readString();
479151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            checkinDetails = in.readString();
480151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
481151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
482151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
483151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Save a BatteryInfo instance to a parcel.
484151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
485151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void writeToParcel(Parcel dest, int flags) {
486151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeInt(usagePercent);
487151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeLong(durationMicros);
488151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(usageDetails);
489151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(checkinDetails);
490151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
491151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
492151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
493151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump a BatteryInfo instance to a Printer.
494151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
495151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void dump(Printer pw, String prefix) {
496151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usagePercent: " + usagePercent);
497151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "durationMicros: " + durationMicros);
498151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usageDetails: " + usageDetails);
499151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "checkinDetails: " + checkinDetails);
500151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
501151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    }
502151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
50314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    /**
50414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     * Describes a running service report.
50514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     */
50614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    public static class RunningServiceInfo {
50714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
50814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Duration in milliseconds that the service has been running.
50914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
51014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public long durationMillis;
51114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
51214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
51314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Dump of debug information about the service.
51414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
51514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public String serviceDetails;
51614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
51714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
51814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Create an uninitialized instance of RunningServiceInfo.
51914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
52014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public RunningServiceInfo() {
52114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
52214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
52314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
52414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Create an instance of RunningServiceInfo initialized from a Parcel.
52514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
52614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public RunningServiceInfo(Parcel in) {
52714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            durationMillis = in.readLong();
52814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            serviceDetails = in.readString();
52914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
53014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
53114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
53214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Save a RunningServiceInfo instance to a parcel.
53314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
53414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
53514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            dest.writeLong(durationMillis);
53614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            dest.writeString(serviceDetails);
53714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
53814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
53914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
54014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Dump a BatteryInfo instance to a Printer.
54114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
54214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public void dump(Printer pw, String prefix) {
54314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            pw.println(prefix + "durationMillis: " + durationMillis);
54414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            pw.println(prefix + "serviceDetails: " + serviceDetails);
54514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
54614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    }
54714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
548f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final Parcelable.Creator<ApplicationErrorReport> CREATOR
549f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            = new Parcelable.Creator<ApplicationErrorReport>() {
550f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport createFromParcel(Parcel source) {
551f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport(source);
552f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
553f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
554f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport[] newArray(int size) {
555f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport[size];
556f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
557f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    };
558f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
559f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int describeContents() {
560f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        return 0;
561f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
562f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
563f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
564f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Dump the report to a Printer.
565f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
566f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void dump(Printer pw, String prefix) {
567f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "type: " + type);
568f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "packageName: " + packageName);
569f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "installerPackageName: " + installerPackageName);
570f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "processName: " + processName);
571f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "time: " + time);
572e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        pw.println(prefix + "systemApp: " + systemApp);
573f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
574f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
575f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
576f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.dump(pw, prefix);
577f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
578f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
579f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.dump(pw, prefix);
580f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
58121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
582151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.dump(pw, prefix);
58321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
584f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
585f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
586f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski}
587