Changed ActivityManager.requestBugreport() to take a 'progress' parameter.
When progress is set to 'true', it calls the new, enhanced
'bugreportplus' service, while when 'false' it calls the regular
'bugreport' service.
'bugreportplus' is more user-friendly (it shows a system notification
with the progress, allow user to cancel, etc...), at the cost of
consuming more resources. As such, the "Take Bug Report" UI will be
changed to offer the user a combo with these 2 options, but for now it's
always going to be 'bugreportplus'
BUG: 26034608
Change-Id: I21a6b5b092a85614e91d523b8f4df1fb00e49b3b
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index 2ad63b5..4f7a109 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -142,6 +142,7 @@
" am clear-debug-app\n" +
" am set-watch-heap <PROCESS> <MEM-LIMIT>\n" +
" am clear-watch-heap\n" +
+ " am bug-report [--progress]\n" +
" am monitor [--gdb <port>]\n" +
" am hang [--allow-restart]\n" +
" am restart\n" +
@@ -258,8 +259,9 @@
"\n" +
"am clear-watch-heap: clear the previously set-watch-heap.\n" +
"\n" +
- "am bug-report: request bug report generation; will launch UI\n" +
- " when done to select where it should be delivered.\n" +
+ "am bug-report: request bug report generation; will launch a notification\n" +
+ " when done to select where it should be delivered. Options are: \n" +
+ " --progress: will launch a notification right away to show its progress.\n" +
"\n" +
"am monitor: start monitoring for crashes or ANRs.\n" +
" --gdb: start gdbserv on the given port at crash/ANR\n" +
@@ -1072,7 +1074,17 @@
}
private void runBugReport() throws Exception {
- mAm.requestBugReport();
+ String opt;
+ boolean progress = false;
+ while ((opt=nextOption()) != null) {
+ if (opt.equals("--progress")) {
+ progress = true;
+ } else {
+ System.err.println("Error: Unknown option: " + opt);
+ return;
+ }
+ }
+ mAm.requestBugReport(progress);
System.out.println("Your lovely bug report is being created; please be patient.");
}
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index c05d5e8..f36a165 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -2228,7 +2228,8 @@
case REQUEST_BUG_REPORT_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
- requestBugReport();
+ boolean progress = data.readInt() != 0;
+ requestBugReport(progress);
reply.writeNoException();
return true;
}
@@ -5600,10 +5601,11 @@
reply.recycle();
}
- public void requestBugReport() throws RemoteException {
+ public void requestBugReport(boolean progress) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeInt(progress ? 1 : 0);
mRemote.transact(REQUEST_BUG_REPORT_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 38c79579..50e20f4a 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -437,7 +437,7 @@
public void registerUserSwitchObserver(IUserSwitchObserver observer) throws RemoteException;
public void unregisterUserSwitchObserver(IUserSwitchObserver observer) throws RemoteException;
- public void requestBugReport() throws RemoteException;
+ public void requestBugReport(boolean progress) throws RemoteException;
public long inputDispatchingTimedOut(int pid, boolean aboveSystem, String reason)
throws RemoteException;
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 79d4f17..78e373b 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -123,7 +123,7 @@
/** System property (and value) used for stop dumpstate. */
private static final String CTL_STOP = "ctl.stop";
- private static final String BUGREPORT_SERVICE = "bugreport";
+ private static final String BUGREPORT_SERVICE = "bugreportplus";
/** Managed dumpstate processes (keyed by pid) */
private final SparseArray<BugreportInfo> mProcesses = new SparseArray<>();
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index b769d39..6e897b1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -11224,9 +11224,10 @@
}
}
- public void requestBugReport() {
+ public void requestBugReport(boolean progress) {
+ final String service = progress ? "bugreportplus" : "bugreport";
enforceCallingPermission(android.Manifest.permission.DUMP, "requestBugReport");
- SystemProperties.set("ctl.start", "bugreport");
+ SystemProperties.set("ctl.start", service);
}
public static long getInputDispatchingTimeoutLocked(ActivityRecord r) {
diff --git a/services/core/java/com/android/server/policy/GlobalActions.java b/services/core/java/com/android/server/policy/GlobalActions.java
index d160221f..c8523c9 100644
--- a/services/core/java/com/android/server/policy/GlobalActions.java
+++ b/services/core/java/com/android/server/policy/GlobalActions.java
@@ -390,9 +390,10 @@
// screenshot.
mHandler.postDelayed(new Runnable() {
@Override public void run() {
+ // TODO: select 'progress' flag according to menu choice
try {
ActivityManagerNative.getDefault()
- .requestBugReport();
+ .requestBugReport(true);
} catch (RemoteException e) {
}
}