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>
40271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}.
41f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash
42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}.
43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the
44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}.
45271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_BATTERY} user reported application is using too much
46271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * battery. Information about the battery use is stored in {@link #batteryInfo}.
47271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_RUNNING_SERVICE} user reported application is leaving an
48271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * unneeded serive running. Information about the battery use is stored in
49271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * {@link #runningServiceInfo}.
50f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul>
51f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */
52f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
53f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable {
5421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining error report receiver for system apps
5521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps";
5621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
5721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining default error report receiver
5821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default";
5921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
60f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
61f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Uninitialized error report.
62f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
63f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_NONE = 0;
64f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
65f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
66f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application crash.
67f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
68f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_CRASH = 1;
69f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
70f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
71f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application that's not responding.
72f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
73f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_ANR = 2;
74f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
75f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
7621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * An error report about an application that's consuming too much battery.
7721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
7821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public static final int TYPE_BATTERY = 3;
7921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
8021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
81cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * A report from a user to a developer about a running service that the
82cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * user doesn't think should be running.
8314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     */
8414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    public static final int TYPE_RUNNING_SERVICE = 5;
8514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
8614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    /**
87f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Type of this report. Can be one of {@link #TYPE_NONE},
88cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, {@link #TYPE_BATTERY},
89cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * or {@link #TYPE_RUNNING_SERVICE}.
90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int type;
92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application.
95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String packageName;
97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application which installed the application this
100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * report pertains to.
1014d7bc65538c7cd9fbb1fbbcf22d1da47fcee1219Dirk Dougherty     * This identifies which market the application came from.
102f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String installerPackageName;
104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
105f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
106f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Process name of the application.
107f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
108f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String processName;
109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
110f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
111f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Time at which the error occurred.
112f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
113f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public long time;
114f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
116e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     * Set if the app is on the system image.
117e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     */
118e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    public boolean systemApp;
119e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski
120e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    /**
121f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_CRASH}, contains an instance
122f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of CrashInfo describing the crash; otherwise null.
123f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
124f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public CrashInfo crashInfo;
125f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
126f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
127f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_ANR}, contains an instance
128f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of AnrInfo describing the ANR; otherwise null.
129f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
130f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public AnrInfo anrInfo;
131f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
132f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
133151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * If this report is of type {@link #TYPE_BATTERY}, contains an instance
134151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * of BatteryInfo; otherwise null.
13521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
136151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public BatteryInfo batteryInfo;
137cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick
13821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
13914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     * If this report is of type {@link #TYPE_RUNNING_SERVICE}, contains an instance
14014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     * of RunningServiceInfo; otherwise null.
14114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     */
14214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    public RunningServiceInfo runningServiceInfo;
14314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
14414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    /**
145f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an uninitialized instance of {@link ApplicationErrorReport}.
146f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
147f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public ApplicationErrorReport() {
148f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
149f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
150f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
151f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an instance of {@link ApplicationErrorReport} initialized from
152f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * a parcel.
153f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
154f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    ApplicationErrorReport(Parcel in) {
15528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        readFromParcel(in);
156f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
157f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
15821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public static ComponentName getErrorReportReceiver(Context context,
15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String packageName, int appFlags) {
16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // check if error reporting is enabled in secure settings
161625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        int enabled = Settings.Global.getInt(context.getContentResolver(),
162625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey                Settings.Global.SEND_ACTION_APP_ERROR, 0);
16321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (enabled == 0) {
16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
16721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        PackageManager pm = context.getPackageManager();
16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // look for receiver in the installer package
17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        String candidate = pm.getInstallerPackageName(packageName);
17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ComponentName result = getErrorReportReceiver(pm, packageName, candidate);
17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (result != null) {
17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return result;
17421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
17621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if the error app is on the system image, look for system apps
17721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // error receiver
17821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if ((appFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
17921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY);
18021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            result = getErrorReportReceiver(pm, packageName, candidate);
18121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (result != null) {
18221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                return result;
18321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
18421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
18521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
18621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if there is a default receiver, try that
18721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY);
18821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return getErrorReportReceiver(pm, packageName, candidate);
18921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
19087d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski
19121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
19221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * Return activity in receiverPackage that handles ACTION_APP_ERROR.
19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     *
194ae96f634eccf86ff80e339c9e9a2abbad3f2a02dMadan Ankapura     * @param pm PackageManager instance
19521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param errorPackage package which caused the error
19621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param receiverPackage candidate package to receive the error
19721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @return activity component within receiverPackage which handles
19821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * ACTION_APP_ERROR, or null if not found
19921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
20021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static ComponentName getErrorReportReceiver(PackageManager pm, String errorPackage,
20121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String receiverPackage) {
20221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage == null || receiverPackage.length() == 0) {
20321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
20421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
20521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
20621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // break the loop if it's the error report receiver package that crashed
20721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage.equals(errorPackage)) {
20821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
20921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
21021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
21121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        Intent intent = new Intent(Intent.ACTION_APP_ERROR);
21221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        intent.setPackage(receiverPackage);
21321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ResolveInfo info = pm.resolveActivity(intent, 0);
21421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (info == null || info.activityInfo == null) {
21521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
21621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
21721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return new ComponentName(receiverPackage, info.activityInfo.name);
21821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
21921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
220f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void writeToParcel(Parcel dest, int flags) {
221f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeInt(type);
222f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(packageName);
223f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(installerPackageName);
224f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(processName);
225f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeLong(time);
226e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        dest.writeInt(systemApp ? 1 : 0);
227f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
228f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
229f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
230f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.writeToParcel(dest, flags);
231f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
232f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
233f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.writeToParcel(dest, flags);
234f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
23521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
236151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.writeToParcel(dest, flags);
23721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
23814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            case TYPE_RUNNING_SERVICE:
23914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo.writeToParcel(dest, flags);
24014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                break;
241f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
242f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
243f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
244fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski    public void readFromParcel(Parcel in) {
24528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        type = in.readInt();
24628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        packageName = in.readString();
24728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        installerPackageName = in.readString();
24828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        processName = in.readString();
24928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        time = in.readLong();
250e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        systemApp = in.readInt() == 1;
25128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
25228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        switch (type) {
25328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_CRASH:
25428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = new CrashInfo(in);
25528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = null;
256151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
25714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = null;
25828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
25928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_ANR:
26028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = new AnrInfo(in);
26128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = null;
262151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
26314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = null;
26421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
26521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
266151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = new BatteryInfo(in);
26721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                anrInfo = null;
26821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                crashInfo = null;
26914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = null;
27014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                break;
27114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            case TYPE_RUNNING_SERVICE:
27214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                batteryInfo = null;
27314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                anrInfo = null;
27414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                crashInfo = null;
27514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = new RunningServiceInfo(in);
27628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
27728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        }
27828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski    }
27928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
280f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
281f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application crash.
282f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
283f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class CrashInfo {
284f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
285f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class name of the exception that caused the crash.
286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
287f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String exceptionClassName;
288f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
289f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
290f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         * Message stored in the exception.
291f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         */
292f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        public String exceptionMessage;
293f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski
294f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        /**
295f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * File which the exception was thrown from.
296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
297f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwFileName;
298f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
299f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
300f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class which the exception was thrown from.
301f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
302f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwClassName;
303f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
304f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
305f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Method which the exception was thrown from.
306f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
307f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwMethodName;
308f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
309f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
3105a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         * Line number the exception was thrown from.
3115a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         */
3125a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        public int throwLineNumber;
3135a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski
3145a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        /**
315f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Stack trace.
316f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
317f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String stackTrace;
318f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
319f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
320f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of CrashInfo.
321f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
322f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo() {
323f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
324f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
325f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
326b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         * Create an instance of CrashInfo initialized from an exception.
327b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         */
328b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        public CrashInfo(Throwable tr) {
329b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StringWriter sw = new StringWriter();
330b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            tr.printStackTrace(new PrintWriter(sw));
331b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            stackTrace = sw.toString();
33260d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor            exceptionMessage = tr.getMessage();
333b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
334b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            // Populate fields with the "root cause" exception
3358e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            Throwable rootTr = tr;
336b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            while (tr.getCause() != null) {
337b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                tr = tr.getCause();
3388e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                if (tr.getStackTrace() != null && tr.getStackTrace().length > 0) {
3398e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                    rootTr = tr;
3408e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                }
341b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                String msg = tr.getMessage();
342b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                if (msg != null && msg.length() > 0) {
343b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                    exceptionMessage = msg;
344b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                }
345b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            }
346b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
3478e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            exceptionClassName = rootTr.getClass().getName();
3488e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            if (rootTr.getStackTrace().length > 0) {
3498e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                StackTraceElement trace = rootTr.getStackTrace()[0];
3508e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwFileName = trace.getFileName();
3518e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwClassName = trace.getClassName();
3528e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwMethodName = trace.getMethodName();
3538e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwLineNumber = trace.getLineNumber();
3548e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            } else {
3558e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwFileName = "unknown";
3568e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwClassName = "unknown";
3578e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwMethodName = "unknown";
3588e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwLineNumber = 0;
3598e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            }
360b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        }
361b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
362b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        /**
363f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of CrashInfo initialized from a Parcel.
364f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
365f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo(Parcel in) {
366f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            exceptionClassName = in.readString();
367f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            exceptionMessage = in.readString();
368f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwFileName = in.readString();
369f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwClassName = in.readString();
370f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwMethodName = in.readString();
3715a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            throwLineNumber = in.readInt();
372f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            stackTrace = in.readString();
373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
374f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
376f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save a CrashInfo instance to a parcel.
377f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
378f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(exceptionClassName);
380f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            dest.writeString(exceptionMessage);
381f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwFileName);
382f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwClassName);
383f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwMethodName);
3845a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            dest.writeInt(throwLineNumber);
385f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(stackTrace);
386f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
387f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
388f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
389f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump a CrashInfo instance to a Printer.
390f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
391f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
392f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "exceptionClassName: " + exceptionClassName);
393f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            pw.println(prefix + "exceptionMessage: " + exceptionMessage);
394f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwFileName: " + throwFileName);
395f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwClassName: " + throwClassName);
396f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwMethodName: " + throwMethodName);
3975a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            pw.println(prefix + "throwLineNumber: " + throwLineNumber);
398f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "stackTrace: " + stackTrace);
399f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
400f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
401f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
402f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
403f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application not responding error.
404f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
405f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class AnrInfo {
406f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
407f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Activity name.
408f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
409f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String activity;
410f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
411f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
412f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Description of the operation that timed out.
413f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
414f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String cause;
415f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
416f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
417f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Additional info, including CPU stats.
418f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
419f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String info;
420f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
421f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
422f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of AnrInfo.
423f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
424f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo() {
425f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
426f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
427f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
428f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of AnrInfo initialized from a Parcel.
429f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
430f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo(Parcel in) {
431f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            activity = in.readString();
432f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            cause = in.readString();
433f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            info = in.readString();
434f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
435f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
436f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
437f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save an AnrInfo instance to a parcel.
438f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
439f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
440f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(activity);
441f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(cause);
442f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(info);
443f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
444f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
445f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
446f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump an AnrInfo instance to a Printer.
447f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
448f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
449f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "activity: " + activity);
450f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "cause: " + cause);
451f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "info: " + info);
452f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
453f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
454f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
455151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    /**
456151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * Describes a battery usage report.
457151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     */
458151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public static class BatteryInfo {
459151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
460151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Percentage of the battery that was used up by the process.
461151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
462151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public int usagePercent;
463151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
464151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
465151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Duration in microseconds over which the process used the above
466151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * percentage of battery.
467151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
468151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public long durationMicros;
469151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
470151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
471151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump of various info impacting battery use.
472151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
473151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String usageDetails;
474151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
475151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
476151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Checkin details.
477151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
478151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String checkinDetails;
479151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
480151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
481151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an uninitialized instance of BatteryInfo.
482151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
483151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo() {
484151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
485151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
486151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
487151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an instance of BatteryInfo initialized from a Parcel.
488151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
489151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo(Parcel in) {
490151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usagePercent = in.readInt();
491151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            durationMicros = in.readLong();
492151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usageDetails = in.readString();
493151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            checkinDetails = in.readString();
494151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
495151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
496151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
497151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Save a BatteryInfo instance to a parcel.
498151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
499151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void writeToParcel(Parcel dest, int flags) {
500151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeInt(usagePercent);
501151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeLong(durationMicros);
502151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(usageDetails);
503151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(checkinDetails);
504151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
505151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
506151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
507151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump a BatteryInfo instance to a Printer.
508151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
509151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void dump(Printer pw, String prefix) {
510151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usagePercent: " + usagePercent);
511151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "durationMicros: " + durationMicros);
512151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usageDetails: " + usageDetails);
513151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "checkinDetails: " + checkinDetails);
514151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
515151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    }
516151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
51714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    /**
51814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     * Describes a running service report.
51914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     */
52014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    public static class RunningServiceInfo {
52114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
52214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Duration in milliseconds that the service has been running.
52314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
52414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public long durationMillis;
52514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
52614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
52714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Dump of debug information about the service.
52814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
52914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public String serviceDetails;
53014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
53114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
53214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Create an uninitialized instance of RunningServiceInfo.
53314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
53414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public RunningServiceInfo() {
53514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
53614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
53714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
53814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Create an instance of RunningServiceInfo initialized from a Parcel.
53914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
54014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public RunningServiceInfo(Parcel in) {
54114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            durationMillis = in.readLong();
54214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            serviceDetails = in.readString();
54314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
54414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
54514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
54614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Save a RunningServiceInfo instance to a parcel.
54714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
54814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
54914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            dest.writeLong(durationMillis);
55014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            dest.writeString(serviceDetails);
55114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
55214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
55314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
55414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Dump a BatteryInfo instance to a Printer.
55514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
55614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public void dump(Printer pw, String prefix) {
55714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            pw.println(prefix + "durationMillis: " + durationMillis);
55814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            pw.println(prefix + "serviceDetails: " + serviceDetails);
55914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
56014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    }
56114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
562f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final Parcelable.Creator<ApplicationErrorReport> CREATOR
563f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            = new Parcelable.Creator<ApplicationErrorReport>() {
564f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport createFromParcel(Parcel source) {
565f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport(source);
566f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
567f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
568f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport[] newArray(int size) {
569f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport[size];
570f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
571f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    };
572f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
573f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int describeContents() {
574f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        return 0;
575f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
576f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
577f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
578f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Dump the report to a Printer.
579f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
580f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void dump(Printer pw, String prefix) {
581f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "type: " + type);
582f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "packageName: " + packageName);
583f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "installerPackageName: " + installerPackageName);
584f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "processName: " + processName);
585f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "time: " + time);
586e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        pw.println(prefix + "systemApp: " + systemApp);
587f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
588f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
589f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
590f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.dump(pw, prefix);
591f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
592f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
593f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.dump(pw, prefix);
594f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
59521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
596151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.dump(pw, prefix);
59721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
59887d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski            case TYPE_RUNNING_SERVICE:
59987d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski                runningServiceInfo.dump(pw, prefix);
60087d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski                break;
601f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
602f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
603f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski}
604