Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c141ca8b authored by ezio84's avatar ezio84 Committed by Nolen Johnson
Browse files

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
parent e999792b
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -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));
    }

+2 −1
Original line number Diff line number Diff line
@@ -384,7 +384,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);
    }

+15 −0
Original line number Diff line number Diff line
@@ -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;
    }
}
+4 −3
Original line number Diff line number Diff line
@@ -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;
+42 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.animation.AnimatorListenerAdapter;
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;
@@ -43,6 +44,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;
@@ -92,6 +94,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;

@@ -296,6 +300,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,
@@ -359,6 +390,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(Consumer<Uri> finisher, RequestCallback requestCallback) {
@@ -707,6 +747,7 @@ public class ScreenshotController {
                                        mScreenshotView.startLongScreenshotTransition(
                                                transitionDestination, onTransitionEnd,
                                                longScreenshot));
                        mLongScreenshotHolder.setForegroundAppName(getForegroundAppLabel());

                        final Intent intent = new Intent(mContext, LongScreenshotActivity.class);
                        intent.setFlags(
@@ -878,7 +919,7 @@ public class ScreenshotController {

        mSaveInBgTask = new SaveImageInBackgroundTask(mContext, mImageExporter,
                mScreenshotSmartActions, data, getActionTransitionSupplier());
        mSaveInBgTask.execute();
        mSaveInBgTask.execute(getForegroundAppLabel());
    }

    private void cancelTimeout() {
Loading