Add code support for tracking data connection state.

Add Rpc to get current data connection state.
Add Rpc to start/stop tracking data connection.
Add pop event for data connection state change.

Change-Id: Iad24368a76194fcb1f4959f7c5cd6b8a7203c8e0
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java b/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
index fb2d999..6311da0 100755
--- a/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
@@ -44,6 +44,8 @@
 import com.googlecode.android_scripting.facade.tele.TelephonyStateListeners
                                                    .DataConnectionChangeListener;
 import com.googlecode.android_scripting.facade.tele.TelephonyStateListeners
+                                                   .DataConnectionStateChangeListener;
+import com.googlecode.android_scripting.facade.tele.TelephonyStateListeners
                                                    .ServiceStateChangeListener;
 import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
 import com.googlecode.android_scripting.rpc.Rpc;
@@ -74,6 +76,7 @@
 
     private CallStateChangeListener mCallStateChangeListener;
     private DataConnectionChangeListener mDataConnectionChangeListener;
+    private DataConnectionStateChangeListener mDataConnectionStateChangeListener;
     private ServiceStateChangeListener mServiceStateChangeListener;
 
     private ITelephony mITelephony;
@@ -116,6 +119,7 @@
             public Object call() throws Exception {
                 mCallStateChangeListener = new CallStateChangeListener(mEventFacade);
                 mDataConnectionChangeListener = new DataConnectionChangeListener(mEventFacade);
+                mDataConnectionStateChangeListener = new DataConnectionStateChangeListener(mEventFacade);
                 mServiceStateChangeListener = new ServiceStateChangeListener(mEventFacade);
                 return null;
             }
@@ -155,6 +159,17 @@
         mTelephonyManager.listen(mDataConnectionChangeListener, PhoneStateListener.LISTEN_NONE);
     }
 
