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

Unverified Commit 94ca4126 authored by ezio84's avatar ezio84 Committed by Michael Bestas
Browse files

Screenshot: Append app name to filename



Co-authored-by: default avatarDroidFreak32 <rushabshah32@gmail.com>
Co-authored-by: default avatarLuK1337 <priv.luk@gmail.com>
Co-authored-by: default avatarMichael Bestas <mkbestas@lineageos.org>
Co-authored-by: default avatarWang Han <wanghan1995315@gmail.com>
Change-Id: Ic2a42536bf763a0c6f7fb9ac4bbbe84f73723f91
parent 7457afa2
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -70,7 +70,8 @@ constructor(
                UUID.randomUUID(),
                screenshot.bitmap,
                screenshot.getUserOrDefault(),
                screenshot.displayId
                screenshot.displayId,
                null
            )
        future.addListener(
            {
+17 −5
Original line number Diff line number Diff line
@@ -68,6 +68,9 @@ public 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";
    // ex: 'Screenshot_20201215-090626-display-1.png'
    private static final String CONNECTED_DISPLAY_FILENAME_PATTERN =
            "Screenshot_%1$tY%<tm%<td-%<tH%<tM%<tS-display-%2$d.%3$s";
@@ -154,15 +157,17 @@ public class ImageExporter {
     * @param executor  the thread for execution
     * @param bitmap    the bitmap to export
     * @param displayId the display id the bitmap comes from.
     * @param foregroundAppName the name of app running in foreground
     * @return a listenable future result
     */
    public ListenableFuture<Result> export(Executor executor, UUID requestId, Bitmap bitmap,
            UserHandle owner, int displayId) {
            UserHandle owner, int displayId, String foregroundAppName) {
        ZonedDateTime captureTime = ZonedDateTime.now(ZoneId.systemDefault());
        return export(executor,
                new Task(mResolver, requestId, bitmap, captureTime, mCompressFormat,
                        mQuality, /* publish */ true, owner, mFlags,
                        createFilename(captureTime, mCompressFormat, displayId)));
                        createFilename(captureTime, mCompressFormat, displayId,
                        foregroundAppName)));
    }

    /**
@@ -194,13 +199,14 @@ public 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
     */
    public ListenableFuture<Result> export(Executor executor, UUID requestId, Bitmap bitmap,
            ZonedDateTime captureTime, UserHandle owner, int displayId) {
            ZonedDateTime captureTime, UserHandle owner, int displayId, String foregroundAppName) {
        return export(executor, new Task(mResolver, requestId, bitmap, captureTime, mCompressFormat,
                mQuality, /* publish */ true, owner, mFlags,
                createFilename(captureTime, mCompressFormat, displayId)));
                createFilename(captureTime, mCompressFormat, displayId, foregroundAppName)));
    }

    /**
@@ -208,6 +214,7 @@ public 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,
@@ -480,8 +487,13 @@ public class ImageExporter {
    }

    @VisibleForTesting
    static String createFilename(ZonedDateTime time, CompressFormat format, int displayId) {
    static String createFilename(ZonedDateTime time, CompressFormat format, int displayId,
            String foregroundAppName) {
        if (displayId == Display.DEFAULT_DISPLAY) {
            if (foregroundAppName != null) {
                return String.format(FILENAME_WITH_APP_NAME_PATTERN, time, foregroundAppName,
                        fileExtension(format));
            }
            return String.format(FILENAME_PATTERN, time, fileExtension(format));
        }
        return String.format(CONNECTED_DISPLAY_FILENAME_PATTERN, time, displayId,
+3 −3
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ import java.util.concurrent.CompletableFuture;
/**
 * 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";
@@ -96,7 +96,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");
@@ -133,7 +133,7 @@ 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, mParams.owner,
                            mParams.displayId);
                            mParams.displayId, params != null ? params[0] : null);
            ImageExporter.Result result = future.get();
            Log.d(TAG, "Saved screenshot: " + result);
            final Uri uri = result.uri;
+48 −2
Original line number Diff line number Diff line
@@ -36,20 +36,24 @@ import android.annotation.MainThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.app.ActivityTaskManager;
import android.app.ExitTransitionCoordinator;
import android.app.ICompatCameraControlCallback;
import android.app.Notification;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Insets;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -79,6 +83,8 @@ import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.res.R;
import com.android.systemui.screenshot.TakeScreenshotService.RequestCallback;
import com.android.systemui.screenshot.scroll.ScrollCaptureExecutor;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.util.Assert;

import com.google.common.util.concurrent.ListenableFuture;
@@ -247,6 +253,36 @@ public class ScreenshotController implements ScreenshotHandler {
                    | 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(() -> updateForegroundTaskSync());
        }
    };

    private void updateForegroundTaskSync() {
        try {
            final ActivityTaskManager.RootTaskInfo focusedStack =
                    ActivityTaskManager.getService().getFocusedRootTaskInfo();
            if (focusedStack != null && focusedStack.topActivity != null) {
                mTaskComponentName = focusedStack.topActivity;
            }
        } catch (RemoteException e) {
            Log.e(TAG, "Failed to get foreground task component", e);
        }
    }

    private String getForegroundAppLabel() {
        try {
            final ActivityInfo ai = mPm.getActivityInfo(mTaskComponentName, 0);
            return ai.applicationInfo.loadLabel(mPm).toString();
        } catch (PackageManager.NameNotFoundException e) {
             return null;
        }
    }

    @AssistedInject
    ScreenshotController(
@@ -349,6 +385,15 @@ public class ScreenshotController implements ScreenshotHandler {
                        ClipboardOverlayController.COPY_OVERLAY_ACTION), null, null,
                Context.RECEIVER_NOT_EXPORTED, ClipboardOverlayController.SELF_PERMISSION);
        mShowUIOnExternalDisplay = showUIOnExternalDisplay;

        // Grab PackageManager
        mPm = mContext.getPackageManager();

        // Register task stack listener
        TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskListener);

        // Initialize current foreground package name
        updateForegroundTaskSync();
    }

    @Override
@@ -531,6 +576,7 @@ public class ScreenshotController implements ScreenshotHandler {
        removeWindow();
        releaseMediaPlayer();
        releaseContext();
        TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskListener);
        mBgExecutor.shutdown();
    }

@@ -848,7 +894,7 @@ public class ScreenshotController implements ScreenshotHandler {
            ScreenshotData screenshot, UUID requestId, Consumer<Uri> finisher) {
        ListenableFuture<ImageExporter.Result> future = mImageExporter.export(mBgExecutor,
                requestId, screenshot.getBitmap(), screenshot.getUserOrDefault(),
                mDisplay.getDisplayId());
                mDisplay.getDisplayId(), getForegroundAppLabel());
        future.addListener(() -> {
            try {
                ImageExporter.Result result = future.get();
@@ -899,7 +945,7 @@ public class ScreenshotController implements ScreenshotHandler {
        mSaveInBgTask = new SaveImageInBackgroundTask(mContext, mFlags, mImageExporter,
                mScreenshotSmartActions, data,
                mScreenshotNotificationSmartActionsProvider);
        mSaveInBgTask.execute();
        mSaveInBgTask.execute(getForegroundAppLabel());
    }


+1 −1
Original line number Diff line number Diff line
@@ -118,7 +118,7 @@ final class AppClipsViewModel extends ViewModel {

            // Export and save the screenshot in background.
            ListenableFuture<ImageExporter.Result> exportFuture = mImageExporter.export(mBgExecutor,
                    UUID.randomUUID(), screenshotBitmap, user, Display.DEFAULT_DISPLAY);
                    UUID.randomUUID(), screenshotBitmap, user, Display.DEFAULT_DISPLAY, null);

            // Get the result and update state on main thread.
            exportFuture.addListener(() -> {
Loading