MediaMetrics: Implement AudioTrack status logging

Convert error field to status field to be more generic.
Incorporate the HeatMap to track general item status.

Test: atest AudioTrackTest#testBuilderError
Test: adb shell dumpsys media.metrics
Bug: 199763036
Change-Id: I53f3064e614d7e49bed3bf63cc5e6faf19684d2f
diff --git a/media/libmediametrics/MediaMetricsItem.cpp b/media/libmediametrics/MediaMetricsItem.cpp
index 36ab8c3..57fc49d 100644
--- a/media/libmediametrics/MediaMetricsItem.cpp
+++ b/media/libmediametrics/MediaMetricsItem.cpp
@@ -57,19 +57,19 @@
     // This may be found in frameworks/av/media/libmediametrics/include/MediaMetricsConstants.h
     static std::unordered_map<std::string, int32_t> map{
         {"",                                      NO_ERROR},
-        {AMEDIAMETRICS_PROP_ERROR_VALUE_OK,       NO_ERROR},
-        {AMEDIAMETRICS_PROP_ERROR_VALUE_ARGUMENT, BAD_VALUE},
-        {AMEDIAMETRICS_PROP_ERROR_VALUE_IO,       DEAD_OBJECT},
-        {AMEDIAMETRICS_PROP_ERROR_VALUE_MEMORY,   NO_MEMORY},
-        {AMEDIAMETRICS_PROP_ERROR_VALUE_SECURITY, PERMISSION_DENIED},
-        {AMEDIAMETRICS_PROP_ERROR_VALUE_STATE,    INVALID_OPERATION},
-        {AMEDIAMETRICS_PROP_ERROR_VALUE_TIMEOUT,  WOULD_BLOCK},
-        {AMEDIAMETRICS_PROP_ERROR_VALUE_UNKNOWN,  UNKNOWN_ERROR},
+        {AMEDIAMETRICS_PROP_STATUS_VALUE_OK,       NO_ERROR},
+        {AMEDIAMETRICS_PROP_STATUS_VALUE_ARGUMENT, BAD_VALUE},
+        {AMEDIAMETRICS_PROP_STATUS_VALUE_IO,       DEAD_OBJECT},
+        {AMEDIAMETRICS_PROP_STATUS_VALUE_MEMORY,   NO_MEMORY},
+        {AMEDIAMETRICS_PROP_STATUS_VALUE_SECURITY, PERMISSION_DENIED},
+        {AMEDIAMETRICS_PROP_STATUS_VALUE_STATE,    INVALID_OPERATION},
+        {AMEDIAMETRICS_PROP_STATUS_VALUE_TIMEOUT,  WOULD_BLOCK},
+        {AMEDIAMETRICS_PROP_STATUS_VALUE_UNKNOWN,  UNKNOWN_ERROR},
     };
     return map;
 }
 
