ApplicationErrorReport.java revision ae96f634eccf86ff80e339c9e9a2abbad3f2a02d
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; 30b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.PrintWriter; 31b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.StringWriter; 32f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 33f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/** 34f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application error. 35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * 36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * A report has a type, which is one of 37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <ul> 38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash 39f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}. 40f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the 41f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}. 42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}. 43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul> 44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * 45f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * @hide 46f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 47f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 48f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable { 4921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // System property defining error report receiver for system apps 5021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps"; 5121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 5221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // System property defining default error report receiver 5321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default"; 5421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 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 /** 77f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Type of this report. Can be one of {@link #TYPE_NONE}, 7821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, or {@link #TYPE_BATTERY}. 79f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 80f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public int type; 81f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 82f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 83f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Package name of the application. 84f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 85f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String packageName; 86f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 87f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 88f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Package name of the application which installed the application this 89f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * report pertains to. 90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * This identifies which Market the application came from. 91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String installerPackageName; 93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Process name of the application. 96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String processName; 98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Time at which the error occurred. 101f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 102f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public long time; 103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 105e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski * Set if the app is on the system image. 106e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski */ 107e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski public boolean systemApp; 108e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski 109e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski /** 110f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * If this report is of type {@link #TYPE_CRASH}, contains an instance 111f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * of CrashInfo describing the crash; otherwise null. 112f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 113f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo crashInfo; 114f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 116f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * If this report is of type {@link #TYPE_ANR}, contains an instance 117f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * of AnrInfo describing the ANR; otherwise null. 118f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 119f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo anrInfo; 120f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 121f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 122151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * If this report is of type {@link #TYPE_BATTERY}, contains an instance 123151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * of BatteryInfo; otherwise null. 12421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 125151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo batteryInfo; 12621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 12721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 128f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of {@link ApplicationErrorReport}. 129f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 130f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport() { 131f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 132f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 133f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 134f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of {@link ApplicationErrorReport} initialized from 135f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * a parcel. 136f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 137f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski ApplicationErrorReport(Parcel in) { 13828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski readFromParcel(in); 139f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 140f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 14121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public static ComponentName getErrorReportReceiver(Context context, 14221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String packageName, int appFlags) { 14321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // check if error reporting is enabled in secure settings 14421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn int enabled = Settings.Secure.getInt(context.getContentResolver(), 14521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Settings.Secure.SEND_ACTION_APP_ERROR, 0); 14621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (enabled == 0) { 14721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 14821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 14921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 15021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn PackageManager pm = context.getPackageManager(); 15121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 15221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // look for receiver in the installer package 15321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String candidate = pm.getInstallerPackageName(packageName); 15421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn ComponentName result = getErrorReportReceiver(pm, packageName, candidate); 15521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (result != null) { 15621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return result; 15721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 15821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // if the error app is on the system image, look for system apps 16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // error receiver 16121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if ((appFlags&ApplicationInfo.FLAG_SYSTEM) != 0) { 16221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY); 16321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn result = getErrorReportReceiver(pm, packageName, candidate); 16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (result != null) { 16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return result; 16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 16721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // if there is a default receiver, try that 17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY); 17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return getErrorReportReceiver(pm, packageName, candidate); 17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 17421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * Return activity in receiverPackage that handles ACTION_APP_ERROR. 17621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * 177ae96f634eccf86ff80e339c9e9a2abbad3f2a02dMadan Ankapura * @param pm PackageManager instance 17821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @param errorPackage package which caused the error 17921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @param receiverPackage candidate package to receive the error 18021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @return activity component within receiverPackage which handles 18121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * ACTION_APP_ERROR, or null if not found 18221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 18321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static ComponentName getErrorReportReceiver(PackageManager pm, String errorPackage, 18421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String receiverPackage) { 18521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (receiverPackage == null || receiverPackage.length() == 0) { 18621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 18721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 18821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 18921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // break the loop if it's the error report receiver package that crashed 19021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (receiverPackage.equals(errorPackage)) { 19121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 19221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 19421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Intent intent = new Intent(Intent.ACTION_APP_ERROR); 19521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn intent.setPackage(receiverPackage); 19621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn ResolveInfo info = pm.resolveActivity(intent, 0); 19721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (info == null || info.activityInfo == null) { 19821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 19921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 20021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return new ComponentName(receiverPackage, info.activityInfo.name); 20121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 20221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 203f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 204f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeInt(type); 205f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(packageName); 206f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(installerPackageName); 207f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(processName); 208f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeLong(time); 209e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski dest.writeInt(systemApp ? 1 : 0); 210f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 211f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski switch (type) { 212f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_CRASH: 213f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski crashInfo.writeToParcel(dest, flags); 214f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 215f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_ANR: 216f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski anrInfo.writeToParcel(dest, flags); 217f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 21821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 219151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo.writeToParcel(dest, flags); 22021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 221f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 222f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 223f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 224fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski public void readFromParcel(Parcel in) { 22528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski type = in.readInt(); 22628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski packageName = in.readString(); 22728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski installerPackageName = in.readString(); 22828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski processName = in.readString(); 22928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski time = in.readLong(); 230e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski systemApp = in.readInt() == 1; 23128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski 23228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski switch (type) { 23328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski case TYPE_CRASH: 23428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski crashInfo = new CrashInfo(in); 23528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski anrInfo = null; 236151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = null; 23728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski break; 23828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski case TYPE_ANR: 23928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski anrInfo = new AnrInfo(in); 24028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski crashInfo = null; 241151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = null; 24221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 24321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 244151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = new BatteryInfo(in); 24521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn anrInfo = null; 24621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn crashInfo = null; 24728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski break; 24828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski } 24928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski } 25028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski 251f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 252f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application crash. 253f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 254f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static class CrashInfo { 255f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 256f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Class name of the exception that caused the crash. 257f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 258f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String exceptionClassName; 259f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 260f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 261f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski * Message stored in the exception. 262f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski */ 263f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski public String exceptionMessage; 264f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski 265f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski /** 266f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * File which the exception was thrown from. 267f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 268f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwFileName; 269f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 270f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 271f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Class which the exception was thrown from. 272f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 273f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwClassName; 274f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 275f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 276f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Method which the exception was thrown from. 277f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 278f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwMethodName; 279f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 280f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 2815a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski * Line number the exception was thrown from. 2825a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski */ 2835a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski public int throwLineNumber; 2845a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski 2855a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski /** 286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Stack trace. 287f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 288f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String stackTrace; 289f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 290f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 291f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of CrashInfo. 292f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 293f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo() { 294f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 295f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 297b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor * Create an instance of CrashInfo initialized from an exception. 298b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor */ 299b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor public CrashInfo(Throwable tr) { 300b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor StringWriter sw = new StringWriter(); 301b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor tr.printStackTrace(new PrintWriter(sw)); 302b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor stackTrace = sw.toString(); 30360d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor exceptionMessage = tr.getMessage(); 304b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 305b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor // Populate fields with the "root cause" exception 306b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor while (tr.getCause() != null) { 307b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor tr = tr.getCause(); 308b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor String msg = tr.getMessage(); 309b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor if (msg != null && msg.length() > 0) { 310b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor exceptionMessage = msg; 311b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 312b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 313b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 314b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor exceptionClassName = tr.getClass().getName(); 315b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor StackTraceElement trace = tr.getStackTrace()[0]; 316b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor throwFileName = trace.getFileName(); 317b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor throwClassName = trace.getClassName(); 318b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor throwMethodName = trace.getMethodName(); 319b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor throwLineNumber = trace.getLineNumber(); 320b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 321b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 322b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor /** 323f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of CrashInfo initialized from a Parcel. 324f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 325f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo(Parcel in) { 326f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski exceptionClassName = in.readString(); 327f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski exceptionMessage = in.readString(); 328f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwFileName = in.readString(); 329f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwClassName = in.readString(); 330f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwMethodName = in.readString(); 3315a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski throwLineNumber = in.readInt(); 332f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski stackTrace = in.readString(); 333f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 334f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 335f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 336f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Save a CrashInfo instance to a parcel. 337f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 338f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 339f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(exceptionClassName); 340f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski dest.writeString(exceptionMessage); 341f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwFileName); 342f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwClassName); 343f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwMethodName); 3445a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski dest.writeInt(throwLineNumber); 345f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(stackTrace); 346f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 347f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 348f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 349f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump a CrashInfo instance to a Printer. 350f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 351f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 352f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "exceptionClassName: " + exceptionClassName); 353f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski pw.println(prefix + "exceptionMessage: " + exceptionMessage); 354f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwFileName: " + throwFileName); 355f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwClassName: " + throwClassName); 356f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwMethodName: " + throwMethodName); 3575a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski pw.println(prefix + "throwLineNumber: " + throwLineNumber); 358f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "stackTrace: " + stackTrace); 359f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 360f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 361f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 362f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 363f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application not responding error. 364f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 365f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static class AnrInfo { 366f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 367f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Activity name. 368f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 369f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String activity; 370f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 371f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 372f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Description of the operation that timed out. 373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 374f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String cause; 375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 376f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 377f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Additional info, including CPU stats. 378f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String info; 380f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 381f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 382f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of AnrInfo. 383f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 384f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo() { 385f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 386f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 387f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 388f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of AnrInfo initialized from a Parcel. 389f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 390f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo(Parcel in) { 391f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski activity = in.readString(); 392f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski cause = in.readString(); 393f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski info = in.readString(); 394f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 395f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 396f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 397f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Save an AnrInfo instance to a parcel. 398f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 399f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 400f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(activity); 401f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(cause); 402f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(info); 403f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 404f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 405f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 406f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump an AnrInfo instance to a Printer. 407f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 408f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 409f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "activity: " + activity); 410f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "cause: " + cause); 411f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "info: " + info); 412f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 413f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 414f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 415151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 416151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Describes a battery usage report. 417151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 418151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public static class BatteryInfo { 419151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 420151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Percentage of the battery that was used up by the process. 421151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 422151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public int usagePercent; 423151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 424151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 425151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Duration in microseconds over which the process used the above 426151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * percentage of battery. 427151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 428151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public long durationMicros; 429151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 430151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 431151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Dump of various info impacting battery use. 432151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 433151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public String usageDetails; 434151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 435151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 436151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Checkin details. 437151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 438151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public String checkinDetails; 439151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 440151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 441151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Create an uninitialized instance of BatteryInfo. 442151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 443151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo() { 444151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 445151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 446151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 447151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Create an instance of BatteryInfo initialized from a Parcel. 448151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 449151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo(Parcel in) { 450151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski usagePercent = in.readInt(); 451151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski durationMicros = in.readLong(); 452151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski usageDetails = in.readString(); 453151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski checkinDetails = in.readString(); 454151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 455151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 456151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 457151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Save a BatteryInfo instance to a parcel. 458151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 459151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public void writeToParcel(Parcel dest, int flags) { 460151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeInt(usagePercent); 461151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeLong(durationMicros); 462151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeString(usageDetails); 463151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeString(checkinDetails); 464151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 465151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 466151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 467151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Dump a BatteryInfo instance to a Printer. 468151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 469151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public void dump(Printer pw, String prefix) { 470151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "usagePercent: " + usagePercent); 471151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "durationMicros: " + durationMicros); 472151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "usageDetails: " + usageDetails); 473151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "checkinDetails: " + checkinDetails); 474151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 475151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 476151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 477f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final Parcelable.Creator<ApplicationErrorReport> CREATOR 478f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski = new Parcelable.Creator<ApplicationErrorReport>() { 479f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport createFromParcel(Parcel source) { 480f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return new ApplicationErrorReport(source); 481f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 482f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 483f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport[] newArray(int size) { 484f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return new ApplicationErrorReport[size]; 485f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 486f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski }; 487f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 488f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public int describeContents() { 489f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return 0; 490f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 491f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 492f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 493f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump the report to a Printer. 494f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 495f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 496f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "type: " + type); 497f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "packageName: " + packageName); 498f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "installerPackageName: " + installerPackageName); 499f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "processName: " + processName); 500f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "time: " + time); 501e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski pw.println(prefix + "systemApp: " + systemApp); 502f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 503f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski switch (type) { 504f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_CRASH: 505f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski crashInfo.dump(pw, prefix); 506f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 507f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_ANR: 508f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski anrInfo.dump(pw, prefix); 509f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 51021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 511151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo.dump(pw, prefix); 51221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 513f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 514f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 515f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski} 516