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

Commit 299dc3ae authored by ezio84's avatar ezio84 Committed by Bruno Martins
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 fdb29c5c
Loading
Loading
Loading
Loading
+49 −1
Original line number Diff line number Diff line
@@ -31,12 +31,15 @@ import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.ActivityTaskManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
@@ -88,14 +91,17 @@ import android.widget.Toast;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.statusbar.phone.StatusBar;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Consumer;
@@ -119,6 +125,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset
        public Consumer<Uri> finisher;
        public GlobalScreenshot.ActionsReadyListener mActionsReadyListener;
        public int errorMsgResId;
        public String appLabel;

        void clearImage() {
            image = null;
@@ -245,6 +252,34 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset
        }
    };

    private ComponentName mTaskComponentName;
    private PackageManager mPm;

    private final Executor mUiBgExecutor;
    private final TaskStackChangeListener mTaskListener = new TaskStackChangeListener() {
        @Override
        public void onTaskStackChanged() {
            mUiBgExecutor.execute(() -> {
                try {
                    final ActivityManager.StackInfo focusedStack =
                            ActivityTaskManager.getService().getFocusedStackInfo();
                    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;
        }
    }

    /**
     * @param context everything needs a context :(
     */
@@ -252,7 +287,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset
    public GlobalScreenshot(
            Context context, @Main Resources resources,
            ScreenshotNotificationsController screenshotNotificationsController,
            UiEventLogger uiEventLogger) {
            UiEventLogger uiEventLogger, @UiBackground Executor uiBgExecutor) {
        mContext = context;
        mNotificationsController = screenshotNotificationsController;
        mUiEventLogger = uiEventLogger;
@@ -291,6 +326,18 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset
        // Setup the Camera shutter sound
        mCameraSound = new MediaActionSound();
        mCameraSound.load(MediaActionSound.SHUTTER_CLICK);

        // Store UI background executor
        mUiBgExecutor = uiBgExecutor;

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

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

        // Initialize current foreground package name
        mTaskListener.onTaskStackChanged();
    }

    @Override // ViewTreeObserver.OnComputeInternalInsetsListener
@@ -495,6 +542,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset
        data.image = mScreenBitmap;
        data.finisher = finisher;
        data.mActionsReadyListener = actionsReadyListener;
        data.appLabel = getForegroundAppLabel();

        if (mSaveInBgTask != null) {
            // just log success/failure for the pre-existing screenshot
+12 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.screenshot;

import android.app.ActivityTaskManager;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.ClipData;
@@ -77,6 +78,7 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
    private static final String TAG = "SaveImageInBackgroundTask";

    private static final String SCREENSHOT_FILE_NAME_TEMPLATE = "Screenshot_%s.png";
    private static final String SCREENSHOT_FILE_NAME_TEMPLATE_APPNAME = "Screenshot_%s_%s.png";
    private static final String SCREENSHOT_ID_TEMPLATE = "Screenshot_%s";
    private static final String SCREENSHOT_SHARE_SUBJECT_TEMPLATE = "Screenshot (%s)";

@@ -98,7 +100,16 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
        mParams = data;
        mImageTime = System.currentTimeMillis();
        String imageDate = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date(mImageTime));
        boolean onKeyguard = context.getSystemService(KeyguardManager.class).isKeyguardLocked();
        if (!onKeyguard && data.appLabel != null) {
            // Replace all spaces and special chars with an underscore
            String appNameString = data.appLabel.toString().replaceAll("[\\\\/:*?\"<>|\\s]+", "_");
            mImageFileName = String.format(SCREENSHOT_FILE_NAME_TEMPLATE_APPNAME,
                    imageDate, appNameString);
        } else {
            mImageFileName = String.format(SCREENSHOT_FILE_NAME_TEMPLATE, imageDate);
        }

        mScreenshotId = String.format(SCREENSHOT_ID_TEMPLATE, UUID.randomUUID());

        // Initialize screenshot notification smart actions provider.