Add support for DUN over a cdma connection.

It uses the data profile paramater when setting up the connection to indicate
it's a tethered connection.  We get different behavior from vzw afterwards, so
it is getting picked up.

bug:2422545
Change-Id: Ic022845088726d723813b82e166d15d7b2945da1
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
index 6c20204..95cb1c6 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
@@ -20,6 +20,8 @@
 import android.util.Log;
 
 import com.android.internal.telephony.DataConnection;
+import com.android.internal.telephony.gsm.ApnSetting;
+import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.RILConstants;
 
 /**
@@ -71,12 +73,20 @@
         createTime = -1;
         lastFailTime = -1;
         lastFailCause = FailCause.NONE;
+        int dataProfile;
+        if ((cp.apn != null) && (cp.apn.types.length > 0) && (cp.apn.types[0] != null) &&
+                (cp.apn.types[0].equals(Phone.APN_TYPE_DUN))) {
+            if (DBG) log("CdmaDataConnection using DUN");
+            dataProfile = RILConstants.DATA_PROFILE_TETHERED;
+        } else {
+            dataProfile = RILConstants.DATA_PROFILE_DEFAULT;
+        }
 
         // msg.obj will be returned in AsyncResult.userObj;
         Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp);
         msg.obj = cp;
         phone.mCM.setupDataCall(Integer.toString(RILConstants.SETUP_DATA_TECH_CDMA),
-                Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), null, null,
+                Integer.toString(dataProfile), null, null,
                 null, Integer.toString(RILConstants.SETUP_DATA_AUTH_PAP_CHAP), msg);
     }
 
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index af9c652..2f801cc 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -48,6 +48,7 @@
 import com.android.internal.telephony.DataConnection;
 import com.android.internal.telephony.DataConnectionTracker;
 import com.android.internal.telephony.EventLogTags;
+import com.android.internal.telephony.gsm.ApnSetting;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.RetryManager;
 import com.android.internal.telephony.ServiceStateTracker;
@@ -77,9 +78,6 @@
     /** Currently active CdmaDataConnection */
     private CdmaDataConnection mActiveDataConnection;
 
-    /** mimic of GSM's mActiveApn */
-    private boolean mIsApnActive = false;
-
     private boolean mPendingRestartRadio = false;
     private static final int TIME_DELAYED_TO_RESTART_RADIO =
             SystemProperties.getInt("ro.cdma.timetoradiorestart", 60000);
@@ -108,6 +106,14 @@
             Phone.APN_TYPE_DUN,
             Phone.APN_TYPE_HIPRI };
 
+    private static final String[] mDefaultApnTypes = {
+            Phone.APN_TYPE_DEFAULT,
+            Phone.APN_TYPE_MMS,
+            Phone.APN_TYPE_HIPRI };
+
+    // if we have no active Apn this is null
+    protected ApnSetting mActiveApn;
+
     // Possibly promoate to base class, the only difference is
     // the INTENT_RECONNECT_ALARM action is a different string.
     // Do consider technology changes if it is promoted.
@@ -250,7 +256,7 @@
 
     @Override
     protected boolean isApnTypeActive(String type) {
-        return (mIsApnActive && isApnTypeAvailable(type));
+        return mActiveApn != null && mActiveApn.canHandleType(type);
     }
 
     @Override
@@ -265,10 +271,9 @@
 
     protected String[] getActiveApnTypes() {
         String[] result;
-        if (mIsApnActive) {
-            result = mSupportedApnTypes.clone();
+        if (mActiveApn != null) {
+            result = mActiveApn.types;
         } else {
-            // TODO - should this return an empty array?  See GSM too.
             result = new String[1];
             result[0] = Phone.APN_TYPE_DEFAULT;
         }
@@ -414,7 +419,6 @@
     }
 
     private boolean setupData(String reason) {
-
         CdmaDataConnection conn = findFreeDataConnection();
 
         if (conn == null) {
@@ -423,12 +427,19 @@
         }
 
         mActiveDataConnection = conn;
-        mIsApnActive = true;
+        String[] types;
+        if (mRequestedApnType.equals(Phone.APN_TYPE_DUN)) {
+            types = new String[1];
+            types[0] = Phone.APN_TYPE_DUN;
+        } else {
+            types = mDefaultApnTypes;
+        }
+        mActiveApn = new ApnSetting(0, "", "", "", "", "", "", "", "", "", "", 0, types);
 
         Message msg = obtainMessage();
         msg.what = EVENT_DATA_SETUP_COMPLETE;
         msg.obj = reason;
-        conn.connect(msg);
+        conn.connect(msg, mActiveApn);
 
         setState(State.INITING);
         phone.notifyDataConnection(reason);
@@ -627,7 +638,7 @@
         if (DBG) log("gotoIdleAndNotifyDataConnection: reason=" + reason);
         setState(State.IDLE);
         phone.notifyDataConnection(reason);
-        mIsApnActive = false;
+        mActiveApn = null;
     }
 
     protected void onRecordsLoaded() {
@@ -649,8 +660,7 @@
      */
     @Override
     protected void onEnableNewApn() {
-        // for cdma we only use this when default data is enabled..
-        onTrySetupData(Phone.REASON_DATA_ENABLED);
+          cleanUpConnection(true, Phone.REASON_APN_SWITCHED);
     }
 
     /**
@@ -763,7 +773,7 @@
         }
 
         phone.notifyDataConnection(reason);
-        mIsApnActive = false;
+        mActiveApn = null;
         if (retryAfterDisconnected(reason)) {
           trySetupData(reason);
       }
diff --git a/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java b/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java
index 8d807fd..4cbfc87 100644
--- a/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java
+++ b/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java
@@ -32,12 +32,12 @@
     String user;
     String password;
     int authType;
-    String[] types;
+    public String[] types;
     int id;
     String numeric;
 
 
-    ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port,
+    public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port,
             String mmsc, String mmsProxy, String mmsPort,
             String user, String password, int authType, String[] types) {
         this.id = id;
@@ -73,7 +73,7 @@
         return sb.toString();
     }
 
-    boolean canHandleType(String type) {
+    public boolean canHandleType(String type) {
         for (String t : types) {
             // DEFAULT handles all, and HIPRI is handled by DEFAULT
             if (t.equals(type) || t.equals(Phone.APN_TYPE_ALL) ||