Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +40 −5 Original line number Diff line number Diff line Loading @@ -1778,10 +1778,17 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { return code; } private int getDisconnectCauseFromReasonInfo(ImsReasonInfo reasonInfo) { /** * Maps an {@link ImsReasonInfo} reason code to a {@link DisconnectCause} cause code. * The {@link Call.State} provided is the state of the call prior to disconnection. * @param reasonInfo the {@link ImsReasonInfo} for the disconnection. * @param callState The {@link Call.State} prior to disconnection. * @return The {@link DisconnectCause} code. */ @VisibleForTesting public int getDisconnectCauseFromReasonInfo(ImsReasonInfo reasonInfo, Call.State callState) { int cause = DisconnectCause.ERROR_UNSPECIFIED; //int type = reasonInfo.getReasonType(); int code = maybeRemapReasonCode(reasonInfo); switch (code) { case ImsReasonInfo.CODE_SIP_BAD_ADDRESS: Loading Loading @@ -1837,10 +1844,18 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { case ImsReasonInfo.CODE_TIMEOUT_NO_ANSWER_CALL_UPDATE: return DisconnectCause.TIMED_OUT; case ImsReasonInfo.CODE_LOCAL_LOW_BATTERY: case ImsReasonInfo.CODE_LOCAL_POWER_OFF: return DisconnectCause.POWER_OFF; case ImsReasonInfo.CODE_LOCAL_LOW_BATTERY: case ImsReasonInfo.CODE_LOW_BATTERY: { if (callState == Call.State.DIALING) { return DisconnectCause.DIAL_LOW_BATTERY; } else { return DisconnectCause.LOW_BATTERY; } } case ImsReasonInfo.CODE_FDN_BLOCKED: return DisconnectCause.FDN_BLOCKED; Loading Loading @@ -1988,8 +2003,18 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { return; } else { mPendingMO = null; int cause = getDisconnectCauseFromReasonInfo(reasonInfo); ImsPhoneConnection conn = findConnection(imsCall); Call.State callState; if (conn != null) { callState = conn.getState(); } else { // Need to fall back in case connection is null; it shouldn't be, but a sane // fallback is to assume we're dialing. This state is only used to // determine which disconnect string to show in the case of a low battery // disconnect. callState = Call.State.DIALING; } int cause = getDisconnectCauseFromReasonInfo(reasonInfo, callState); if(conn != null) { conn.setPreciseDisconnectCause( Loading @@ -2007,8 +2032,18 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { public void onCallTerminated(ImsCall imsCall, ImsReasonInfo reasonInfo) { if (DBG) log("onCallTerminated reasonCode=" + reasonInfo.getCode()); int cause = getDisconnectCauseFromReasonInfo(reasonInfo); ImsPhoneConnection conn = findConnection(imsCall); Call.State callState; if (conn != null) { callState = conn.getState(); } else { // Connection shouldn't be null, but if it is, we can assume the call was active. // This call state is only used for determining which disconnect message to show in // the case of the device's battery being low resulting in a call drop. callState = Call.State.ACTIVE; } int cause = getDisconnectCauseFromReasonInfo(reasonInfo, callState); if (DBG) log("cause = " + cause + " conn = " + conn); if (conn != null) { Loading tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.support.test.filters.FlakyTest; import android.telephony.DisconnectCause; import android.telephony.PhoneNumberUtils; import android.telephony.ims.feature.ImsFeature; import android.test.suitebuilder.annotation.SmallTest; Loading Loading @@ -496,4 +497,22 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest { verify(mImsManager, times(2)).open(anyInt(), nullable(PendingIntent.class), nullable(ImsConnectionStateListener.class)); } @Test @SmallTest public void testLowBatteryDisconnectMidCall() { assertEquals(DisconnectCause.LOW_BATTERY, mCTUT.getDisconnectCauseFromReasonInfo( new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_LOW_BATTERY, 0), Call.State.ACTIVE)); assertEquals(DisconnectCause.LOW_BATTERY, mCTUT.getDisconnectCauseFromReasonInfo( new ImsReasonInfo(ImsReasonInfo.CODE_LOW_BATTERY, 0), Call.State.ACTIVE)); } @Test @SmallTest public void testLowBatteryDisconnectDialing() { assertEquals(DisconnectCause.DIAL_LOW_BATTERY, mCTUT.getDisconnectCauseFromReasonInfo( new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_LOW_BATTERY, 0), Call.State.DIALING)); assertEquals(DisconnectCause.DIAL_LOW_BATTERY, mCTUT.getDisconnectCauseFromReasonInfo( new ImsReasonInfo(ImsReasonInfo.CODE_LOW_BATTERY, 0), Call.State.DIALING)); } } Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +40 −5 Original line number Diff line number Diff line Loading @@ -1778,10 +1778,17 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { return code; } private int getDisconnectCauseFromReasonInfo(ImsReasonInfo reasonInfo) { /** * Maps an {@link ImsReasonInfo} reason code to a {@link DisconnectCause} cause code. * The {@link Call.State} provided is the state of the call prior to disconnection. * @param reasonInfo the {@link ImsReasonInfo} for the disconnection. * @param callState The {@link Call.State} prior to disconnection. * @return The {@link DisconnectCause} code. */ @VisibleForTesting public int getDisconnectCauseFromReasonInfo(ImsReasonInfo reasonInfo, Call.State callState) { int cause = DisconnectCause.ERROR_UNSPECIFIED; //int type = reasonInfo.getReasonType(); int code = maybeRemapReasonCode(reasonInfo); switch (code) { case ImsReasonInfo.CODE_SIP_BAD_ADDRESS: Loading Loading @@ -1837,10 +1844,18 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { case ImsReasonInfo.CODE_TIMEOUT_NO_ANSWER_CALL_UPDATE: return DisconnectCause.TIMED_OUT; case ImsReasonInfo.CODE_LOCAL_LOW_BATTERY: case ImsReasonInfo.CODE_LOCAL_POWER_OFF: return DisconnectCause.POWER_OFF; case ImsReasonInfo.CODE_LOCAL_LOW_BATTERY: case ImsReasonInfo.CODE_LOW_BATTERY: { if (callState == Call.State.DIALING) { return DisconnectCause.DIAL_LOW_BATTERY; } else { return DisconnectCause.LOW_BATTERY; } } case ImsReasonInfo.CODE_FDN_BLOCKED: return DisconnectCause.FDN_BLOCKED; Loading Loading @@ -1988,8 +2003,18 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { return; } else { mPendingMO = null; int cause = getDisconnectCauseFromReasonInfo(reasonInfo); ImsPhoneConnection conn = findConnection(imsCall); Call.State callState; if (conn != null) { callState = conn.getState(); } else { // Need to fall back in case connection is null; it shouldn't be, but a sane // fallback is to assume we're dialing. This state is only used to // determine which disconnect string to show in the case of a low battery // disconnect. callState = Call.State.DIALING; } int cause = getDisconnectCauseFromReasonInfo(reasonInfo, callState); if(conn != null) { conn.setPreciseDisconnectCause( Loading @@ -2007,8 +2032,18 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { public void onCallTerminated(ImsCall imsCall, ImsReasonInfo reasonInfo) { if (DBG) log("onCallTerminated reasonCode=" + reasonInfo.getCode()); int cause = getDisconnectCauseFromReasonInfo(reasonInfo); ImsPhoneConnection conn = findConnection(imsCall); Call.State callState; if (conn != null) { callState = conn.getState(); } else { // Connection shouldn't be null, but if it is, we can assume the call was active. // This call state is only used for determining which disconnect message to show in // the case of the device's battery being low resulting in a call drop. callState = Call.State.ACTIVE; } int cause = getDisconnectCauseFromReasonInfo(reasonInfo, callState); if (DBG) log("cause = " + cause + " conn = " + conn); if (conn != null) { Loading
tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.support.test.filters.FlakyTest; import android.telephony.DisconnectCause; import android.telephony.PhoneNumberUtils; import android.telephony.ims.feature.ImsFeature; import android.test.suitebuilder.annotation.SmallTest; Loading Loading @@ -496,4 +497,22 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest { verify(mImsManager, times(2)).open(anyInt(), nullable(PendingIntent.class), nullable(ImsConnectionStateListener.class)); } @Test @SmallTest public void testLowBatteryDisconnectMidCall() { assertEquals(DisconnectCause.LOW_BATTERY, mCTUT.getDisconnectCauseFromReasonInfo( new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_LOW_BATTERY, 0), Call.State.ACTIVE)); assertEquals(DisconnectCause.LOW_BATTERY, mCTUT.getDisconnectCauseFromReasonInfo( new ImsReasonInfo(ImsReasonInfo.CODE_LOW_BATTERY, 0), Call.State.ACTIVE)); } @Test @SmallTest public void testLowBatteryDisconnectDialing() { assertEquals(DisconnectCause.DIAL_LOW_BATTERY, mCTUT.getDisconnectCauseFromReasonInfo( new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_LOW_BATTERY, 0), Call.State.DIALING)); assertEquals(DisconnectCause.DIAL_LOW_BATTERY, mCTUT.getDisconnectCauseFromReasonInfo( new ImsReasonInfo(ImsReasonInfo.CODE_LOW_BATTERY, 0), Call.State.DIALING)); } }