Merge "Wrap StatsDimensionsValue over structured parcel" into rvc-dev
diff --git a/apex/framework/test/TEST_MAPPING b/apex/TEST_MAPPING
similarity index 60%
rename from apex/framework/test/TEST_MAPPING
rename to apex/TEST_MAPPING
index f387958..93f1087 100644
--- a/apex/framework/test/TEST_MAPPING
+++ b/apex/TEST_MAPPING
@@ -2,6 +2,9 @@
   "presubmit" : [
     {
       "name" : "FrameworkStatsdTest"
+    },
+    {
+      "name" : "LibStatsPullTests"
     }
   ]
 }
diff --git a/apex/aidl/android/os/IStatsd.aidl b/apex/aidl/android/os/IStatsd.aidl
index c8aec53..d5b5949 100644
--- a/apex/aidl/android/os/IStatsd.aidl
+++ b/apex/aidl/android/os/IStatsd.aidl
@@ -190,11 +190,13 @@
                                          long timeoutMillis,in int[] additiveFields,
                                          IPullAtomCallback pullerCallback);
 
-   /**
-    * Registers a puller callback function that, when invoked, pulls the data
-    * for the specified atom tag.
-    */
-    oneway void registerNativePullAtomCallback(int atomTag, long coolDownNs, long timeoutNs,
+    /**
+     * Registers a puller callback function that, when invoked, pulls the data
+     * for the specified atom tag.
+     *
+     * Enforces the REGISTER_STATS_PULL_ATOM permission.
+     */
+    oneway void registerNativePullAtomCallback(int atomTag, long coolDownMillis, long timeoutMillis,
                            in int[] additiveFields, IPullAtomCallback pullerCallback);
 
     /**
@@ -203,7 +205,9 @@
     oneway void unregisterPullAtomCallback(int uid, int atomTag);
 
     /**
-     * Unregisters any pullAtomCallback for the given atom.
+     * Unregisters any pullAtomCallback for the given atom + caller.
+     *
+     * Enforces the REGISTER_STATS_PULL_ATOM permission.
      */
     oneway void unregisterNativePullAtomCallback(int atomTag);
 
diff --git a/apex/framework/api/current.txt b/apex/framework/api/current.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/apex/framework/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/apex/framework/api/module-lib-current.txt b/apex/framework/api/module-lib-current.txt
new file mode 100644
index 0000000..8b6e217
--- /dev/null
+++ b/apex/framework/api/module-lib-current.txt
@@ -0,0 +1,10 @@
+// Signature format: 2.0
+package android.os {
+
+  public class StatsFrameworkInitializer {
+    method public static void registerServiceWrappers();
+    method public static void setStatsServiceManager(@NonNull android.os.StatsServiceManager);
+  }
+
+}
+
diff --git a/apex/framework/api/module-lib-removed.txt b/apex/framework/api/module-lib-removed.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/apex/framework/api/module-lib-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/apex/framework/api/removed.txt b/apex/framework/api/removed.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/apex/framework/api/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/apex/framework/api/system-current.txt b/apex/framework/api/system-current.txt
new file mode 100644
index 0000000..3ea5724
--- /dev/null
+++ b/apex/framework/api/system-current.txt
@@ -0,0 +1,111 @@
+// Signature format: 2.0
+package android.app {
+
+  public final class StatsManager {
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
+    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]);
+    method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void clearPullAtomCallback(int);
+    method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getData(long);
+    method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getMetadata();
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] getRegisteredExperimentIds() throws android.app.StatsManager.StatsUnavailableException;
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException;
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
+    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long);
+    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
+    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
+    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent);
+    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
+    method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void setPullAtomCallback(int, @Nullable android.app.StatsManager.PullAtomMetadata, @NonNull java.util.concurrent.Executor, @NonNull android.app.StatsManager.StatsPullAtomCallback);
+    field public static final String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
+    field public static final String EXTRA_STATS_ACTIVE_CONFIG_KEYS = "android.app.extra.STATS_ACTIVE_CONFIG_KEYS";
+    field public static final String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
+    field public static final String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
+    field public static final String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID";
+    field public static final String EXTRA_STATS_DIMENSIONS_VALUE = "android.app.extra.STATS_DIMENSIONS_VALUE";
+    field public static final String EXTRA_STATS_SUBSCRIPTION_ID = "android.app.extra.STATS_SUBSCRIPTION_ID";
+    field public static final String EXTRA_STATS_SUBSCRIPTION_RULE_ID = "android.app.extra.STATS_SUBSCRIPTION_RULE_ID";
+    field public static final int PULL_SKIP = 1; // 0x1
+    field public static final int PULL_SUCCESS = 0; // 0x0
+  }
+
+  public static class StatsManager.PullAtomMetadata {
+    method @Nullable public int[] getAdditiveFields();
+    method public long getCoolDownMillis();
+    method public long getTimeoutMillis();
+  }
+
+  public static class StatsManager.PullAtomMetadata.Builder {
+    ctor public StatsManager.PullAtomMetadata.Builder();
+    method @NonNull public android.app.StatsManager.PullAtomMetadata build();
+    method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setAdditiveFields(@NonNull int[]);
+    method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setCoolDownMillis(long);
+    method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setTimeoutMillis(long);
+  }
+
+  public static interface StatsManager.StatsPullAtomCallback {
+    method public int onPullAtom(int, @NonNull java.util.List<android.util.StatsEvent>);
+  }
+
+  public static class StatsManager.StatsUnavailableException extends android.util.AndroidException {
+    ctor public StatsManager.StatsUnavailableException(String);
+    ctor public StatsManager.StatsUnavailableException(String, Throwable);
+  }
+
+}
+
+package android.os {
+
+  public final class StatsDimensionsValue implements android.os.Parcelable {
+    method public int describeContents();
+    method public boolean getBooleanValue();
+    method public int getField();
+    method public float getFloatValue();
+    method public int getIntValue();
+    method public long getLongValue();
+    method public String getStringValue();
+    method public java.util.List<android.os.StatsDimensionsValue> getTupleValueList();
+    method public int getValueType();
+    method public boolean isValueType(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final int BOOLEAN_VALUE_TYPE = 5; // 0x5
+    field @NonNull public static final android.os.Parcelable.Creator<android.os.StatsDimensionsValue> CREATOR;
+    field public static final int FLOAT_VALUE_TYPE = 6; // 0x6
+    field public static final int INT_VALUE_TYPE = 3; // 0x3
+    field public static final int LONG_VALUE_TYPE = 4; // 0x4
+    field public static final int STRING_VALUE_TYPE = 2; // 0x2
+    field public static final int TUPLE_VALUE_TYPE = 7; // 0x7
+  }
+
+}
+
+package android.util {
+
+  public final class StatsEvent {
+    method @NonNull public static android.util.StatsEvent.Builder newBuilder();
+  }
+
+  public static final class StatsEvent.Builder {
+    method @NonNull public android.util.StatsEvent.Builder addBooleanAnnotation(byte, boolean);
+    method @NonNull public android.util.StatsEvent.Builder addIntAnnotation(byte, int);
+    method @NonNull public android.util.StatsEvent build();
+    method @NonNull public android.util.StatsEvent.Builder setAtomId(int);
+    method @NonNull public android.util.StatsEvent.Builder usePooledBuffer();
+    method @NonNull public android.util.StatsEvent.Builder writeAttributionChain(@NonNull int[], @NonNull String[]);
+    method @NonNull public android.util.StatsEvent.Builder writeBoolean(boolean);
+    method @NonNull public android.util.StatsEvent.Builder writeByteArray(@NonNull byte[]);
+    method @NonNull public android.util.StatsEvent.Builder writeFloat(float);
+    method @NonNull public android.util.StatsEvent.Builder writeInt(int);
+    method @NonNull public android.util.StatsEvent.Builder writeKeyValuePairs(@Nullable android.util.SparseIntArray, @Nullable android.util.SparseLongArray, @Nullable android.util.SparseArray<java.lang.String>, @Nullable android.util.SparseArray<java.lang.Float>);
+    method @NonNull public android.util.StatsEvent.Builder writeLong(long);
+    method @NonNull public android.util.StatsEvent.Builder writeString(@NonNull String);
+  }
+
+  public final class StatsLog {
+    method public static void write(@NonNull android.util.StatsEvent);
+    method public static void writeRaw(@NonNull byte[], int);
+  }
+
+}
+
diff --git a/apex/framework/api/system-removed.txt b/apex/framework/api/system-removed.txt
new file mode 100644
index 0000000..d802177
--- /dev/null
+++ b/apex/framework/api/system-removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/apex/service/Android.bp b/apex/service/Android.bp
index ff56bb5..df0ccfc 100644
--- a/apex/service/Android.bp
+++ b/apex/service/Android.bp
@@ -1,6 +1,16 @@
-// Statsd Service jar, which will eventually be put in the statsd mainline apex.
-// service-statsd needs to be added to PRODUCT_UPDATABLE_SYSTEM_SERVER_JARS.
-// This jar will contain StatsCompanionService
+// Copyright (C) 2020 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.
 
 filegroup {
     name: "service-statsd-sources",
@@ -11,28 +21,13 @@
 
 java_library {
     name: "service-statsd",
-    installable: true,
-
-    srcs: [
-        ":service-statsd-sources",
-    ],
-
-    // TODO(b/146757305) should be "module_current" since not allowed to use
-    // @CorePlatformApi's
-    sdk_version: "core_platform",
-
+    srcs: [ ":service-statsd-sources" ],
+    sdk_version: "system_server_current",
     libs: [
         "framework-annotations-lib",
-        "services-stubs",
         "framework-statsd",
-
-        // TODO(b/146757305): should be unnecessary once
-        // sdk_version="module_lib_current" or "module_current"
-        "android_module_lib_stubs_current",
     ],
-
     plugins: ["java_api_finder"],
-
     apex_available: [
         "com.android.os.statsd",
         "test_com.android.os.statsd",
diff --git a/apex/service/java/com/android/server/stats/StatsCompanionService.java b/apex/service/java/com/android/server/stats/StatsCompanionService.java
index c84627d..aad5112 100644
--- a/apex/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/service/java/com/android/server/stats/StatsCompanionService.java
@@ -30,6 +30,7 @@
 import android.content.pm.ResolveInfo;
 import android.os.Binder;
 import android.os.Bundle;
+import android.os.FileUtils;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.IBinder;
@@ -37,6 +38,7 @@
 import android.os.IStatsd;
 import android.os.Looper;
 import android.os.ParcelFileDescriptor;
+import android.os.PowerManager;
 import android.os.RemoteException;
 import android.os.StatsFrameworkInitializer;
 import android.os.SystemClock;
@@ -47,8 +49,6 @@
 
 import com.android.internal.annotations.GuardedBy;
 
-import libcore.io.IoUtils;
-
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.FileOutputStream;
@@ -100,9 +100,9 @@
     private static IStatsd sStatsd;
     private static final Object sStatsdLock = new Object();
 
-    private final OnAlarmListener mAnomalyAlarmListener = new AnomalyAlarmListener();
-    private final OnAlarmListener mPullingAlarmListener = new PullingAlarmListener();
-    private final OnAlarmListener mPeriodicAlarmListener = new PeriodicAlarmListener();
+    private final OnAlarmListener mAnomalyAlarmListener;
+    private final OnAlarmListener mPullingAlarmListener;
+    private final OnAlarmListener mPeriodicAlarmListener;
 
     private StatsManagerService mStatsManagerService;
 
@@ -121,6 +121,9 @@
         handlerThread.start();
         mHandler = new CompanionHandler(handlerThread.getLooper());
 
+        mAnomalyAlarmListener = new AnomalyAlarmListener(context);
+        mPullingAlarmListener = new PullingAlarmListener(context);
+        mPeriodicAlarmListener = new PeriodicAlarmListener(context);
     }
 
     private final static int[] toIntArray(List<Integer> list) {
@@ -226,13 +229,38 @@
                     Log.d(TAG, "Sent data for " + numRecords + " apps");
                 }
             } finally {
-                IoUtils.closeQuietly(fout);
+                FileUtils.closeQuietly(fout);
                 backgroundThread.quit();
                 backgroundThread.interrupt();
             }
         });
     }
 
