Merge changes I3f912418,Idd2465d5 into rvc-dev

* changes:
  Send boot completed to statsd
  Send puller registration signal to statsd
diff --git a/apex/statsd/aidl/android/os/IStatsd.aidl b/apex/statsd/aidl/android/os/IStatsd.aidl
index d5b5949..80308d2 100644
--- a/apex/statsd/aidl/android/os/IStatsd.aidl
+++ b/apex/statsd/aidl/android/os/IStatsd.aidl
@@ -31,6 +31,11 @@
     oneway void systemRunning();
 
     /**
+     * Tell the stats daemon that the android system has finished booting.
+     */
+    oneway void bootCompleted();
+
+    /**
      * Tell the stats daemon that the StatsCompanionService is up and running.
      * Two-way binder call so that caller knows message received.
      */
@@ -182,10 +187,15 @@
      */
     void sendAppBreadcrumbAtom(int label, int state);
 
-   /**
-    * Registers a puller callback function that, when invoked, pulls the data
-    * for the specified atom tag.
-    */
+    /**
+     * Tell the stats daemon that all the pullers registered during boot have been sent.
+     */
+    oneway void allPullersFromBootRegistered();
+
+    /**
+     * Registers a puller callback function that, when invoked, pulls the data
+     * for the specified atom tag.
+     */
     oneway void registerPullAtomCallback(int uid, int atomTag, long coolDownMillis,
                                          long timeoutMillis,in int[] additiveFields,
                                          IPullAtomCallback pullerCallback);
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanion.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanion.java
index c1ba73f..dc477a5 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsCompanion.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanion.java
@@ -87,6 +87,9 @@
             if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
                 mStatsCompanionService.systemReady();
             }
+            if (phase == PHASE_BOOT_COMPLETED) {
+                mStatsCompanionService.bootCompleted();
+            }
         }
     }
 
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
index 66e41cc..ce5309e 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
@@ -112,6 +112,18 @@
     private final HashMap<Long, String> mDeletedFiles = new HashMap<>();
     private final CompanionHandler mHandler;
 
+    // Flag that is set when PHASE_BOOT_COMPLETED is triggered in the StatsCompanion lifecycle. This
+    // and the flag mSentBootComplete below is used for synchronization to ensure that the boot
+    // complete signal is only ever sent once to statsd. Two signals are needed because
+    // #sayHiToStatsd can be called from both statsd and #onBootPhase
+    // PHASE_THIRD_PARTY_APPS_CAN_START.
+    @GuardedBy("sStatsdLock")
+    private boolean mBootCompleted = false;
+    // Flag that is set when IStatsd#bootCompleted is called. This flag ensures that boot complete
+    // signal is only ever sent once.
+    @GuardedBy("sStatsdLock")
+    private boolean mSentBootComplete = false;
+
     public StatsCompanionService(Context context) {
         super();
         mContext = context;
@@ -688,6 +700,19 @@
                     List.of(appUpdateReceiver, userUpdateReceiver, shutdownEventReceiver));
 
             final long token = Binder.clearCallingIdentity();
+
+            // Used so we can call statsd.bootComplete() outside of the lock.
+            boolean shouldSendBootComplete = false;
+            synchronized (sStatsdLock) {
+                if (mBootCompleted && !mSentBootComplete) {
+                    mSentBootComplete = true;
+                    shouldSendBootComplete = true;
+                }
+            }
+            if (shouldSendBootComplete) {
+                statsd.bootCompleted();
+            }
+
             try {
                 // Pull the latest state of UID->app name, version mapping when
                 // statsd starts.
@@ -749,6 +774,7 @@
                     mContext.unregisterReceiver(receiver);
                 }
                 statsdNotReadyLocked();
+                mSentBootComplete = false;
             }
         }
     }
@@ -758,6 +784,28 @@
         mStatsManagerService.statsdNotReady();
     }
 
+    void bootCompleted() {
+        IStatsd statsd = getStatsdNonblocking();
+        synchronized (sStatsdLock) {
+            mBootCompleted = true;
+            if (mSentBootComplete) {
+                // do not send a boot complete a second time.
+                return;
+            }
+            if (statsd == null) {
+                // Statsd is not yet ready.
+                // Delay the boot completed ping to {@link #sayHiToStatsd()}
+                return;
+            }
+            mSentBootComplete = true;
+        }
+        try {
+            statsd.bootCompleted();
+        } catch (RemoteException e) {
+            Log.e(TAG, "Failed to notify statsd that boot completed");
+        }
+    }
+
     @Override
     protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java
index 58c78da..90764b0 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java
@@ -600,6 +600,7 @@
             statsd.registerPullAtomCallback(key.getUid(), key.getAtom(), value.getCoolDownMillis(),
                     value.getTimeoutMillis(), value.getAdditiveFields(), value.getCallback());
         }
+        statsd.allPullersFromBootRegistered();
     }
 
     // Pre-condition: the Binder calling identity has already been cleared
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 9169eb17..dd1d400 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -1054,6 +1054,14 @@
     return Status::ok();
 }
 
+Status StatsService::bootCompleted() {
+    ENFORCE_UID(AID_SYSTEM);
+
+    VLOG("StatsService::bootCompleted was called");
+
+    return Status::ok();
+}
+
 void StatsService::Startup() {
     mConfigManager->Startup();
     mProcessor->LoadActiveConfigsFromDisk();
@@ -1215,6 +1223,14 @@
     return Status::ok();
 }
 
+Status StatsService::allPullersFromBootRegistered() {
+    ENFORCE_UID(AID_SYSTEM);
+
+    VLOG("StatsService::allPullersFromBootRegistered was called");
+
+    return Status::ok();
+}
+
 Status StatsService::registerPullAtomCallback(int32_t uid, int32_t atomTag, int64_t coolDownMillis,
                                               int64_t timeoutMillis,
                                               const std::vector<int32_t>& additiveFields,
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index 114c84f..23d4c1b 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -64,6 +64,7 @@
 
     virtual Status systemRunning();
     virtual Status statsCompanionReady();
+    virtual Status bootCompleted();
     virtual Status informAnomalyAlarmFired();
     virtual Status informPollAlarmFired();
     virtual Status informAlarmForSubscriberTriggeringFired();
@@ -165,6 +166,11 @@
     virtual Status sendAppBreadcrumbAtom(int32_t label, int32_t state) override;
 
     /**
+     * Binder call to notify statsd that all pullers from boot have been registered.
+     */
+    virtual Status allPullersFromBootRegistered();
+
+    /**
      * Binder call to register a callback function for a pulled atom.
      */
     virtual Status registerPullAtomCallback(