StatsEventParcel impl.; move AIDL files

This implementation continue to uses libbinder, as opposed to
libbinder_ndk.

We also move many (but not all) statsd aidl files from
frameworks/base/core into the apex.

Test: m -j128 && bit statsd_test:*
Change-Id: I95f06e937e50c1e2a638163b13587682402956a7
diff --git a/Android.bp b/Android.bp
index 9426a9c..3dd8a0a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -253,6 +253,8 @@
         ":libcamera_client_aidl",
         ":libcamera_client_framework_aidl",
         ":libupdate_engine_aidl",
+        // TODO: this needs to be removed when statsd-framework.jar is separated out
+        ":statsd_aidl",
         ":storaged_aidl",
         ":vold_aidl",
 
@@ -413,18 +415,6 @@
 }
 
 filegroup {
-    name: "statsd_aidl",
-    srcs: [
-        "core/java/android/os/IPullAtomCallback.aidl",
-        "core/java/android/os/IPullAtomResultReceiver.aidl",
-        "core/java/android/os/IStatsCompanionService.aidl",
-        "core/java/android/os/IStatsManager.aidl",
-        "core/java/android/os/IStatsPullerCallback.aidl",
-    ],
-    path: "core/java",
-}
-
-filegroup {
     name: "libvibrator_aidl",
     srcs: [
         "core/java/android/os/IExternalVibrationController.aidl",
diff --git a/apex/statsd/aidl/Android.bp b/apex/statsd/aidl/Android.bp
new file mode 100644
index 0000000..e6ca544
--- /dev/null
+++ b/apex/statsd/aidl/Android.bp
@@ -0,0 +1,35 @@
+//
+// Copyright (C) 2019 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.
+//
+
+// TODO(b/145815909): move StatsDimensionsValue.aidl and StatsLogEventWrapper.aidl here
+filegroup {
+    name: "statsd_aidl",
+    srcs: ["**/*.aidl"],
+}
+
+// This library is currently unused
+aidl_interface {
+    name: "stats-event-parcel-aidl",
+    srcs: ["android/util/StatsEventParcel.aidl"],
+    backend: {
+        java: {
+            sdk_version: "28",
+        },
+        cpp: {
+            enabled: false,
+        }
+    }
+}
diff --git a/core/java/android/os/IPullAtomCallback.aidl b/apex/statsd/aidl/android/os/IPullAtomCallback.aidl
similarity index 100%
rename from core/java/android/os/IPullAtomCallback.aidl
rename to apex/statsd/aidl/android/os/IPullAtomCallback.aidl
diff --git a/core/java/android/os/IPullAtomResultReceiver.aidl b/apex/statsd/aidl/android/os/IPullAtomResultReceiver.aidl
similarity index 92%
rename from core/java/android/os/IPullAtomResultReceiver.aidl
rename to apex/statsd/aidl/android/os/IPullAtomResultReceiver.aidl
index bfb35ff..00d026e 100644
--- a/core/java/android/os/IPullAtomResultReceiver.aidl
+++ b/apex/statsd/aidl/android/os/IPullAtomResultReceiver.aidl
@@ -16,7 +16,7 @@
 
 package android.os;
 
-import android.util.StatsEvent;
+import android.util.StatsEventParcel;
 
 /**
   * Binder interface to pull atoms for the stats service.
@@ -27,6 +27,6 @@
     /**
      * Indicate that a pull request for an atom is complete.
      */
-     oneway void pullFinished(int atomTag, boolean success, in StatsEvent[] output);
+     oneway void pullFinished(int atomTag, boolean success, in StatsEventParcel[] output);
 
 }
diff --git a/core/java/android/os/IStatsCompanionService.aidl b/apex/statsd/aidl/android/os/IStatsCompanionService.aidl
similarity index 100%
rename from core/java/android/os/IStatsCompanionService.aidl
rename to apex/statsd/aidl/android/os/IStatsCompanionService.aidl
diff --git a/core/java/android/os/IStatsManager.aidl b/apex/statsd/aidl/android/os/IStatsManager.aidl
similarity index 100%
rename from core/java/android/os/IStatsManager.aidl
rename to apex/statsd/aidl/android/os/IStatsManager.aidl
diff --git a/core/java/android/os/IStatsPullerCallback.aidl b/apex/statsd/aidl/android/os/IStatsPullerCallback.aidl
similarity index 100%
rename from core/java/android/os/IStatsPullerCallback.aidl
rename to apex/statsd/aidl/android/os/IStatsPullerCallback.aidl
diff --git a/apex/statsd/aidl/android/util/StatsEventParcel.aidl b/apex/statsd/aidl/android/util/StatsEventParcel.aidl
new file mode 100644
index 0000000..add8bfb
--- /dev/null
+++ b/apex/statsd/aidl/android/util/StatsEventParcel.aidl
@@ -0,0 +1,8 @@
+package android.util;
+
+/**
+ * @hide
+ */
+parcelable StatsEventParcel {
+    byte[] buffer;
+}
diff --git a/cmds/statsd/src/external/PullResultReceiver.cpp b/cmds/statsd/src/external/PullResultReceiver.cpp
index 6bd0545..6b6fe7d 100644
--- a/cmds/statsd/src/external/PullResultReceiver.cpp
+++ b/cmds/statsd/src/external/PullResultReceiver.cpp
@@ -25,12 +25,13 @@
 namespace statsd {
 
 PullResultReceiver::PullResultReceiver(
-        std::function<void(int32_t, bool, const vector<android::util::StatsEvent>&)> pullFinishCb)
+        std::function<void(int32_t, bool, const vector<android::util::StatsEventParcel>&)>
+             pullFinishCb)
     : pullFinishCallback(std::move(pullFinishCb)) {
 }
 
 Status PullResultReceiver::pullFinished(int32_t atomTag, bool success,
-                                        const vector<StatsEvent>& output) {
+                                        const vector<StatsEventParcel>& output) {
     pullFinishCallback(atomTag, success, output);
     return Status::ok();
 }
@@ -40,4 +41,4 @@
 
 }  // namespace statsd
 }  // namespace os
