Pass in event time when notifying listeners of a state change

Add an event time parameter to onStateChanged. Value and Duration
metrics need the event time for aggregation.

Test: bit statsd_test:*
Change-Id: I73c7a16de158de43bd9fbeb26ab8f0c32559a4a2
diff --git a/cmds/statsd/src/state/StateTracker.cpp b/cmds/statsd/src/state/StateTracker.cpp
index e6f6122..90ce1e9 100644
--- a/cmds/statsd/src/state/StateTracker.cpp
+++ b/cmds/statsd/src/state/StateTracker.cpp
@@ -38,49 +38,51 @@
 }
 
 void StateTracker::onLogEvent(const LogEvent& event) {
-    // parse event for primary field values i.e. primary key
+    int64_t eventTimeNs = event.GetElapsedTimestampNs();
+
+    // Parse event for primary field values i.e. primary key.
     HashableDimensionKey primaryKey;
     if (mPrimaryFields.size() > 0) {
         if (!filterValues(mPrimaryFields, event.getValues(), &primaryKey) ||
             primaryKey.getValues().size() != mPrimaryFields.size()) {
             ALOGE("StateTracker error extracting primary key from log event.");
-            handleReset();
+            handleReset(eventTimeNs);
             return;
         }
     } else {
-        // atom has no primary fields
+        // Use an empty HashableDimensionKey if atom has no primary fields.
         primaryKey = DEFAULT_DIMENSION_KEY;
     }
 
-    // parse event for state value
+    // Parse event for state value.
     FieldValue stateValue;
     int32_t state;
     if (!filterValues(mStateField, event.getValues(), &stateValue) ||
         stateValue.mValue.getType() != INT) {
         ALOGE("StateTracker error extracting state from log event. Type: %d",
               stateValue.mValue.getType());
-        handlePartialReset(primaryKey);
+        handlePartialReset(eventTimeNs, primaryKey);
         return;
     }
     state = stateValue.mValue.int_value;
 
     if (state == mResetState) {
         VLOG("StateTracker Reset state: %s", stateValue.mValue.toString().c_str());
-        handleReset();
+        handleReset(eventTimeNs);
     }
 
-    // track and update state
+    // Track and update state.
     int32_t oldState = 0;
     int32_t newState = 0;
     updateState(primaryKey, state, &oldState, &newState);
 
-    // notify all listeners if state has changed
+    // Notify all listeners if state has changed.
     if (oldState != newState) {
         VLOG("StateTracker updated state");
         for (auto listener : mListeners) {
             auto sListener = listener.promote();  // safe access to wp<>
             if (sListener != nullptr) {
-                sListener->onStateChanged(mAtomId, primaryKey, oldState, newState);
+                sListener->onStateChanged(eventTimeNs, mAtomId, primaryKey, oldState, newState);
             }
         }
     } else {
@@ -119,20 +121,22 @@
     return false;
 }
 
-void StateTracker::handleReset() {
+void StateTracker::handleReset(const int64_t eventTimeNs) {
     VLOG("StateTracker handle reset");
     for (const auto pair : mStateMap) {
         for (auto l : mListeners) {
             auto sl = l.promote();
             if (sl != nullptr) {
-                sl->onStateChanged(mAtomId, pair.first, pair.second.state, mDefaultState);
+                sl->onStateChanged(eventTimeNs, mAtomId, pair.first, pair.second.state,
+                                   mDefaultState);
             }
         }
     }
     mStateMap.clear();
 }
 
-void StateTracker::handlePartialReset(const HashableDimensionKey& primaryKey) {
+void StateTracker::handlePartialReset(const int64_t eventTimeNs,
+                                      const HashableDimensionKey& primaryKey) {
     VLOG("StateTracker handle partial reset");
     if (mStateMap.find(primaryKey) != mStateMap.end()) {
         mStateMap.erase(primaryKey);