Add preset trace configs

This change adds PresetTraceConfigs, which contains the set of atrace
categories and other trace options (app tracing, long traces, bug report
attachment, etc) used for tracing presets.

Test: Collect traces using these presets and confirm that the trace info
      shows the expected config.
Bug: 306420759
Change-Id: I56e7207569094a4625c7836cb833642735416908
diff --git a/src/com/android/traceur/MainFragment.java b/src/com/android/traceur/MainFragment.java
index e314f23..536e7dd 100644
--- a/src/com/android/traceur/MainFragment.java
+++ b/src/com/android/traceur/MainFragment.java
@@ -375,7 +375,7 @@
             mTags.setEntries(entries.toArray(new String[0]));
             mTags.setEntryValues(values.toArray(new String[0]));
             if (restoreDefaultTags || !mPrefs.contains(context.getString(R.string.pref_key_tags))) {
-                mTags.setValues(Receiver.getDefaultTagList());
+                mTags.setValues(PresetTraceConfigs.getDefaultTags());
             }
             mHeapDumpProcesses.setEntries(sortedProcesses.toArray(new String[0]));
             mHeapDumpProcesses.setEntryValues(sortedProcesses.toArray(new String[0]));
@@ -408,7 +408,7 @@
                 Locale.getDefault());
         Map<String, Object> arguments = new HashMap<>();
         arguments.put("count", categories.size());
