diff options
author | ezio84 <brabus84@gmail.com> | 2017-12-19 14:37:35 +0100 |
---|---|---|
committer | alk3pInjection <webmaster@raspii.tech> | 2022-05-06 01:18:25 +0800 |
commit | 2c918b36d62c98b06211d63d13c0548c1b65c49d (patch) | |
tree | bf284d0a60e5d0aa68e28b8d208815eadd364ebc /packages/SystemUI/src | |
parent | 1940e0fb878b7c65fd4674cfd09de80bb1a39e43 (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/SystemUI/src')
5 files changed, 82 insertions, 13 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() { |