-status_t errorStringToStatus(const char *error) {
+status_t statusStringToStatus(const char *error) {
     const auto& map = getErrorStringMap();
     if (error == nullptr || error[0] == '\0') return NO_ERROR;
     auto it = map.find(error);
diff --git a/media/libmediametrics/include/MediaMetricsConstants.h b/media/libmediametrics/include/MediaMetricsConstants.h
index 7d120b5..2bf72a7 100644
--- a/media/libmediametrics/include/MediaMetricsConstants.h
+++ b/media/libmediametrics/include/MediaMetricsConstants.h
@@ -119,18 +119,6 @@
 #define AMEDIAMETRICS_PROP_DURATIONNS     "durationNs"     // int64 duration time span
 #define AMEDIAMETRICS_PROP_ENCODING       "encoding"       // string value of format
 
-// Error statistics
-#define AMEDIAMETRICS_PROP_ERROR          "error#"         // string, empty or one of
-                                                           // AMEDIAMETRICS_PROP_ERROR_VALUE_*
-                                                           // Used for error categorization.
-#define AMEDIAMETRICS_PROP_ERRORSUBCODE   "errorSubCode#"  // int32, specific code for error
-                                                           // used in conjunction with error#.
-#define AMEDIAMETRICS_PROP_ERRORMESSAGE   "errorMessage#"  // string, supplemental to error.
-                                                           // Arbitrary information treated as
-                                                           // informational, may be logcat msg,
-                                                           // or an exception with stack trace.
-                                                           // Treated as "debug" information.
-
 #define AMEDIAMETRICS_PROP_EVENT          "event#"         // string value (often func name)
 #define AMEDIAMETRICS_PROP_EXECUTIONTIMENS "executionTimeNs"  // time to execute the event
 
@@ -162,7 +150,17 @@
 #define AMEDIAMETRICS_PROP_STARTUPMS      "startupMs"      // double value
 // State is "ACTIVE" or "STOPPED" for AudioRecord
 #define AMEDIAMETRICS_PROP_STATE          "state"          // string
-#define AMEDIAMETRICS_PROP_STATUS         "status"         // int32 status_t
+#define AMEDIAMETRICS_PROP_STATUS         "status#"        // int32 status_t
+                                                           // AAudio uses their own status codes
+// Supplemental information to the status code.
+#define AMEDIAMETRICS_PROP_STATUSSUBCODE  "statusSubCode"  // int32, specific code
+                                                           // used in conjunction with status.
+#define AMEDIAMETRICS_PROP_STATUSMESSAGE  "statusMessage"  // string, supplemental info.
+                                                           // Arbitrary information treated as
+                                                           // informational, may be logcat msg,
+                                                           // or an exception with stack trace.
+                                                           // Treated as "debug" information.
+
 #define AMEDIAMETRICS_PROP_STREAMTYPE     "streamType"     // string (AudioTrack)
 #define AMEDIAMETRICS_PROP_THREADID       "threadId"       // int32 value io handle
 #define AMEDIAMETRICS_PROP_THROTTLEMS     "throttleMs"     // double
@@ -237,17 +235,20 @@
 // https://cs.android.com/android/platform/superproject/+/master:frameworks/native/libs/binder/include/binder/Status.h;drc=88e25c0861499ee3ab885814dddc097ab234cb7b;l=57
 // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/media/java/android/media/AudioSystem.java;drc=3ac246c43294d7f7012bdcb0ccb7bae1aa695bd4;l=785
 // https://cs.android.com/android/platform/superproject/+/master:frameworks/av/media/libaaudio/include/aaudio/AAudio.h;drc=cfd3a6fa3aaaf712a890dc02452b38ef401083b8;l=120
+// https://abseil.io/docs/cpp/guides/status-codes
 
 // Status errors:
 // An empty status string or "ok" is interpreted as no error.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_OK                 "ok"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_OK                "ok"
 
 // Error category: argument
 //   IllegalArgumentException
 //   NullPointerException
 //   BAD_VALUE
+//   absl::INVALID_ARGUMENT
+//   absl::OUT_OF_RANGE
 //   Out of range, out of bounds.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_ARGUMENT           "argument"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_ARGUMENT          "argument"
 
 // Error category: io
 //   IOException
@@ -258,36 +259,48 @@
 //   file or ioctl failure
 //   Service, rpc, binder, or socket failure.
 //   Hardware or device failure.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_IO                 "io"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_IO                "io"
 
 // Error category: outOfMemory
 //   OutOfMemoryException
 //   NO_MEMORY
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_MEMORY             "memory"
+//   absl::RESOURCE_EXHAUSTED
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_MEMORY            "memory"
 
 // Error category: security
 //   SecurityException
 //   PERMISSION_DENIED
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_SECURITY           "security"
+//   absl::PERMISSION_DENIED
+//   absl::UNAUTHENTICATED
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_SECURITY          "security"
 
 // Error category: state
 //   IllegalStateException
 //   UnsupportedOperationException
 //   INVALID_OPERATION
 //   NO_INIT
+//   absl::NOT_FOUND
+//   absl::ALREADY_EXISTS
+//   absl::FAILED_PRECONDITION
+//   absl::UNAVAILABLE
+//   absl::UNIMPLEMENTED
 //   Functionality not implemented (argument may or may not be correct).
 //   Call unexpected or out of order.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_STATE              "state"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_STATE             "state"
 
 // Error category: timeout
 //   TimeoutException
 //   WOULD_BLOCK
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_TIMEOUT            "timeout"
+//   absl::DEADLINE_EXCEEDED
+//   absl::ABORTED
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_TIMEOUT           "timeout"
 
 // Error category: unknown
 //   Exception (Java specified not listed above, or custom app/service)
 //   UNKNOWN_ERROR
+//   absl::INTERNAL
+//   absl::DATA_LOSS
 //   Catch-all bucket for errors not listed above.
-#define AMEDIAMETRICS_PROP_ERROR_VALUE_UNKNOWN            "unknown"
+#define AMEDIAMETRICS_PROP_STATUS_VALUE_UNKNOWN           "unknown"
 
 #endif // ANDROID_MEDIA_MEDIAMETRICSCONSTANTS_H
diff --git a/media/libmediametrics/include/media/MediaMetricsItem.h b/media/libmediametrics/include/media/MediaMetricsItem.h
index 87f608f..de56665 100644
--- a/media/libmediametrics/include/media/MediaMetricsItem.h
+++ b/media/libmediametrics/include/media/MediaMetricsItem.h
@@ -106,34 +106,34 @@
 };
 
 /*
- * Helper for error conversions
+ * Helper for status conversions
  */
 
-static inline constexpr const char* statusToErrorString(status_t status) {
+inline constexpr const char* statusToStatusString(status_t status) {
     switch (status) {
-    case NO_ERROR:
-        return "";
     case BAD_VALUE:
-        return AMEDIAMETRICS_PROP_ERROR_VALUE_ARGUMENT;
+        return AMEDIAMETRICS_PROP_STATUS_VALUE_ARGUMENT;
     case DEAD_OBJECT:
     case FAILED_TRANSACTION:
-        return AMEDIAMETRICS_PROP_ERROR_VALUE_IO;
+        return AMEDIAMETRICS_PROP_STATUS_VALUE_IO;
     case NO_MEMORY:
-        return AMEDIAMETRICS_PROP_ERROR_VALUE_MEMORY;
+        return AMEDIAMETRICS_PROP_STATUS_VALUE_MEMORY;
     case PERMISSION_DENIED:
-        return AMEDIAMETRICS_PROP_ERROR_VALUE_SECURITY;
+        return AMEDIAMETRICS_PROP_STATUS_VALUE_SECURITY;
     case NO_INIT:
     case INVALID_OPERATION:
-        return AMEDIAMETRICS_PROP_ERROR_VALUE_STATE;
+        return AMEDIAMETRICS_PROP_STATUS_VALUE_STATE;
     case WOULD_BLOCK:
-        return AMEDIAMETRICS_PROP_ERROR_VALUE_TIMEOUT;
-    case UNKNOWN_ERROR:
+        return AMEDIAMETRICS_PROP_STATUS_VALUE_TIMEOUT;
     default:
-        return AMEDIAMETRICS_PROP_ERROR_VALUE_UNKNOWN;
+        if (status >= 0) return AMEDIAMETRICS_PROP_STATUS_VALUE_OK; // non-negative values "OK"
+        [[fallthrough]];            // negative values are error.
+    case UNKNOWN_ERROR:
+        return AMEDIAMETRICS_PROP_STATUS_VALUE_UNKNOWN;
     }
 }
 
-status_t errorStringToStatus(const char *error);
+status_t statusStringToStatus(const char *error);
 
 /*
  * Time printing