+    @Rpc(description = "Starts tracking data connection state change.")
+    public void phoneStartTrackingDataConnectionStateChange() {
+        mTelephonyManager.listen(mDataConnectionStateChangeListener,
+                                 DataConnectionStateChangeListener.sListeningStates);
+    }
+
+    @Rpc(description = "Stops tracking data connection state change.")
+    public void phoneStopTrackingDataConnectionStateChange() {
+        mTelephonyManager.listen(mDataConnectionStateChangeListener, PhoneStateListener.LISTEN_NONE);
+    }
+
     @Rpc(description = "Starts tracking service state change.")
     public void phoneStartTrackingServiceStateChange() {
         mTelephonyManager.listen(mServiceStateChangeListener,
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java b/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
index 8858b5f..734c678 100644
--- a/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
@@ -54,15 +54,12 @@
             }
             switch (state) {
                 case TelephonyManager.CALL_STATE_IDLE:
-                    mCallStateEvent.putString("State", "IDLE");
                     subEvent = "Idle";
                     break;
                 case TelephonyManager.CALL_STATE_OFFHOOK:
-                    mCallStateEvent.putString("State", "OFFHOOK");
                     subEvent = "Offhook";
                     break;
                 case TelephonyManager.CALL_STATE_RINGING:
-                    mCallStateEvent.putString("State", "RINGING");
                     subEvent = "Ringing";
                     break;
             }
@@ -94,32 +91,23 @@
             String subEvent = null;
             EventMsg.putString("Type", which);
             if (newState == PreciseCallState.PRECISE_CALL_STATE_ACTIVE) {
-                EventMsg.putString("State", "ACTIVE");
                 subEvent = "Active";
             } else if (newState == PreciseCallState.PRECISE_CALL_STATE_HOLDING) {
-                EventMsg.putString("State", "HOLDING)");
                 subEvent = "Holding";
             } else if (newState == PreciseCallState.PRECISE_CALL_STATE_DIALING) {
-                EventMsg.putString("State", "DIALING");
                 subEvent = "Dialing";
             } else if (newState == PreciseCallState.PRECISE_CALL_STATE_ALERTING) {
-                EventMsg.putString("State", "ALERTING");
                 subEvent = "Alerting";
             } else if (newState == PreciseCallState.PRECISE_CALL_STATE_INCOMING) {
-                EventMsg.putString("State", "INCOMING");
                 subEvent = "Incoming";
             } else if (newState == PreciseCallState.PRECISE_CALL_STATE_WAITING) {
-                EventMsg.putString("State", "WAITING");
                 subEvent = "Waiting";
             } else if (newState == PreciseCallState.PRECISE_CALL_STATE_DISCONNECTED) {
-                EventMsg.putString("State", "DISCONNECTED");
                 subEvent = "Disconnected";
                 EventMsg.putInt("Cause", callState.getPreciseDisconnectCause());
             } else if (newState == PreciseCallState.PRECISE_CALL_STATE_DISCONNECTING) {
-                EventMsg.putString("State", "DISCONNECTING");
                 subEvent = "Disconnecting";
             } else if (newState == PreciseCallState.PRECISE_CALL_STATE_IDLE) {
-                EventMsg.putString("State", "IDLE");
                 subEvent = "Idle";
             }
             mEventFacade.postEvent("onPreciseStateChanged"+subEvent, EventMsg);
@@ -145,20 +133,60 @@
         @Override
         public void onDataConnectionRealTimeInfoChanged(DataConnectionRealTimeInfo dcRtInfo) {
             Bundle event = new Bundle();
+            String subEvent = null;
             event.putString("Type", "modemPowerLvl");
             event.putLong("Time", dcRtInfo.getTime());
 
             int state = dcRtInfo.getDcPowerState();
             if (state == DataConnectionRealTimeInfo.DC_POWER_STATE_LOW) {
-                event.putString("PowerLevel", "LOW");
+                subEvent = "Low";
             } else if (state == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH) {
-                event.putString("PowerLevel", "MEDIUM");
+                subEvent = "High";
             } else if (state == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) {
-                event.putString("PowerLevel", "HIGH");
+                subEvent = "Medium";
             } else if (state == DataConnectionRealTimeInfo.DC_POWER_STATE_UNKNOWN) {
-                event.putString("PowerLevel", "UNKNOWN");
+                subEvent = "Unknown";
             }
-            mEventFacade.postEvent("onModemPowerLevelChanged", event);
+            mEventFacade.postEvent("onModemPowerLevelChanged"+subEvent, event);
+        }
+    }
+
+    public static class DataConnectionStateChangeListener extends PhoneStateListener {
+
+        private final EventFacade mEventFacade;
+        public static final int sListeningStates =
+                PhoneStateListener.LISTEN_DATA_CONNECTION_STATE;
+
+        public DataConnectionStateChangeListener(EventFacade ef) {
+            super();
+            mEventFacade = ef;
+        }
+
+        public DataConnectionStateChangeListener(EventFacade ef, int subId) {
+            super(subId);
+            mEventFacade = ef;
+        }
+
+        @Override
+        public void onDataConnectionStateChanged(int state) {
+            Bundle event = new Bundle();
+            String subEvent = null;
+            event.putString("Type", "DataConnectionState");
+            if (state == TelephonyManager.DATA_DISCONNECTED) {
+                subEvent = "Disconnected";
+            } else if (state == TelephonyManager.DATA_CONNECTING) {
+                subEvent = "Connecting";
+            } else if (state == TelephonyManager.DATA_CONNECTED) {
+                subEvent = "Connected";
+            } else if (state == TelephonyManager.DATA_SUSPENDED) {
+                subEvent = "Suspended";
+            } else if (state == TelephonyManager.DATA_UNKNOWN) {
+                subEvent = "Unknown";
+            } else {
+                subEvent = "UnknownStateCode";
+                event.putInt("UnknownStateCode", state);
+            }
+            mEventFacade.postEvent("onDataConnectionStateChanged"+subEvent, event);
         }
     }
 
@@ -183,19 +211,15 @@
             String subEvent = null;
             switch(serviceState.getVoiceRegState()) {
                 case ServiceState.STATE_EMERGENCY_ONLY:
-                    event.putString("State", "EMERGENCY_ONLY");
                     subEvent = "EmergencyOnly";
                 break;
                 case ServiceState.STATE_IN_SERVICE:
-                    event.putString("State", "IN_SERVICE");
                     subEvent = "InService";
                 break;
                 case ServiceState.STATE_OUT_OF_SERVICE:
-                    event.putString("State","OUT_OF_SERVICE");
                     subEvent = "OutOfService";
                 break;
                 case ServiceState.STATE_POWER_OFF:
-                    event.putString("State", "POWER_OFF");
                     subEvent = "PowerOff";
                 break;
             }