Add ECBM functionality for IMS
Uma Maheswari Ramalingam [Thu, 31 Jul 2014 23:01:47 +0000 (16:01 -0700)]
Code for adding ECBM functionality for IMS.

Change-Id: I2833c81baf0a55a18ac6433c47fd76bad7cf0ec9

src/java/com/android/ims/ImsEcbm.java [new file with mode: 0644]
src/java/com/android/ims/ImsEcbmStateListener.java [new file with mode: 0644]
src/java/com/android/ims/ImsManager.java

diff --git a/src/java/com/android/ims/ImsEcbm.java b/src/java/com/android/ims/ImsEcbm.java
new file mode 100644 (file)
index 0000000..9fa9598
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *    * Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+ *    * Redistributions in binary form must reproduce the above
+ *      copyright notice, this list of conditions and the following
+ *      disclaimer in the documentation and/or other materials provided
+ *      with the distribution.
+ *    * Neither the name of The Linux Foundation nor the names of its
+ *      contributors may be used to endorse or promote products derived
+ *      from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.android.ims;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import android.os.AsyncResult;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.RemoteException;
+import android.telephony.Rlog;
+
+import com.android.ims.internal.IImsEcbm;
+import com.android.ims.internal.IImsEcbmListener;
+import com.android.ims.ImsEcbmStateListener;
+
+/**
+ * Provides APIs for the supplementary service settings using IMS (Ut interface).
+ * It is created from 3GPP TS 24.623 (XCAP(XML Configuration Access Protocol)
+ * over the Ut interface for manipulating supplementary services).
+ *
+ * @hide
+ */
+public class ImsEcbm {
+    private static final String TAG = "ImsEcbm";
+    private static final boolean DBG = true;
+
+    private final IImsEcbm miEcbm;
+
+    public ImsEcbm(IImsEcbm iEcbm) {
+        if (DBG) Rlog.d(TAG, "ImsEcbm created");
+        miEcbm = iEcbm;
+    }
+
+    public void setEcbmStateListener(ImsEcbmStateListener ecbmListener) throws ImsException {
+        try {
+            miEcbm.setListener(new ImsEcbmListenerProxy(ecbmListener));
+        } catch (RemoteException e) {
+            throw new ImsException("setEcbmStateListener()", e,
+                    ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
+        }
+    }
+
+    public void exitEmergencyCallbackMode() throws ImsException {
+        try {
+            miEcbm.exitEmergencyCallbackMode();
+        } catch (RemoteException e) {
+            throw new ImsException("exitEmergencyCallbackMode()", e,
+                    ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
+        }
+    }
+
+    /**
+     * Adapter class for {@link IImsEcbmListener}.
+     */
+    private class ImsEcbmListenerProxy extends IImsEcbmListener.Stub {
+        private ImsEcbmStateListener mListener;
+
+        public ImsEcbmListenerProxy(ImsEcbmStateListener listener) {
+            mListener = listener;
+        }
+
+        @Override
+        public void enteredECBM() {
+            if (DBG) Rlog.d(TAG, "enteredECBM ::");
+
+            if (mListener != null) {
+                mListener.onECBMEntered();
+            }
+        }
+
+        @Override
+        public void exitedECBM() {
+            if (DBG) Rlog.d(TAG, "exitedECBM ::");
+
+            if (mListener != null) {
+                mListener.onECBMExited();
+            }
+        }
+    }
+}
diff --git a/src/java/com/android/ims/ImsEcbmStateListener.java b/src/java/com/android/ims/ImsEcbmStateListener.java
new file mode 100644 (file)
index 0000000..ea662ee
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *    * Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+ *    * Redistributions in binary form must reproduce the above
+ *      copyright notice, this list of conditions and the following
+ *      disclaimer in the documentation and/or other materials provided
+ *      with the distribution.
+ *    * Neither the name of The Linux Foundation nor the names of its
+ *      contributors may be used to endorse or promote products derived
+ *      from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.android.ims;
+
+/**
+ * Listener for receiving notifications about changes to the IMS connection.
+ * It provides a state of IMS registration between UE and IMS network, the service
+ * availability of the local device during IMS registered.
+ *
+ * @hide
+ */
+public class ImsEcbmStateListener {
+    /**
+     * Called when the device enters Emergency Callback Mode
+     */
+    public void onECBMEntered() {
+        // no-op
+    }
+
+    /**
+     * Called when the device exits Emergency Callback Mode
+     */
+    public void onECBMExited() {
+        // no-op
+    }
+}
index c186046..494e8dc 100644 (file)
@@ -29,6 +29,8 @@ import android.os.ServiceManager;
 import android.telephony.Rlog;
 
 import com.android.ims.internal.IImsCallSession;
+import com.android.ims.internal.IImsEcbm;
+import com.android.ims.internal.IImsEcbmListener;
 import com.android.ims.internal.IImsRegistrationListener;
 import com.android.ims.internal.IImsService;
 import com.android.ims.internal.IImsUt;
@@ -132,6 +134,9 @@ public class ImsManager {
     // Interface to get/set ims config items
     private ImsConfig mConfig = null;
 
+    // ECBM interface
+    private ImsEcbm mEcbm = null;
+
     /**
      * Gets a manager instance.
      *
@@ -232,6 +237,7 @@ public class ImsManager {
         } finally {
             mUt = null;
             mConfig = null;
+            mEcbm = null;
         }
     }
 
@@ -607,6 +613,7 @@ public class ImsManager {
             mImsService = null;
             mUt = null;
             mConfig = null;
+            mEcbm = null;
 
             if (mContext != null) {
                 Intent intent = new Intent(ACTION_IMS_SERVICE_DOWN);
@@ -695,4 +702,30 @@ public class ImsManager {
         }
 
     }
+    /**
+     * Gets the ECBM interface to request ECBM exit.
+     *
+     * @param serviceId a service id which is obtained from {@link ImsManager#open}
+     * @return the ECBM interface instance
+     * @throws ImsException if getting the ECBM interface results in an error
+     */
+    public ImsEcbm getEcbmInterface(int serviceId) throws ImsException {
+        if (mEcbm == null) {
+            checkAndThrowExceptionIfServiceUnavailable();
+
+            try {
+                IImsEcbm iEcbm = mImsService.getEcbmInterface(serviceId);
+
+                if (iEcbm == null) {
+                    throw new ImsException("getEcbmInterface()",
+                            ImsReasonInfo.CODE_ECBM_NOT_SUPPORTED);
+                }
+                mEcbm = new ImsEcbm(iEcbm);
+            } catch (RemoteException e) {
+                throw new ImsException("getEcbmInterface()", e,
+                        ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
+            }
+        }
+        return mEcbm;
+    }
 }