+    private static class WakelockThread extends Thread {
+        private final PowerManager.WakeLock mWl;
+        private final Runnable mRunnable;
+
+        WakelockThread(Context context, String wakelockName, Runnable runnable) {
+            PowerManager powerManager = (PowerManager)
+                    context.getSystemService(Context.POWER_SERVICE);
+            mWl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakelockName);
+            mRunnable = runnable;
+        }
+        @Override
+        public void run() {
+            try {
+                mRunnable.run();
+            } finally {
+                mWl.release();
+            }
+        }
+        @Override
+        public void start() {
+            mWl.acquire();
+            super.start();
+        }
+    }
+
     private final static class AppUpdateReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -308,6 +336,12 @@
     }
 
     public static final class AnomalyAlarmListener implements OnAlarmListener {
+        private final Context mContext;
+
+        AnomalyAlarmListener(Context context) {
+            mContext = context;
+        }
+
         @Override
         public void onAlarm() {
             if (DEBUG) {
@@ -319,17 +353,30 @@
                 Log.w(TAG, "Could not access statsd to inform it of anomaly alarm firing");
                 return;
             }
-            try {
-                // Two-way call to statsd to retain AlarmManager wakelock
-                statsd.informAnomalyAlarmFired();
-            } catch (RemoteException e) {
-                Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e);
-            }
-            // AlarmManager releases its own wakelock here.
+
+            // Wakelock needs to be retained while calling statsd.
+            Thread thread = new WakelockThread(mContext,
+                    AnomalyAlarmListener.class.getCanonicalName(), new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                statsd.informAnomalyAlarmFired();
+                            } catch (RemoteException e) {
+                                Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e);
+                            }
+                        }
+                    });
+            thread.start();
         }
     }
 
     public final static class PullingAlarmListener implements OnAlarmListener {
+        private final Context mContext;
+
+        PullingAlarmListener(Context context) {
+            mContext = context;
+        }
+
         @Override
         public void onAlarm() {
             if (DEBUG) {
@@ -340,16 +387,30 @@
                 Log.w(TAG, "Could not access statsd to inform it of pulling alarm firing.");
                 return;
             }
-            try {
-                // Two-way call to statsd to retain AlarmManager wakelock
-                statsd.informPollAlarmFired();
-            } catch (RemoteException e) {
-                Log.w(TAG, "Failed to inform statsd of pulling alarm firing.", e);
-            }
+
+            // Wakelock needs to be retained while calling statsd.
+            Thread thread = new WakelockThread(mContext,
+                    PullingAlarmListener.class.getCanonicalName(), new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                statsd.informPollAlarmFired();
+                            } catch (RemoteException e) {
+                                Log.w(TAG, "Failed to inform statsd of pulling alarm firing.", e);
+                            }
+                        }
+                    });
+            thread.start();
         }
     }
 
     public final static class PeriodicAlarmListener implements OnAlarmListener {
+        private final Context mContext;
+
+        PeriodicAlarmListener(Context context) {
+            mContext = context;
+        }
+
         @Override
         public void onAlarm() {
             if (DEBUG) {
@@ -360,13 +421,20 @@
                 Log.w(TAG, "Could not access statsd to inform it of periodic alarm firing.");
                 return;
             }
-            try {
-                // Two-way call to statsd to retain AlarmManager wakelock
-                statsd.informAlarmForSubscriberTriggeringFired();
-            } catch (RemoteException e) {
-                Log.w(TAG, "Failed to inform statsd of periodic alarm firing.", e);
-            }
-            // AlarmManager releases its own wakelock here.
+
+            // Wakelock needs to be retained while calling statsd.
+            Thread thread = new WakelockThread(mContext,
+                    PeriodicAlarmListener.class.getCanonicalName(), new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                statsd.informAlarmForSubscriberTriggeringFired();
+                            } catch (RemoteException e) {
+                                Log.w(TAG, "Failed to inform statsd of periodic alarm firing.", e);
+                            }
+                        }
+                    });
+            thread.start();
         }
     }
 
