Merge cherrypicks of [15732630, 15732754, 15732755, 15732756, 15732757, 15733137, 15733138, 15732858, 15733570, 15733571, 15733572, 15733573, 15733574, 15732859, 15733575, 15733576, 15733685, 15733686] into sc-d1-release

Change-Id: Ibd3bdd7403e99f3e5271b9750f4d3352a6c8fb6b
diff --git a/src/java/com/android/internal/telephony/GsmCdmaConnection.java b/src/java/com/android/internal/telephony/GsmCdmaConnection.java
index e9ecb79..b79bdef 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaConnection.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaConnection.java
@@ -42,7 +42,7 @@
 import com.android.telephony.Rlog;
 
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collections;
 
 /**
  * {@hide}
@@ -141,7 +141,10 @@
         mAddress = dc.number;
         setEmergencyCallInfo(mOwner);
 
-        mForwardedNumber = new ArrayList<String>(Arrays.asList(dc.forwardedNumber));
+        String forwardedNumber = TextUtils.isEmpty(dc.forwardedNumber) ? null : dc.forwardedNumber;
+        Rlog.i(LOG_TAG, "create, forwardedNumber=" + Rlog.pii(LOG_TAG, forwardedNumber));
+        mForwardedNumber =  forwardedNumber == null ? null :
+                new ArrayList<>(Collections.singletonList(dc.forwardedNumber));
         mIsIncoming = dc.isMT;
         mCreateTime = System.currentTimeMillis();
         mCnapName = dc.name;
@@ -710,11 +713,13 @@
             mOwner.getPhone().getVoiceCallSessionStats().onAudioCodecChanged(this, dc.audioQuality);
         }
 
-        ArrayList<String> forwardedNumber =
-                new ArrayList<String>(Arrays.asList(dc.forwardedNumber));
-        if (!equalsHandlesNulls(mForwardedNumber, forwardedNumber)) {
-            if (Phone.DEBUG_PHONE) log("update: mForwardedNumber, # changed!");
-            mForwardedNumber = forwardedNumber;
+        String forwardedNumber = TextUtils.isEmpty(dc.forwardedNumber) ? null : dc.forwardedNumber;
+        Rlog.i(LOG_TAG, "update: forwardedNumber=" + Rlog.pii(LOG_TAG, forwardedNumber));
+        ArrayList<String> forwardedNumbers =  forwardedNumber == null ? null :
+                new ArrayList<>(Collections.singletonList(dc.forwardedNumber));
+        if (!equalsHandlesNulls(mForwardedNumber, forwardedNumbers)) {
+            if (Phone.DEBUG_PHONE) log("update: mForwardedNumber, # changed");
+            mForwardedNumber = forwardedNumbers;
             changed = true;
         }
 
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
index 06b02c7..6ddc6fe 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
@@ -1324,7 +1324,7 @@
     /**
      * Clear all settings called when entering mInactiveState.
      */
-    private void clearSettings() {
+    private synchronized void clearSettings() {
         if (DBG) log("clearSettings");
 
         mCreateTime = -1;
@@ -3830,7 +3830,7 @@
     }
 
     /** Doesn't print mApnList of ApnContext's which would be recursive */
-    public String toStringSimple() {
+    public synchronized String toStringSimple() {
         return getName() + ": State=" + getCurrentState().getName()
                 + " mApnSetting=" + mApnSetting + " RefCount=" + mApnContexts.size()
                 + " mCid=" + mCid + " mCreateTime=" + mCreateTime
diff --git a/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaConnectionTest.java
index a5d0b4d..a078642 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/GsmCdmaConnectionTest.java
@@ -278,4 +278,22 @@
         assertEquals(new ArrayList<String>(Arrays.asList(forwardedNumber)),
                 connection.getForwardedNumber());
     }
+
+    @Test @SmallTest
+    public void testForwardedNumberEmptyNull() {
+        mDC.state = DriverCall.State.INCOMING;
+        mDC.forwardedNumber = "";
+        connection = new GsmCdmaConnection(mPhone, mDC, mCT, 0);
+        assertNull(connection.getForwardedNumber());
+        mDC.forwardedNumber = null;
+        connection.update(mDC);
+        assertNull(connection.getForwardedNumber());
+
+        mDC.forwardedNumber = null;
+        connection = new GsmCdmaConnection(mPhone, mDC, mCT, 0);
+        assertNull(connection.getForwardedNumber());
+        mDC.forwardedNumber = "";
+        connection.update(mDC);
+        assertNull(connection.getForwardedNumber());
+    }
 }