Skip to content

Commit 94b7041

Browse files
committed
SystemUI: Use TaskStackChangeListener API for contextual screenshot package name
* This should hopefully fix mislabeled screenshots. Change-Id: Ifde106c0e306a6700081e4d724c1cf0c06dd126c
1 parent 2760fc2 commit 94b7041

File tree

1 file changed

+49
-27
lines changed

1 file changed

+49
-27
lines changed

packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import android.content.Context;
5050
import android.content.Intent;
5151
import android.content.pm.ActivityInfo;
52+
import android.content.pm.ApplicationInfo;
5253
import android.content.pm.PackageManager;
5354
import android.content.pm.UserInfo;
5455
import android.content.res.Configuration;
@@ -103,12 +104,15 @@
103104
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
104105
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
105106
import com.android.internal.statusbar.IStatusBarService;
107+
import com.android.systemui.Dependency;
106108
import com.android.systemui.R;
107109
import com.android.systemui.SysUiServiceProvider;
108110
import com.android.systemui.SystemUI;
109111
import com.android.systemui.SystemUIFactory;
110112
import com.android.systemui.shared.system.ActivityManagerWrapper;
113+
import com.android.systemui.shared.system.TaskStackChangeListener;
111114
import com.android.systemui.statusbar.phone.StatusBar;
115+
import com.android.systemui.UiOffloadThread;
112116
import com.android.systemui.util.NotificationChannels;
113117

114118
import libcore.io.IoUtils;
@@ -177,36 +181,18 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
177181
private final boolean mSmartActionsEnabled;
178182
private final Random mRandom = new Random();
179183

180-
private static CharSequence getRunningActivityName(Context context) {
181-
final ActivityManager am = context.getSystemService(ActivityManager.class);
182-
final PackageManager pm = context.getPackageManager();
183-
184-
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
185-
if (tasks != null && !tasks.isEmpty()) {
186-
ActivityManager.RunningTaskInfo top = tasks.get(0);
187-
try {
188-
ActivityInfo info = pm.getActivityInfo(top.topActivity, 0);
189-
return pm.getApplicationLabel(info.applicationInfo);
190-
} catch (PackageManager.NameNotFoundException e) {
191-
}
192-
}
193-
194-
return null;
195-
}
196-
197184
SaveImageInBackgroundTask(Context context, SaveImageInBackgroundData data,
198-
NotificationManager nManager) {
185+
NotificationManager nManager, String appLabel) {
199186
Resources r = context.getResources();
200187

201188
// Prepare all the output metadata
202189
mParams = data;
203190
mImageTime = System.currentTimeMillis();
204191
String imageDate = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date(mImageTime));
205-
CharSequence appName = getRunningActivityName(context);
206192
boolean onKeyguard = context.getSystemService(KeyguardManager.class).isKeyguardLocked();
207-
if (!onKeyguard && appName != null) {
193+
if (!onKeyguard && appLabel != null) {
208194
// Replace all spaces and special chars with an underscore
209-
String appNameString = appName.toString().replaceAll("[\\\\/:*?\"<>|\\s]+", "_");
195+
String appNameString = appLabel.toString().replaceAll("[\\\\/:*?\"<>|\\s]+", "_");
210196
mImageFileName = String.format(SCREENSHOT_FILE_NAME_TEMPLATE_APPNAME,
211197
imageDate, appNameString);
212198
} else {
@@ -667,6 +653,33 @@ class GlobalScreenshot {
667653
private AudioManager mAudioManager;
668654
private Vibrator mVibrator;
669655

656+
private ComponentName mTaskComponentName;
657+
private PackageManager mPm;
658+
659+
private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class);
660+
private final TaskStackChangeListener mTaskListener = new TaskStackChangeListener() {
661+
@Override
662+
public void onTaskStackChanged() {
663+
mUiOffloadThread.submit(() -> {
664+
try {
665+
final ActivityManager.StackInfo focusedStack =
666+
ActivityTaskManager.getService().getFocusedStackInfo();
667+
if (focusedStack != null && focusedStack.topActivity != null) {
668+
mTaskComponentName = focusedStack.topActivity;
669+
}
670+
} catch (Exception e) {}
671+
});
672+
}
673+
};
674+
675+
private String getForegroundAppLabel() {
676+
try {
677+
final ActivityInfo ai = mPm.getActivityInfo(mTaskComponentName, 0);
678+
return ai.applicationInfo.loadLabel(mPm).toString();
679+
} catch (PackageManager.NameNotFoundException e) {
680+
return null;
681+
}
682+
}
670683

671684
/**
672685
* @param context everything needs a context :(
@@ -743,12 +756,21 @@ public boolean onTouch(View v, MotionEvent event) {
743756
// Grab system services needed for screenshot sound
744757
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
745758
mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
759+
760+
// Grab PackageManager
761+
mPm = mContext.getPackageManager();
762+
763+
// Register task stack listener
764+
ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskListener);
765+
766+
// Initialize current foreground package name
767+
mTaskListener.onTaskStackChanged();
746768
}
747769

748770
/**
749771
* Creates a new worker thread and saves the screenshot to the media store.
750772
*/
751-
private void saveScreenshotInWorkerThread(Consumer<Uri> finisher) {
773+
private void saveScreenshotInWorkerThread(Consumer<Uri> finisher, String appLabel) {
752774
SaveImageInBackgroundData data = new SaveImageInBackgroundData();
753775
data.context = mContext;
754776
data.image = mScreenBitmap;
@@ -759,8 +781,8 @@ private void saveScreenshotInWorkerThread(Consumer<Uri> finisher) {
759781
if (mSaveInBgTask != null) {
760782
mSaveInBgTask.cancel(false);
761783
}
762-
mSaveInBgTask = new SaveImageInBackgroundTask(mContext, data, mNotificationManager)
763-
.execute();
784+
mSaveInBgTask = new SaveImageInBackgroundTask(
785+
mContext, data, mNotificationManager, appLabel).execute();
764786
}
765787

766788
/**
@@ -787,7 +809,7 @@ private void takeScreenshot(Consumer<Uri> finisher, boolean statusBarVisible,
787809

788810
// Start the post-screenshot animation
789811
startAnimation(finisher, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels,
790-
statusBarVisible, navBarVisible);
812+
statusBarVisible, navBarVisible, getForegroundAppLabel());
791813
}
792814

793815
void takeScreenshot(Consumer<Uri> finisher, boolean statusBarVisible, boolean navBarVisible) {
@@ -936,7 +958,7 @@ void stopScreenshot() {
936958
* Starts the animation after taking the screenshot
937959
*/
938960
private void startAnimation(final Consumer<Uri> finisher, int w, int h,
939-
boolean statusBarVisible, boolean navBarVisible) {
961+
boolean statusBarVisible, boolean navBarVisible, String appLabel) {
940962
// If power save is on, show a toast so there is some visual indication that a screenshot
941963
// has been taken.
942964
PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
@@ -966,7 +988,7 @@ private void startAnimation(final Consumer<Uri> finisher, int w, int h,
966988
@Override
967989
public void onAnimationEnd(Animator animation) {
968990
// Save the screenshot once we have a bit of time now
969-
saveScreenshotInWorkerThread(finisher);
991+
saveScreenshotInWorkerThread(finisher, appLabel);
970992
mWindowManager.removeView(mScreenshotLayout);
971993

972994
// Clear any references to the bitmap

0 commit comments

Comments
 (0)