Merge "Fix Traceur notifications for HSUM builds" into main am: 704ac747b6

Original change: https://android-review.googlesource.com/c/platform/packages/apps/Traceur/+/3167377

Change-Id: Ia26186cd8d1c1db1a5fbad9a9f6702737c6f1ba4
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index bb40ae3..2db62cb 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -133,7 +133,6 @@
 
         <receiver android:name=".Receiver"
              android:permission="android.permission.DUMP"
-             androidprv:systemUserOnly="true"
              android:exported="true">
             <intent-filter android:priority="2147483647">
                 <action android:name="android.intent.action.BOOT_COMPLETED"/>
diff --git a/src/com/android/traceur/Receiver.java b/src/com/android/traceur/Receiver.java
index 12b421a..87235ba 100644
--- a/src/com/android/traceur/Receiver.java
+++ b/src/com/android/traceur/Receiver.java
@@ -24,6 +24,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.database.ContentObserver;
@@ -68,6 +69,9 @@
 
         if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
             Log.i(TAG, "Received BOOT_COMPLETE");
+            // USER_FOREGROUND and USER_BACKGROUND can only be received by explicitly registered
+            // receivers; manifest-declared receivers are not sufficient.
+            registerUserSwitchReceiver(context, this);
             createNotificationChannels(context);
             updateDeveloperOptionsWatcher(context, /* fromBootIntent */ true);
             // We know that Perfetto won't be tracing already at boot, so pass the
@@ -75,8 +79,15 @@
             updateTracing(context, /* assumeTracingIsOff= */ true);
             TraceUtils.cleanupOlderFiles();
         } else if (Intent.ACTION_USER_FOREGROUND.equals(intent.getAction())) {
-            updateStorageProvider(context, isTraceurAllowed(context));
-        } else if (STOP_ACTION.equals(intent.getAction())) {
+            boolean traceurAllowed = isTraceurAllowed(context);
+            updateStorageProvider(context, traceurAllowed);
+            if (!traceurAllowed) {
+                // We don't need to check for ongoing traces to stop because if
+                // ACTION_USER_FOREGROUND is received, there should be no ongoing traces.
+                removeQuickSettingsTiles(context);
+            }
+        } else if (Intent.ACTION_USER_BACKGROUND.equals(intent.getAction()) ||
+                STOP_ACTION.equals(intent.getAction())) {
             // Only one of these should be enabled, but they all use the same path for stopping and
             // saving, so set them all to false.
             prefs.edit().putBoolean(
@@ -229,6 +240,20 @@
         updateQuickSettingsPanel(context, stackSamplingQsEnabled, StackSamplingQsService.class);
     }
 
+    private static void removeQuickSettingsTiles(Context context) {
+        SharedPreferences prefs =
+            PreferenceManager.getDefaultSharedPreferences(context);
+        prefs.edit().putBoolean(
+            context.getString(R.string.pref_key_tracing_quick_setting), false)
+            .commit();
+        prefs.edit().putBoolean(
+            context.getString(
+                R.string.pref_key_stack_sampling_quick_setting), false)
+            .commit();
+        updateTracingQuickSettings(context);
+        updateStackSamplingQuickSettings(context);
+    }
+
     /*
      * When Developer Options are toggled, also toggle the Storage Provider that
      * shows "System traces" in Files.
@@ -249,17 +274,7 @@
                         boolean traceurAllowed = isTraceurAllowed(context);
                         updateStorageProvider(context, traceurAllowed);
                         if (!traceurAllowed) {
-                            SharedPreferences prefs =
-                                PreferenceManager.getDefaultSharedPreferences(context);
-                            prefs.edit().putBoolean(
-                                context.getString(R.string.pref_key_tracing_quick_setting), false)
-                                .commit();
-                            prefs.edit().putBoolean(
-                                context.getString(
-                                    R.string.pref_key_stack_sampling_quick_setting), false)
-                                .commit();
-                            updateTracingQuickSettings(context);
-                            updateStackSamplingQuickSettings(context);
+                            removeQuickSettingsTiles(context);
                             // Stop an ongoing trace if one exists.
                             if (TraceUtils.isTracingOn()) {
                                 TraceService.stopTracingWithoutSaving(context);
@@ -341,6 +356,13 @@
         notificationManager.createNotificationChannel(saveTraceChannel);
     }
 
+    private static void registerUserSwitchReceiver(Context context, BroadcastReceiver receiver) {
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Intent.ACTION_USER_FOREGROUND);
+        filter.addAction(Intent.ACTION_USER_BACKGROUND);
+        context.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);
+    }
+
     public static Set<String> getActiveTags(Context context, SharedPreferences prefs, boolean onlyAvailable) {
         Set<String> tags = prefs.getStringSet(context.getString(R.string.pref_key_tags),
                 PresetTraceConfigs.getDefaultTags());