On data only devices use data registration state.

Some operators may report that the voice registration state is
not in service on a data only device. So use the Data registration
state for data only devices.

Bug: 8213254
Change-Id: Ieb6eef65fa5afb3d2c1a39b32a5bc5825ccc7f1c
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index dc96c6c..474523c 100644
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -53,6 +53,8 @@
 
     protected PhoneBase mPhoneBase;
 
+    protected boolean mVoiceCapable;
+
     public ServiceState mSS = new ServiceState();
     protected ServiceState mNewSS = new ServiceState();
 
@@ -196,6 +198,8 @@
         mPhoneBase = phoneBase;
         mCellInfo = cellInfo;
         mCi = ci;
+        mVoiceCapable = mPhoneBase.getContext().getResources().getBoolean(
+                com.android.internal.R.bool.config_voice_capable);
         mUiccController = UiccController.getInstance();
         mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
         mCi.setOnSignalStrengthUpdate(this, EVENT_SIGNAL_STRENGTH_UPDATE, null);
@@ -230,6 +234,22 @@
     }
 
     /**
+     * Some operators have been known to report registration failure
+     * data only devices, to fix that use DataRegState.
+     */
+    protected void useDataRegStateForDataOnlyDevices() {
+        if (mVoiceCapable == false) {
+            if (DBG) {
+                log("useDataRegStateForDataOnlyDevice: VoiceRegState=" + mNewSS.getVoiceRegState()
+                    + " DataRegState=" + mNewSS.getDataRegState());
+            }
+            // TODO: Consider not lying and instead have callers know the difference. 
+            mNewSS.setVoiceRegState(mNewSS.getDataRegState());
+        }
+    }
+
+
+    /**
      * Registration point for combined roaming on
      * combined roaming is true when roaming is true and ONS differs SPN
      *
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java b/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
index 74fbb61..43b0614 100644
--- a/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
@@ -251,6 +251,8 @@
     protected void pollStateDone() {
         log("pollStateDone: lte 1 ss=[" + mSS + "] newSS=[" + mNewSS + "]");
 
+        useDataRegStateForDataOnlyDevices();
+
         boolean hasRegistered = mSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE
                 && mNewSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE;
 
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index 9026be6..3936e9e 100644
--- a/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -964,6 +964,8 @@
             mNewSS.setRoaming(true);
         }
 
+        useDataRegStateForDataOnlyDevices();
+
         boolean hasRegistered =
             mSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE
             && mNewSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE;
diff --git a/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index d4d2edc..99512f4 100644
--- a/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -806,6 +806,8 @@
             mNewSS.setRoaming(true);
         }
 
+        useDataRegStateForDataOnlyDevices();
+
         boolean hasRegistered =
             mSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE
             && mNewSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE;