49
49
import android .content .Context ;
50
50
import android .content .Intent ;
51
51
import android .content .pm .ActivityInfo ;
52
+ import android .content .pm .ApplicationInfo ;
52
53
import android .content .pm .PackageManager ;
53
54
import android .content .pm .UserInfo ;
54
55
import android .content .res .Configuration ;
103
104
import com .android .internal .config .sysui .SystemUiDeviceConfigFlags ;
104
105
import com .android .internal .messages .nano .SystemMessageProto .SystemMessage ;
105
106
import com .android .internal .statusbar .IStatusBarService ;
107
+ import com .android .systemui .Dependency ;
106
108
import com .android .systemui .R ;
107
109
import com .android .systemui .SysUiServiceProvider ;
108
110
import com .android .systemui .SystemUI ;
109
111
import com .android .systemui .SystemUIFactory ;
110
112
import com .android .systemui .shared .system .ActivityManagerWrapper ;
113
+ import com .android .systemui .shared .system .TaskStackChangeListener ;
111
114
import com .android .systemui .statusbar .phone .StatusBar ;
115
+ import com .android .systemui .UiOffloadThread ;
112
116
import com .android .systemui .util .NotificationChannels ;
113
117
114
118
import libcore .io .IoUtils ;
@@ -177,36 +181,18 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
177
181
private final boolean mSmartActionsEnabled ;
178
182
private final Random mRandom = new Random ();
179
183
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
-
197
184
SaveImageInBackgroundTask (Context context , SaveImageInBackgroundData data ,
198
- NotificationManager nManager ) {
185
+ NotificationManager nManager , String appLabel ) {
199
186
Resources r = context .getResources ();
200
187
201
188
// Prepare all the output metadata
202
189
mParams = data ;
203
190
mImageTime = System .currentTimeMillis ();
204
191
String imageDate = new SimpleDateFormat ("yyyyMMdd-HHmmss" ).format (new Date (mImageTime ));
205
- CharSequence appName = getRunningActivityName (context );
206
192
boolean onKeyguard = context .getSystemService (KeyguardManager .class ).isKeyguardLocked ();
207
- if (!onKeyguard && appName != null ) {
193
+ if (!onKeyguard && appLabel != null ) {
208
194
// Replace all spaces and special chars with an underscore
209
- String appNameString = appName .toString ().replaceAll ("[\\ \\ /:*?\" <>|\\ s]+" , "_" );
195
+ String appNameString = appLabel .toString ().replaceAll ("[\\ \\ /:*?\" <>|\\ s]+" , "_" );
210
196
mImageFileName = String .format (SCREENSHOT_FILE_NAME_TEMPLATE_APPNAME ,
211
197
imageDate , appNameString );
212
198
} else {
@@ -667,6 +653,33 @@ class GlobalScreenshot {
667
653
private AudioManager mAudioManager ;
668
654
private Vibrator mVibrator ;
669
655
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
+ }
670
683
671
684
/**
672
685
* @param context everything needs a context :(
@@ -743,12 +756,21 @@ public boolean onTouch(View v, MotionEvent event) {
743
756
// Grab system services needed for screenshot sound
744
757
mAudioManager = (AudioManager ) mContext .getSystemService (Context .AUDIO_SERVICE );
745
758
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 ();
746
768
}
747
769
748
770
/**
749
771
* Creates a new worker thread and saves the screenshot to the media store.
750
772
*/
751
- private void saveScreenshotInWorkerThread (Consumer <Uri > finisher ) {
773
+ private void saveScreenshotInWorkerThread (Consumer <Uri > finisher , String appLabel ) {
752
774
SaveImageInBackgroundData data = new SaveImageInBackgroundData ();
753
775
data .context = mContext ;
754
776
data .image = mScreenBitmap ;
@@ -759,8 +781,8 @@ private void saveScreenshotInWorkerThread(Consumer<Uri> finisher) {
759
781
if (mSaveInBgTask != null ) {
760
782
mSaveInBgTask .cancel (false );
761
783
}
762
- mSaveInBgTask = new SaveImageInBackgroundTask (mContext , data , mNotificationManager )
763
- .execute ();
784
+ mSaveInBgTask = new SaveImageInBackgroundTask (
785
+ mContext , data , mNotificationManager , appLabel ) .execute ();
764
786
}
765
787
766
788
/**
@@ -787,7 +809,7 @@ private void takeScreenshot(Consumer<Uri> finisher, boolean statusBarVisible,
787
809
788
810
// Start the post-screenshot animation
789
811
startAnimation (finisher , mDisplayMetrics .widthPixels , mDisplayMetrics .heightPixels ,
790
- statusBarVisible , navBarVisible );
812
+ statusBarVisible , navBarVisible , getForegroundAppLabel () );
791
813
}
792
814
793
815
void takeScreenshot (Consumer <Uri > finisher , boolean statusBarVisible , boolean navBarVisible ) {
@@ -936,7 +958,7 @@ void stopScreenshot() {
936
958
* Starts the animation after taking the screenshot
937
959
*/
938
960
private void startAnimation (final Consumer <Uri > finisher , int w , int h ,
939
- boolean statusBarVisible , boolean navBarVisible ) {
961
+ boolean statusBarVisible , boolean navBarVisible , String appLabel ) {
940
962
// If power save is on, show a toast so there is some visual indication that a screenshot
941
963
// has been taken.
942
964
PowerManager powerManager = (PowerManager ) mContext .getSystemService (Context .POWER_SERVICE );
@@ -966,7 +988,7 @@ private void startAnimation(final Consumer<Uri> finisher, int w, int h,
966
988
@ Override
967
989
public void onAnimationEnd (Animator animation ) {
968
990
// Save the screenshot once we have a bit of time now
969
- saveScreenshotInWorkerThread (finisher );
991
+ saveScreenshotInWorkerThread (finisher , appLabel );
970
992
mWindowManager .removeView (mScreenshotLayout );
971
993
972
994
// Clear any references to the bitmap
0 commit comments