diff options
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() { |