Merge cherrypicks of [8558068, 8558825, 8558826, 8558827, 8557109, 8558018, 8558886, 8558887, 8558888, 8558889, 8558071, 8558072, 8556231] into qt-release

Change-Id: Ie56006124d1d4821e3befc49b474ac684fae993d
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
index c2cf4be..9fbef9c 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
@@ -156,7 +156,8 @@
 
     private TelephonyMetrics mMetrics;
     private final Map<String, CallQualityMetrics> mCallQualityMetrics = new ConcurrentHashMap<>();
-    private final ConcurrentLinkedQueue<String> mLeastRecentCallId = new ConcurrentLinkedQueue<>();
+    private final ConcurrentLinkedQueue<CallQualityMetrics> mCallQualityMetricsHistory =
+            new ConcurrentLinkedQueue<>();
     private boolean mCarrierConfigLoaded = false;
 
     private final MmTelFeatureListener mMmTelFeatureListener = new MmTelFeatureListener();
@@ -2354,6 +2355,11 @@
             mMetrics.writeOnImsCallTerminated(mPhone.getPhoneId(), imsCall.getCallSession(),
                     reasonInfo, mCallQualityMetrics.get(callId), conn.getEmergencyNumberInfo(),
                     getNetworkCountryIso());
+            // Remove info for the callId from the current calls and add it to the history
+            CallQualityMetrics lastCallMetrics = mCallQualityMetrics.remove(callId);
+            if (lastCallMetrics != null) {
+                mCallQualityMetricsHistory.add(lastCallMetrics);
+            }
             pruneCallQualityMetricsHistory();
             mPhone.notifyImsReason(reasonInfo);
 
@@ -2987,7 +2993,6 @@
             CallQualityMetrics cqm = mCallQualityMetrics.get(callId);
             if (cqm == null) {
                 cqm = new CallQualityMetrics(mPhone);
-                mLeastRecentCallId.add(callId);
             }
             cqm.saveCallQuality(callQuality);
             mCallQualityMetrics.put(callId, cqm);
@@ -3549,6 +3554,7 @@
         pw.println(" mVtDataUsageSnapshot=" + mVtDataUsageSnapshot);
         pw.println(" mVtDataUsageUidSnapshot=" + mVtDataUsageUidSnapshot);
         pw.println(" mCallQualityMetrics=" + mCallQualityMetrics);
+        pw.println(" mCallQualityMetricsHistory=" + mCallQualityMetricsHistory);
 
         pw.flush();
         pw.println("++++++++++++++++++++++++++++++++");
@@ -4125,10 +4131,10 @@
         mIsDataEnabled = isDataEnabled;
     }
 
-    // Removes old call quality metrics if mCallQualityMetrics exceeds its max size
+    // Removes old call quality metrics if mCallQualityMetricsHistory exceeds its max size
     private void pruneCallQualityMetricsHistory() {
-        if (mCallQualityMetrics.size() > MAX_CALL_QUALITY_HISTORY) {
-            mCallQualityMetrics.remove(mLeastRecentCallId.poll());
+        if (mCallQualityMetricsHistory.size() > MAX_CALL_QUALITY_HISTORY) {
+            mCallQualityMetricsHistory.poll();
         }
     }