ApplicationErrorReport.java revision 5b747191ff8ad43a54d41faf50436271d1d7fcc8
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; 305b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 31b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.PrintWriter; 32b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.StringWriter; 33f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 34f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/** 35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application error. 36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * 37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * A report has a type, which is one of 38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <ul> 39f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash 40f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}. 41f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the 42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}. 43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}. 44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul> 45f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * 46f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * @hide 47f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 48f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 49f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable { 5021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // System property defining error report receiver for system apps 5121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps"; 5221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 5321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // System property defining default error report receiver 5421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default"; 5521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 56f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 57f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Uninitialized error report. 58f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 59f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final int TYPE_NONE = 0; 60f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 61f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 62f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * An error report about an application crash. 63f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 64f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final int TYPE_CRASH = 1; 65f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 66f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 67f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * An error report about an application that's not responding. 68f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 69f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final int TYPE_ANR = 2; 70f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 71f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 7221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * An error report about an application that's consuming too much battery. 7321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 7421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public static final int TYPE_BATTERY = 3; 7521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 7621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 7746d42387464a651268648659e91d022566d4844cBrad Fitzpatrick * An error report about a StrictMode violation. 7846d42387464a651268648659e91d022566d4844cBrad Fitzpatrick */ 7946d42387464a651268648659e91d022566d4844cBrad Fitzpatrick public static final int TYPE_STRICT_MODE_VIOLATION = 4; 8046d42387464a651268648659e91d022566d4844cBrad Fitzpatrick 8146d42387464a651268648659e91d022566d4844cBrad Fitzpatrick /** 82f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Type of this report. Can be one of {@link #TYPE_NONE}, 8321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, or {@link #TYPE_BATTERY}. 84f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 85f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public int type; 86f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 87f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 88f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Package name of the application. 89f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String packageName; 91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Package name of the application which installed the application this 94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * report pertains to. 95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * This identifies which Market the application came from. 96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String installerPackageName; 98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Process name of the application. 101f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 102f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String processName; 103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 105f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Time at which the error occurred. 106f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 107f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public long time; 108f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 110e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski * Set if the app is on the system image. 111e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski */ 112e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski public boolean systemApp; 113e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski 114e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski /** 115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * If this report is of type {@link #TYPE_CRASH}, contains an instance 116f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * of CrashInfo describing the crash; otherwise null. 117f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 118f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo crashInfo; 119f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 120f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 121f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * If this report is of type {@link #TYPE_ANR}, contains an instance 122f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * of AnrInfo describing the ANR; otherwise null. 123f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 124f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo anrInfo; 125f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 126f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 127151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * If this report is of type {@link #TYPE_BATTERY}, contains an instance 128151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * of BatteryInfo; otherwise null. 12921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 130151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo batteryInfo; 13121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 13221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 133f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of {@link ApplicationErrorReport}. 134f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 135f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport() { 136f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 137f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 138f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 139f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of {@link ApplicationErrorReport} initialized from 140f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * a parcel. 141f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 142f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski ApplicationErrorReport(Parcel in) { 14328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski readFromParcel(in); 144f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 145f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 14621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public static ComponentName getErrorReportReceiver(Context context, 14721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String packageName, int appFlags) { 14821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // check if error reporting is enabled in secure settings 14921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn int enabled = Settings.Secure.getInt(context.getContentResolver(), 15021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Settings.Secure.SEND_ACTION_APP_ERROR, 0); 15121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (enabled == 0) { 15221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 15321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 15421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 15521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn PackageManager pm = context.getPackageManager(); 15621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 15721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // look for receiver in the installer package 15821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String candidate = pm.getInstallerPackageName(packageName); 15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn ComponentName result = getErrorReportReceiver(pm, packageName, candidate); 16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (result != null) { 16121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return result; 16221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 16321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // if the error app is on the system image, look for system apps 16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // error receiver 16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if ((appFlags&ApplicationInfo.FLAG_SYSTEM) != 0) { 16721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY); 16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn result = getErrorReportReceiver(pm, packageName, candidate); 16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (result != null) { 17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return result; 17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 17421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // if there is a default receiver, try that 17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY); 17621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return getErrorReportReceiver(pm, packageName, candidate); 17721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 17821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 17921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 18021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * Return activity in receiverPackage that handles ACTION_APP_ERROR. 18121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * 18221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @param pm PackageManager isntance 18321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @param errorPackage package which caused the error 18421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @param receiverPackage candidate package to receive the error 18521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @return activity component within receiverPackage which handles 18621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * ACTION_APP_ERROR, or null if not found 18721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 18821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static ComponentName getErrorReportReceiver(PackageManager pm, String errorPackage, 18921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String receiverPackage) { 19021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (receiverPackage == null || receiverPackage.length() == 0) { 19121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 19221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 19421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // break the loop if it's the error report receiver package that crashed 19521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (receiverPackage.equals(errorPackage)) { 19621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 19721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 19821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 19921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Intent intent = new Intent(Intent.ACTION_APP_ERROR); 20021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn intent.setPackage(receiverPackage); 20121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn ResolveInfo info = pm.resolveActivity(intent, 0); 20221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (info == null || info.activityInfo == null) { 20321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 20421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 20521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return new ComponentName(receiverPackage, info.activityInfo.name); 20621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 20721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 208f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 209f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeInt(type); 210f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(packageName); 211f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(installerPackageName); 212f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(processName); 213f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeLong(time); 214e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski dest.writeInt(systemApp ? 1 : 0); 215f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 216f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski switch (type) { 217f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_CRASH: 218f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski crashInfo.writeToParcel(dest, flags); 219f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 220f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_ANR: 221f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski anrInfo.writeToParcel(dest, flags); 222f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 22321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 224151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo.writeToParcel(dest, flags); 22521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 226f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 227f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 228f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 229fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski public void readFromParcel(Parcel in) { 23028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski type = in.readInt(); 23128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski packageName = in.readString(); 23228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski installerPackageName = in.readString(); 23328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski processName = in.readString(); 23428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski time = in.readLong(); 235e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski systemApp = in.readInt() == 1; 23628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski 23728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski switch (type) { 23828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski case TYPE_CRASH: 23928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski crashInfo = new CrashInfo(in); 24028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski anrInfo = null; 241151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = null; 24228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski break; 24328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski case TYPE_ANR: 24428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski anrInfo = new AnrInfo(in); 24528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski crashInfo = null; 246151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = null; 24721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 24821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 249151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = new BatteryInfo(in); 25021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn anrInfo = null; 25121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn crashInfo = null; 25228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski break; 25328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski } 25428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski } 25528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski 256f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 257f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application crash. 258143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick * 259143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick * <p>This is also used to marshal around stack traces of ANRs and 260143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick * StrictMode violations which aren't necessarily crashes, but have 261143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick * a lot in common. 262f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 263f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static class CrashInfo { 264f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 265f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Class name of the exception that caused the crash. 266f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 267f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String exceptionClassName; 268f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 269f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 270f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski * Message stored in the exception. 271f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski */ 272f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski public String exceptionMessage; 273f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski 274f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski /** 275f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * File which the exception was thrown from. 276f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 277f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwFileName; 278f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 279f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 280f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Class which the exception was thrown from. 281f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 282f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwClassName; 283f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 284f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 285f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Method which the exception was thrown from. 286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 287f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwMethodName; 288f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 289f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 2905a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski * Line number the exception was thrown from. 2915a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski */ 2925a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski public int throwLineNumber; 2935a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski 2945a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski /** 295f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Stack trace. 296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 297f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String stackTrace; 298f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 299f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 300143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick * For StrictMode violations, the wall time duration of the 301143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick * violation, when known. 302143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick */ 303143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick public long durationMillis = -1; 304143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick 305143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick /** 306f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of CrashInfo. 307f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 308f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo() { 309f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 310f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 311f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 312b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor * Create an instance of CrashInfo initialized from an exception. 313b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor */ 314b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor public CrashInfo(Throwable tr) { 315b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor StringWriter sw = new StringWriter(); 316b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor tr.printStackTrace(new PrintWriter(sw)); 317b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor stackTrace = sw.toString(); 31860d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor exceptionMessage = tr.getMessage(); 319b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 320b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor // Populate fields with the "root cause" exception 321b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor while (tr.getCause() != null) { 322b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor tr = tr.getCause(); 323b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor String msg = tr.getMessage(); 324b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor if (msg != null && msg.length() > 0) { 325b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor exceptionMessage = msg; 326b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 327b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 328b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 329b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor exceptionClassName = tr.getClass().getName(); 330b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor StackTraceElement trace = tr.getStackTrace()[0]; 331b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor throwFileName = trace.getFileName(); 332b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor throwClassName = trace.getClassName(); 333b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor throwMethodName = trace.getMethodName(); 334b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor throwLineNumber = trace.getLineNumber(); 335b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 336b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 337b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor /** 338f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of CrashInfo initialized from a Parcel. 339f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 340f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo(Parcel in) { 341f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski exceptionClassName = in.readString(); 342f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski exceptionMessage = in.readString(); 343f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwFileName = in.readString(); 344f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwClassName = in.readString(); 345f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwMethodName = in.readString(); 3465a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski throwLineNumber = in.readInt(); 347f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski stackTrace = in.readString(); 348143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick durationMillis = in.readLong(); 349f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 350f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 351f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 352f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Save a CrashInfo instance to a parcel. 353f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 354f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 355f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(exceptionClassName); 356f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski dest.writeString(exceptionMessage); 357f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwFileName); 358f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwClassName); 359f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwMethodName); 3605a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski dest.writeInt(throwLineNumber); 361f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(stackTrace); 362143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick dest.writeLong(durationMillis); 363f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 364f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 365f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 366f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump a CrashInfo instance to a Printer. 367f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 368f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 369f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "exceptionClassName: " + exceptionClassName); 370f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski pw.println(prefix + "exceptionMessage: " + exceptionMessage); 371f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwFileName: " + throwFileName); 372f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwClassName: " + throwClassName); 373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwMethodName: " + throwMethodName); 3745a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski pw.println(prefix + "throwLineNumber: " + throwLineNumber); 375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "stackTrace: " + stackTrace); 376143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick if (durationMillis != -1) { 377143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick pw.println(prefix + "durationMillis: " + durationMillis); 378143666f0ca28f0e3e6597e5025078f0449ca6abeBrad Fitzpatrick } 379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 380f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 381f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 382f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 383f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application not responding error. 384f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 385f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static class AnrInfo { 386f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 387f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Activity name. 388f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 389f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String activity; 390f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 391f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 392f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Description of the operation that timed out. 393f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 394f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String cause; 395f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 396f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 397f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Additional info, including CPU stats. 398f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 399f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String info; 400f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 401f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 402f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of AnrInfo. 403f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 404f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo() { 405f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 406f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 407f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 408f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of AnrInfo initialized from a Parcel. 409f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 410f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo(Parcel in) { 411f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski activity = in.readString(); 412f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski cause = in.readString(); 413f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski info = in.readString(); 414f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 415f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 416f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 417f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Save an AnrInfo instance to a parcel. 418f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 419f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 420f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(activity); 421f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(cause); 422f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(info); 423f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 424f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 425f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 426f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump an AnrInfo instance to a Printer. 427f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 428f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 429f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "activity: " + activity); 430f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "cause: " + cause); 431f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "info: " + info); 432f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 433f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 434f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 435151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 436151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Describes a battery usage report. 437151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 438151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public static class BatteryInfo { 439151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 440151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Percentage of the battery that was used up by the process. 441151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 442151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public int usagePercent; 443151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 444151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 445151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Duration in microseconds over which the process used the above 446151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * percentage of battery. 447151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 448151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public long durationMicros; 449151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 450151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 451151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Dump of various info impacting battery use. 452151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 453151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public String usageDetails; 454151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 455151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 456151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Checkin details. 457151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 458151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public String checkinDetails; 459151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 460151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 461151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Create an uninitialized instance of BatteryInfo. 462151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 463151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo() { 464151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 465151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 466151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 467151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Create an instance of BatteryInfo initialized from a Parcel. 468151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 469151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo(Parcel in) { 470151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski usagePercent = in.readInt(); 471151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski durationMicros = in.readLong(); 472151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski usageDetails = in.readString(); 473151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski checkinDetails = in.readString(); 474151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 475151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 476151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 477151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Save a BatteryInfo instance to a parcel. 478151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 479151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public void writeToParcel(Parcel dest, int flags) { 480151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeInt(usagePercent); 481151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeLong(durationMicros); 482151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeString(usageDetails); 483151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeString(checkinDetails); 484151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 485151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 486151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 487151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Dump a BatteryInfo instance to a Printer. 488151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 489151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public void dump(Printer pw, String prefix) { 490151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "usagePercent: " + usagePercent); 491151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "durationMicros: " + durationMicros); 492151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "usageDetails: " + usageDetails); 493151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "checkinDetails: " + checkinDetails); 494151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 495151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 496151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 497f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final Parcelable.Creator<ApplicationErrorReport> CREATOR 498f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski = new Parcelable.Creator<ApplicationErrorReport>() { 499f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport createFromParcel(Parcel source) { 500f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return new ApplicationErrorReport(source); 501f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 502f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 503f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport[] newArray(int size) { 504f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return new ApplicationErrorReport[size]; 505f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 506f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski }; 507f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 508f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public int describeContents() { 509f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return 0; 510f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 511f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 512f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 513f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump the report to a Printer. 514f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 515f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 516f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "type: " + type); 517f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "packageName: " + packageName); 518f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "installerPackageName: " + installerPackageName); 519f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "processName: " + processName); 520f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "time: " + time); 521e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski pw.println(prefix + "systemApp: " + systemApp); 522f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 523f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski switch (type) { 524f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_CRASH: 525f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski crashInfo.dump(pw, prefix); 526f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 527f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_ANR: 528f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski anrInfo.dump(pw, prefix); 529f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 53021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 531151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo.dump(pw, prefix); 53221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 533f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 534f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 535f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski} 536