summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorezio84 <brabus84@gmail.com>2017-12-19 14:37:35 +0100
committeralk3pInjection <webmaster@raspii.tech>2022-05-06 01:18:25 +0800
commit2c918b36d62c98b06211d63d13c0548c1b65c49d (patch)
treebf284d0a60e5d0aa68e28b8d208815eadd364ebc /packages
parent1940e0fb878b7c65fd4674cfd09de80bb1a39e43 (diff)
Screenshot: Append app name to filename
Author: ezio84 <brabus84@gmail.com> Date: Tue Dec 19 14:37:35 2017 +0100 Screenshot: append app name to filename Kang Samsung's idea. Change-Id: Ibc6a52b5e2597e6014a2da6a4211febe17ec02c7 Author: Wang Han <wanghan1995315@gmail.com> Date: Fri May 11 12:47:40 2018 +0200 SystemUI: Don't append app name to file on lockscreen When device is locked, current implementation will append the current app name to file when taking screenshot. This causes information leaks. To prevent this, we check for isKeyGuardLocked() and fall back not to append the app name when taking screenshot on lockscreen. Change-Id: I04498faf51986e1a3723a32befd97d29e1f3fe58 Author: DroidFreak32 <rushabshah32@gmail.com> Date: Thu Oct 4 11:33:07 2018 +0530 Screenshot: Append app name after screenshot date. Change-Id: I2ee5d65006ff22dfa381aae50e5757b8e7596e91 Author: ezio84 <brabus84@gmail.com> Date: Sat Jun 16 16:57:19 2018 +0200 GlobalScreenshot: Fix screenshot not saved with some languages like Virgin Islands English when taking a screenshot of the Settings app Change-Id: Ic04f66f5813b9597c96835d15c74509c93530a5c Author: Han Wang <416810799@qq.com> Date: Mon May 25 11:18:01 2020 +0200 SystemUI: Do not convert application name to ISO-8859-15 * ISO-8859-15 does not handle CJK chars, so all of them are 'unknown' and empty eventually. Change-Id: I27c689f5d737190d381146e49c1989e998b4f623 Author: LuK1337 <priv.luk@gmail.com> Date: Mon Aug 24 17:52:39 2020 +0200 SystemUI: Use TaskStackChangeListener API for contextual screenshot package name * This should hopefully fix mislabeled screenshots. Change-Id: Ifde106c0e306a6700081e4d724c1cf0c06dd126c Change-Id: Ic2a42536bf763a0c6f7fb9ac4bbbe84f73723f91
Diffstat (limited to 'packages')
-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));