summaryrefslogtreecommitdiff
path: root/packages/Shell/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/Shell/src')
-rw-r--r--packages/Shell/src/com/android/shell/BugreportProgressService.java66
1 files changed, 54 insertions, 12 deletions
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index c9daf538d280..f7b1c5bf9c5b 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -47,6 +47,7 @@ import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
+import android.os.Binder;
import android.os.BugreportManager;
import android.os.BugreportManager.BugreportCallback;
import android.os.BugreportManager.BugreportCallback.BugreportErrorCode;
@@ -186,7 +187,7 @@ public class BugreportProgressService extends Service {
static final int SCREENSHOT_DELAY_SECONDS = 3;
/** System property where dumpstate stores last triggered bugreport id */
- private static final String PROPERTY_LAST_ID = "dumpstate.last_id";
+ static final String PROPERTY_LAST_ID = "dumpstate.last_id";
private static final String BUGREPORT_SERVICE = "bugreport";
@@ -233,7 +234,7 @@ public class BugreportProgressService extends Service {
private File mBugreportsDir;
- private BugreportManager mBugreportManager;
+ @VisibleForTesting BugreportManager mBugreportManager;
/**
* id of the notification used to set service on foreground.
@@ -248,6 +249,11 @@ public class BugreportProgressService extends Service {
*/
private boolean mTakingScreenshot;
+ /**
+ * The delay timeout before taking a screenshot.
+ */
+ @VisibleForTesting int mScreenshotDelaySec = SCREENSHOT_DELAY_SECONDS;
+
@GuardedBy("sNotificationBundle")
private static final Bundle sNotificationBundle = new Bundle();
@@ -282,6 +288,7 @@ public class BugreportProgressService extends Service {
mContext.getString(R.string.bugreport_notification_channel),
isTv(this) ? NotificationManager.IMPORTANCE_DEFAULT
: NotificationManager.IMPORTANCE_LOW));
+ mBugreportManager = mContext.getSystemService(BugreportManager.class);
}
@Override
@@ -305,7 +312,7 @@ public class BugreportProgressService extends Service {
@Override
public IBinder onBind(Intent intent) {
- return null;
+ return new LocalBinder();
}
@Override
@@ -375,6 +382,7 @@ public class BugreportProgressService extends Service {
mInfo.renameScreenshots();
synchronized (mLock) {
sendBugreportFinishedBroadcastLocked();
+ mMainThreadHandler.post(() -> mInfoDialog.onBugreportFinished(mInfo));
}
}
@@ -627,8 +635,6 @@ public class BugreportProgressService extends Service {
}
}
- mBugreportManager = (BugreportManager) mContext.getSystemService(
- Context.BUGREPORT_SERVICE);
final Executor executor = ActivityThread.currentActivityThread().getExecutor();
Log.i(TAG, "bugreport type = " + bugreportType
@@ -888,12 +894,12 @@ public class BugreportProgressService extends Service {
collapseNotificationBar();
final String msg = mContext.getResources()
.getQuantityString(com.android.internal.R.plurals.bugreport_countdown,
- SCREENSHOT_DELAY_SECONDS, SCREENSHOT_DELAY_SECONDS);
+ mScreenshotDelaySec, mScreenshotDelaySec);
Log.i(TAG, msg);
// Show a toast just once, otherwise it might be captured in the screenshot.
Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
- takeScreenshot(id, SCREENSHOT_DELAY_SECONDS);
+ takeScreenshot(id, mScreenshotDelaySec);
}
/**
@@ -1623,6 +1629,16 @@ public class BugreportProgressService extends Service {
}
/**
+ * A local binder with interface to return an instance of BugreportProgressService for the
+ * purpose of testing.
+ */
+ final class LocalBinder extends Binder {
+ @VisibleForTesting BugreportProgressService getService() {
+ return BugreportProgressService.this;
+ }
+ }
+
+ /**
* Helper class encapsulating the UI elements and logic used to display a dialog where user
* can change the details of a bugreport.
*/
@@ -1751,6 +1767,22 @@ public class BugreportProgressService extends Service {
}
}
+ /**
+ * Notifies the dialog that the bugreport has finished so it disables the {@code name}
+ * field.
+ * <p>Once the bugreport is finished dumpstate has already generated the final files, so
+ * changing the name would have no effect.
+ */
+ void onBugreportFinished(BugreportInfo info) {
+ if (mId == info.id && mInfoName != null) {
+ mInfoName.setEnabled(false);
+ mInfoName.setText(null);
+ if (!TextUtils.isEmpty(info.getName())) {
+ mInfoName.setText(info.getName());
+ }
+ }
+ }
+
void cancel() {
if (mDialog != null) {
mDialog.cancel();
@@ -1995,12 +2027,21 @@ public class BugreportProgressService extends Service {
Log.i(TAG, "Deleting empty bugreport file: " + bugreportFile);
bugreportFile.delete();
}
- for (File file : screenshotFiles) {
- if (file.length() == 0) {
+ deleteEmptyScreenshots();
+ }
+
+ /**
+ * Deletes empty screenshot files.
+ */
+ private void deleteEmptyScreenshots() {
+ screenshotFiles.removeIf(file -> {
+ final long length = file.length();
+ if (length == 0) {
Log.i(TAG, "Deleting empty screenshot file: " + file);
file.delete();
}
- }
+ return length == 0;
+ });
}
/**
@@ -2008,7 +2049,8 @@ public class BugreportProgressService extends Service {
* {@code initialName} if user has changed it.
*/
void renameScreenshots() {
- if (TextUtils.isEmpty(name)) {
+ deleteEmptyScreenshots();
+ if (TextUtils.isEmpty(name) || screenshotFiles.isEmpty()) {
return;
}
final List<File> renamedFiles = new ArrayList<>(screenshotFiles.size());
@@ -2027,7 +2069,7 @@ public class BugreportProgressService extends Service {
if (newFile.length() > 0) {
renamedFiles.add(newFile);
} else if (newFile.delete()) {
- Log.d(TAG, "screenshot file: " + newFile + "deleted successfully.");
+ Log.d(TAG, "screenshot file: " + newFile + " deleted successfully.");
}
}
screenshotFiles = renamedFiles;