Merge "Move onDataCallDisconnected to DcInactiveState so we can indicate failureCause"
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
index 2051919..8af800c 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
@@ -2423,6 +2423,7 @@
                     mApnSetting != null ? (long) mApnSetting.getApnTypeBitmask() : 0L,
                     mApnSetting != null
                         ? mApnSetting.canHandleType(ApnSetting.TYPE_DEFAULT) : false);
+            mDataCallSessionStats.onDataCallDisconnected(mDcFailCause);
             if (mHandoverState == HANDOVER_STATE_BEING_TRANSFERRED) {
                 // This is from source data connection to set itself's state
                 setHandoverState(HANDOVER_STATE_COMPLETED);
@@ -2916,7 +2917,6 @@
 
             TelephonyMetrics.getInstance().writeRilDataCallEvent(mPhone.getPhoneId(),
                     mCid, mApnSetting.getApnTypeBitmask(), RilDataCall.State.DISCONNECTED);
-            mDataCallSessionStats.onDataCallDisconnected();
 
             mVcnManager.removeVcnNetworkPolicyChangeListener(mVcnPolicyChangeListener);
 
diff --git a/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java b/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java
index 3b4fc69..1d8a1c2 100644
--- a/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java
+++ b/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java
@@ -24,6 +24,7 @@
 
 import android.os.SystemClock;
 import android.telephony.Annotation.ApnType;
+import android.telephony.Annotation.DataFailureCause;
 import android.telephony.Annotation.NetworkType;
 import android.telephony.DataFailCause;
 import android.telephony.ServiceState;
@@ -69,8 +70,7 @@
             // deactivateDataCall hasn't been processed properly, so we save the previous atom here
             // and move on to create a new atom.
             if (mOngoingDataCall != null) {
-                mOngoingDataCall.failureCause = DataFailCause.UNKNOWN;
-                onDataCallDisconnected();
+                onDataCallDisconnected(DataFailCause.UNKNOWN);
             }
             mOngoingDataCall = getDefaultProto(apnTypeBitMask);
             mStartTime = getTimeMillis();
@@ -96,7 +96,7 @@
             @RilRadioTechnology int radioTechnology,
             @ApnType int apnTypeBitmask,
             @ProtocolType int protocol,
-            int failureCause) {
+            @DataFailureCause int failureCause) {
         // there should've been another call to initiate the atom,
         // so this method is being called out of order -> no metric will be logged
         if (mOngoingDataCall == null) {
@@ -161,14 +161,17 @@
         mOngoingDataCall.oosAtEnd = getIsOos();
     }
 
-    /** Stores the atom when DataConnection reaches DISCONNECTED state. */
-    public synchronized void onDataCallDisconnected() {
+    /** Stores the atom when DataConnection reaches DISCONNECTED state.
+     *  @param failureCause failure cause as per android.telephony.DataFailCause
+     **/
+    public synchronized void onDataCallDisconnected(@DataFailureCause int failureCause) {
         // there should've been another call to initiate the atom,
         // so this method is being called out of order -> no atom will be saved
         if (mOngoingDataCall == null) {
             loge("onSetupDataCallResponse: no DataCallSession atom has been initiated.");
             return;
         }
+        mOngoingDataCall.failureCause = failureCause;
         mOngoingDataCall.ongoing = false;
         mOngoingDataCall.durationMinutes = convertMillisToMinutes(getTimeMillis() - mStartTime);
         // store for the data call list event, after DataCall is disconnected and entered into