diff --git a/apex/tests/libstatspull/AndroidManifest.xml b/apex/tests/libstatspull/AndroidManifest.xml
index bffd400..0c669b0 100644
--- a/apex/tests/libstatspull/AndroidManifest.xml
+++ b/apex/tests/libstatspull/AndroidManifest.xml
@@ -21,6 +21,7 @@
 
     <uses-permission android:name="android.permission.DUMP" />
     <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
+    <uses-permission android:name="android.permission.REGISTER_STATS_PULL_ATOM" />
 
     <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.internal.os.statsd.libstats"
diff --git a/apex/tests/libstatspull/TEST_MAPPING b/apex/tests/libstatspull/TEST_MAPPING
deleted file mode 100644
index 5e1178c..0000000
--- a/apex/tests/libstatspull/TEST_MAPPING
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "presubmit" : [
-    {
-      "name" : "LibStatsPullTests"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/apex/tests/libstatspull/jni/stats_pull_helper.cpp b/apex/tests/libstatspull/jni/stats_pull_helper.cpp
index 9e5aa95..166592d 100644
--- a/apex/tests/libstatspull/jni/stats_pull_helper.cpp
+++ b/apex/tests/libstatspull/jni/stats_pull_helper.cpp
@@ -44,30 +44,27 @@
     return sPullReturnVal;
 }
 
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_registerStatsPuller(
-        JNIEnv* /*env*/, jobject /* this */, jint atomTag, jlong timeoutNs, jlong coolDownNs,
-        jint pullRetVal, jlong latencyMillis, int atomsPerPull)
-{
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_setStatsPuller(
+        JNIEnv* /*env*/, jobject /* this */, jint atomTag, jlong timeoutMillis,
+        jlong coolDownMillis, jint pullRetVal, jlong latencyMillis, int atomsPerPull) {
     sAtomTag = atomTag;
     sPullReturnVal = pullRetVal;
     sLatencyMillis = latencyMillis;
     sAtomsPerPull = atomsPerPull;
     sNumPulls = 0;
     AStatsManager_PullAtomMetadata* metadata = AStatsManager_PullAtomMetadata_obtain();
-    AStatsManager_PullAtomMetadata_setCoolDownNs(metadata, coolDownNs);
-    AStatsManager_PullAtomMetadata_setTimeoutNs(metadata, timeoutNs);
+    AStatsManager_PullAtomMetadata_setCoolDownMillis(metadata, coolDownMillis);
+    AStatsManager_PullAtomMetadata_setTimeoutMillis(metadata, timeoutMillis);
 
-    AStatsManager_registerPullAtomCallback(sAtomTag, &pullAtomCallback, metadata, nullptr);
+    AStatsManager_setPullAtomCallback(sAtomTag, metadata, &pullAtomCallback, nullptr);
     AStatsManager_PullAtomMetadata_release(metadata);
 }
 
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_unregisterStatsPuller(
-        JNIEnv* /*env*/, jobject /* this */, jint /*atomTag*/)
-{
-    AStatsManager_unregisterPullAtomCallback(sAtomTag);
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_clearStatsPuller(JNIEnv* /*env*/,
+                                                                                jobject /* this */,
+                                                                                jint /*atomTag*/) {
+    AStatsManager_clearPullAtomCallback(sAtomTag);
 }
 } // namespace
diff --git a/apex/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java b/apex/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
index d4e51e0..3f199e8 100644
--- a/apex/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
+++ b/apex/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
@@ -58,8 +58,8 @@
     private static int sPullReturnValue;
     private static long sConfigId;
     private static long sPullLatencyMillis;
-    private static long sPullTimeoutNs;
-    private static long sCoolDownNs;
+    private static long sPullTimeoutMillis;
+    private static long sCoolDownMillis;
     private static int sAtomsPerPull;
 
     static {
@@ -75,8 +75,8 @@
         assertThat(InstrumentationRegistry.getInstrumentation()).isNotNull();
         sPullReturnValue = StatsManager.PULL_SUCCESS;
         sPullLatencyMillis = 0;
-        sPullTimeoutNs = 10_000_000_000L;
-        sCoolDownNs = 1_000_000_000L;
+        sPullTimeoutMillis = 10_000L;
+        sCoolDownMillis = 1_000L;
         sAtomsPerPull = 1;
     }
 
@@ -85,7 +85,7 @@
      */
     @After
     public void tearDown() throws Exception {
-        unregisterStatsPuller(PULL_ATOM_TAG);
+        clearStatsPuller(PULL_ATOM_TAG);
         StatsManager statsManager = (StatsManager) mContext.getSystemService(
                 Context.STATS_MANAGER);
         statsManager.removeConfig(sConfigId);
@@ -102,14 +102,14 @@
         createAndAddConfigToStatsd(statsManager);
 
         // Add the puller.
-        registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+        setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
                 sPullLatencyMillis, sAtomsPerPull);
         Thread.sleep(SHORT_SLEEP_MILLIS);
         StatsLog.logStart(APP_BREADCRUMB_LABEL);
         // Let the current bucket finish.
         Thread.sleep(LONG_SLEEP_MILLIS);
         List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
-        unregisterStatsPuller(PULL_ATOM_TAG);
+        clearStatsPuller(PULL_ATOM_TAG);
         assertThat(data.size()).isEqualTo(1);
         TestAtoms.PullCallbackAtomWrapper atomWrapper = null;
         try {
@@ -135,14 +135,14 @@
         createAndAddConfigToStatsd(statsManager);
         sPullReturnValue = StatsManager.PULL_SKIP;
         // Add the puller.
-        registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+        setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
                 sPullLatencyMillis, sAtomsPerPull);
         Thread.sleep(SHORT_SLEEP_MILLIS);
         StatsLog.logStart(APP_BREADCRUMB_LABEL);
         // Let the current bucket finish.
         Thread.sleep(LONG_SLEEP_MILLIS);
         List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
-        unregisterStatsPuller(PULL_ATOM_TAG);
+        clearStatsPuller(PULL_ATOM_TAG);
         assertThat(data.size()).isEqualTo(0);
     }
 
@@ -157,17 +157,17 @@
         // The puller will sleep for 1.5 sec.
         sPullLatencyMillis = 1_500;
         // 1 second timeout
-        sPullTimeoutNs = 1_000_000_000;
+        sPullTimeoutMillis = 1_000;
 
         // Add the puller.
-        registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+        setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
                 sPullLatencyMillis, sAtomsPerPull);
         Thread.sleep(SHORT_SLEEP_MILLIS);
         StatsLog.logStart(APP_BREADCRUMB_LABEL);
         // Let the current bucket finish and the pull timeout.
         Thread.sleep(sPullLatencyMillis * 2);
         List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
