SL4A: Expose Voice mail related APIs.

1. Expose TelephonyManager.getVoiceMessageCount
2. Add Listener for LISTEN_MESSAGE_WAITING_INDICATOR

Change-Id: I5e92dd2c55b8f63c9dcc346cbec7d0cb5c52f860
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 a325f86..6c5da99 100644
--- a/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
@@ -54,6 +54,8 @@
                                                    .DataConnectionStateChangeListener;
 import com.googlecode.android_scripting.facade.tele.TelephonyStateListeners
                                                    .ServiceStateChangeListener;
+import com.googlecode.android_scripting.facade.tele.TelephonyStateListeners
+                                                   .VoiceMailStateChangeListener;
 import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
 import com.googlecode.android_scripting.rpc.Rpc;
 import com.googlecode.android_scripting.rpc.RpcDefault;
@@ -139,6 +141,8 @@
                     mStateListeners.mDataConnectionRTInfoChangeListener =
                         new DataConnectionRealTimeInfoChangeListener(mEventFacade,
                                                                      subId);
+                    mStateListeners.mVoiceMailStateChangeListener =
+                        new VoiceMailStateChangeListener(mEventFacade, subId);
 
                     StateChangeListeners.put(subId, mStateListeners);
                 }
@@ -537,6 +541,50 @@
         }
     }
 
+    @Rpc(description = "Starts tracking voice mail state change " +
+                       "for default subscription ID.")
+    public Boolean phoneStartTrackingVoiceMailStateChange() {
+        return phoneStartTrackingVoiceMailStateChangeForSubscription(
+                                 SubscriptionManager.getDefaultSubId());
+    }
+
+    @Rpc(description = "Starts tracking voice mail state change " +
+                       "for specified subscription ID.")
+    public Boolean phoneStartTrackingVoiceMailStateChangeForSubscription(
+                   @RpcParameter(name = "subId") Integer subId) {
+         try {
+            mTelephonyManager.listen(
+                StateChangeListeners.get(subId).mVoiceMailStateChangeListener,
+                VoiceMailStateChangeListener.sListeningStates);
+            return true;
+        } catch (Exception e) {
+            Log.e("Invalid subscription ID");
+            return false;
+        }
+    }
+
+    @Rpc(description = "Stops tracking voice mail state change " +
+                       "for default subscription ID.")
+    public Boolean phoneStopTrackingVoiceMailStateChange() {
+        return phoneStopTrackingVoiceMailStateChangeForSubscription(
+                                 SubscriptionManager.getDefaultSubId());
+    }
+
+    @Rpc(description = "Stops tracking voice mail state change " +
+                       "for specified subscription ID.")
+    public Boolean phoneStopTrackingVoiceMailStateChangeForSubscription(
+                   @RpcParameter(name = "subId") Integer subId) {
+        try {
+            mTelephonyManager.listen(
+                StateChangeListeners.get(subId).mVoiceMailStateChangeListener,
+                PhoneStateListener.LISTEN_NONE);
+            return true;
+        } catch (Exception e) {
+            Log.e("Invalid subscription ID");
+            return false;
+        }
+    }
+
     //FIXME: b/20917712 to support videoCall parameter in Extras
     @Deprecated
     @Rpc(description = "Calls a phone by resolving a generic URI.")
@@ -950,6 +998,17 @@
         return mTelephonyManager.getVoiceMailNumber(subId);
     }
 
+    @Rpc(description = "Get voice message count for specified subscription ID.")
+    public Integer getVoiceMailCountForSubscription(
+                   @RpcParameter(name = "subId") Integer subId) {
+        return mTelephonyManager.getVoiceMessageCount(subId);
+    }
+
+    @Rpc(description = "Get voice message count for default subscription ID.")
+    public Integer getVoiceMailCount() {
+        return mTelephonyManager.getVoiceMessageCount();
+    }
+
     @Rpc(description = "Returns true if the device is in  roaming state" +
                        "for default subscription ID")
     public Boolean checkNetworkRoaming() {
@@ -1200,6 +1259,7 @@
         return mTelephonyManager.isVideoCallingEnabled();
     }
 
+
     @Rpc(description = "Returns a boolean of isImsRegistered()")
     public Boolean isImsRegistered() {
         return mTelephonyManager.isImsRegistered();
@@ -1260,6 +1320,8 @@
                            mDataConnectionStateChangeListener;
         private DataConnectionRealTimeInfoChangeListener
                            mDataConnectionRTInfoChangeListener;
+        private VoiceMailStateChangeListener
+                           mVoiceMailStateChangeListener;
     }
 
     @Override
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 88888ba..24797e4 100644
--- a/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
@@ -308,4 +308,31 @@
         }
     }
 
+    public static class VoiceMailStateChangeListener extends PhoneStateListener {
+
+        private final EventFacade mEventFacade;
+
+        public static final int sListeningStates =
+                PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR;
+
+        public VoiceMailStateChangeListener(EventFacade ef) {
+            super();
+            mEventFacade = ef;
+        }
+
+        public VoiceMailStateChangeListener(EventFacade ef, int subId) {
+            super(subId);
+            mEventFacade = ef;
+        }
+
+        @Override
+        public void onMessageWaitingIndicatorChanged(boolean messageWaitingIndicator) {
+            Bundle event = new Bundle();
+            event.putBoolean("MessageWaitingIndicator", messageWaitingIndicator);
+
+            mEventFacade.postEvent(
+                    "onMessageWaitingIndicatorChanged", event);
+        }
+    }
+
 }