Replace upTimeMillis with elapsedRealTime

upTimeMillis does not include time spent in deep sleep. Use
elapsedRealtime instead.

The time spent in deep sleep is important to include since the
keepalives may still be ongoing during deep sleep and so that time
should be included in duration calculations.

Bug: 273451360
Fixes: 281639289
Test: atest FrameworksNetTests
(cherry picked from https://android-review.googlesource.com/q/commit:d5ca3f1f6968a688b2128360da79595d1a1b9784)
Merged-In: I54350d49bdfec58cc00dea6d82cba01f5d387bb0
Change-Id: I54350d49bdfec58cc00dea6d82cba01f5d387bb0
diff --git a/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java b/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java
index b91f158..ff9bb70 100644
--- a/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java
+++ b/service/src/com/android/server/connectivity/KeepaliveStatsTracker.java
@@ -112,7 +112,7 @@
         /**
          * Gets the lifetime stats for the keepalive, updated to timeNow, and then resets it.
          *
-         * @param timeNow a timestamp obtained using Dependencies.getUptimeMillis
+         * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
          */
         public LifetimeStats getAndResetLifetimeStats(long timeNow) {
             updateLifetimeStatsAndSetActive(timeNow, mKeepaliveActive);
@@ -147,7 +147,7 @@
          * Updates the lifetime metrics to the given time and sets the active state. This should be
          * called whenever the active state of the keepalive changes.
          *
-         * @param timeNow a timestamp obtained using Dependencies.getUptimeMillis
+         * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
          */
         public void updateLifetimeStatsAndSetActive(long timeNow, boolean keepaliveActive) {
             final int durationIncrease = (int) (timeNow - mLastUpdateLifetimeTimestamp);
@@ -162,7 +162,7 @@
          * Resets the lifetime metrics but does not reset the active/stopped state of the keepalive.
          * This also updates the time to timeNow, ensuring stats will start from this time.
          *
-         * @param timeNow a timestamp obtained using Dependencies.getUptimeMillis
+         * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
          */
         public void resetLifetimeStats(long timeNow) {
             mLifetimeMs = 0;
@@ -243,10 +243,10 @@
     /** Dependency class */
     @VisibleForTesting
     public static class Dependencies {
-        // Returns a timestamp with the time base of SystemClock.uptimeMillis to keep durations
-        // relative to start time and avoid timezone change.
-        public long getUptimeMillis() {
-            return SystemClock.uptimeMillis();
+        // Returns a timestamp with the time base of SystemClock.elapsedRealtime to keep durations
+        // relative to start time and avoid timezone change, including time spent in deep sleep.
+        public long getElapsedRealtime() {
+            return SystemClock.elapsedRealtime();
         }
     }
 
@@ -266,7 +266,7 @@
         final SubscriptionManager subscriptionManager =
                 Objects.requireNonNull(context.getSystemService(SubscriptionManager.class));
 
-        mLastUpdateDurationsTimestamp = mDependencies.getUptimeMillis();
+        mLastUpdateDurationsTimestamp = mDependencies.getElapsedRealtime();
 
         // The default constructor for OnSubscriptionsChangedListener will always implicitly grab
         // the looper of the current thread. In the case the current thread does not have a looper,
@@ -326,7 +326,7 @@
      * change to mNumRegisteredKeepalive or mNumActiveKeepalive to keep the duration metrics
      * correct.
      *
-     * @param timeNow a timestamp obtained using Dependencies.getUptimeMillis
+     * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
      */
     private void updateDurationsPerNumOfKeepalive(long timeNow) {
         if (mDurationPerNumOfKeepalive.size() < mNumRegisteredKeepalive) {
@@ -406,7 +406,7 @@
         if (isAutoKeepalive) mNumAutomaticKeepaliveRequests++;
         mAppUids.add(appUid);
 
-        final long timeNow = mDependencies.getUptimeMillis();
+        final long timeNow = mDependencies.getElapsedRealtime();
         updateDurationsPerNumOfKeepalive(timeNow);
 
         mNumRegisteredKeepalive++;
@@ -432,7 +432,7 @@
      */
     private @NonNull KeepaliveStats onKeepaliveActive(
             @NonNull Network network, int slot, boolean keepaliveActive) {
-        final long timeNow = mDependencies.getUptimeMillis();
+        final long timeNow = mDependencies.getElapsedRealtime();
         return onKeepaliveActive(network, slot, keepaliveActive, timeNow);
     }
 
@@ -443,7 +443,7 @@
      * @param network the network of the keepalive
      * @param slot the slot number of the keepalive
      * @param keepaliveActive the new active state of the keepalive
-     * @param timeNow a timestamp obtained using Dependencies.getUptimeMillis
+     * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
      * @return the KeepaliveStats associated with the network, slot pair or null if it is unknown.
      */
     private @NonNull KeepaliveStats onKeepaliveActive(
@@ -479,7 +479,7 @@
     /** Inform the KeepaliveStatsTracker a keepalive has just been stopped. */
     public void onStopKeepalive(@NonNull Network network, int slot) {
         final int keepaliveId = getKeepaliveId(network, slot);
-        final long timeNow = mDependencies.getUptimeMillis();
+        final long timeNow = mDependencies.getElapsedRealtime();
 
         final KeepaliveStats keepaliveStats =
                 onKeepaliveActive(network, slot, /* keepaliveActive= */ false, timeNow);
@@ -496,7 +496,7 @@
      * Updates and adds the lifetime metric of keepaliveStats to the aggregate.
      *
      * @param keepaliveStats the stats to add to the aggregate
-     * @param timeNow a timestamp obtained using Dependencies.getUptimeMillis
+     * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
      */
     private void addToAggregateKeepaliveLifetime(
             @NonNull KeepaliveStats keepaliveStats, long timeNow) {
@@ -537,14 +537,14 @@
     @VisibleForTesting
     public @NonNull DailykeepaliveInfoReported buildKeepaliveMetrics() {
         ensureRunningOnHandlerThread();
-        final long timeNow = mDependencies.getUptimeMillis();
+        final long timeNow = mDependencies.getElapsedRealtime();
         return buildKeepaliveMetrics(timeNow);
     }
 
     /**
      * Updates the metrics to timeNow and builds and returns DailykeepaliveInfoReported proto.
      *
-     * @param timeNow a timestamp obtained using Dependencies.getUptimeMillis
+     * @param timeNow a timestamp obtained using Dependencies.getElapsedRealtime
      */
     private @NonNull DailykeepaliveInfoReported buildKeepaliveMetrics(long timeNow) {
         updateDurationsPerNumOfKeepalive(timeNow);
@@ -594,7 +594,7 @@
      */
     public @NonNull DailykeepaliveInfoReported buildAndResetMetrics() {
         ensureRunningOnHandlerThread();
-        final long timeNow = mDependencies.getUptimeMillis();
+        final long timeNow = mDependencies.getElapsedRealtime();
 
         final DailykeepaliveInfoReported metrics = buildKeepaliveMetrics(timeNow);
 
diff --git a/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java b/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java
index 6558004..9472ded 100644
--- a/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java
+++ b/tests/unit/java/com/android/server/connectivity/KeepaliveStatsTrackerTest.java
@@ -198,7 +198,7 @@
         mHandlerThread.start();
         mTestHandler = new Handler(mHandlerThread.getLooper());
 
-        setUptimeMillis(0);
+        setElapsedRealtime(0);
         mKeepaliveStatsTracker = new KeepaliveStatsTracker(mContext, mTestHandler, mDependencies);
         HandlerUtils.waitForIdle(BackgroundThread.getHandler(), TIMEOUT_MS);
 
@@ -207,19 +207,19 @@
         HandlerUtils.waitForIdle(mTestHandler, TIMEOUT_MS);
     }
 
-    private void setUptimeMillis(long time) {
-        doReturn(time).when(mDependencies).getUptimeMillis();
+    private void setElapsedRealtime(long time) {
+        doReturn(time).when(mDependencies).getElapsedRealtime();
     }
 
     private DailykeepaliveInfoReported buildKeepaliveMetrics(long time) {
-        setUptimeMillis(time);
+        setElapsedRealtime(time);
 
         return visibleOnHandlerThread(
                 mTestHandler, () -> mKeepaliveStatsTracker.buildKeepaliveMetrics());
     }
 
     private DailykeepaliveInfoReported buildAndResetMetrics(long time) {
-        setUptimeMillis(time);
+        setElapsedRealtime(time);
 
         return visibleOnHandlerThread(
                 mTestHandler, () -> mKeepaliveStatsTracker.buildAndResetMetrics());
@@ -244,26 +244,26 @@
 
     private void onStartKeepalive(long time, int slot, NetworkCapabilities nc, int intervalSeconds,
             int uid, boolean isAutoKeepalive) {
-        setUptimeMillis(time);
+        setElapsedRealtime(time);
         visibleOnHandlerThread(mTestHandler, () ->
                 mKeepaliveStatsTracker.onStartKeepalive(TEST_NETWORK, slot, nc, intervalSeconds,
                         uid, isAutoKeepalive));
     }
 
     private void onPauseKeepalive(long time, int slot) {
-        setUptimeMillis(time);
+        setElapsedRealtime(time);
         visibleOnHandlerThread(
                 mTestHandler, () -> mKeepaliveStatsTracker.onPauseKeepalive(TEST_NETWORK, slot));
     }
 
     private void onResumeKeepalive(long time, int slot) {
-        setUptimeMillis(time);
+        setElapsedRealtime(time);
         visibleOnHandlerThread(
                 mTestHandler, () -> mKeepaliveStatsTracker.onResumeKeepalive(TEST_NETWORK, slot));
     }
 
     private void onStopKeepalive(long time, int slot) {
-        setUptimeMillis(time);
+        setElapsedRealtime(time);
         visibleOnHandlerThread(
                 mTestHandler, () -> mKeepaliveStatsTracker.onStopKeepalive(TEST_NETWORK, slot));
     }