Fix ImsPhone.processDisconnectReason() function

- Escape "|" (pipe) symbol.
- Add unit test

Bug: 29581592
Change-Id: I4c7f5758478ab8360fad8a7b97055bbaaa7805bf
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index abf7100..4c97c25 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -267,7 +267,7 @@
     public static final String EXTRA_KEY_ALERT_TITLE = "alertTitle";
     public static final String EXTRA_KEY_ALERT_MESSAGE = "alertMessage";
     public static final String EXTRA_KEY_ALERT_SHOW = "alertShow";
-    protected static final String EXTRA_KEY_NOTIFICATION_MESSAGE = "notificationMessage";
+    public static final String EXTRA_KEY_NOTIFICATION_MESSAGE = "notificationMessage";
 
     private final RegistrantList mPreciseCallStateRegistrants
             = new RegistrantList();
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
index a18b8b2..8a6726b 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
@@ -1476,7 +1476,7 @@
                             com.android.internal.R.array.wfcOperatorErrorNotificationMessages);
 
             for (int i = 0; i < wfcOperatorErrorCodes.length; i++) {
-                String[] codes = wfcOperatorErrorCodes[i].split("|");
+                String[] codes = wfcOperatorErrorCodes[i].split("\\|");
                 if (codes.length != 2) {
                     Rlog.e(LOG_TAG, "Invalid carrier config: " + wfcOperatorErrorCodes[i]);
                     continue;
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
index 612be4a..ef841f2 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
@@ -303,6 +303,40 @@
         }
 
         @Override
+        public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
+            logd("sendOrderedBroadcast called for " + intent.getAction());
+            sendBroadcast(intent);
+        }
+
+        @Override
+        public void sendOrderedBroadcast(Intent intent, String receiverPermission,
+                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
+                String initialData, Bundle initialExtras) {
+            sendOrderedBroadcast(intent, receiverPermission);
+            if (resultReceiver != null) {
+                synchronized (mOrderedBroadcastReceivers) {
+                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
+                }
+            }
+        }
+
+        @Override
+        public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
+                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
+                String initialData, Bundle initialExtras) {
+            sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
+                    initialCode, initialData, initialExtras);
+        }
+
+        @Override
+        public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
+                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
+                String initialData, Bundle initialExtras) {
+            sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
+                    initialCode, initialData, initialExtras);
+        }
+
+        @Override
         public void sendBroadcastAsUser(Intent intent, UserHandle user) {
             sendBroadcast(intent);
         }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java
index f0ca274..ecac444 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java
@@ -18,6 +18,7 @@
 
 import android.app.Activity;
 import android.app.IApplicationThread;
+import android.content.BroadcastReceiver;
 import android.content.IIntentReceiver;
 import android.content.Intent;
 import android.os.AsyncResult;
@@ -25,11 +26,15 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Message;
+import android.os.PersistableBundle;
 import android.os.SystemProperties;
+import android.telephony.CarrierConfigManager;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.ims.ImsCallProfile;
 import com.android.ims.ImsEcbmStateListener;
+import com.android.ims.ImsManager;
+import com.android.ims.ImsReasonInfo;
 import com.android.ims.ImsStreamMediaProfile;
 import com.android.ims.ImsUtInterface;
 import com.android.internal.telephony.Call;
@@ -64,6 +69,7 @@
 import static org.mockito.Matchers.anyLong;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.times;
@@ -566,4 +572,42 @@
         // verify wakeLock released
         assertEquals(false, mImsPhoneUT.getWakeLock().isHeld());
     }
+
+    @Test
+    @SmallTest
+    public void testProcessDisconnectReason() throws Exception {
+        // set up CarrierConfig
+        PersistableBundle bundle = mContextFixture.getCarrierConfigBundle();
+        bundle.putStringArray(CarrierConfigManager.KEY_WFC_OPERATOR_ERROR_CODES_STRING_ARRAY,
+                new String[]{"REG09|0"});
+
+        // set up overlays
+        String title = "title";
+        String messageAlert = "Alert!";
+        String messageNotification = "Notification!";
+        mContextFixture.putStringArrayResource(
+                com.android.internal.R.array.wfcOperatorErrorAlertMessages,
+                new String[]{messageAlert});
+        mContextFixture.putStringArrayResource(
+                com.android.internal.R.array.wfcOperatorErrorNotificationMessages,
+                new String[]{messageNotification});
+        mContextFixture.putResource(com.android.internal.R.string.wfcRegErrorTitle, title);
+
+        mImsPhoneUT.processDisconnectReason(
+                new ImsReasonInfo(ImsReasonInfo.CODE_REGISTRATION_ERROR, 0, "REG09"));
+
+        // TODO: Verify that WFC has been turned off (can't do it right now because
+        // setWfcSetting is static).
+        //verify(mImsManager).setWfcSetting(any(), eq(false));
+
+        ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+        verify(mContext).sendOrderedBroadcast(
+                intent.capture(), anyString(), any(BroadcastReceiver.class), any(),
+                eq(Activity.RESULT_OK), anyString(), any());
+        assertEquals(ImsManager.ACTION_IMS_REGISTRATION_ERROR, intent.getValue().getAction());
+        assertEquals(title, intent.getValue().getStringExtra(Phone.EXTRA_KEY_ALERT_TITLE));
+        assertEquals(messageAlert, intent.getValue().getStringExtra(Phone.EXTRA_KEY_ALERT_MESSAGE));
+        assertEquals(messageNotification,
+                intent.getValue().getStringExtra(Phone.EXTRA_KEY_NOTIFICATION_MESSAGE));
+    }
 }