Map new WFC related ImsReasonInfo codes to disconnect causes.

Map CODE_EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE and
CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION to the corresponding
disconnect cause in Telephony.
Make reason string matching case insensitive.

Bug: 128993720
Test: Unit tests added to confirm remapping.
Change-Id: I2ae48a78c10ed6ade2117c89d9298f479c548bd4
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
index 9fbef9c..ec50981 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
@@ -1948,6 +1948,9 @@
      */
     @VisibleForTesting
     public void addReasonCodeRemapping(Integer fromCode, String message, Integer toCode) {
+        if (message != null) {
+            message = message.toLowerCase();
+        }
         mImsReasonCodeMap.put(new Pair<>(fromCode, message), toCode);
     }
 
@@ -1966,6 +1969,8 @@
         String reason = reasonInfo.getExtraMessage();
         if (reason == null) {
             reason = "";
+        } else {
+            reason = reason.toLowerCase();
         }
         log("maybeRemapReasonCode : fromCode = " + reasonInfo.getCode() + " ; message = "
                 + reason);
@@ -2038,6 +2043,12 @@
             case ImsReasonInfo.CODE_SIP_GLOBAL_ERROR:
                 return DisconnectCause.SERVER_ERROR;
 
+            case ImsReasonInfo.CODE_EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE:
+                return DisconnectCause.EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE;
+
+            case ImsReasonInfo.CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION:
+                return DisconnectCause.WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION;
+
             case ImsReasonInfo.CODE_SIP_SERVICE_UNAVAILABLE:
             case ImsReasonInfo.CODE_SIP_SERVER_ERROR:
                 return DisconnectCause.SERVER_UNREACHABLE;
diff --git a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java
index 76fbdd6..f128404 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneCallTrackerTest.java
@@ -119,6 +119,12 @@
                     ImsReasonInfo.CODE_ANSWERED_ELSEWHERE);
             mCTUT.addReasonCodeRemapping(ImsReasonInfo.CODE_USER_TERMINATED_BY_REMOTE, "",
                     ImsReasonInfo.CODE_SIP_FORBIDDEN);
+            mCTUT.addReasonCodeRemapping(ImsReasonInfo.CODE_SIP_SERVICE_UNAVAILABLE,
+                    "emergency calls over wifi not allowed in this location",
+                    ImsReasonInfo.CODE_EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE);
+            mCTUT.addReasonCodeRemapping(ImsReasonInfo.CODE_SIP_FORBIDDEN,
+                    "service not allowed in this location",
+                    ImsReasonInfo.CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION);
             mCTUT.setDataEnabled(true);
             mCTHander = new Handler(mCTUT.getLooper());
             setReady(true);
@@ -621,7 +627,11 @@
         assertEquals(ImsReasonInfo.CODE_ANSWERED_ELSEWHERE,
                 mCTUT.maybeRemapReasonCode(new ImsReasonInfo(501, 1, "Call answered elsewhere.")));
         assertEquals(ImsReasonInfo.CODE_ANSWERED_ELSEWHERE,
+                mCTUT.maybeRemapReasonCode(new ImsReasonInfo(501, 1, "CALL answered elsewhere.")));
+        assertEquals(ImsReasonInfo.CODE_ANSWERED_ELSEWHERE,
                 mCTUT.maybeRemapReasonCode(new ImsReasonInfo(510, 1, "Call answered elsewhere.")));
+        assertEquals(ImsReasonInfo.CODE_ANSWERED_ELSEWHERE,
+                mCTUT.maybeRemapReasonCode(new ImsReasonInfo(510, 1, "CALL ANswered elsewhere.")));
         assertEquals(90210, mCTUT.maybeRemapReasonCode(new ImsReasonInfo(90210, 1,
                 "Call answered elsewhere.")));
     }
@@ -917,6 +927,38 @@
                 new ImsReasonInfo(ImsReasonInfo.CODE_USER_TERMINATED_BY_REMOTE, 0, "")));
     }
 
+    @Test
+    @SmallTest
+    public void testRemapEmergencyCallsOverWfc() {
+        assertEquals(ImsReasonInfo.CODE_SIP_SERVICE_UNAVAILABLE,
+                mCTUT.maybeRemapReasonCode(
+                        new ImsReasonInfo(ImsReasonInfo.CODE_SIP_SERVICE_UNAVAILABLE, 0)));
+        assertEquals(ImsReasonInfo.CODE_EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE,
+                mCTUT.maybeRemapReasonCode(
+                        new ImsReasonInfo(ImsReasonInfo.CODE_SIP_SERVICE_UNAVAILABLE, 0,
+                                "emergency calls over wifi not allowed in this location")));
+        assertEquals(ImsReasonInfo.CODE_EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE,
+                mCTUT.maybeRemapReasonCode(
+                        new ImsReasonInfo(ImsReasonInfo.CODE_SIP_SERVICE_UNAVAILABLE, 0,
+                                "EMERGENCY calls over wifi not allowed in this location")));
+    }
+
+    @Test
+    @SmallTest
+    public void testRemapWfcNotAvailable() {
+        assertEquals(ImsReasonInfo.CODE_SIP_FORBIDDEN,
+                mCTUT.maybeRemapReasonCode(
+                        new ImsReasonInfo(ImsReasonInfo.CODE_SIP_FORBIDDEN, 0)));
+        assertEquals(ImsReasonInfo.CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION,
+                mCTUT.maybeRemapReasonCode(
+                        new ImsReasonInfo(ImsReasonInfo.CODE_SIP_FORBIDDEN, 0,
+                                "Service not allowed in this location")));
+        assertEquals(ImsReasonInfo.CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION,
+                mCTUT.maybeRemapReasonCode(
+                        new ImsReasonInfo(ImsReasonInfo.CODE_SIP_FORBIDDEN, 0,
+                                "SERVICE not allowed in this location")));
+    }
+
     private void placeCallAndMakeActive() {
         try {
             doAnswer(new Answer<ImsCall>() {