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