summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java27
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotData.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java43
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/screenshot/ImageExporterTest.java6
6 files changed, 85 insertions, 16 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java b/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java
index 55602a98b8c5..dcd22958c54a 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ImageExporter.java
@@ -60,6 +60,9 @@ class ImageExporter {
// ex: 'Screenshot_20201215-090626.png'
private static final String FILENAME_PATTERN = "Screenshot_%1$tY%<tm%<td-%<tH%<tM%<tS.%2$s";
+ // ex: 'Screenshot_20201215-090626_Settings.png'
+ private static final String FILENAME_WITH_APP_NAME_PATTERN =
+ "Screenshot_%1$tY%<tm%<td-%<tH%<tM%<tS_%2$s.%3$s";
private static final String SCREENSHOTS_PATH = Environment.DIRECTORY_PICTURES
+ File.separator + Environment.DIRECTORY_SCREENSHOTS;
@@ -139,11 +142,13 @@ class ImageExporter {
*
* @param executor the thread for execution
* @param bitmap the bitmap to export
+ * @param foregroundAppName the name of app running in foreground
*
* @return a listenable future result
*/
- ListenableFuture<Result> export(Executor executor, UUID requestId, Bitmap bitmap) {
- return export(executor, requestId, bitmap, ZonedDateTime.now());
+ ListenableFuture<Result> export(Executor executor, UUID requestId, Bitmap bitmap,
+ String foregroundAppName) {
+ return export(executor, requestId, bitmap, ZonedDateTime.now(), foregroundAppName);
}
/**
@@ -151,14 +156,15 @@ class ImageExporter {
*
* @param executor the thread for execution
* @param bitmap the bitmap to export
+ * @param foregroundAppName the name of app running in foreground
*
* @return a listenable future result
*/
ListenableFuture<Result> export(Executor executor, UUID requestId, Bitmap bitmap,
- ZonedDateTime captureTime) {
+ ZonedDateTime captureTime, String foregroundAppName) {
- final Task task = new Task(mResolver, requestId, bitmap, captureTime, mCompressFormat,
- mQuality, /* publish */ true);
+ final Task task = new Task(mResolver, requestId, bitmap, captureTime, foregroundAppName,
+ mCompressFormat, mQuality, /* publish */ true);
return CallbackToFutureAdapter.getFuture(
(completer) -> {
@@ -231,14 +237,14 @@ class ImageExporter {
private final boolean mPublish;
Task(ContentResolver resolver, UUID requestId, Bitmap bitmap, ZonedDateTime captureTime,
- CompressFormat format, int quality, boolean publish) {
+ String foregroundAppName, CompressFormat format, int quality, boolean publish) {
mResolver = resolver;
mRequestId = requestId;
mBitmap = bitmap;
mCaptureTime = captureTime;
mFormat = format;
mQuality = quality;
- mFileName = createFilename(mCaptureTime, mFormat);
+ mFileName = createFilename(mCaptureTime, mFormat, foregroundAppName);
mPublish = publish;
}
@@ -377,7 +383,12 @@ class ImageExporter {
}
@VisibleForTesting
- static String createFilename(ZonedDateTime time, CompressFormat format) {
+ static String createFilename(ZonedDateTime time, CompressFormat format,
+ String foregroundAppName) {
+ if (foregroundAppName != null) {
+ return String.format(FILENAME_WITH_APP_NAME_PATTERN, time, foregroundAppName,
+ fileExtension(format));
+ }
return String.format(FILENAME_PATTERN, time, fileExtension(format));
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
index a42b34cf23d0..0421114469cf 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
@@ -382,7 +382,8 @@ public class LongScreenshotActivity extends Activity {
mOutputBitmap = renderBitmap(drawable, bounds);
ListenableFuture<ImageExporter.Result> exportFuture = mImageExporter.export(
- mBackgroundExecutor, UUID.randomUUID(), mOutputBitmap, ZonedDateTime.now());
+ mBackgroundExecutor, UUID.randomUUID(), mOutputBitmap, ZonedDateTime.now(),
+ mLongScreenshotHolder.getForegroundAppName());
exportFuture.addListener(() -> onExportCompleted(action, exportFuture), mUiExecutor);
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotData.java b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotData.java
index f549faf2414a..7b3c58e41384 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotData.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotData.java
@@ -31,6 +31,7 @@ public class LongScreenshotData {
private final AtomicReference<ScrollCaptureController.LongScreenshot> mLongScreenshot;
private final AtomicReference<ScreenshotController.TransitionDestination>
mTransitionDestinationCallback;
+ private String mForegroundAppName;
@Inject
public LongScreenshotData() {
@@ -73,4 +74,18 @@ public class LongScreenshotData {
public ScreenshotController.TransitionDestination takeTransitionDestinationCallback() {
return mTransitionDestinationCallback.getAndSet(null);
}
+
+ /**
+ * Set the holder's foreground app name.
+ */
+ public void setForegroundAppName(String foregroundAppName) {
+ mForegroundAppName = foregroundAppName;
+ }
+
+ /**
+ * Return the current foreground app name.
+ */
+ public String getForegroundAppName() {
+ return mForegroundAppName;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
index e9dea65c2078..c3463bfb6485 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
@@ -66,7 +66,7 @@ import java.util.function.Supplier;
/**
* An AsyncTask that saves an image to the media store in the background.
*/
-class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
+class SaveImageInBackgroundTask extends AsyncTask<String, Void, Void> {
private static final String TAG = logTag(SaveImageInBackgroundTask.class);
private static final String SCREENSHOT_ID_TEMPLATE = "Screenshot_%s";
@@ -115,7 +115,7 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
}
@Override
- protected Void doInBackground(Void... paramsUnused) {
+ protected Void doInBackground(String... params) {
if (isCancelled()) {
if (DEBUG_STORAGE) {
Log.d(TAG, "cancelled! returning null");
@@ -140,7 +140,8 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
// Call synchronously here since already on a background thread.
ListenableFuture<ImageExporter.Result> future =
- mImageExporter.export(Runnable::run, requestId, image);
+ mImageExporter.export(Runnable::run, requestId, image,
+ params != null ? params[0] : null);
ImageExporter.Result result = future.get();
final Uri uri = result.uri;
mImageTime = result.timestamp;
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
index 17b00a9e3b5b..9f4dbbe79d37 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
@@ -37,6 +37,7 @@ import android.annotation.MainThread;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.ExitTransitionCoordinator;
import android.app.ExitTransitionCoordinator.ExitTransitionCallbacks;
import android.app.Notification;
@@ -44,6 +45,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Insets;
import android.graphics.PixelFormat;
@@ -93,6 +95,8 @@ import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ActionTransition;
import com.android.systemui.screenshot.TakeScreenshotService.RequestCallback;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
+import com.android.systemui.shared.system.TaskStackChangeListener;
import com.google.common.util.concurrent.ListenableFuture;
@@ -300,6 +304,33 @@ public class ScreenshotController {
| ActivityInfo.CONFIG_SCREEN_LAYOUT
| ActivityInfo.CONFIG_ASSETS_PATHS);
+ private ComponentName mTaskComponentName;
+ private PackageManager mPm;
+
+ private final TaskStackChangeListener mTaskListener = new TaskStackChangeListener() {
+ @Override
+ public void onTaskStackChanged() {
+ mBgExecutor.execute(() -> {
+ try {
+ final ActivityTaskManager.RootTaskInfo focusedStack =
+ ActivityTaskManager.getService().getFocusedRootTaskInfo();
+ if (focusedStack != null && focusedStack.topActivity != null) {
+ mTaskComponentName = focusedStack.topActivity;
+ }
+ } catch (Exception e) {}
+ });
+ }
+ };
+
+ private String getForegroundAppLabel() {
+ try {
+ final ActivityInfo ai = mPm.getActivityInfo(mTaskComponentName, 0);
+ return ai.applicationInfo.loadLabel(mPm).toString();
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ }
+ }
+
@Inject
ScreenshotController(
Context context,
@@ -363,6 +394,15 @@ public class ScreenshotController {
// Grab system services needed for screenshot sound
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
+
+ // Grab PackageManager
+ mPm = mContext.getPackageManager();
+
+ // Register task stack listener
+ ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskListener);
+
+ // Initialize current foreground package name
+ mTaskListener.onTaskStackChanged();
}
void takeScreenshotFullscreen(ComponentName topComponent, Consumer<Uri> finisher,
@@ -716,6 +756,7 @@ public class ScreenshotController {
mScreenshotView.startLongScreenshotTransition(
transitionDestination, onTransitionEnd,
longScreenshot));
+ mLongScreenshotHolder.setForegroundAppName(getForegroundAppLabel());
final Intent intent = new Intent(mContext, LongScreenshotActivity.class);
intent.setFlags(
@@ -894,7 +935,7 @@ public class ScreenshotController {
mSaveInBgTask = new SaveImageInBackgroundTask(mContext, mImageExporter,
mScreenshotSmartActions, data, getActionTransitionSupplier());
- mSaveInBgTask.execute();
+ mSaveInBgTask.execute(getForegroundAppLabel());
}
private void cancelTimeout() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ImageExporterTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ImageExporterTest.java
index 7d563399ee1c..b2f19904d8ba 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ImageExporterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ImageExporterTest.java
@@ -70,7 +70,7 @@ public class ImageExporterTest extends SysuiTestCase {
@Test
public void testImageFilename() {
assertEquals("image file name", "Screenshot_20201215-131500.png",
- ImageExporter.createFilename(CAPTURE_TIME, CompressFormat.PNG));
+ ImageExporter.createFilename(CAPTURE_TIME, CompressFormat.PNG, null));
}
@Test
@@ -97,7 +97,7 @@ public class ImageExporterTest extends SysuiTestCase {
Bitmap original = createCheckerBitmap(10, 10, 10);
ListenableFuture<ImageExporter.Result> direct =
- exporter.export(DIRECT_EXECUTOR, requestId, original, CAPTURE_TIME);
+ exporter.export(DIRECT_EXECUTOR, requestId, original, CAPTURE_TIME, null);
assertTrue("future should be done", direct.isDone());
assertFalse("future should not be canceled", direct.isCancelled());
ImageExporter.Result result = direct.get();
@@ -150,7 +150,7 @@ public class ImageExporterTest extends SysuiTestCase {
@Test
public void testMediaStoreMetadata() {
- String name = ImageExporter.createFilename(CAPTURE_TIME, CompressFormat.PNG);
+ String name = ImageExporter.createFilename(CAPTURE_TIME, CompressFormat.PNG, null);
ContentValues values = ImageExporter.createMetadata(CAPTURE_TIME, CompressFormat.PNG, name);
assertEquals("Pictures/Screenshots",
values.getAsString(MediaStore.MediaColumns.RELATIVE_PATH));