-}  // namespace android
\ No newline at end of file
+}  // namespace android
diff --git a/cmds/statsd/src/external/PullResultReceiver.h b/cmds/statsd/src/external/PullResultReceiver.h
index f731f77..17d06e4 100644
--- a/cmds/statsd/src/external/PullResultReceiver.h
+++ b/cmds/statsd/src/external/PullResultReceiver.h
@@ -24,7 +24,7 @@
 
 class PullResultReceiver : public BnPullAtomResultReceiver {
 public:
-    PullResultReceiver(function<void(int32_t, bool, const vector<android::util::StatsEvent>&)>
+    PullResultReceiver(function<void(int32_t, bool, const vector<android::util::StatsEventParcel>&)>
                                pullFinishCallback);
     ~PullResultReceiver();
 
@@ -32,10 +32,11 @@
      * Binder call for finishing a pull.
      */
     binder::Status pullFinished(int32_t atomTag, bool success,
-                                        const vector<android::util::StatsEvent>& output) override;
+                                const vector<android::util::StatsEventParcel>& output) override;
 
 private:
-    function<void(int32_t, bool, const vector<android::util::StatsEvent>&)> pullFinishCallback;
+    function<void(int32_t, bool, const vector<android::util::StatsEventParcel>&)>
+            pullFinishCallback;
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/external/StatsCallbackPuller.cpp b/cmds/statsd/src/external/StatsCallbackPuller.cpp
index 92db684..f5b1e7f 100644
--- a/cmds/statsd/src/external/StatsCallbackPuller.cpp
+++ b/cmds/statsd/src/external/StatsCallbackPuller.cpp
@@ -20,7 +20,7 @@
 #include "StatsCallbackPuller.h"
 
 #include <android/os/IPullAtomCallback.h>
-#include <android/util/StatsEvent.h>
+#include <android/util/StatsEventParcel.h>
 
 #include "PullResultReceiver.h"
 #include "StatsPullerManager.h"
@@ -57,13 +57,19 @@
 
     sp<PullResultReceiver> resultReceiver = new PullResultReceiver(
             [cv_mutex, cv, pullFinish, pullSuccess, sharedData](
-                    int32_t atomTag, bool success, const vector<StatsEvent>& output) {
+                    int32_t atomTag, bool success, const vector<StatsEventParcel>& output) {
                 // This is the result of the pull, executing in a statsd binder thread.
                 // The pull could have taken a long time, and we should only modify
                 // data (the output param) if the pointer is in scope and the pull did not time out.
                 {
                     lock_guard<mutex> lk(*cv_mutex);
-                    // TODO: fill the shared vector of LogEvents once StatsEvent is complete.
+                    for (const StatsEventParcel& parcel: output) {
+                        shared_ptr<LogEvent> event =
+                              make_shared<LogEvent>(const_cast<uint8_t*>(parcel.buffer.data()),
+                                                    parcel.buffer.size(),
+                                                    /*uid=*/ -1);
+                        sharedData->push_back(event);
+                    }
                     *pullSuccess = success;
                     *pullFinish = true;
                 }
diff --git a/core/java/android/app/StatsManager.java b/core/java/android/app/StatsManager.java
index 2ef0510..90cd51f 100644
--- a/core/java/android/app/StatsManager.java
+++ b/core/java/android/app/StatsManager.java
@@ -34,6 +34,7 @@
 import android.util.AndroidException;
 import android.util.Slog;
 import android.util.StatsEvent;
+import android.util.StatsEventParcel;
 
 import com.android.internal.annotations.GuardedBy;
 
@@ -540,10 +541,12 @@
             mExecutor.execute(() -> {
                 List<StatsEvent> data = new ArrayList<>();
                 boolean success = mCallback.onPullAtom(atomTag, data);
-                StatsEvent[] arr = new StatsEvent[data.size()];
-                arr = data.toArray(arr);
+                StatsEventParcel[] parcels = new StatsEventParcel[data.size()];
+                for (int i = 0; i < data.size(); i++) {
+                    parcels[i].buffer = data.get(i).getBytes();
+                }
                 try {
-                    resultReceiver.pullFinished(atomTag, success, arr);
+                    resultReceiver.pullFinished(atomTag, success, parcels);
                 } catch (RemoteException e) {
                     Slog.w(TAG, "StatsPullResultReceiver failed for tag " + mAtomId);
                 }
diff --git a/core/java/android/util/StatsEvent.java b/core/java/android/util/StatsEvent.java
index 0a4069d..7e71640 100644
--- a/core/java/android/util/StatsEvent.java
+++ b/core/java/android/util/StatsEvent.java
@@ -20,8 +20,6 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.os.Parcel;
-import android.os.Parcelable;
 import android.os.SystemClock;
 
 import com.android.internal.annotations.GuardedBy;
@@ -44,7 +42,7 @@
  * </pre>
  * @hide
  **/
-public final class StatsEvent implements Parcelable {
+public final class StatsEvent {
     // Type Ids.
     /**
      * @hide
@@ -265,39 +263,6 @@
     }
 
     /**
-     * Boilerplate for Parcel.
-     */
-    public static final @NonNull Parcelable.Creator<StatsEvent> CREATOR =
-            new Parcelable.Creator<StatsEvent>() {
-                public StatsEvent createFromParcel(Parcel in) {
-                    // Purposefully leaving this method not implemented.
-                    throw new RuntimeException("Not implemented");
-                }
-
-                public StatsEvent[] newArray(int size) {
-                    // Purposefully leaving this method not implemented.
-                    throw new RuntimeException("Not implemented");
-                }
-            };
-
-    /**
-     * Boilerplate for Parcel.
-     */
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeInt(mAtomId);
-        out.writeInt(getNumBytes());
-        out.writeByteArray(getBytes());
-    }
-
-    /**
-     * Boilerplate for Parcel.
-     */
-    public int describeContents() {
-        return 0;
-    }
-
-
-    /**
      * Builder for constructing a StatsEvent object.
      *
      * <p>This class defines and encapsulates the socket encoding for the buffer.