-        mTags.setSummary(Receiver.getDefaultTagList().equals(categories)
+        mTags.setSummary(PresetTraceConfigs.getDefaultTags().equals(categories)
                          ? context.getString(R.string.default_categories)
                          : msgFormat.format(arguments));
 
diff --git a/src/com/android/traceur/Receiver.java b/src/com/android/traceur/Receiver.java
index 39ff6ad..0ff7e42 100644
--- a/src/com/android/traceur/Receiver.java
+++ b/src/com/android/traceur/Receiver.java
@@ -55,20 +55,11 @@
     public static final String NOTIFICATION_CHANNEL_TRACING = "trace-is-being-recorded";
     public static final String NOTIFICATION_CHANNEL_OTHER = "system-tracing";
 
-    private static final List<String> DEFAULT_TRACE_TAGS = Arrays.asList(
-            "aidl", "am", "binder_driver", "camera", "dalvik", "disk", "freq",
-            "gfx", "hal", "idle", "input", "memory", "memreclaim", "network", "power",
-            "res", "sched", "ss", "sync", "thermal", "view", "webview", "wm", "workq");
-    private static final List<String> USER_BUILD_DISABLED_TRACE_TAGS = Arrays.asList(
-            "workq", "sync"
-    );
-
     private static final String TAG = "Traceur";
 
     private static final String BETTERBUG_PACKAGE_NAME =
             "com.google.android.apps.internal.betterbug";
 
-    private static Set<String> mDefaultTagList = null;
     private static ContentObserver mDeveloperOptionsObserver;
 
     @Override
@@ -351,7 +342,7 @@
 
     public static Set<String> getActiveTags(Context context, SharedPreferences prefs, boolean onlyAvailable) {
         Set<String> tags = prefs.getStringSet(context.getString(R.string.pref_key_tags),
-                getDefaultTagList());
+                PresetTraceConfigs.getDefaultTags());
         Set<String> available = TraceUtils.listCategories().keySet();
 
         if (onlyAvailable) {
@@ -364,7 +355,7 @@
 
     public static Set<String> getActiveUnavailableTags(Context context, SharedPreferences prefs) {
         Set<String> tags = prefs.getStringSet(context.getString(R.string.pref_key_tags),
-                getDefaultTagList());
+                PresetTraceConfigs.getDefaultTags());
         Set<String> available = TraceUtils.listCategories().keySet();
 
         tags.removeAll(available);
@@ -373,17 +364,6 @@
         return tags;
     }
 
-    public static Set<String> getDefaultTagList() {
-        if (mDefaultTagList == null) {
-            mDefaultTagList = new ArraySet<String>(DEFAULT_TRACE_TAGS);
-            if (Build.TYPE.equals("user")) {
-                mDefaultTagList.removeAll(USER_BUILD_DISABLED_TRACE_TAGS);
-            }
-        }
-
-        return mDefaultTagList;
-    }
-
     public static boolean isTraceurAllowed(Context context) {
         boolean developerOptionsEnabled = Settings.Global.getInt(context.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
diff --git a/src_common/com/android/traceur/PresetTraceConfigs.java b/src_common/com/android/traceur/PresetTraceConfigs.java
new file mode 100644
index 0000000..e083db9
--- /dev/null
+++ b/src_common/com/android/traceur/PresetTraceConfigs.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.traceur;
+
+import android.os.Build;
+import android.util.ArraySet;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+public class PresetTraceConfigs {
+
+    private static final List<String> DEFAULT_TRACE_TAGS = Arrays.asList(
+            "aidl", "am", "binder_driver", "camera", "dalvik", "disk", "freq",
+            "gfx", "hal", "idle", "input", "memory", "memreclaim", "network", "power",
+            "res", "sched", "ss", "sync", "thermal", "view", "webview", "wm", "workq");
+
+    private static final List<String> PERFORMANCE_TRACE_TAGS = DEFAULT_TRACE_TAGS;
+    private static final List<String> UI_TRACE_TAGS = DEFAULT_TRACE_TAGS;
+
+    private static final List<String> THERMAL_TRACE_TAGS = Arrays.asList(
+            "aidl", "am", "binder_driver", "camera", "dalvik", "disk", "freq",
+            "gfx", "hal", "idle", "input", "memory", "memreclaim", "network", "power",
+            "res", "sched", "ss", "sync", "thermal", "thermal_tj", "view", "webview",
+            "wm", "workq");
+
+    private static final List<String> BATTERY_TRACE_TAGS = Arrays.asList(
+            "aidl", "am", "binder_driver", "network", "nnapi",
+            "pm", "power", "ss", "thermal", "wm");
+
+    private static final List<String> USER_BUILD_DISABLED_TRACE_TAGS = Arrays.asList(
+            "workq", "sync");
+
+    private static Set<String> mDefaultTagList = null;
+    private static Set<String> mPerformanceTagList = null;
+    private static Set<String> mBatteryTagList = null;
+    private static Set<String> mThermalTagList = null;
+    private static Set<String> mUiTagList = null;
+
+    public static Set<String> getDefaultTags() {
+        if (mDefaultTagList == null) {
+            mDefaultTagList = new ArraySet<String>(DEFAULT_TRACE_TAGS);
+            updateTagsIfUserBuild(mDefaultTagList);
+        }
+        return mDefaultTagList;
+    }
+
+    public static Set<String> getPerformanceTags() {
+        if (mPerformanceTagList == null) {
+            mPerformanceTagList = new ArraySet<String>(PERFORMANCE_TRACE_TAGS);
+            updateTagsIfUserBuild(mPerformanceTagList);
+        }
+        return mPerformanceTagList;
+    }
+
+    public static Set<String> getBatteryTags() {
+        if (mBatteryTagList == null) {
+            mBatteryTagList = new ArraySet<String>(BATTERY_TRACE_TAGS);
+            updateTagsIfUserBuild(mBatteryTagList);
+        }
+        return mBatteryTagList;
+    }
+
+    public static Set<String> getThermalTags() {
+        if (mThermalTagList == null) {
+            mThermalTagList = new ArraySet<String>(THERMAL_TRACE_TAGS);
+            updateTagsIfUserBuild(mThermalTagList);
+        }
+        return mThermalTagList;
+    }
+
+    public static Set<String> getUiTags() {
+        if (mUiTagList == null) {
+            mUiTagList = new ArraySet<String>(UI_TRACE_TAGS);
+            updateTagsIfUserBuild(mUiTagList);
+        }
+        return mUiTagList;
+    }
+
+    private static void updateTagsIfUserBuild(Collection<String> tags) {
+        if (Build.TYPE.equals("user")) {
+            tags.removeAll(USER_BUILD_DISABLED_TRACE_TAGS);
+        }
+    }
+
+    static class TraceOptions {
+        final int bufferSizeKb;
+        final boolean winscope;
+        final boolean apps;
+        final boolean longTrace;
+        final boolean attachToBugreport;
+        final int maxLongTraceSizeMb;
+        final int maxLongTraceDurationMinutes;
+
+        TraceOptions(int bufferSizeKb, boolean winscope, boolean apps, boolean longTrace,
+                boolean attachToBugreport, int maxLongTraceSizeMb,
+                int maxLongTraceDurationMinutes) {
+            this.bufferSizeKb = bufferSizeKb;
+            this.winscope = winscope;
+            this.apps = apps;
+            this.longTrace = longTrace;
+            this.attachToBugreport = attachToBugreport;
+            this.maxLongTraceSizeMb = maxLongTraceSizeMb;
+            this.maxLongTraceDurationMinutes = maxLongTraceDurationMinutes;
+        }
+    }
+
+    // Keep in sync with default sizes and durations in buffer_sizes.xml.
+    private static final int DEFAULT_BUFFER_SIZE_KB = 16384;
+    private static final int DEFAULT_MAX_LONG_TRACE_SIZE_MB = 10240;
+    private static final int DEFAULT_MAX_LONG_TRACE_DURATION_MINUTES = 30;
+
+    private static final TraceOptions DEFAULT_TRACE_OPTIONS =
+            new TraceOptions(DEFAULT_BUFFER_SIZE_KB,
+                    /* winscope */ false,
+                    /* apps */ true,
+                    /* longTrace */ false,
+                    /* attachToBugreport */ true,
+                    DEFAULT_MAX_LONG_TRACE_SIZE_MB,
+                    DEFAULT_MAX_LONG_TRACE_DURATION_MINUTES);
+
+    private static final TraceOptions PERFORMANCE_TRACE_OPTIONS =
+            new TraceOptions(DEFAULT_BUFFER_SIZE_KB,
+                    /* winscope */ false,
+                    /* apps */ true,
+                    /* longTrace */ false,
+                    /* attachToBugreport */ true,
+                    DEFAULT_MAX_LONG_TRACE_SIZE_MB,
+                    DEFAULT_MAX_LONG_TRACE_DURATION_MINUTES);
+
+    private static final TraceOptions BATTERY_TRACE_OPTIONS =
+            new TraceOptions(DEFAULT_BUFFER_SIZE_KB,
+                    /* winscope */ false,
+                    /* apps */ false,
+                    /* longTrace */ true,
+                    /* attachToBugreport */ true,
+                    DEFAULT_MAX_LONG_TRACE_SIZE_MB,
+                    DEFAULT_MAX_LONG_TRACE_DURATION_MINUTES);
+
+    private static final TraceOptions THERMAL_TRACE_OPTIONS =
+            new TraceOptions(DEFAULT_BUFFER_SIZE_KB,
+                    /* winscope */ false,
+                    /* apps */ true,
+                    /* longTrace */ true,
+                    /* attachToBugreport */ true,
+                    DEFAULT_MAX_LONG_TRACE_SIZE_MB,
+                    DEFAULT_MAX_LONG_TRACE_DURATION_MINUTES);
+
+    private static final TraceOptions UI_TRACE_OPTIONS =
+            new TraceOptions(DEFAULT_BUFFER_SIZE_KB,
+                    /* winscope */ true,
+                    /* apps */ true,
+                    /* longTrace */ true,
+                    /* attachToBugreport */ true,
+                    DEFAULT_MAX_LONG_TRACE_SIZE_MB,
+                    DEFAULT_MAX_LONG_TRACE_DURATION_MINUTES);
+
+    public static TraceOptions getDefaultOptions() {
+        return DEFAULT_TRACE_OPTIONS;
+    }
+
+    public static TraceOptions getPerformanceOptions() {
+        return PERFORMANCE_TRACE_OPTIONS;
+    }
+
+    public static TraceOptions getBatteryOptions() {
+        return BATTERY_TRACE_OPTIONS;
+    }
+
+    public static TraceOptions getThermalOptions() {
+        return THERMAL_TRACE_OPTIONS;
+    }
+
+    public static TraceOptions getUiOptions() {
+        return UI_TRACE_OPTIONS;
+    }
+
+}
diff --git a/src_common/com/android/traceur/TraceUtils.java b/src_common/com/android/traceur/TraceUtils.java
index 9942efb..68e371b 100644
--- a/src_common/com/android/traceur/TraceUtils.java
+++ b/src_common/com/android/traceur/TraceUtils.java
@@ -62,7 +62,42 @@
     private static final Runtime RUNTIME = Runtime.getRuntime();
 
     public enum RecordingType {
-      UNKNOWN, TRACE, STACK_SAMPLES, HEAP_DUMP
+        UNKNOWN, TRACE, STACK_SAMPLES, HEAP_DUMP
+    }
+
+    public enum PresetTraceType {
+        UNSET, PERFORMANCE, BATTERY, THERMAL, UI
+    }
+
+    public static boolean presetTraceStart(ContentResolver contentResolver, PresetTraceType type) {
+        Set<String> tags;
+        PresetTraceConfigs.TraceOptions options;
+        Log.v(TAG, "Using preset of type " + type.toString());
+        switch (type) {
+            case PERFORMANCE:
+                tags = PresetTraceConfigs.getPerformanceTags();
+                options = PresetTraceConfigs.getPerformanceOptions();
+                break;
+            case BATTERY:
+                tags = PresetTraceConfigs.getBatteryTags();
+                options = PresetTraceConfigs.getBatteryOptions();
+                break;
+            case THERMAL:
+                tags = PresetTraceConfigs.getThermalTags();
+                options = PresetTraceConfigs.getThermalOptions();
+                break;
+            case UI:
+                tags = PresetTraceConfigs.getUiTags();
+                options = PresetTraceConfigs.getUiOptions();
+                break;
+            case UNSET:
+            default:
+                tags = PresetTraceConfigs.getDefaultTags();
+                options = PresetTraceConfigs.getDefaultOptions();
+        }
+        return traceStart(contentResolver, tags, options.bufferSizeKb, options.winscope,
+                options.apps, options.longTrace, options.attachToBugreport,
+                options.maxLongTraceSizeMb, options.maxLongTraceDurationMinutes);
     }
 
     public static boolean traceStart(ContentResolver contentResolver, TraceConfig config,