diff --git a/core/java/android/os/BugreportManager.java b/core/java/android/os/BugreportManager.java
index a3c2cd8e7a5d7..9ca1c3313670e 100644
--- a/core/java/android/os/BugreportManager.java
+++ b/core/java/android/os/BugreportManager.java
@@ -27,8 +27,10 @@ import android.annotation.SystemService;
import android.annotation.TestApi;
import android.app.ActivityManager;
import android.content.Context;
+import android.os.Handler;
import android.util.Log;
-
+import android.widget.Toast;
+import com.android.internal.R;
import com.android.internal.util.Preconditions;
import libcore.io.IoUtils;
@@ -155,12 +157,14 @@ public final class BugreportManager {
Preconditions.checkNotNull(executor);
Preconditions.checkNotNull(callback);
+ boolean validScreenshotFd = screenshotFd != null;
if (screenshotFd == null) {
// Binder needs a valid File Descriptor to be passed
screenshotFd = ParcelFileDescriptor.open(new File("/dev/null"),
ParcelFileDescriptor.MODE_READ_ONLY);
}
- DumpstateListener dsListener = new DumpstateListener(executor, callback);
+ DumpstateListener dsListener = new DumpstateListener(executor, callback,
+ validScreenshotFd);
// Note: mBinder can get callingUid from the binder transaction.
mBinder.startBugreport(-1 /* callingUid */,
mContext.getOpPackageName(),
@@ -221,10 +225,13 @@ public final class BugreportManager {
private final class DumpstateListener extends IDumpstateListener.Stub {
private final Executor mExecutor;
private final BugreportCallback mCallback;
+ private final boolean mValidScreenshotFd;
- DumpstateListener(Executor executor, BugreportCallback callback) {
+ DumpstateListener(Executor executor, BugreportCallback callback,
+ boolean validScreenshotFd) {
mExecutor = executor;
mCallback = callback;
+ mValidScreenshotFd = validScreenshotFd;
}
@Override
@@ -262,5 +269,20 @@ public final class BugreportManager {
Binder.restoreCallingIdentity(identity);
}
}
+
+ @Override
+ public void onScreenshotTaken(boolean success) throws RemoteException {
+ if (!mValidScreenshotFd) {
+ return;
+ }
+
+ Handler mainThreadHandler = new Handler(Looper.getMainLooper());
+ mainThreadHandler.post(
+ () -> {
+ int message = success ? R.string.bugreport_screenshot_success_toast
+ : R.string.bugreport_screenshot_failure_toast;
+ Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
+ });
+ }
}
}
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index df1f46f10967a..a7e02eea585dd 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -584,6 +584,12 @@
%s (%s)
+
+ Screenshot taken with bug report
+
+
+ Failed to take screenshot with bug report
+
Silent mode
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 220b6dc7f5191..83a9beac3a4b2 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1789,6 +1789,8 @@
+
+
diff --git a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
index 1e2d52d76697d..6c2d77cac6d39 100644
--- a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
+++ b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
@@ -275,6 +275,11 @@ class BugreportManagerServiceImpl extends IDumpstate.Stub {
mListener.onFinished();
}
+ @Override
+ public void onScreenshotTaken(boolean success) throws RemoteException {
+ mListener.onScreenshotTaken(success);
+ }
+
@Override
public void binderDied() {
synchronized (mLock) {