Bug fix of ModemActivitInfo update

Fix a bug in ModemActivityInfo update which modifies the last return
object.

Bug: 259755308
Test: atest ModemActivityInfoTest
Test: atest TelephonyManagerTest#testRequestModemActivityInfo
Test: manual with speed test and check to ensure the modem activity is reported with adb shell dumpsys activity service TelephonyDebugService | grep -A150 LinkBandwidth

Change-Id: I17ec9904341428da4d39e98a6732039a4f507e4a
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 59868b4..1c14553 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -1415,6 +1415,7 @@
                     request = (MainThreadRequest) ar.userObj;
                     ResultReceiver result = (ResultReceiver) request.argument;
                     int error = 0;
+                    ModemActivityInfo ret = null;
                     if (mLastModemActivityInfo == null) {
                         mLastModemActivitySpecificInfo = new ActivityStatsTechSpecificInfo[1];
                         mLastModemActivitySpecificInfo[0] =
@@ -1433,12 +1434,14 @@
                         if (isModemActivityInfoValid(info)) {
                             mergeModemActivityInfo(info);
                         }
-                        mLastModemActivityInfo =
-                                new ModemActivityInfo(
-                                        mLastModemActivityInfo.getTimestampMillis(),
-                                        mLastModemActivityInfo.getSleepTimeMillis(),
-                                        mLastModemActivityInfo.getIdleTimeMillis(),
-                                        mLastModemActivitySpecificInfo);
+                        // This is needed to decouple ret from mLastModemActivityInfo
+                        // We don't want to return mLastModemActivityInfo which is updated
+                        // inside mergeModemActivityInfo()
+                        ret = new ModemActivityInfo(
+                                mLastModemActivityInfo.getTimestampMillis(),
+                                mLastModemActivityInfo.getSleepTimeMillis(),
+                                mLastModemActivityInfo.getIdleTimeMillis(),
+                                deepCopyModemActivitySpecificInfo(mLastModemActivitySpecificInfo));
 
                     } else {
                         if (ar.result == null) {
@@ -1456,10 +1459,10 @@
                         }
                     }
                     Bundle bundle = new Bundle();
-                    if (mLastModemActivityInfo != null) {
+                    if (ret != null) {
                         bundle.putParcelable(
                                 TelephonyManager.MODEM_ACTIVITY_RESULT_KEY,
-                                mLastModemActivityInfo);
+                                ret);
                     } else {
                         bundle.putInt(TelephonyManager.EXCEPTION_RESULT_KEY, error);
                     }
@@ -7839,7 +7842,7 @@
     */
     private void mergeModemActivityInfo(ModemActivityInfo info) {
         List<ActivityStatsTechSpecificInfo> merged = new ArrayList<>();
-        ActivityStatsTechSpecificInfo mDeltaSpecificInfo;
+        ActivityStatsTechSpecificInfo deltaSpecificInfo;
         boolean matched;
         for (int i = 0; i < info.getSpecificInfoLength(); i++) {
             matched = false;
@@ -7864,13 +7867,13 @@
             }
 
             if (!matched) {
-                mDeltaSpecificInfo =
+                deltaSpecificInfo =
                         new ActivityStatsTechSpecificInfo(
                                 rat,
                                 freq,
                                 info.getTransmitTimeMillis(rat, freq),
                                 (int) info.getReceiveTimeMillis(rat, freq));
-                merged.addAll(Arrays.asList(mDeltaSpecificInfo));
+                merged.addAll(Arrays.asList(deltaSpecificInfo));
             }
         }
         merged.addAll(Arrays.asList(mLastModemActivitySpecificInfo));
@@ -7885,6 +7888,26 @@
         mLastModemActivityInfo.setIdleTimeMillis(
                 info.getIdleTimeMillis()
                 + mLastModemActivityInfo.getIdleTimeMillis());
+
+        mLastModemActivityInfo =
+                 new ModemActivityInfo(
+                         mLastModemActivityInfo.getTimestampMillis(),
+                         mLastModemActivityInfo.getSleepTimeMillis(),
+                         mLastModemActivityInfo.getIdleTimeMillis(),
+                         mLastModemActivitySpecificInfo);
+    }
+
+    private ActivityStatsTechSpecificInfo[] deepCopyModemActivitySpecificInfo(
+            ActivityStatsTechSpecificInfo[] info) {
+        int infoSize = info.length;
+        ActivityStatsTechSpecificInfo[] ret = new ActivityStatsTechSpecificInfo[infoSize];
+        for (int i = 0; i < infoSize; i++) {
+            ret[i] = new ActivityStatsTechSpecificInfo(
+                    info[i].getRat(), info[i].getFrequencyRange(),
+                    info[i].getTransmitTimeMillis(),
+                    (int) info[i].getReceiveTimeMillis());
+        }
+        return ret;
     }
 
     /**