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());