-        unregisterStatsPuller(PULL_ATOM_TAG);
+        clearStatsPuller(PULL_ATOM_TAG);
         assertThat(data.size()).isEqualTo(0);
     }
 
@@ -181,9 +181,9 @@
         createAndAddConfigToStatsd(statsManager);
 
         // Set the cooldown to 10 seconds
-        sCoolDownNs = 10_000_000_000L;
+        sCoolDownMillis = 10_000L;
         // Add the puller.
-        registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+        setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
                 sPullLatencyMillis, sAtomsPerPull);
 
         Thread.sleep(SHORT_SLEEP_MILLIS);
@@ -192,7 +192,7 @@
         StatsLog.logStart(APP_BREADCRUMB_LABEL);
         Thread.sleep(LONG_SLEEP_MILLIS);
         List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
-        unregisterStatsPuller(PULL_ATOM_TAG);
+        clearStatsPuller(PULL_ATOM_TAG);
         assertThat(data.size()).isEqualTo(2);
         for (int i = 0; i < data.size(); i++) {
             TestAtoms.PullCallbackAtomWrapper atomWrapper = null;
@@ -221,7 +221,7 @@
         createAndAddConfigToStatsd(statsManager);
         sAtomsPerPull = 1000;
         // Add the puller.
-        registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+        setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
                 sPullLatencyMillis, sAtomsPerPull);
 
         Thread.sleep(SHORT_SLEEP_MILLIS);
@@ -229,7 +229,7 @@
         // Let the current bucket finish.
         Thread.sleep(LONG_SLEEP_MILLIS);
         List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
-        unregisterStatsPuller(PULL_ATOM_TAG);
+        clearStatsPuller(PULL_ATOM_TAG);
         assertThat(data.size()).isEqualTo(sAtomsPerPull);
 
         for (int i = 0; i < data.size(); i++) {
@@ -276,9 +276,9 @@
         assertThat(StatsConfigUtils.verifyValidConfigExists(statsManager, sConfigId)).isTrue();
     }
 
-    private native void registerStatsPuller(int atomTag, long timeoutNs, long coolDownNs,
+    private native void setStatsPuller(int atomTag, long timeoutMillis, long coolDownMillis,
             int pullReturnVal, long latencyMillis, int atomPerPull);
 
-    private native void unregisterStatsPuller(int atomTag);
+    private native void clearStatsPuller(int atomTag);
 }