1f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/*
2f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Copyright (C) 2008 The Android Open Source Project
3f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
4f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Licensed under the Apache License, Version 2.0 (the "License");
5f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * you may not use this file except in compliance with the License.
6f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * You may obtain a copy of the License at
7f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
8f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *      http://www.apache.org/licenses/LICENSE-2.0
9f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
10f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Unless required by applicable law or agreed to in writing, software
11f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * distributed under the License is distributed on an "AS IS" BASIS,
12f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * See the License for the specific language governing permissions and
14f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * limitations under the License.
15f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */
16f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
17f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipackage android.app;
18f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
1921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.ComponentName;
2021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.Context;
2121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.Intent;
2221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.pm.ApplicationInfo;
2321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.pm.PackageManager;
2421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.pm.ResolveInfo;
25f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.os.Parcel;
26f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.os.Parcelable;
2721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.os.SystemProperties;
2821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.provider.Settings;
29f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.util.Printer;
3073d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackbornimport android.util.Slog;
318c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackbornimport com.android.internal.util.FastPrintWriter;
325b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick
33b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.PrintWriter;
34b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.StringWriter;
35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/**
37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application error.
38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski *
39f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * A report has a type, which is one of
40f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <ul>
41271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}.
42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash
43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}.
44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the
45f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}.
46271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_BATTERY} user reported application is using too much
47271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * battery. Information about the battery use is stored in {@link #batteryInfo}.
48271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_RUNNING_SERVICE} user reported application is leaving an
49271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * unneeded serive running. Information about the battery use is stored in
50271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * {@link #runningServiceInfo}.
51f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul>
52f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */
53f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
54f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable {
5521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining error report receiver for system apps
5621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps";
5721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
5821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    // System property defining default error report receiver
5921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default";
6021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
61f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
62f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Uninitialized error report.
63f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
64f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_NONE = 0;
65f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
66f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
67f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application crash.
68f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
69f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_CRASH = 1;
70f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
71f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
72f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * An error report about an application that's not responding.
73f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
74f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final int TYPE_ANR = 2;
75f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
76f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
7721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * An error report about an application that's consuming too much battery.
7821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
7921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public static final int TYPE_BATTERY = 3;
8021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
8121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
82cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * A report from a user to a developer about a running service that the
83cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * user doesn't think should be running.
8414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     */
8514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    public static final int TYPE_RUNNING_SERVICE = 5;
8614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
8714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    /**
88f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Type of this report. Can be one of {@link #TYPE_NONE},
89cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, {@link #TYPE_BATTERY},
90cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick     * or {@link #TYPE_RUNNING_SERVICE}.
91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int type;
93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application.
96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String packageName;
98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Package name of the application which installed the application this
101f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * report pertains to.
1024d7bc65538c7cd9fbb1fbbcf22d1da47fcee1219Dirk Dougherty     * This identifies which market the application came from.
103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String installerPackageName;
105f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
106f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
107f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Process name of the application.
108f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public String processName;
110f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
111f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
112f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Time at which the error occurred.
113f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
114f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public long time;
115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
116f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
117e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     * Set if the app is on the system image.
118e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski     */
119e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    public boolean systemApp;
120e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski
121e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski    /**
122f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_CRASH}, contains an instance
123f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of CrashInfo describing the crash; otherwise null.
124f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
125f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public CrashInfo crashInfo;
126f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
127f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
128f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * If this report is of type {@link #TYPE_ANR}, contains an instance
129f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * of AnrInfo describing the ANR; otherwise null.
130f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
131f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public AnrInfo anrInfo;
132f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
133f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
134151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * If this report is of type {@link #TYPE_BATTERY}, contains an instance
135151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * of BatteryInfo; otherwise null.
13621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
137151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public BatteryInfo batteryInfo;
138cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick
13921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
14014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     * If this report is of type {@link #TYPE_RUNNING_SERVICE}, contains an instance
14114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     * of RunningServiceInfo; otherwise null.
14214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     */
14314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    public RunningServiceInfo runningServiceInfo;
14414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
14514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    /**
146f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an uninitialized instance of {@link ApplicationErrorReport}.
147f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
148f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public ApplicationErrorReport() {
149f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
150f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
151f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
152f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Create an instance of {@link ApplicationErrorReport} initialized from
153f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * a parcel.
154f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
155f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    ApplicationErrorReport(Parcel in) {
15628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        readFromParcel(in);
157f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
158f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public static ComponentName getErrorReportReceiver(Context context,
16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String packageName, int appFlags) {
16121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // check if error reporting is enabled in secure settings
162625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        int enabled = Settings.Global.getInt(context.getContentResolver(),
163625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey                Settings.Global.SEND_ACTION_APP_ERROR, 0);
16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (enabled == 0) {
16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
16721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        PackageManager pm = context.getPackageManager();
16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // look for receiver in the installer package
17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        String candidate = pm.getInstallerPackageName(packageName);
17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ComponentName result = getErrorReportReceiver(pm, packageName, candidate);
17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (result != null) {
17421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return result;
17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
17621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
17721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if the error app is on the system image, look for system apps
17821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // error receiver
17921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if ((appFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
18021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY);
18121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            result = getErrorReportReceiver(pm, packageName, candidate);
18221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (result != null) {
18321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                return result;
18421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
18521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
18621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
18721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // if there is a default receiver, try that
18821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY);
18921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return getErrorReportReceiver(pm, packageName, candidate);
19021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
19187d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski
19221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    /**
19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * Return activity in receiverPackage that handles ACTION_APP_ERROR.
19421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     *
195ae96f634eccf86ff80e339c9e9a2abbad3f2a02dMadan Ankapura     * @param pm PackageManager instance
19621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param errorPackage package which caused the error
19721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @param receiverPackage candidate package to receive the error
19821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * @return activity component within receiverPackage which handles
19921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     * ACTION_APP_ERROR, or null if not found
20021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn     */
20121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    static ComponentName getErrorReportReceiver(PackageManager pm, String errorPackage,
20221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            String receiverPackage) {
20321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage == null || receiverPackage.length() == 0) {
20421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
20521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
20621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
20721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        // break the loop if it's the error report receiver package that crashed
20821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (receiverPackage.equals(errorPackage)) {
20921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
21021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
21121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
21221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        Intent intent = new Intent(Intent.ACTION_APP_ERROR);
21321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        intent.setPackage(receiverPackage);
21421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        ResolveInfo info = pm.resolveActivity(intent, 0);
21521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (info == null || info.activityInfo == null) {
21621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return null;
21721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
21821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        return new ComponentName(receiverPackage, info.activityInfo.name);
21921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
22021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
221f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void writeToParcel(Parcel dest, int flags) {
222f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeInt(type);
223f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(packageName);
224f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(installerPackageName);
225f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeString(processName);
226f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        dest.writeLong(time);
227e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        dest.writeInt(systemApp ? 1 : 0);
228f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
229f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
230f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
231f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.writeToParcel(dest, flags);
232f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
233f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
234f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.writeToParcel(dest, flags);
235f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
23621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
237151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.writeToParcel(dest, flags);
23821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
23914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            case TYPE_RUNNING_SERVICE:
24014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo.writeToParcel(dest, flags);
24114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                break;
242f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
243f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
244f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
245fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski    public void readFromParcel(Parcel in) {
24628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        type = in.readInt();
24728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        packageName = in.readString();
24828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        installerPackageName = in.readString();
24928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        processName = in.readString();
25028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        time = in.readLong();
251e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        systemApp = in.readInt() == 1;
25228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
25328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        switch (type) {
25428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_CRASH:
25528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = new CrashInfo(in);
25628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = null;
257151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
25814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = null;
25928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
26028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski            case TYPE_ANR:
26128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                anrInfo = new AnrInfo(in);
26228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                crashInfo = null;
263151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = null;
26414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = null;
26521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
26621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
267151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo = new BatteryInfo(in);
26821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                anrInfo = null;
26921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                crashInfo = null;
27014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = null;
27114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                break;
27214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            case TYPE_RUNNING_SERVICE:
27314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                batteryInfo = null;
27414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                anrInfo = null;
27514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                crashInfo = null;
27614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn                runningServiceInfo = new RunningServiceInfo(in);
27728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski                break;
27828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski        }
27928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski    }
28028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski
281f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
282f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application crash.
283f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
284f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class CrashInfo {
285f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class name of the exception that caused the crash.
287f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
288f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String exceptionClassName;
289f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
290f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
291f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         * Message stored in the exception.
292f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski         */
293f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        public String exceptionMessage;
294f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski
295f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski        /**
296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * File which the exception was thrown from.
297f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
298f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwFileName;
299f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
300f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
301f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Class which the exception was thrown from.
302f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
303f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwClassName;
304f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
305f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
306f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Method which the exception was thrown from.
307f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
308f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String throwMethodName;
309f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
310f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
3115a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         * Line number the exception was thrown from.
3125a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski         */
3135a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        public int throwLineNumber;
3145a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski
3155a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski        /**
316f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Stack trace.
317f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
318f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String stackTrace;
319f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
320f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
321f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of CrashInfo.
322f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
323f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo() {
324f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
325f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
326f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
327b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         * Create an instance of CrashInfo initialized from an exception.
328b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor         */
329b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        public CrashInfo(Throwable tr) {
330b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            StringWriter sw = new StringWriter();
3318c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn            PrintWriter pw = new FastPrintWriter(sw, false, 256);
3328c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn            tr.printStackTrace(pw);
3338c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn            pw.flush();
334b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            stackTrace = sw.toString();
33560d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor            exceptionMessage = tr.getMessage();
336b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
337b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            // Populate fields with the "root cause" exception
3388e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            Throwable rootTr = tr;
339b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            while (tr.getCause() != null) {
340b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                tr = tr.getCause();
3418e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                if (tr.getStackTrace() != null && tr.getStackTrace().length > 0) {
3428e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                    rootTr = tr;
3438e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                }
344b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                String msg = tr.getMessage();
345b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                if (msg != null && msg.length() > 0) {
346b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                    exceptionMessage = msg;
347b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor                }
348b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor            }
349b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
3508e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            exceptionClassName = rootTr.getClass().getName();
3518e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            if (rootTr.getStackTrace().length > 0) {
3528e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                StackTraceElement trace = rootTr.getStackTrace()[0];
3538e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwFileName = trace.getFileName();
3548e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwClassName = trace.getClassName();
3558e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwMethodName = trace.getMethodName();
3568e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwLineNumber = trace.getLineNumber();
3578e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            } else {
3588e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwFileName = "unknown";
3598e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwClassName = "unknown";
3608e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwMethodName = "unknown";
3618e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                throwLineNumber = 0;
3628e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            }
363b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        }
364b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor
365b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor        /**
366f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of CrashInfo initialized from a Parcel.
367f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
368f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public CrashInfo(Parcel in) {
369f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            exceptionClassName = in.readString();
370f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            exceptionMessage = in.readString();
371f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwFileName = in.readString();
372f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwClassName = in.readString();
373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            throwMethodName = in.readString();
3745a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            throwLineNumber = in.readInt();
375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            stackTrace = in.readString();
376f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
377f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
378f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save a CrashInfo instance to a parcel.
380f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
381f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
38273d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn            int start = dest.dataPosition();
383f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(exceptionClassName);
384f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            dest.writeString(exceptionMessage);
385f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwFileName);
386f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwClassName);
387f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(throwMethodName);
3885a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            dest.writeInt(throwLineNumber);
389f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(stackTrace);
39073d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn            int total = dest.dataPosition()-start;
391f85e7af4d009862fc799c7232ec5cf9e2dc9fa34Dianne Hackborn            if (total > 20*1024) {
39273d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn                Slog.d("Error", "ERR: exClass=" + exceptionClassName);
39373d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn                Slog.d("Error", "ERR: exMsg=" + exceptionMessage);
39473d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn                Slog.d("Error", "ERR: file=" + throwFileName);
39573d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn                Slog.d("Error", "ERR: class=" + throwClassName);
39673d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn                Slog.d("Error", "ERR: method=" + throwMethodName + " line=" + throwLineNumber);
39773d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn                Slog.d("Error", "ERR: stack=" + stackTrace);
39873d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn                Slog.d("Error", "ERR: TOTAL BYTES WRITTEN: " + (dest.dataPosition()-start));
39973d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn            }
400f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
401f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
402f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
403f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump a CrashInfo instance to a Printer.
404f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
405f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
406f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "exceptionClassName: " + exceptionClassName);
407f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski            pw.println(prefix + "exceptionMessage: " + exceptionMessage);
408f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwFileName: " + throwFileName);
409f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwClassName: " + throwClassName);
410f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "throwMethodName: " + throwMethodName);
4115a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski            pw.println(prefix + "throwLineNumber: " + throwLineNumber);
412f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "stackTrace: " + stackTrace);
413f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
414f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
415f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
416f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
417f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Describes an application not responding error.
418f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
419f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static class AnrInfo {
420f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
421f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Activity name.
422f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
423f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String activity;
424f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
425f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
426f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Description of the operation that timed out.
427f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
428f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String cause;
429f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
430f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
431f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Additional info, including CPU stats.
432f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
433f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public String info;
434f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
435f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
436f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an uninitialized instance of AnrInfo.
437f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
438f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo() {
439f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
440f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
441f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
442f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Create an instance of AnrInfo initialized from a Parcel.
443f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
444f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public AnrInfo(Parcel in) {
445f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            activity = in.readString();
446f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            cause = in.readString();
447f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            info = in.readString();
448f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
449f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
450f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
451f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Save an AnrInfo instance to a parcel.
452f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
453f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void writeToParcel(Parcel dest, int flags) {
454f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(activity);
455f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(cause);
456f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            dest.writeString(info);
457f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
458f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
459f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        /**
460f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         * Dump an AnrInfo instance to a Printer.
461f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski         */
462f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public void dump(Printer pw, String prefix) {
463f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "activity: " + activity);
464f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "cause: " + cause);
465f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            pw.println(prefix + "info: " + info);
466f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
467f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
468f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
469151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    /**
470151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     * Describes a battery usage report.
471151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski     */
472151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    public static class BatteryInfo {
473151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
474151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Percentage of the battery that was used up by the process.
475151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
476151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public int usagePercent;
477151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
478151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
479151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Duration in microseconds over which the process used the above
480151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * percentage of battery.
481151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
482151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public long durationMicros;
483151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
484151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
485151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump of various info impacting battery use.
486151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
487151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String usageDetails;
488151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
489151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
490151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Checkin details.
491151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
492151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public String checkinDetails;
493151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
494151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
495151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an uninitialized instance of BatteryInfo.
496151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
497151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo() {
498151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
499151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
500151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
501151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Create an instance of BatteryInfo initialized from a Parcel.
502151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
503151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public BatteryInfo(Parcel in) {
504151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usagePercent = in.readInt();
505151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            durationMicros = in.readLong();
506151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            usageDetails = in.readString();
507151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            checkinDetails = in.readString();
508151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
509151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
510151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
511151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Save a BatteryInfo instance to a parcel.
512151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
513151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void writeToParcel(Parcel dest, int flags) {
514151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeInt(usagePercent);
515151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeLong(durationMicros);
516151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(usageDetails);
517151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            dest.writeString(checkinDetails);
518151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
519151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
520151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        /**
521151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         * Dump a BatteryInfo instance to a Printer.
522151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski         */
523151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        public void dump(Printer pw, String prefix) {
524151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usagePercent: " + usagePercent);
525151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "durationMicros: " + durationMicros);
526151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "usageDetails: " + usageDetails);
527151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski            pw.println(prefix + "checkinDetails: " + checkinDetails);
528151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski        }
529151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski    }
530151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski
53114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    /**
53214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     * Describes a running service report.
53314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn     */
53414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    public static class RunningServiceInfo {
53514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
53614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Duration in milliseconds that the service has been running.
53714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
53814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public long durationMillis;
53914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
54014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
54114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Dump of debug information about the service.
54214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
54314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public String serviceDetails;
54414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
54514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
54614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Create an uninitialized instance of RunningServiceInfo.
54714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
54814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public RunningServiceInfo() {
54914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
55014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
55114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
55214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Create an instance of RunningServiceInfo initialized from a Parcel.
55314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
55414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public RunningServiceInfo(Parcel in) {
55514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            durationMillis = in.readLong();
55614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            serviceDetails = in.readString();
55714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
55814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
55914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
56014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Save a RunningServiceInfo instance to a parcel.
56114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
56214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
56314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            dest.writeLong(durationMillis);
56414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            dest.writeString(serviceDetails);
56514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
56614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
56714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        /**
56814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         * Dump a BatteryInfo instance to a Printer.
56914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn         */
57014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        public void dump(Printer pw, String prefix) {
57114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            pw.println(prefix + "durationMillis: " + durationMillis);
57214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn            pw.println(prefix + "serviceDetails: " + serviceDetails);
57314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn        }
57414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn    }
57514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn
576f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public static final Parcelable.Creator<ApplicationErrorReport> CREATOR
577f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            = new Parcelable.Creator<ApplicationErrorReport>() {
578f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport createFromParcel(Parcel source) {
579f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport(source);
580f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
581f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
582f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        public ApplicationErrorReport[] newArray(int size) {
583f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return new ApplicationErrorReport[size];
584f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
585f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    };
586f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
587f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public int describeContents() {
588f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        return 0;
589f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
590f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
591f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    /**
592f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     * Dump the report to a Printer.
593f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski     */
594f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    public void dump(Printer pw, String prefix) {
595f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "type: " + type);
596f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "packageName: " + packageName);
597f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "installerPackageName: " + installerPackageName);
598f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "processName: " + processName);
599f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        pw.println(prefix + "time: " + time);
600e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski        pw.println(prefix + "systemApp: " + systemApp);
601f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
602f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        switch (type) {
603f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_CRASH:
604f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                crashInfo.dump(pw, prefix);
605f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
606f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            case TYPE_ANR:
607f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                anrInfo.dump(pw, prefix);
608f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                break;
60921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            case TYPE_BATTERY:
610151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski                batteryInfo.dump(pw, prefix);
61121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                break;
61287d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski            case TYPE_RUNNING_SERVICE:
61387d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski                runningServiceInfo.dump(pw, prefix);
61487d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski                break;
615f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
616f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski    }
617f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski}
618