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;
}
/**