Merge "RCS: add RCS service file"
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/rcs_service_aidl/Android.mk b/rcs_service_aidl/Android.mk
new file mode 100644
index 0000000..580b6c8
--- /dev/null
+++ b/rcs_service_aidl/Android.mk
@@ -0,0 +1,55 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src
+
+# Important: Must not contain any aidl files for parcelables
+LOCAL_SRC_FILES := \
+	$(call all-java-files-under, src) \
+	src/com/suntek/mway/rcs/client/api/autoconfig/IAutoConfigApi.aidl \
+	src/com/suntek/mway/rcs/client/api/blacklist/IBlackListApi.aidl \
+	src/com/suntek/mway/rcs/client/api/capability/ICapabilityApi.aidl \
+	src/com/suntek/mway/rcs/client/api/capability/IRcsCapabilityApi.aidl \
+	src/com/suntek/mway/rcs/client/api/emoticon/IEmoticonApi.aidl \
+	src/com/suntek/mway/rcs/client/api/im/IGroupManagerApi.aidl \
+	src/com/suntek/mway/rcs/client/api/im/IInstantMessageApi.aidl \
+	src/com/suntek/mway/rcs/client/api/im/IPaMessageApi.aidl \
+	src/com/suntek/mway/rcs/client/api/IRCSServiceListener.aidl \
+	src/com/suntek/mway/rcs/client/api/login/ILoginApi.aidl \
+	src/com/suntek/mway/rcs/client/api/login/ILoginEventListener.aidl \
+	src/com/suntek/mway/rcs/client/api/mcloud/IMcloudFileApi.aidl \
+	src/com/suntek/mway/rcs/client/api/mcontact/IMcontactApi.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/ICapabiltyListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IConferenceCallback.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonCallbackApi.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonCanSendCallback.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonPackagesNetCallbackApi.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonSetSuccessDownListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudAuthListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudConfListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudFileListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudMsgListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudOperationCtrl.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudSdkListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudShareListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudTransListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IMContactSyncListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IProfileGetCallback.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IProfileListener.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IProfilePutCallback.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/callback/IPublicAccountCallbackAPI.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/IMcloudFileApi.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/IProfileApi.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/IPublicAccountAPI.aidl \
+	src/com/suntek/mway/rcs/client/api/plugin/IRichScreenApi.aidl \
+	src/com/suntek/mway/rcs/client/api/plugincenter/IPluginCenterApi.aidl \
+	src/com/suntek/mway/rcs/client/api/registration/IRegistrationApi.aidl \
+	src/com/suntek/mway/rcs/client/api/setting/callback/IAccountEventListener.aidl \
+	src/com/suntek/mway/rcs/client/api/setting/IRcsSettingApi.aidl \
+	src/com/suntek/mway/rcs/client/api/specialnumber/ISpecialServiceNumApi.aidl
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := rcs_service_aidl
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
\ No newline at end of file
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterface.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterface.java
new file mode 100644
index 0000000..387c1de
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterface.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+import java.util.List;
+import java.util.Vector;
+
+import com.suntek.mway.rcs.client.api.constant.APIConstant;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.Context;
+
+/**
+ * <p>Title: ClientInterface base class</p>
+ * <p>
+ * Description: The abstract class <code>ClientInterface</code> represents a bridge of
+ * communication between local and service. Any object that wants to communicate to
+ * the service must extends <code>com.suntek.mway.rcs.api.client.ClientInterface</code>.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public abstract class ClientInterface {
+    /**
+     * a vertor of {@link ClientInterfaceListener}
+     */
+    private Vector<ClientInterfaceListener> listeners = new Vector<ClientInterfaceListener>();
+
+    /**
+     * Constructs an ClientInterface with zero ClientInterfaceListener.
+     */
+    public ClientInterface() {
+    }
+
+    /**
+     * add a {@link ClientInterfaceListener}
+     * @param listener a implementation of ClientInterfaceListener
+     */
+    public void addInterfaceEventListener(ClientInterfaceListener listener) {
+        listeners.addElement(listener);
+    }
+
+    /**
+     * remove a {@link ClientInterfaceListener}
+     *
+     * @param listener a implementation of ClientInterfaceListener
+     */
+    public void removeInterfaceEventListener(ClientInterfaceListener listener) {
+        listeners.removeElement(listener);
+    }
+
+    /**
+     * remove all {@link ClientInterfaceListener}
+     */
+    public void removeAllInterfaceEventListeners() {
+        listeners.removeAllElements();
+    }
+
+    /**
+     * when the local connect to service, then notify all of its {@link ClientInterfaceListener}
+     */
+    public void notifyEventInterfaceConnected() {
+        for(int i=0; i < listeners.size(); i++) {
+            ClientInterfaceListener listener = (ClientInterfaceListener)listeners.elementAt(i);
+            listener.handleInterfaceConnected();
+        }
+    }
+
+    /**
+     * when disconnect between local and service, then notify all of its {@link ClientInterfaceListener}
+     */
+    public void notifyEventInterfaceDisconnected() {
+        for(int i=0; i < listeners.size(); i++) {
+            ClientInterfaceListener listener = (ClientInterfaceListener)listeners.elementAt(i);
+            listener.handleInterfaceDisconnected();
+        }
+    }
+
+    /**
+     * check the service is start or not.
+     * @param ctx android.content.Context
+     * @return true if the service is started , false otherwise.
+     */
+    public static boolean isServiceStarted(Context ctx) {
+        ActivityManager activityManager = (ActivityManager)ctx.getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningServiceInfo> serviceList = activityManager.getRunningServices(Integer.MAX_VALUE);
+         for(int i = 0; i < serviceList.size(); i++) {
+               ActivityManager.RunningServiceInfo serviceInfo = serviceList.get(i);
+               ComponentName serviceName = serviceInfo.service;
+               if (serviceName.getClassName().equals(APIConstant.CORE_SERVICE_CLASSNAME)) {
+                     if (serviceInfo.pid != 0) {
+                          return true;
+                     } else {
+                          return false;
+                     }
+               }
+         }
+         return false;
+    }
+
+    /**
+     * subclass must override this method  for connect operation
+     */
+    protected abstract void connectInterface();
+
+    /**
+     * subclass must override this method  for disconnect operation
+     */
+    protected abstract void disconnectInterface();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceException.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceException.java
new file mode 100644
index 0000000..c8c213b
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceException.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+/**
+ * <p>Title: ClientInterfaceException base class</p>
+ * <p>
+ * Description: The class <code>ClientInterfaceException</code> and its subclasses are a form of
+ * <code>Exception</code> that indicates conditions that a reasonable application
+ * might want to catch.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class ClientInterfaceException extends java.lang.Exception {
+    static final long serialVersionUID = 4210559475585831906L;
+
+    /**
+     * Constructs a new exception with the specified detail message.
+     * @param message the detail message.
+     */
+    public ClientInterfaceException(String message) {
+        super(message);
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceIntents.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceIntents.java
new file mode 100644
index 0000000..a0f2bb3
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceIntents.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+/**
+ * <p>Title: ClientInterfaceIntents interface</p>
+ * <p>
+ * Description: The interface <code>ClientInterfaceIntents</code> defines a series of
+ * broadcast messages which are indicated by the field definition in this class.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public interface ClientInterfaceIntents {
+    /**
+     * the broadcast message of login or logout.
+     * The android.content.Intent associated with
+     * the broadcast message carries three arguments
+     * that are described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <th>extra variable name</th><th>type</th><th>description</th>
+     * </tr>
+     * <tr>
+     *     <td>status</td><td>int</td><td>{@link ClientInterfaceIntents#REGISTER_SUCCESS}<br/>{@link ClientInterfaceIntents#REGISTER_FAILED}<br/>{@link ClientInterfaceIntents#REGISTER_TERMINATED}<br/>{@link ClientInterfaceIntents#REGISTER_IN_PROGRESS}</td>
+     * </tr>
+     * <tr>
+     *     <td>errorCode</td><td>int</td><td>the error code related to register failure</td>
+     * </tr>
+     * <tr>
+     *     <td>message</td><td>String</td><td>the message related to register failure</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_REGISTER_STATUS_CHANGED = "com.suntek.mway.rcs.ACTION_REGISTER_STATUS_CHANGED";
+
+    /**
+     * register successfully.
+     */
+    public static final int REGISTER_SUCCESS = 200;
+
+    /**
+     * register fail.
+     */
+    public static final int REGISTER_FAILED = -1;
+
+    /**
+     * unregister successfully.
+     */
+    public static final int REGISTER_TERMINATED = -3;
+
+    /**
+     * In the register progress.
+     */
+    public static final int REGISTER_IN_PROGRESS = 202;
+
+    /** The Constant DMS_USER_STATUS_OK. */
+    public static final int DMS_USER_STATUS_OK = 0;
+
+    /** The Constant DMS_USER_STATUS_TEMP_PASSIVE_DISABLED. */
+    public static final int DMS_USER_STATUS_TEMP_PASSIVE_DISABLED = 1;
+
+    /** The Constant DMS_USER_STATUS_PERMANENT_DISABLED. */
+    public static final int DMS_USER_STATUS_PERMANENT_DISABLED = 2;
+
+    /** The Constant DMS_USER_STATUS_TEMP_ACTIVE_DISABLED. */
+    public static final int DMS_USER_STATUS_TEMP_ACTIVE_DISABLED = 3;
+
+    /** The Constant DMS_USER_STATUS_DORMANT. */
+    public static final int DMS_USER_STATUS_DORMANT = 4;
+
+    /**
+     * the broadcast message of audio or video call.
+     * The android.content.Intent associated with
+     * the broadcast message carries three arguments
+     * that are described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <th>extra variable name</th><th>type</th><th>description</th>
+     * </tr>
+     * <tr>
+     *     <td>callRecordId</td><td>int</td><td>long</td><td>call record id</td>
+     * </tr>
+     * <tr>
+     *     <td>sessionId</td><td>long</td><td>session id</td>
+     * </tr>
+     * <tr>
+     *     <td>contact</td><td>String</td><td>phone number</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_INCOMING_AV_CALL = "com.suntek.mway.rcs.ACTION_INCOMING_AV_CALL";
+
+    /**
+     * the broadcast message of the status changed of message to be send.
+     * The android.content.Intent associated with
+     * the broadcast message carries two arguments
+     * that are described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <th>extra variable name</th><th>type</th><th>description</th>
+     * </tr>
+     * <tr>
+     *     <td>status</td><td>int</td><td>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_STATE_SEND_OK}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_STATE_SEND_REC}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_STATE_SENDED}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_STATE_SEND_ING}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_STATE_SEND_FAIL}</td>
+     * </tr>
+     * <tr>
+     *     <td>messageId</td><td>String</td><td>message id</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_MESSAGE_STATUS_CHANGED = "com.suntek.mway.rcs.ACTION_MESSAGE_STATUS_CHANGED";
+
+    /**
+     * the broadcast message of the new arrival message.
+     * The android.content.Intent associated with
+     * the broadcast message carries four arguments
+     * that are described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <th>extra variable name</th><th>type</th><th>description</th>
+     * </tr>
+     * <tr>
+     *     <td>msgType</td><td>int</td><td>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_TEXT}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_FILE}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_LOCATION}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_CONTACT}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_GROUP_INFO}</td>
+     * </tr>
+     * <tr>
+     *     <td>contact</td><td>String</td><td>phone number</td>
+     * </tr>
+     * <tr>
+     *     <td>message</td><td>String</td><td>message content</td>
+     * </tr>
+     * <tr>
+     *     <td>receivedAt</td><td>Date</td><td>received date</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_INCOMING_MESSAGE = "com.suntek.mway.rcs.message.ACTION_INCOMING_MESSAGE";
+
+    /**
+     * the broadcast message of the file transfer progress changed.
+     * The android.content.Intent associated with
+     * the broadcast message carries four arguments
+     * that are described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <th>name</th><th>type</th><th>description</th>
+     * </tr>
+     * <tr>
+     *     <td>messageId</td><td>String</td><td>message id</td>
+     * </tr>
+     * <tr>
+     *     <td>file</td><td>String</td><td>the path of file being transfered</td>
+     * </tr>
+     * <tr>
+     *     <td>current</td><td>long</td><td>current bytes being sent</td>
+     * </tr>
+     * <tr>
+     *     <td>total</td><td>long</td><td>total bytes of file</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_FILE_TRANSFER_PROGRESS_CHANGED = "com.suntek.mway.rcs.ACTION_FILE_TRANSFER_PROGRESS_CHANGED";
+
+    /**
+     * the broadcast message of request before incoming file transfer is established.
+     * The android.content.Intent associated with
+     * the broadcast message carries five arguments
+     * that are described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <th>name</th><th>type</th><th>description</th>
+     * </tr>
+     * <tr>
+     *     <td>contact</td><td>String</td><td>phone number</td>
+     * </tr>
+     * <tr>
+     *     <td>sessionId</td><td>long</td><td>session id</td>
+     * </tr>
+     * <tr>
+     *     <td>filename</td><td>String</td><td>file name</td>
+     * </tr>
+     * <tr>
+     *     <td>fileSize</td><td>long</td><td>bytes of file</td>
+     * </tr>
+     * <tr>
+     *     <td>fileType</td><td>String</td><td>file type</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_INCOMING_FILE_TRANSFER = "com.suntek.mway.rcs.message.ACTION_INCOMING_FILE_TRANSFER";
+
+    /**
+     * the broadcast message of incoming geographical location.
+     */
+    //public final static String ACTION_INCOMING_LOCATION = "com.suntek.mway.rcs.message.ACTION_INCOMING_LOCATION";
+
+    /**
+     * the broadcast message of incoming contacts.
+     */
+    //public final static String ACTION_INCOMING_CONTACT = "com.suntek.mway.rcs.message.ACTION_INCOMING_CONTACT";
+
+    /**
+     * the broadcast message of request before one to one chat invitation is agreed.
+     * The android.content.Intent associated with
+     * the broadcast message carries three arguments
+     * that are described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <th>name</th><th>type</th><th>description</th>
+     * </tr>
+     * <tr>
+     *     <td>contact</td><td>String</td><td>phone number</td>
+     * </tr>
+     * <tr>
+     *     <td>subject</td><td>String</td><td>chat topic</td>
+     * </tr>
+     * <tr>
+     *     <td>sessionId</td><td>long</td><td>session id</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_ONE_2_ONE_CHAT_INVITATION = "com.suntek.mway.rcs.message.ACTION_ONE_2_ONE_CHAT_INVITATION";
+
+    /**
+     * the broadcast message of request before group chat invitation is agreed.
+     * The android.content.Intent associated with
+     * the broadcast message carries three arguments
+     * that are described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <th>name</th><th>type</th><th>description</th>
+     * </tr>
+     * <tr>
+     *     <td>contact</td><td>String</td><td>chat room uri</td>
+     * </tr>
+     * <tr>
+     *     <td>subject</td><td>String</td><td>chat topic</td>
+     * </tr>
+     * <tr>
+     *     <td>sessionId</td><td>long</td><td>session id</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_GROUP_CHAT_INVITATION = "com.suntek.mway.rcs.message.ACTION_GROUP_CHAT_INVITATION";
+
+    /**
+     * the broadcast message of incoming group message.
+     * The android.content.Intent associated with
+     * the broadcast message carries four arguments
+     * that are described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <th>name</th><th>type</th><th>description</th>
+     * </tr>
+     * <tr>
+     *     <td>sessionId</td><td>long</td><td>session id of group chat</td>
+     * </tr>
+     * <tr>
+     *     <td>msgType</td><td>int</td><td>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_TEXT}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_FILE}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_LOCATION}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_CONTACT}<br/>{@link com.suntek.mway.rcs.client.api.provider.SuntekMessageData#MSG_TYPE_GROUP_INFO}</td>
+     * </tr>
+     * <tr>
+     *     <td>contact</td><td>String</td><td>phone number</td>
+     * </tr>
+     * <tr>
+     *     <td>message</td><td>String</td><td>message content</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_INCOMING_GROUP_MESSAGE = "com.suntek.mway.rcs.message.ACTION_INCOMING_GROUP_MESSAGE";
+
+    /**
+     * the broadcast message of the capability of contacts changed.
+     * The android.content.Intent associated with
+     * the broadcast message carries one argument
+     * that is described as the following table:
+     * <table border="1">
+     * <tr>
+     *     <td>contact</td><td>String</td><td>phone number</td>
+     * </tr>
+     * </table>
+     */
+    public final static String ACTION_CAPABILITY_STATUS_CHANGED = "com.suntek.mway.rcs.message.ACTION_CAPABILITY_STATUS_CHANGED";
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceListener.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceListener.java
new file mode 100644
index 0000000..23e76bf
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceListener.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+/**
+ * <p>Title: ClientInterfaceListener interface</p>
+ * <p>
+ * Description: The interface <code>ClientInterfaceListener</code> defines two callback methods
+ * about connect/disconnect between local and service.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public interface ClientInterfaceListener {
+    /**
+     * to be invoked when local is connected to the service.
+     */
+    public void handleInterfaceConnected();
+
+    /**
+     * to be invoked when local is disconnected from the service
+     */
+    public void handleInterfaceDisconnected();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceNotify.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceNotify.java
new file mode 100644
index 0000000..e477b2e
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ClientInterfaceNotify.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+/**
+ * <p>Title: ClientInterfaceNotify class</p>
+ * <p>
+ * Description: The class <code>ClientInterfaceNotify</code> is a singleton that
+ * represents the notification when local is connecting to the service.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class ClientInterfaceNotify {
+    /**
+     * the singleton instance.
+     */
+    private static ClientInterfaceNotify instance;
+
+    /**
+     * the only one static method to be invoked to get a singleton instance.
+     * @return singleton instance of ClientInterfaceNotify
+     */
+    public static ClientInterfaceNotify getInstance() {
+        if(instance == null) {
+            synchronized(ClientInterfaceNotify.class){
+                if(instance == null){
+                    instance = new ClientInterfaceNotify();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * private constructor to avoid new a instance from outer environment.
+     */
+    private ClientInterfaceNotify() {}
+
+    /**
+     * This is a blocking method.
+     * When invoked, the caller will be blocked until the local is connected to the service.
+     */
+    public void waitConnected() {
+        try {
+            synchronized(this) {
+                wait();
+            }
+        } catch(java.lang.InterruptedException e) {
+
+        }
+    }
+
+    /**
+     * when invoked, wakes up the caller which invoked the method <code>waitConnected()</code> before.
+     */
+    public void notifyConnected() {
+        synchronized(this) {
+            notifyAll();
+        }
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/CoreServiceNotAvailableException.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/CoreServiceNotAvailableException.java
new file mode 100644
index 0000000..d700afc
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/CoreServiceNotAvailableException.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+/**
+ * <p>Title: CoreServiceNotAvailableException base class</p>
+ * <p>
+ * Description: The class <code>CoreServiceNotAvailableException</code> and its subclasses are a form of
+ * {@link ClientInterfaceException} that indicates conditions that a reasonable application
+ * might want to catch.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class CoreServiceNotAvailableException extends ClientInterfaceException {
+    private static final long serialVersionUID = 8574566864861749638L;
+    /**
+     * Constant of CORE_SERVICE_NOT_AVAILABLE whose value is Core service not available;
+     */
+    private static final String CORE_SERVICE_NOT_AVAILABLE = "Core service not available";
+    /**
+     * Constructs a new exception with the pre-defined constant message {@code CORE_SERVICE_NOT_AVAILABLE} .
+     * @param message the detail message.
+     */
+    public CoreServiceNotAvailableException() {
+        super(CORE_SERVICE_NOT_AVAILABLE);
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/IRCSServiceListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/IRCSServiceListener.aidl
new file mode 100644
index 0000000..b104d54
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/IRCSServiceListener.aidl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+interface IRCSServiceListener
+{
+    void onServiceConnected();
+    void onServiceDisconnected();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/RCSApplication.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/RCSApplication.java
new file mode 100644
index 0000000..582150b
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/RCSApplication.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+import android.app.Application;
+import android.content.Context;
+
+/**
+ * <p>Title: RCSApplication class</p>
+ * <p>
+ * Description: The class <code>RCSApplication</code>
+ * is the root of the class hierarchy in UI project. The UI application
+ * must extends <code>com.suntek.mway.rcs.api.client.RCSApplication</code>
+ * and override the method onCreate() to initialize various APIs
+ * (
+ * such as {@link com.suntek.mway.rcs.client.api.capability.CapabilityApi},
+ * {@link com.suntek.mway.rcs.client.api.contacts.ContactApi},
+ * {@link com.suntek.mway.rcs.client.api.im.MessageApi},
+ * {@link com.suntek.mway.rcs.client.api.log.LogAPI},
+ * {@link com.suntek.mway.rcs.client.api.registration.RegistrationApi},
+ * {@link com.suntek.mway.rcs.client.api.setting.SettingApi},
+ * {@link com.suntek.mway.rcs.client.api.voip.VoIpApi}
+ * )
+ * provided by RCS
+ * according to business needs.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class RCSApplication extends Application {
+
+    /**
+     * instance of RCSApplication.
+     */
+    private static RCSApplication rcsApp;
+
+    /**
+     * handler of android.content.Context.
+     */
+    private static Context ctx;
+
+    /**
+     * construct a new instance of RCSApplication
+     */
+    public RCSApplication() {
+        RCSApplication.rcsApp = this;
+    }
+
+    /**
+     * init context with the specified subclass of android.content.Context
+     * here is the instance of RCSApplication.
+     * @param context subclass of android.content.Context, here is the instance of RCSApplication.
+     */
+    public static void initContext(Context context) {
+        ctx = context;
+    }
+
+    /**
+     * returns subclass of android.content.Context, here is the instance of RCSApplication
+     * @return the instance of RCSApplication
+     */
+    public static Context getContext() {
+        if(ctx == null) {
+            ctx = RCSApplication.rcsApp;
+        }
+        return ctx;
+    }
+
+    /**
+     * override the method to initialize various API provided by RCS
+     * according to business needs.
+     */
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        initContext(this);
+        ServiceInterface.init(this);
+    }
+
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ServiceInterface.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ServiceInterface.java
new file mode 100644
index 0000000..04c5e0d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ServiceInterface.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * <p>Title: ServiceInterface class</p>
+ * <p>
+ * Description: The class <code>ServiceInterface</code> is used to initialize the service context
+ * for future use.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class ServiceInterface {
+
+    /**
+     * Constant of the key related to the specific service.
+     */
+    public static final String SERVICE_NAME = "com.suntek.mway.rcs.SERVICE";
+
+    /**
+     * initialize the service context. when invoke the method
+     * a service associated with the constant key <code>SERVICE_NAME</code>
+     * will be initialize and started by the specified parameter ctx.
+     * @param ctx android.content.Context
+     */
+    public static void init(Context ctx) {
+        ctx.startService(new Intent(SERVICE_NAME));
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ServiceUnknownException.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ServiceUnknownException.java
new file mode 100644
index 0000000..2a3f46d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/ServiceUnknownException.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+import android.os.RemoteException;
+
+/**
+ * <p>Title: ServiceUnknownException base class</p>
+ * <p>
+ * Description: The class <code>ServiceUnknownException</code> and its subclasses are a form of
+ * <code>ServiceUnknownException</code> that indicates unregister status when trying to invoke some
+ * methods of the APIs
+ * such as {@link com.suntek.mway.rcs.client.api.capability.CapabilityApi},
+ * {@link com.suntek.mway.rcs.client.api.contacts.ContactApi},
+ * {@link com.suntek.mway.rcs.client.api.im.MessageApi},
+ * {@link com.suntek.mway.rcs.client.api.log.LogAPI},
+ * {@link com.suntek.mway.rcs.client.api.setting.SettingApi},
+ * {@link com.suntek.mway.rcs.client.api.voip.VoIpApi}
+ * provided by RCS without invoke register() method
+ * of {@link com.suntek.mway.rcs.client.api.registration.RegistrationApi}.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class ServiceUnknownException extends RemoteException {
+    static final long serialVersionUID = 10000L;
+
+    /**
+     * Constructs a new exception with the specified detail exception.
+     *
+     * @param ex Exception
+     */
+    public ServiceUnknownException(Exception ex) {
+        setStackTrace(ex.getStackTrace());
+    }
+
+    /**
+     * Constructs a new exception with the specified detail message.
+     *
+     * @param error Error message
+     */
+    public ServiceUnknownException(String message) {
+        Exception ex = new Exception(message);
+        this.setStackTrace(ex.getStackTrace());
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/autoconfig/IAutoConfigApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/autoconfig/IAutoConfigApi.aidl
new file mode 100644
index 0000000..9c4f756
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/autoconfig/IAutoConfigApi.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.autoconfig;
+
+/**
+ * AutoConfig API
+ */
+interface IAutoConfigApi {
+
+    // User accept rcs auto registration provisions and press accept button to continue
+    void acceptAutoReg();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/blacklist/IBlackListApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/blacklist/IBlackListApi.aidl
new file mode 100644
index 0000000..26d57eb
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/blacklist/IBlackListApi.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.blacklist;
+
+interface IBlackListApi
+{
+    boolean add(String number);
+    boolean remove(String number);
+    void clear();
+    boolean checkIsBlack(String number);
+    List<String> getList();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/ICapabilityApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/ICapabilityApi.aidl
new file mode 100644
index 0000000..2a2ea0b
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/ICapabilityApi.aidl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.capability;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.ICapabiltyListener;
+
+interface ICapabilityApi
+{
+    void findCapabilityByNumber(String number, ICapabiltyListener listener);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/IRcsCapabilityApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/IRcsCapabilityApi.aidl
new file mode 100644
index 0000000..084828a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/IRcsCapabilityApi.aidl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.capability;
+
+import com.suntek.mway.rcs.client.api.capability.RCSCapabilities;
+
+/**
+ * Rcs Capability API
+ */
+interface IRcsCapabilityApi {
+    // reset capabilities for a contact
+    void resetCapabilities(in String contact);
+
+    // reset capabilities for all contacts
+    void resetAllCapabilities();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/RCSCapabilities.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/RCSCapabilities.aidl
new file mode 100644
index 0000000..cdded0a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/RCSCapabilities.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.capability;
+
+parcelable RCSCapabilities;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/RCSCapabilities.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/RCSCapabilities.java
new file mode 100644
index 0000000..515afc9
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/capability/RCSCapabilities.java
@@ -0,0 +1,739 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.capability;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+import com.suntek.mway.rcs.client.api.constant.APIConstant;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: RCSCapabilities class</p>
+ * <p>
+ * Description: The class <code>RCSCapabilities</code> represents a series of
+ * capabilities of the contact, which is indicated by the field definition in this class.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class RCSCapabilities implements Parcelable,Serializable {
+    /**
+     *
+     */
+    private static final long serialVersionUID = 5516256269504150135L;
+
+    /**
+     * Image sharing support,
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.gsma-is"
+     */
+    //private boolean imageSharingSupported = false;
+
+    /**
+     * Video sharing support
+     * +g.3gpp.cs-voice
+     */
+    //private boolean videoSharingSupported = false;
+
+    /**
+     * IP voice call support
+     * "urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel"
+     */
+    //private boolean ipVoiceCallSupported = false;
+
+    /**
+     * IP video call support
+     * "urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel";video
+     */
+    //private boolean ipVideoCallSupported = false;
+
+    /**
+     * IM session support
+     * "urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.session"
+     */
+    private boolean imSessionSupported = false;
+
+    /**
+     * File transfer support
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.ft"
+     * "urn%3Aurn-7%3A3gppservice.ims.icsi.oma.cpm.filetransfer"
+     */
+    private boolean fileTransferSupported = false;
+
+    /**
+     * CS video support
+     * +g.3gpp.cs-voice
+     */
+    //private boolean csVideoSupported = false;
+
+    /**
+     * Presence discovery support
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.dp"
+     */
+    //private boolean presenceDiscoverySupported = false;
+
+    /**
+     * Social presence support
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.sp"
+     */
+    //private boolean socialPresenceSupported = false;
+
+    /**
+     * File transfer over HTTP support
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.fthttp"
+     */
+    //private boolean fileTransferHttpSupported = false;
+
+    /**
+     * Geolocation push support
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.geopush"
+     */
+    private boolean geolocationPushSupported = false;
+
+    /**
+     * Geolocation pull support
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.geopullft"
+     */
+    private boolean geolocationPullSupported = false;
+
+    /**
+     * File Transfer Thumbnail support
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.ftthumb"
+     */
+    private boolean fileTransferThumbnailSupported = false;
+
+    /**
+     * File Transfer S&F
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.ftstandfw"
+     */
+    private boolean fileTransferStoreForwardSupported = false;
+
+    /**
+     * Group chat S&F
+     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.fullsfgroupchat"
+     */
+    private boolean groupChatStoreForwardSupported = false;
+
+    /**
+     * SIP automata (@see RFC 3840)
+     * +g.oma.sip-im
+     */
+    //
+
+    /**
+     * page mode message
+     */
+    private boolean pageModeMsgSupported = false;
+
+    /**
+     * large mode message
+     */
+    private boolean largeModeMsgSupported = false;
+
+    /**
+     * public message
+     */
+    private boolean publicMsgSupported = false;
+
+    /**
+     * vemotion
+     */
+    private boolean vemotionSupported = false;
+
+    /**
+     * cmcc
+     */
+    private boolean cmccSupported = false;
+
+    private boolean burnAfterReading = false;
+
+    /**
+     * Last capabilities update
+     */
+    private long timestamp = System.currentTimeMillis();
+
+    /**
+     * Constructor
+     */
+    public RCSCapabilities() {
+    }
+
+    /**
+     * Construct a new RCSCapabilities() with another specified instance of RCSCapabilities.
+     *
+     * @param source another instance of RCSCapabilities.
+     */
+    public RCSCapabilities(Parcel source) {
+        //this.imageSharingSupported = source.readInt() != 0;
+        //this.videoSharingSupported = source.readInt() != 0;
+        //this.ipVoiceCallSupported = source.readInt() != 0;
+        //this.ipVideoCallSupported = source.readInt() != 0;
+        this.imSessionSupported = source.readInt() != 0;
+        this.fileTransferSupported = source.readInt() != 0;
+        //this.csVideoSupported = source.readInt() != 0;
+        //this.presenceDiscoverySupported = source.readInt() != 0;
+        //this.socialPresenceSupported = source.readInt() != 0;
+        //this.fileTransferHttpSupported = source.readInt() != 0;
+        this.geolocationPushSupported = source.readInt() != 0;
+        this.geolocationPullSupported = source.readInt() != 0;
+        this.fileTransferThumbnailSupported = source.readInt() != 0;
+        this.fileTransferStoreForwardSupported = source.readInt() != 0;
+        this.groupChatStoreForwardSupported = source.readInt() != 0;
+        this.pageModeMsgSupported = source.readInt() != 0;
+        this.largeModeMsgSupported = source.readInt() != 0;
+        this.publicMsgSupported = source.readInt() != 0;
+        this.vemotionSupported = source.readInt() != 0;
+        this.cmccSupported = source.readInt() != 0;
+        this.burnAfterReading = source.readInt() != 0;
+        //this.sipAutomata = source.readInt() != 0;
+        this.timestamp = source.readLong();
+    }
+
+    /**
+     * Describe the kinds of special objects contained in this Parcelable's
+     * marshalled representation
+     *
+     * @return Integer
+     */
+    public int describeContents() {
+        return APIConstant.PARCEL_OBJECT_TYPE;
+    }
+
+    /**
+     * Write parcelable object
+     *
+     * @param dest The Parcel in which the object should be written
+     * @param flags Additional flags about how the object should be written
+     */
+    public void writeToParcel(Parcel dest, int flags) {
+        //dest.writeInt(imageSharingSupported ? 1 : 0);
+        //dest.writeInt(videoSharingSupported ? 1 : 0);
+        //dest.writeInt(ipVoiceCallSupported ? 1 : 0);
+        //dest.writeInt(ipVideoCallSupported ? 1 : 0);
+        dest.writeInt(imSessionSupported ? 1 : 0);
+        dest.writeInt(fileTransferSupported ? 1 : 0);
+        //dest.writeInt(csVideoSupported ? 1 : 0);
+        //dest.writeInt(presenceDiscoverySupported ? 1 : 0);
+        //dest.writeInt(socialPresenceSupported ? 1 : 0);
+        //dest.writeInt(fileTransferHttpSupported ? 1 : 0);
+        dest.writeInt(geolocationPushSupported ? 1 : 0);
+        dest.writeInt(geolocationPullSupported ? 1 : 0);
+        dest.writeInt(fileTransferThumbnailSupported ? 1 : 0);
+        dest.writeInt(fileTransferStoreForwardSupported ? 1 : 0);
+        dest.writeInt(groupChatStoreForwardSupported ? 1 : 0);
+        dest.writeInt(pageModeMsgSupported ? 1 : 0);
+        dest.writeInt(largeModeMsgSupported ? 1 : 0);
+        dest.writeInt(publicMsgSupported ? 1 : 0);
+        dest.writeInt(vemotionSupported ? 1 : 0);
+        dest.writeInt(cmccSupported ? 1 : 0);
+        dest.writeInt(burnAfterReading ? 1 : 0);
+        //dest.writeInt(sipAutomata ? 1 : 0);
+        dest.writeLong(timestamp);
+    }
+
+    /**
+     * a fast way to get a Parcelable creator.
+     */
+    public static final Parcelable.Creator<RCSCapabilities> CREATOR
+            = new Parcelable.Creator<RCSCapabilities>() {
+        public RCSCapabilities createFromParcel(Parcel source) {
+            return new RCSCapabilities(source);
+        }
+
+        public RCSCapabilities[] newArray(int size) {
+            return new RCSCapabilities[size];
+        }
+    };
+
+    /**
+     * Is image sharing supported
+     *
+     * @return Boolean
+     */
+    /*
+    public boolean isImageSharingSupported() {
+        return imageSharingSupported;
+    }
+    */
+    /**
+     * Set the image sharing support
+     *
+     * @param supported Supported
+     */
+    /*
+    public void setImageSharingSupported(boolean supported) {
+        this.imageSharingSupported = supported;
+    }
+    */
+    /**
+     * Is video sharing supported
+     *
+     * @return Boolean
+     */
+    /*
+    public boolean isVideoSharingSupported() {
+        return videoSharingSupported;
+    }
+    */
+    /**
+     * Set the video sharing support
+     *
+     * @param supported Supported
+     */
+    /*
+    public void setVideoSharingSupported(boolean supported) {
+        this.videoSharingSupported = supported;
+    }
+    */
+
+    /**
+     * Is IP voice call supported
+     *
+     * @return Boolean
+     */
+    /*
+    public boolean isIpVoiceCallSupported() {
+        return ipVoiceCallSupported;
+    }
+    */
+    /**
+     * Is IP video call supported
+     *
+     * @return Boolean
+     */
+    /*
+    public boolean isIpVideoCallSupported() {
+        return ipVideoCallSupported;
+    }
+    */
+    /**
+     * Set the IP voice call support
+     *
+     * @param supported Supported
+     */
+    /*
+    public void setIpVoiceCallSupported(boolean supported) {
+        this.ipVoiceCallSupported = supported;
+    }
+    */
+    /**
+     * Set the IP video call support
+     *
+     * @param supported Supported
+     */
+    /*
+    public void setIpVideoCallSupported(boolean supported) {
+        this.ipVideoCallSupported = supported;
+    }
+    */
+    /**
+     * Is IM session supported
+     *
+     * @return Boolean
+     */
+    public boolean isImSessionSupported() {
+        return imSessionSupported;
+    }
+
+    /**
+     * Set the IM session support
+     *
+     * @param supported Supported
+     */
+    public void setImSessionSupported(boolean supported) {
+        this.imSessionSupported = supported;
+    }
+
+    /**
+     * Is file transfer supported
+     *
+     * @return Boolean
+     */
+    public boolean isFileTransferSupported() {
+        return fileTransferSupported;
+    }
+
+    /**
+     * Set the file transfer support
+     *
+     * @param supported Supported
+     */
+    public void setFileTransferSupported(boolean supported) {
+        this.fileTransferSupported = supported;
+    }
+
+    /**
+     * Is CS video supported
+     *
+     * @return Boolean
+     */
+    /*
+    public boolean isCsVideoSupported() {
+        return csVideoSupported;
+    }
+    */
+    /**
+     * Set the CS video support
+     *
+     * @param supported Supported
+     */
+    /*
+    public void setCsVideoSupported(boolean supported) {
+        this.csVideoSupported = supported;
+    }
+    */
+    /**
+     * Is presence discovery supported
+     *
+     * @return Boolean
+     */
+    /*
+    public boolean isPresenceDiscoverySupported() {
+        return presenceDiscoverySupported;
+    }
+    */
+
+    /**
+     * Set the presence discovery support
+     *
+     * @param supported Supported
+     */
+    /*
+    public void setPresenceDiscoverySupported(boolean supported) {
+        this.presenceDiscoverySupported = supported;
+    }
+    */
+
+    /**
+     * Is social presence supported
+     *
+     * @return Boolean
+     */
+    /*
+    public boolean isSocialPresenceSupported() {
+        return socialPresenceSupported;
+    }
+    */
+
+    /**
+     * Set the social presence support
+     *
+     * @param supported Supported
+     */
+    /*
+    public void setSocialPresenceSupported(boolean supported) {
+        this.socialPresenceSupported = supported;
+    }
+    */
+
+    /**
+     * Is file transfer over HTTP supported
+     *
+     * @return Boolean
+     */
+    /*
+    public boolean isFileTransferHttpSupported() {
+        return fileTransferHttpSupported;
+    }
+    */
+    /**
+     * Set the file transfer over HTTP support
+     *
+     * @param supported Supported
+     */
+    /*
+    public void setFileTransferHttpSupported(boolean supported) {
+        this.fileTransferHttpSupported = supported;
+    }
+    */
+    /**
+     * Is Geolocation Push supported
+     *
+     * @return Boolean
+     */
+    public boolean isGeolocationPushSupported() {
+        return geolocationPushSupported;
+    }
+
+    /**
+     * Set the Geolocation Pull support
+     *
+     * @param supported Supported
+     */
+    public void setGeolocationPullSupported(boolean supported) {
+        this.geolocationPullSupported = supported;
+    }
+
+    /**
+     * Is Geolocation Pull supported
+     *
+     * @return Boolean
+     */
+    public boolean isGeolocationPullSupported() {
+        return geolocationPullSupported;
+    }
+
+    /**
+     * Set the Geolocation Push support
+     *
+     * @param supported Supported
+     */
+    public void setGeolocationPushSupported(boolean supported) {
+        this.geolocationPushSupported = supported;
+    }
+
+    /**
+     * Is file transfer thumbnail supported
+     *
+     * @return Boolean
+     */
+    public boolean isFileTransferThumbnailSupported() {
+        return fileTransferThumbnailSupported;
+    }
+
+    /**
+     * Set the file transfer thumbnail support
+     *
+     * @param supported Supported
+     */
+    public void setFileTransferThumbnailSupported(boolean supported) {
+        this.fileTransferThumbnailSupported = supported;
+    }
+
+    /**
+     * Is file transfer S&F supported
+     *
+     * @return Boolean
+     */
+
+    public boolean isFileTransferStoreForwardSupported() {
+        return fileTransferStoreForwardSupported;
+    }
+
+    /**
+     * Set the file transfer S&F support
+     *
+     * @param supported Supported
+     */
+
+    public void setFileTransferStoreForwardSupported(boolean supported) {
+        this.fileTransferStoreForwardSupported = supported;
+    }
+
+    /**
+     * Is group chat S&F supported
+     *
+     * @return Boolean
+     */
+    public boolean isGroupChatStoreForwardSupported() {
+        return groupChatStoreForwardSupported;
+    }
+
+    /**
+     * Set the group chat S&F support
+     *
+     * @param supported Supported
+     */
+    public void setGroupChatStoreForwardSupported(boolean supported) {
+        this.groupChatStoreForwardSupported = supported;
+    }
+
+    /**
+     * Is device an automata ?
+     * @return True if automata
+     */
+    /*
+    public boolean isSipAutomata() {
+        return sipAutomata;
+    }
+    */
+
+    /**
+     * Set the SIP automata feature tag
+     * @param sipAutomata
+     */
+    /*
+    public void setSipAutomata(boolean sipAutomata) {
+        this.sipAutomata = sipAutomata;
+    }
+    */
+
+    /**
+     * page mode message or not
+     * @return
+     */
+    public boolean isPageModeMsgSupported() {
+        return pageModeMsgSupported;
+    }
+
+    /**
+     * Set page mode message
+     * @param pageModeMsg
+     */
+    public void setPageModeMsgSupported(boolean pageModeMsg) {
+        this.pageModeMsgSupported = pageModeMsg;
+    }
+
+    /**
+     * large mode message or not
+     * @return
+     */
+    public boolean isLargeModeMsgSupported() {
+        return largeModeMsgSupported;
+    }
+
+    /**
+     * set large mode message
+     * @param largeModeMsg
+     */
+    public void setLargeModeMsgSupported(boolean largeModeMsg) {
+        this.largeModeMsgSupported = largeModeMsg;
+    }
+
+    /**
+     * public message or not
+     * @return
+     */
+    public boolean isPublicMsgSupported() {
+        return publicMsgSupported;
+    }
+
+    /**
+     * set public message
+     * @param publicMsg
+     */
+    public void setPublicMsgSupported(boolean publicMsg) {
+        this.publicMsgSupported = publicMsg;
+    }
+
+    /**
+     * ve motion or not
+     * @return
+     */
+    public boolean isVemotionSupported() {
+        return vemotionSupported;
+    }
+
+    /**
+     * set ve motion
+     * @param vemotion
+     */
+    public void setVemotionSupported(boolean vemotion) {
+        this.vemotionSupported = vemotion;
+    }
+
+    /**
+     * group management(modify group name, kick people, transfer the group) nor not
+     * @return
+     */
+    public boolean isCmccSupported() {
+        return cmccSupported;
+    }
+
+    /**
+     * set group management
+     * @param cmcc
+     */
+    public void setCmccSupported(boolean cmcc) {
+        this.cmccSupported = cmcc;
+    }
+
+    /**
+     * Checks is burn after reading
+     * @return
+     */
+    public boolean isBurnAfterReading() {
+        return burnAfterReading;
+    }
+
+    /**
+     * Set burn after reading
+     * @param burnAfterReading
+     */
+    public void setBurnAfterReading(boolean burnAfterReading) {
+        this.burnAfterReading = burnAfterReading;
+    }
+
+    /**
+     * Get the capabilities timestamp
+     *
+     * @return Timestamp (in milliseconds)
+     */
+    public long getTimestamp() {
+        return timestamp;
+    }
+
+    /**
+     * Set capabilities timestamp
+     *
+     * @param Timestamp
+     */
+    public void setTimestamp(long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    /**
+     * Returns a string representation of the object
+     *
+     * @return String
+     */
+    public String toString() {
+
+        return
+
+            //", Video_share=" + videoSharingSupported +
+            //", IP_voice_call=" + ipVoiceCallSupported +
+            //", IP_video_call=" + ipVideoCallSupported +
+            "File_transfer=" + fileTransferSupported +
+            //", Image_share=" + imageSharingSupported +
+            ", File_transferStoreForward=" + fileTransferStoreForwardSupported +
+
+            ", Chat=" + imSessionSupported +
+            //", CS_video=" + csVideoSupported +
+            //", Presence_discovery=" + presenceDiscoverySupported +
+            //", Social_presence=" + socialPresenceSupported +
+            //", FT_http=" + fileTransferHttpSupported +
+            ", groupChatStoreForward=" + groupChatStoreForwardSupported +
+            ", Geolocation_push=" + geolocationPushSupported +
+            ", Geolocation_pull=" + geolocationPullSupported +
+            ", FT_thumbnail=" + fileTransferThumbnailSupported +
+            ", pageModeMsg=" + pageModeMsgSupported +
+            ", largeModeMsg=" + largeModeMsgSupported +
+            ", publicMsg=" + publicMsgSupported +
+            ", vemotion=" + vemotionSupported +
+            ", cmcc=" + cmccSupported +
+            ", burnAfterReading=" + burnAfterReading +
+            //", SipAutomata=" + sipAutomata +
+            ", Timestamp=" + timestamp;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/constant/APIConstant.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/constant/APIConstant.java
new file mode 100644
index 0000000..8e16757
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/constant/APIConstant.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.constant;
+
+/**
+ * <p>Title: APIConstant class</p>
+ * <p>
+ * Description: The class <code>APIConstant</code> represents a series of
+ * constants of SDK API, which is indicated by the field definition in this class.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public abstract class APIConstant {
+    /**
+     * The kind of special object contained in this Parcelable's
+     * marshalled representation
+     */
+    public static final int PARCEL_OBJECT_TYPE = 0;
+
+    /**
+     * Class name for CoreService.
+     */
+    public static final String CORE_SERVICE_CLASSNAME = "com.suntek.mway.rcs.app.service.core.CoreService";
+    public static final String MAIN_SERVICE_NAME = "com.suntek.mway.rcs.app.service.service.ServiceManager";
+    /** The Constant IM_STATUS_OFFLINE. */
+    public static final int IM_STATUS_OFFLINE = 0;
+
+    /** The Constant IM_STATUS_ONLINE. */
+    public static final int IM_STATUS_ONLINE = 1;
+
+    public static final int BUTTON_HIDDEN = 0;
+
+    public static final int BUTTON_DISPLAY = 1;
+
+
+    /** The Constant LOGIN_SUCCESS. */
+    public static final int LOGIN_SUCCESS = 0;
+
+    /** The Constant LOGIN_FAIL. */
+    public static final int LOGIN_FAIL = 1;
+
+    /** The Constant SIM_CARD_NOT_EXIST. */
+    public static final int SIM_CARD_NOT_EXIST = 2;
+
+    /** The Constant NETWORK_NOT_AVAILABLE. */
+    public static final int NETWORK_NOT_AVAILABLE = 3;
+
+    /** current account has not open RCS business **/
+    public static final int ACCOUNT_NOT_OPEN_BUSS_ERR_CODE = -999;
+    /** current network is not PS network, must change to PS network. **/
+    public static final int MUST_OPEN_PS_ERR_CODE = -998;
+    /** current account's status is invalid.**/
+    public static final int ACCOUNT_STATUS_INVALID_ERR_CODE = -997;
+
+    /** Send message auto select system sms or im */
+    public static final int MSG_SEND_POLICY_AUTO = 1;
+
+    /** Send message auto select system sms */
+    public static final int MSG_SEND_POLICY_SMS = 2;
+
+    /** Send message auto select im */
+    public static final int MSG_SEND_POLICY_IM = 3;
+
+    /** Remind me when message sent by SMS  */
+    public static final int SMS_SEND_REMIND = 1;
+
+    /** Not need remind me when message sent by SMS  */
+    public static final int SMS_SEND_NOT_REMIND = 0;
+
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/constant/BroadcastConstants.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/constant/BroadcastConstants.java
new file mode 100644
index 0000000..472cca8
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/constant/BroadcastConstants.java
@@ -0,0 +1,589 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.constant;
+
+/**
+ * The Class BroadcastContstants.
+ */
+public class BroadcastConstants {
+
+    /** Text send by system SMS broadcast action */
+    public static final String SYSTEM_SMS_SEND_TEXT = "com.suntek.mway.rcs.ACTION_SYSTEM_SMS_SEND";
+
+    /** SYSTEM_SMS_SEND_TEXT broadcast passed parameter name text String. */
+    public static final String BC_VAR_SMS_TEXT = "text";
+
+    /** SYSTEM_SMS_SEND_TEXT broadcast passed parameter name time Long. */
+    public static final String BC_VAR_SMS_TIME = "time";
+
+    /** Notify UI to show message notification. */
+    public static final String UI_SHOW_MESSAGE_NOTIFY = "com.suntek.mway.rcs.ACTION_UI_SHOW_MESSAGE_NOTIFY";
+
+    /** Notify UI to refresh message. */
+    public static final String UI_REFRESH_MESSAGE_LIST = "com.suntek.mway.rcs.ACTION_UI_MESSAGE_LIST_NEED_REFRESH";
+
+    /** UI_REFRESH_MESSAGE_LIST broadcast passed parameter name isBlack int. */
+    public static final String BC_VAR_MSG_BLACK_FLAG = "blackMsgFlag";
+
+    /** Notify UI to show group message notification. */
+    public static final String UI_SHOW_GROUP_MESSAGE_NOTIFY = "com.suntek.mway.rcs.ACTION_UI_SHOW_GROUP_MESSAGE_NOTIFY";
+
+    /**
+     * Notify UI that changed group information
+     */
+    public static final String UI_GROUP_MANAGE_NOTIFY = "com.suntek.mway.rcs.ACTION_UI_GROUP_MANAGE_NOTIFY";
+
+    /**
+     * Notify UI that group state is invalid
+     * contains parameter groupId, state
+     */
+    public static final String UI_GROUP_STATE_ERROR = "com.suntek.mway.rcs.ACTION_UI_GROUP_STATE_ERROR";
+
+    /** Notify UI that message status has changed */
+    public static final String UI_MESSAGE_STATUS_CHANGE_NOTIFY = "com.suntek.mway.rcs.ACTION_UI_MESSAGE_STATUS_CHANGE_NOTIFY";
+
+    /** Notify UI that message has added to database */
+    public static final String UI_MESSAGE_ADD_DATABASE = "com.suntek.mway.rcs.ACTION_UI_MESSAGE_ADD_TO_DATABASE";
+
+    /** UI_MESSAGE_ADD_DATABASE broadcast passed parameter name chatMessage long. */
+    public static final String BC_VAR_CHAT_MESSAGE = "chatMessage";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name threadId long. */
+    public static final String BC_VAR_MSG_THREAD_ID = "threadId";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name id Integer. */
+    public static final String BC_VAR_ID = "id";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name status Integer. */
+    public static final String BC_VAR_MSG_STATUS = "status";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name contact String. */
+    public static final String BC_VAR_MSG_CONTACT = "contact";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name contactName String. */
+    public static final String BC_VAR_MSG_NAME = "name";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name msgType Integer. */
+    public static final String BC_VAR_MSG_TYPE = "msgType";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name burnFlag Integer. */
+    public static final String BC_VAR_BURN_FLAG = "burnFlag";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name tickerText String. */
+    public static final String BC_VAR_MSG_TICKERTEXT = "tickerText";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name groupId String. */
+    public static final String BC_VAR_MSG_GROUP_ID = "groupId";
+
+    /**
+     * UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name actionType String.
+     *
+     * actionType contains:
+     * {@link BroadcastConstants#ACTION_TYPE_CREATE}
+     * {@link BroadcastConstants#ACTION_TYPE_CREATE_NOT_ACTIVE}
+     * {@link BroadcastConstants#ACTION_TYPE_CONNECTED}
+     * {@link BroadcastConstants#ACTION_TYPE_DEPARTED}
+     * {@link BroadcastConstants#ACTION_TYPE_BOOTED}
+     * {@link BroadcastConstants#ACTION_TYPE_DELETED}
+     * {@link BroadcastConstants#ACTION_TYPE_UPDATE_ALIAS}
+     * {@link BroadcastConstants#ACTION_TYPE_UPDATE_CHAIRMAN}
+     * {@link BroadcastConstants#ACTION_TYPE_UPDATE_REMARK}
+     * {@link BroadcastConstants#ACTION_TYPE_UPDATE_SUBJECT}
+     */
+
+    public static final String BC_VAR_MSG_ACTION_TYPE = "actionType";
+
+    /***
+     * Group created
+     */
+    public static final String ACTION_TYPE_CREATE = "create";
+
+    /**
+     * Group create but not active
+     */
+    public static final String ACTION_TYPE_CREATE_NOT_ACTIVE = "create_not_active";
+
+    /***
+     * New member to join the group
+     */
+    public static final String ACTION_TYPE_CONNECTED = "connected";
+    /**
+     * Group member quit
+     */
+    public static final String ACTION_TYPE_DEPARTED = "departed";
+    /**
+     * Member has been kicked out of the group
+     */
+    public static final String ACTION_TYPE_BOOTED = "booted";
+
+    /**
+     * Group has disband
+     */
+    public static final String ACTION_TYPE_DELETED = "deleted";
+
+    /**
+     * Update the subject of group
+     */
+    public static final String ACTION_TYPE_UPDATE_SUBJECT = "updateSubject";
+
+    /**
+     * Update the remark of group
+     */
+    public static final String ACTION_TYPE_UPDATE_REMARK = "updateRemark";
+
+    /**
+     * Update the alias of group member
+     */
+    public static final String ACTION_TYPE_UPDATE_ALIAS = "updateAlias";
+
+    /**
+     * Update the alias of group member
+     */
+    public static final String ACTION_TYPE_UPDATE_CHAIRMAN = "updateChairman";
+
+    /**
+     * Update the max count of group
+     */
+    public static final String ACTION_TYPE_UPDATE_MAXCOUNT = "updateMaxCount";
+
+    /**
+     * Over the max count of group
+     */
+    public static final String ACTION_TYPE_OVER_MAXCOUNT = "overMaxCount";
+
+    /**
+     * Update the policy of group
+     */
+    public static final String ACTION_TYPE_POLICY_UPDATE = "updatePolicy";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name phoneNumber String. */
+    public static final String BC_VAR_MSG_PHONE = "phoneNumber";
+
+    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name displayName String. */
+    public static final String BC_VAR_MSG_DISPLAY_NAME = "displayName";
+
+    /** Update download progress broadcast. */
+    public static final String UPDATE_DOWN_PROGRESS = "update_download_progress";
+
+    /** UPDATE_DOWN_PROGRESS broadcast passed parameter name id String. */
+    public static final String BC_VAR_DOWN_PRG_ID = "id";
+
+    /** UPDATE_DOWN_PROGRESS broadcast passed parameter name progress integer. */
+    public static final String BC_VAR_DOWN_PRG_PROGRESS = "progress";
+
+    /** File transfer progress broadcast. */
+    public static final String FILE_TRANSFER_PROGRESS = "ui_file_transfre_progress";
+
+    /** UPDATE_DOWN_PROGRESS broadcast passed parameter name messageId String. */
+    public static final String BC_VAR_TRANSFER_PRG_MESSAGE_ID = "messageId";
+
+    /** UPDATE_DOWN_PROGRESS broadcast passed parameter name sessionId long. */
+    public static final String BC_VAR_TRANSFER_PRG_SESSION_ID = "sessionId";
+
+    /** UPDATE_DOWN_PROGRESS broadcast passed parameter name start long. */
+    public static final String BC_VAR_TRANSFER_PRG_START = "start";
+
+    /** UPDATE_DOWN_PROGRESS broadcast passed parameter name end long. */
+    public static final String BC_VAR_TRANSFER_PRG_END = "end";
+
+    /** UPDATE_DOWN_PROGRESS broadcast passed parameter name total long. */
+    public static final String BC_VAR_TRANSFER_PRG_TOTAL = "total";
+
+    /** Warning file is too large broadcast. */
+    public static final String UI_ALERT_FILE_TOO_LARGE = "com.suntek.mway.rcs.ACTION_UI_MESSAGE_ALERT_FILE_TOO_LARGE";
+
+    /** UI_ALERT_FILE_TOO_LARGE broadcast passed parameter name fileMaxSize String. */
+    public static final String BC_VAR_FILE_MAX_SIZE = "fileMaxSizeKb";
+
+    /** Warning File extension is not valid broadcast. */
+    public static final String UI_ALERT_FILE_SUFFIX_INVALID = "com.suntek.mway.rcs.ACTION_UI_MESSAGE_ALERT_FILE_SUFFIX_INVALID";
+
+    /** UI_ALERT_FILE_SUFFIX_INVALID broadcast passed parameter name validSuffix String. */
+    public static final String BC_VAR_FILE_VALID_SUFFIX = "validSuffix";
+
+    /** Invite users to join a group chat broadcast. */
+    public static final String UI_INVITE_TO_JOIN_GROUP = "com.suntek.mway.rcs.ACTION_UI_INVITE_TO_JOIN_GROUP";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name groupId String. */
+    public static final String BC_VAR_GROUP_ID = "groupId";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name subject String. */
+    public static final String BC_VAR_GROUP_SUBJECT = "subject";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name remark String. */
+    public static final String BC_VAR_GROUP_REMARK = "remark";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name inviteUser String. */
+    public static final String BC_VAR_INVITE_USER = "inviteUser";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name chatUri String. */
+    public static final String BC_VAR_CHARURI = "chatUri";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name conversationId String. */
+    public static final String BC_VAR_CONVERSATION_ID = "conversationId";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name contributionId String. */
+    public static final String BC_VAR_CONTRIBUTION_ID = "contributionId";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name inviteTime String. */
+    public static final String BC_VAR_INVITE_TIME = "inviteTime";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name numberData String. */
+    public static final String BC_VAR_NUMBER_DATA = "numberData";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name policy Integer. */
+    public static final String BC_VAR_POLICY = "policy";
+
+    /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name alias String. */
+    public static final String BC_VAR_ALIAS = "alias";
+
+    /**
+     * UI_GROUP_CHAT_MAXCOUNT_CHANGE broadcast passed parameter name maxCount String.
+     */
+    public static final String BC_VAR_MAXCOUNT = "maxCount";
+
+    /**
+     * Group chat element change
+     */
+    public static final String UI_GROUP_CHAT_SUBJECT_CHANGE = "ui_groupchat_subject_change";
+
+    /** ************************************** send message error begin ******************************************************. */
+
+    /**
+     * UI send message error broadcast
+     */
+    public static final String UI_SHOW_MESSAGE_SEND_ERROR = "com.suntek.mway.rcs.ACTION_UI_SHOW_MESSAGE_SEND_ERROR";
+
+    /**
+     * Sip not registered
+     */
+    public static final String BC_VAR_SEND_ERROR_NOT_REG = "sip_not_register";
+
+    /**
+     * Group not exist
+     */
+    public static final String BC_VAR_SEND_ERROR_GROUP_NOT_EXIST = "group_not_exist";
+
+    /**
+     * Create group not complete
+     */
+    public static final String BC_VAR_SEND_ERROR_GROUP_NOT_COMPLETED = "group_not_completed";
+
+    /**
+     * Group has deleted
+     */
+    public static final String BC_VAR_SEND_ERROR_GROUP_HAS_DELETED = "group_has_deleted";
+
+    /** ************************************** send message error end ******************************************************. */
+
+    /** ************************************** send group refer error begin ******************************************************. */
+    /**
+     * UI send group refer message failed
+     */
+    public static final String UI_SHOW_GROUP_REFER_ERROR = "com.suntek.mway.rcs.ACTION_UI_SHOW_GROUP_REFER_ERROR";
+
+    /**
+     * UI_SHOW_GROUP_REFER_ERROR broadcast passed parameter name referType String.
+     */
+    public static final String BC_VAR_REFER_TYPE = "referType";
+
+    /**
+     * Send group refer type define
+     */
+    public static final String REFER_TYPE_INVITE = "invite";
+    public static final String REFER_TYPE_SUBJECT = "updateSubject";
+    public static final String REFER_TYPE_ALIAS = "setAlias";
+    public static final String REFER_TYPE_TRANSFER_CHAIRMAN = "transferChairman";
+    public static final String REFER_TYPE_KICKOUT = "kickout";
+    public static final String REFER_TYPE_QUIT = "quit";
+    public static final String REFER_TYPE_DISBAND= "disband";
+
+    /** ************************************** send group refer error end ******************************************************. */
+
+    /** ************************************** send composing broadcast begin ******************************************************. */
+    /**
+     * The broadcast of composing
+     */
+    public static final String UI_SHOW_COMPOSING_INFO = "com.suntek.mway.rcs.ACTION_UI_SHOW_COMPOSING_INFO";
+
+    /**
+     * UI_SHOW_COMPOSING_INFO broadcast passed parameter name state String.
+     */
+    public static final String BC_VAR_COMPOSE_STATE = "state";
+
+    /**
+     * UI_SHOW_COMPOSING_INFO broadcast passed parameter name contentType String.
+     */
+    public static final String BC_VAR_COMPOSE_CONTENTTYPE = "contentType";
+
+    /**
+     * UI_SHOW_COMPOSING_INFO broadcast passed parameter name refresh Integer.
+     */
+    public static final String BC_VAR_COMPOSE_REFRESH = "refresh";
+
+    /**
+     * UI_SHOW_COMPOSING_INFO broadcast passed parameter name lastActive String.
+     */
+    public static final String BC_VAR_COMPOSE_LASTACTIVE = "lastActive";
+
+    /** ************************************** send composing broadcast end ******************************************************. */
+
+    /** ************************************** send report broadcast begin ******************************************************. */
+    /**
+     * The broadcast of composing
+     */
+    public static final String UI_SHOW_RECV_REPORT_INFO = "com.suntek.mway.rcs.ACTION_UI_SHOW_RECV_REPORT_INFO";
+
+    /**
+     * UI_SHOW_RECV_REPORT_INFO broadcast passed parameter name status String.
+     */
+    public static final String BC_VAR_REPORT_STATUS = "status";
+
+    /**
+     * UI_SHOW_RECV_REPORT_INFO broadcast passed parameter recipient  String.
+     */
+    public static final String BC_VAR_REPORT_RECIPIENT = "recipient";
+
+    /**
+     * UI_SHOW_RECV_REPORT_INFO broadcast passed parameter name status String.
+     */
+    public static final String BC_VAR_REPORT_ORIGINAL_RECT = "original-recipient";
+
+    /** ************************************** send report broadcast end ******************************************************. */
+
+    /** ************************************** send group transfer chairman confirm broadcast begin ******************************************************. */
+    /**
+     * The broadcast of group chairman transfer confirm
+     * parameter contains chaturi, subject, contributionId, conversationId
+     */
+    public static final String UI_SHOW_GROUP_TRANSFER_CHAIRMAN_CONFIRM = "com.suntek.mway.rcs.ACTION_UI_SHOW_GROUP_TRANSFER_CHAIRMAN_CONFIRM";
+
+    /** ************************************** send group transfer chairman confirm broadcast end ******************************************************. */
+
+    /** Invite to join a group chat timeout broadcast. */
+    public static final String UI_JOIN_GROUP_INVITE_TIMEOUT = "com.suntek.mway.rcs.ACTION_UI_JOIN_GROUP_INVITE_TIMEOUT";
+
+    /** ************************************** download file begin ******************************************************. */
+    /**
+     * broadcast of downloading file
+     */
+    public static final String UI_DOWNLOADING_FILE_CHANGE = "com.suntek.mway.rcs.UI_DOWNLOADING_FILE_CHANGE";
+
+    /**
+     * UI_DOWNLOADING_FILE_CHANGE broadcast passed parameter name primary key id Integer.
+     */
+    public static final String BC_VAR_PK_ID = "pkId";
+
+    /**
+     * UI_DOWNLOADING_FILE_CHANGE broadcast passed parameter name filepath String.
+     */
+    public static final String BC_VAR_FILEPATH = "filepath";
+
+    /**
+     * UI_DOWNLOADING_FILE_CHANGE broadcast passed parameter name total long.
+     */
+    public static final String BC_VAR_TOTAL_LEN = "total";
+
+    /**
+     * UI_DOWNLOADING_FILE_CHANGE broadcast passed parameter name current long.
+     */
+    public static final String BC_VAR_CURRENT_LEN = "current";
+
+
+    /** ************************************** download file end ******************************************************. */
+
+    /** ************************************** AV ******************************************************. */
+    /** Notify UI to Sending call */
+    public static final String UI_AV_SENDING_CALL = "ui_av_sending_call";
+
+    /** Notify UI to Handling Incoming AV Events. */
+    public static final String UI_AV_INCOMING_CALL = "com.suntek.mway.rcs.ACTION_AV_INCOMING_CALL";
+
+    /** Notify UI to Handling AV Invite Events. */
+    public static final String UI_AV_INVITE_EVENT = "ui_av_invite_event";
+
+    /** Notify UI to Handling Restore AV Events. */
+    public static final String UI_AV_RESTORE_CALL = "ui_av_restore_event";
+
+    /** Notify UI to Prompt not register. */
+    public static final String UI_AV_NOT_REGISTER = "ui_av_not_register";
+
+    /** AV broadcast passed parameter name sessionId String. */
+    public static final String BC_VAR_AV_SESSIONID = "sessionId";
+
+    /** AV broadcast passed parameter name contact String. */
+    public static final String BC_VAR_AV_CONTACT = "contact";
+
+    /** AV broadcast passed parameter name callType String. */
+    public static final String BC_VAR_AV_MEDIA_TYPE = "callType";
+
+    /** AV broadcast passed parameter name callRecordId String. */
+    public static final String BC_VAR_AV_CALLRECORDID = "callRecordId";
+
+    /** ************************************** PUBLIC ACCOUNT ******************************************************. */
+    /** Callback notification after load thumb of public account. */
+    public static final String UI_PA_LOAD_THUMB = "ui_pa_load_thumb";
+
+    /** Callback notification after load file of public account. */
+    public static final String UI_PA_LOAD_FILE = "ui_pa_load_file";
+
+    /** Public account broadcast passed parameter name messageId String. */
+    public static final String BC_VAR_PA_MESSAGEID = "messageId";
+
+    /** Public account broadcast passed parameter name eventType String. */
+    public static final String BC_VAR_PA_EVENTTYPE = "eventType";
+
+    /** The load file event type START. */
+    public static final String BC_V_PA_LOAD_FILE_EVENTTYPE_START = "start";
+
+    /** The load file event type SUCCESS. */
+    public static final String BC_V_PA_LOAD_FILE_EVENTTYPE_SUCCESS = "success";
+
+    /** The load file event type ERROR. */
+    public static final String BC_V_PA_LOAD_FILE_EVENTTYPE_ERROR = "error";
+
+    /** The load file event type END. */
+    public static final String BC_V_PA_LOAD_FILE_EVENTTYPE_END = "end";
+
+    /** The load file event type LOADING. */
+    public static final String BC_V_PA_LOAD_FILE_EVENTTYPE_ING = "loading";
+
+    /** Public account broadcast passed parameter name filePaths String. */
+    public static final String BC_VAR_PA_LOAD_THUMB_FILEPATHS = "filePaths";
+
+    /** ************************************** MCLOUD ******************************************************. */
+    /** Callback notification after put file. */
+    public static final String UI_MC_PUT_FILE = "ui_mc_put_file";
+
+    /** Callback notification after share file. */
+    public static final String UI_MC_SHARE_FILE = "ui_mc_share_file";
+
+    /** Callback notification after share and send file. */
+    public static final String UI_MC_SHARE_AND_SEND_FILE = "ui_mc_share_and_send_file";
+
+    /** Callback notification after get share file list. */
+    public static final String UI_MC_GET_SHARE_FILE_LIST = "ui_mc_get_share_file_list";
+
+    /** Callback notification after download file from url. */
+    public static final String UI_MC_DOWNLOAD_FILE_FROM_URL = "ui_mc_download_file_from_url";
+
+    /** Callback notification after get remote file list. */
+    public static final String UI_MC_GET_REMOTE_FILE_LIST = "ui_mc_get_remote_file_list";
+
+    /** Mcloud broadcast passed parameter name eventType String. */
+    public static final String BC_VAR_MC_ENENTTYPE = "eventType";
+
+    /** Mcloud broadcast passed parameter name fullPathInID String. */
+    public static final String BC_VAR_MC_FULL_FILE_ID = "fullPathInID";
+
+    /** Mcloud broadcast passed parameter name percent String. */
+    public static final String BC_VAR_MC_PERCENT = "percent";
+
+    /** Mcloud broadcast passed parameter name processSize String. */
+    public static final String BC_VAR_MC_PROCESS_SIZE = "processSize";
+
+    /** Mcloud broadcast passed parameter name totalSize String. */
+    public static final String BC_VAR_MC_TOTAL_SIZE = "totalSize";
+
+    /** Mcloud broadcast passed parameter name message String. */
+    public static final String BC_VAR_MC_MESSAGE = "message";
+
+    /** Mcloud broadcast passed parameter name localPath String. */
+    public static final String BC_VAR_MC_LOCALPATH = "localPath";
+
+    /** Mcloud broadcast passed parameter name shareNode ShareNode. */
+    public static final String BC_VAR_MC_SHARE_NODE = "shareNode";
+
+    /** Mcloud broadcast passed parameter name shareNodeList list<ShareNode>. */
+    public static final String BC_VAR_MC_SHARE_NODE_LIST = "shareNodeList";
+
+    /** Mcloud broadcast passed parameter name remoteNodeList list<FileNode>. */
+    public static final String BC_VAR_MC_REMOTE_NODE_LIST = "remoteNodeList";
+
+    /** The mcloud event type STARTED. */
+    public static final String BC_V_MC_EVENTTYPE_STARTED = "started";
+
+    /** The mcloud event type SUCCESS. */
+    public static final String BC_V_MC_EVENTTYPE_SUCCESS = "success";
+
+    /** The mcloud event type ERROR. */
+    public static final String BC_V_MC_EVENTTYPE_ERROR = "error";
+
+    /** The mcloud event type PROGRESS. */
+    public static final String BC_V_MC_EVENTTYPE_PROGRESS = "progress";
+
+    /** The mcloud event type FILE_TOO_LARGE. */
+    public static final String BC_V_MC_EVENTTYPE_FILE_TOO_LARGE = "fileToLarge";
+
+    /** The mcloud event type OTHER. */
+    public static final String BC_V_MC_EVENTTYPE_OTHER = "other";
+
+    /** The broadcast for plug-in service unavailable */
+    public static final String PLUGIN_SERVICE_UNAVAILABLE = "com.suntek.mway.rcs.action.PLUGIN_SERVICE_UNAVAILABLE";
+
+    /** The broadcast for plug-in apk uninstalled */
+    public static final String PLUGIN_APK_UNINSTALLED = "com.suntek.mway.rcs.action.PLUGIN_APK_UNINSTALLED";
+
+    /** ************************************** IMAP ******************************************************. */
+    public static final String BACKUP_ALL_MESSAGE = "com.suntek.mway.rcs.BACKUP_ALL_MESSAGE";
+
+    public static final String RESTORE_ALL_MESSAGE = "com.suntek.mway.rcs.RESTORE_ALL_MESSAGE";
+
+    public static final String RESTORE_ALL_MESSAGE_RESULT = "com.suntek.mway.rcs.RESTORE_ALL_MESSAGE_RESULT";
+
+    public static final int BACKUP_STATUS_EXCEPTION = -1;
+    public static final int BACKUP_STATUS_START = 0;
+    public static final int BACKUP_STATUS_WORKING = 1;
+    public static final int BACKUP_STATUS_FINISH = 2;
+
+    public static final int RESTORE_STATUS_EXCEPTION = -1;
+    public static final int RESTORE_STATUS_START = 0;
+    public static final int RESTORE_STATUS_WORKING = 1;
+    public static final int RESTORE_STATUS_FINISH = 2;
+
+    public static final String ACTION_DMS_OPEN_BUSS = "com.suntek.mway.rcs.ACTION_DMS_OPEN_BUSS";
+    public static final String ACTION_DMS_OPEN_BUSS_RESULT = "com.suntek.mway.rcs.ACTION_DMS_OPEN_BUSS_RESULT";
+    public static final String OPER_RESULTCODE = "resultCode";
+    public static final String OPER_RESULTDESC = "resultDesc";
+    public static final String DMS_OPEN_BUSS_IMSI = "imsi";
+    public static final String DMS_OPEN_BUSS_MSISDN = "number";
+    public static final String DMS_TIPS_TITLE = "title";
+    public static final String DMS_TIPS_MESSAGE = "message";
+    public static final String DMS_TIPS_ACCEPT_BTN = "Accept_btn";
+    public static final String DMS_TIPS_REJECT_BTN = "Reject_btn";
+
+    public static final String DMS_USER_STATUS = "status";
+
+    public static final int DMS_OPEN_BUSS_RESULTCODE_SUCCESS = 0;
+    public static final int DMS_OPEN_BUSS_RESULTCODE_FAILED = -1;
+    public static final String ACTION_DMS_NEW_CONFIG = "com.suntek.mway.rcs.ACTION_DMS_NEW_CONFIG";
+    public static final String ACTION_DMS_UPDATE_CONFIG = "com.suntek.mway.rcs.ACTION_DMS_UPDATE_CONFIG";
+    public static final String ACTION_SHOW_DIALOG_INFO = "com.suntek.mway.rcs.ACTION_SHOW_DIALOG_INFO";
+    public static final String ACTION_OPEN_PS = "com.suntek.mway.rcs.ACTION_OPEN_PS";
+    public static final String ACTION_CLOSE_WIFI_AND_OPEN_PS = "com.suntek.mway.rcs.ACTION_CLOSE_WIFI_AND_OPEN_PS";
+    public static final String ACTION_DMS_USER_STATUS_CHANGED = "com.suntek.mway.rcs.ACTION_DMS_USER_STATUS_CHANGED";
+    public static final String ACTION_CONFIRM_USE_NEW_IMSI = "com.suntek.mway.rcs.ACTION_CONFIRM_USE_NEW_IMSI";
+    public static final String ACTION_INPUT_SMS_VERIFY_CODE = "com.suntek.mway.rcs.ACTION_INPUT_SMS_VERIFY_CODE";
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/constant/MediaConstants.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/constant/MediaConstants.java
new file mode 100644
index 0000000..4882f18
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/constant/MediaConstants.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.constant;
+
+/**
+ * The Class MediaConstants.
+ */
+public class MediaConstants {
+
+    /** The suffixs of image. */
+    public static final String IMAGE_SUFFIX = "JPG,JPEG,PNG,GIF,BMP";
+
+    /** The suffixs of audio. */
+    public static final String AUDIO_SUFFIX = "MP3,M4A,AAC,AMR";
+
+    /** The suffixs of video. */
+    public static final String VIDEO_SUFFIX = "3GP,MP4";
+
+    /** Maximum default file size. */
+    public static final long DEFAULT_FT_MAX_SIZE = 10 * 1024;
+
+    /** Maximum image file size. */
+    public static final long IMAGE_FT_MAX_SIZE = 10 * 1024;
+
+    /** Maximum video file size. */
+    public static final long VIDEO_FT_MAX_SIZE = 500 * 1024;
+
+    /** Maximum video file time. */
+    public static final long VIDEO_MAX_TIME = 90;
+
+    /** Maximum audio file time. */
+    public static final long AUDIO_MAX_TIME = 180;
+
+    /** Maximum file size. */
+    public static final long FT_MAX_SIZE = 500 * 1024;
+
+    public static final String FT_THUMB = "1";
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/ContactGroup.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/ContactGroup.aidl
new file mode 100644
index 0000000..3504f8a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/ContactGroup.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.contacts;
+
+parcelable ContactGroup;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/ContactGroup.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/ContactGroup.java
new file mode 100644
index 0000000..2a0fd47
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/ContactGroup.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.contacts;
+
+
+public class ContactGroup {
+    private String id;
+    private String name;
+    private boolean focus;
+
+    public ContactGroup(String id, String name) {
+        super();
+        this.id = id;
+        this.name = name;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return "ContactGroup [id=" + id + ", name=" + name + "]";
+    }
+
+    public boolean isFocus() {
+        return focus;
+    }
+
+    public void setFocus(boolean focus) {
+        this.focus = focus;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/RCSContact.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/RCSContact.aidl
new file mode 100644
index 0000000..c8782fe
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/RCSContact.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.contacts;
+
+parcelable RCSContact;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/RCSContact.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/RCSContact.java
new file mode 100644
index 0000000..b2362b5
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/contacts/RCSContact.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.contacts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Profile;
+
+/**
+ * <p>Title: RCSContact class</p>
+ * <p>
+ * Description: The class <code>RCSContact</code> represents the informations
+ * of RCS contact.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class RCSContact extends Profile implements Parcelable {
+
+    /** The id. */
+    private long id = -1;
+
+    /** The is rcs contact. */
+    private boolean isRcsContact = false;
+
+    /** The pinyin. */
+    private String pinyin;
+
+    /** The photo. */
+    private byte[] photo;
+
+    private String photoBase64;
+
+    /**
+     * Checks if is rcs contact.
+     *
+     * @return true, if is rcs contact
+     */
+    public boolean isRcsContact() {
+        return isRcsContact;
+    }
+
+    /**
+     * Sets the rcs contact.
+     *
+     * @param isRcsContact the new rcs contact
+     */
+    public void setRcsContact(boolean isRcsContact) {
+        this.isRcsContact = isRcsContact;
+    }
+
+    /**
+     * Gets the id.
+     *
+     * @return the id
+     */
+    public long getId() {
+        return id;
+    }
+
+    /**
+     * Sets the id.
+     *
+     * @param id the new id
+     */
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    /**
+     * Gets the pinyin.
+     *
+     * @return the pinyin
+     */
+    public String getPinyin() {
+        return pinyin;
+    }
+
+    /**
+     * Sets the pinyin.
+     *
+     * @param pinyin the new pinyin
+     */
+    public void setPinyin(String pinyin) {
+        this.pinyin = pinyin;
+    }
+
+    /**
+     * Get photo
+     * @return
+     */
+    public byte[] getPhoto() {
+        return photo;
+    }
+
+    /**
+     * Set photo
+     * @param photo
+     */
+    public void setPhoto(byte[] photo) {
+        this.photo = photo;
+    }
+
+    /**
+     * Get photo base64 code
+     * @return
+     */
+    public String getPhotoBase64() {
+        return photoBase64;
+    }
+
+    /**
+     * Set photo base64 code
+     * @param photoBase64
+     */
+    public void setPhotoBase64(String photoBase64) {
+        this.photoBase64 = photoBase64;
+    }
+
+    /**
+       * Instantiates a new RCSContact.
+       */
+      public RCSContact()
+      {}
+
+      /**
+       * Instantiates a new RCSContact.
+       *
+       * @param source the source
+       */
+      public RCSContact( Parcel source )
+      {
+          readFromParcel( source );
+      }
+
+      /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the RCSContact entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest the dest
+     * @param flags the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        super.writeToParcel( dest,flags );
+        dest.writeLong( id );
+        dest.writeInt( isRcsContact ? 1 : 0);
+        dest.writeString( pinyin );
+
+        dest.writeString(photoBase64);
+
+        if( photo != null ) {
+            dest.writeByteArray(photo);
+        }
+    }
+
+    /**
+     * Create the RCSContact entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        super.readFromParcel( source );
+        id = source.readLong();
+        isRcsContact = source.readInt() == 1 ? true : false;
+        pinyin = source.readString();
+
+        photoBase64 = source.readString();
+
+        if( photo != null ) {
+            source.readByteArray(photo);
+        }
+
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<RCSContact>    CREATOR    = new Parcelable.Creator<RCSContact>() {
+        @Override
+        public RCSContact createFromParcel( Parcel source )
+        {
+            return new RCSContact( source );
+        }
+
+        @Override
+        public RCSContact[] newArray( int size )
+        {
+            return new RCSContact[ size ];
+        }
+    };
+
+
+    @Override
+    public String toString() {
+        int photoLen = 0;
+        if( photo != null ) {
+            photoLen = photo.length;
+        }
+        List<String> list = new ArrayList<String>();
+        list.add("id="+id);
+        list.add("isRcsContact="+isRcsContact);
+        list.add("pinyin="+pinyin);
+        list.add("photo.length="+photoLen);
+        list.add("profile="+super.toString());
+        return list.toString();
+    }
+
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/emoticon/IEmoticonApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/emoticon/IEmoticonApi.aidl
new file mode 100644
index 0000000..ed19935
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/emoticon/IEmoticonApi.aidl
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.emoticon;
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.EmojiPackageBO;
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.ResultBO;
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.EmoticonBO;
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.UserBO;
+import com.suntek.mway.rcs.client.api.plugin.callback.IEmoticonCallbackApi;
+import com.suntek.mway.rcs.client.api.plugin.callback.IEmoticonCanSendCallback;
+import com.suntek.mway.rcs.client.api.plugin.callback.IEmoticonPackagesNetCallbackApi;
+import com.suntek.mway.rcs.client.api.plugin.callback.IEmoticonSetSuccessDownListener;
+interface IEmoticonApi {
+//    boolean doRegister();
+    
+        /**
+     * Gets the user entity by user phone number.
+     * 
+     * @param userPhone
+     *            the user phone number
+     * @return the user entity
+    UserBO getUser( String userPhone );
+     */
+
+    /**
+     * Gets the current login user entity.
+     * 
+     * @return the current user entity
+     */
+    UserBO getCurrentUser();
+
+    /**
+     * Gets the user login state by the user phone number
+     * 
+     * @param userPhone
+     *            the user phone number
+     * @return the user login state, true is had logined, false is haddn't
+     *         logined
+    boolean getUserState( String userPhone );
+     */
+
+    /**
+     * Gets the current user login state.
+     * 
+     * @return the current user login state, true is had logined, false is
+     *         haddn't logined
+     */
+    boolean getCurrentUserState();
+
+    /**
+     * Query user emoticon packages by user phone number.
+     * 
+     * @return the list of user emoticon package
+     */
+    List<EmojiPackageBO> queryEmojiPackages();
+    
+    /**
+     * Gets the emoticon entity by the emoticon id.
+     * 
+     * @param emoticonId
+     *            the emoticon id
+     * @return the emoticon entity
+     */
+    EmoticonBO getEmoticon( String emoticonId );
+
+    /**
+     * Gets the emoticon package info by the user phone number and the user
+     * emoticon package id.
+     * 
+     * @param packageId
+     *            the emoticon package id
+     * @return the emoticon package
+     */
+    EmojiPackageBO getEmojiPackage( String packageId);
+
+    /**
+     * Gets the emoticon package with detail by the user phone number and the
+     * emoticon package id.
+     * 
+     * @param packageId
+     *            the emoticon package id
+     * @return the emoticon package entity
+     */
+    EmojiPackageBO getEmojiPackageWithDetail( String packageId);
+    
+    /**
+     * Query emoticons by the user phone number and package id.
+     * 
+     * @param packageId
+     *            the emoticon package id
+     * @return the list of emoticon entity
+     */
+    List<EmoticonBO> queryEmoticons( String packageId);
+
+    /**
+     * Judge if the package exist by the emoticon package id and is free
+     * condition.
+     * 
+     * @param packageId
+     *            the emoticon package id
+     * @return true, if exist
+     */
+    boolean emojiPackageExist( String packageId);
+
+    /**
+     * Do accept emoticon.
+     * 
+     * @param emoticonId
+     *            the emoticonId, such as the emoticon id 
+     * @param callback
+     *            the accept emoticon event callback handler
+     */
+    void doAcceptEmoticon( String emoticonId, IEmoticonCallbackApi callback );
+
+    /**
+     * Do download emoticon package.
+     * 
+     * @param zipPath
+     *            the zip path
+     * @param packageId
+     *            the package id
+     * @param userPhone
+     *            the user phone
+     * @return the result entity
+    
+    ResultBO doDownEmojiPackage( String zipPath, String packageId);
+ */
+    /**
+     * Do buy emoticon package.
+     * 
+     * @param params
+     *            the params, such as the package id , the package name and so
+     *            on
+     * @return the result entity
+    
+    ResultBO doBuyEmojiPackage( in Map params );
+ */
+    /**
+     * Query emoticon packages with detail by user phone number.
+     * 
+     * @return the list of emoticon package
+     */
+    List<EmojiPackageBO> queryEmojiPackagesWithDetail();
+
+    /**
+     * Query users info.
+     * 
+     * @return the list of user entity
+    List<UserBO> queryUsers();
+     */
+
+    /**
+     * Authenticate user emoticon right.
+     * 
+     * @param paramMap
+     *            the param map
+     * @param callback
+     *            the authenticate use emoticon right event callback handler
+     */
+    //void authUseEmoticon( in Map paramMap, IEmoticonCallbackApi callback );
+    
+    void isCanSend(String emoticonId, String phone, IEmoticonCanSendCallback cansendCallback);
+    
+    /**
+     * Gets the storage root path.
+     *
+     * @return the storage root path
+     */
+    String getStorageRootPath();
+    /**
+     *Get a list of the specified user's face - Network
+     *
+     *@param callback
+     *            the authenticate use emoticon right event callback handler
+     */
+    void queryEmojiPackagesNet(IEmoticonPackagesNetCallbackApi callback);
+    /**
+     *
+     *Text automatically retrieve expression
+     *@param emoticonName
+     *            the expression name
+     */
+    List<EmoticonBO> queryEmoticonName(String emoticonName);
+    
+    void setSuccessDownListener(IEmoticonSetSuccessDownListener downListener);
+    
+    void unreSuccessListenter();
+    
+    String encodeEmoticon(String emoticonId);
+    
+    EmoticonBO decodeEmoticon(String eid);
+    
+    String getEmoticonId(String eid);
+    
+    byte[] decrypt2Bytes(String emoticonId, int emoFileType);
+/*
+    void decrypt2Temp(String key,String fileStr);
+*/
+
+//    ResultBO doLogout(String userPhone, String date);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/im/IGroupManagerApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/im/IGroupManagerApi.aidl
new file mode 100644
index 0000000..2108daa
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/im/IGroupManagerApi.aidl
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.im;
+
+import java.util.List;
+
+import com.suntek.mway.rcs.client.api.provider.model.GroupChatUser;
+import com.suntek.mway.rcs.client.api.plugin.callback.IConferenceCallback;
+import com.suntek.mway.rcs.client.api.provider.model.GroupChatModel;
+
+interface IGroupManagerApi {
+
+    String createGroupChat(String subject, in List<String> users);
+
+    void agreeToJoinGroup(String conversationId, String contributionId,
+            String chatUri, String subject, String numberData, long inviteTime);
+
+    void refuseToJoinGroup(String conversationId);
+
+    void updateGroupSubject(String groupId, String newSubject);
+
+    void modifyGroupMemo(String groupId, String memo);
+
+    void disbandGroupChat(String groupId);
+
+    void kickedOutOfGroupChat(String groupId, String number);
+
+    void assignGroupChairman(String groupId, String number);
+
+    void quitGroupChat(String groupId, String number);
+    void quitGroupChatEx(String groupId, String oldChairman, String newChairman);
+    void setMyAlias(String groupId, String alias);
+
+    String getGroupChatMemberDisplayName(String groupId, String number);
+
+    void refreshMemberHeadPic(String groupId,String number,int pixel,in IConferenceCallback confCallback);
+
+    void queryMemberHeadPic(String groupId,String number,int pixel,in IConferenceCallback confCallback);
+
+
+
+
+    GroupChatUser getGroupChairman(String groupId);
+
+    void inviteOneMemberToGroupChat(String groupId, String number);
+
+    void inviteToJoinGroupChat(String groupId, in List<String> numbers);
+    
+    GroupChatModel getLastGroupModel();
+    
+    GroupChatModel getGroupChatByGroupId(String groupId);
+    
+    void updateGroupPolicy(String groupId,int policy);
+    
+    List<GroupChatUser> getGroupChatUsersAllowChairman(String groupId);
+    List<GroupChatUser> getGroupChatUsersByGroupId(String groupId);
+    
+    GroupChatModel getGroupChatByThreadId(String threadId);
+       GroupChatModel getGroupChatByChatUri(String chatUri);
+
+    String getGroupChatDomainName();
+
+    String getPublicAccountDomainName();
+
+    void refuseAssigedAsChairman(String chatUri, long inviteTime, String conversationId, String contributionId);
+
+    void acceptAssignedAsChairman(String chatUri, long inviteTime, String conversationId, String contributionId);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/im/IInstantMessageApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/im/IInstantMessageApi.aidl
new file mode 100644
index 0000000..c7e2ae8
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/im/IInstantMessageApi.aidl
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+package com.suntek.mway.rcs.client.api.im;
+
+import com.suntek.mway.rcs.client.api.contacts.RCSContact;
+import com.suntek.mway.rcs.client.api.provider.model.ChatMessage;
+import com.suntek.mway.rcs.client.api.provider.model.MessageSessionModel;
+import com.suntek.mway.rcs.client.api.provider.model.GroupChatModel;
+import com.suntek.mway.rcs.client.api.provider.model.GroupChatUser;
+import com.suntek.mway.rcs.client.api.provider.model.TopMessageData;
+import com.suntek.mway.rcs.client.api.provider.model.SimpleMsg;
+import com.suntek.mway.rcs.client.api.provider.model.FavoriteMessage;
+
+interface IInstantMessageApi {
+    void sendTextMessage(long thread_id,String number, String text,
+            int burnFlag, int barCycle);
+    
+    void sendImageFile(long thread_id,long sms_id,String number, String filePath,
+            int burnFlag, int barCycle,int quality);
+    
+    void sendAudioFile(long thread_id,long sms_id,String number, String filePath,
+            int recordTime,int burnFlag, int barCycle) ;
+    void sendVideoFile(long thread_id,long sms_id,String number, String filePath,
+            int length,int burnFlag, int barCycle);
+    void sendLocation(long thread_id,long sms_id,String number, double lat,
+            double lng,String text);
+    void sendPaidEmo(long thread_id,long sms_id,String number, String emoid,
+            String emoImgFileName);
+    void sendVCard(long thread_id,long sms_id,String number, in RCSContact rcsContact);
+    void sendVCardByPath(long thread_id,long sms_id,String number, String vcardFilePath);
+
+
+    void sendOne2ManyTextMessage(long thread_id,in List<String> numbers, String text,
+            int burnFlag, int barCycle);
+    
+    void sendOne2ManyImageFile(long thread_id,long sms_id, in List<String> numbers, String filePath,
+            int burnFlag, int barCycle,int quality);
+    
+    void sendOne2ManyAudioFile(long thread_id,long sms_id,in List<String> numbers, String filePath,
+            int recordTime,int burnFlag, int barCycle);
+    void sendOne2ManyVideoFile(long thread_id,long sms_id,in List<String> numbers, String filePath,
+            int length,int burnFlag, int barCycle);
+    void sendOne2ManyLocation(long thread_id,long sms_id,in List<String> numbers, double lat,
+            double lng,String text);
+    
+    
+    void sendGroupMessage(long thread_id, String conversationId,long sms_id,String msg,
+            String groupId);
+    void sendGroupImageFile(long thread_id, String conversationId,long sms_id,String filepath,
+            String groupId, int quality);
+    void sendGroupAudioFile(long thread_id, String conversationId,long sms_id,String filepath,
+            int recordTime ,String groupId);
+    void sendGroupVideoFile(long thread_id, String conversationId,long sms_id,String filepath,
+            int  length ,String groupId);
+    void sendGroupLocation(long thread_id,String conversationId,long sms_id, double lat,
+            double lng,String text,String groupId);
+    void sendGroupVCard(long thread_id,String conversationId,long sms_id,
+            in RCSContact rcsContact,String groupId);
+    void sendGroupVCardByPath(long thread_id,String conversationId,long sms_id,
+            String vcardFilePath,String groupId);
+            
+    void acceptFile(in ChatMessage chatMessage);
+    boolean interruptFile(in ChatMessage chatMessage);
+            
+    GroupChatModel getGroupChatById(String groupId);
+    GroupChatModel getGroupChatByThreadId(long threadId);
+    GroupChatUser getGroupChairman(String groupId);
+    
+    long getNewThreadId();
+    List<MessageSessionModel> getMessageSessionList(int offset, int number);
+    List<ChatMessage> getChatMessageList(long threadId, boolean less, int specifiedMsgId, int count);    
+    List<ChatMessage> searchMessageByText(String text, int offset, int number, boolean timaAsc);
+    ChatMessage getMessageById(String rowId);
+    ChatMessage getMessageByMessageId(String messageId);
+    
+    void removeMessageByThreadId(long threadId);
+    void removeOneMessage(String id);
+    void removeAllMessage();
+    
+    void topMessage(long threadId);
+    void cancelTopMessage(long threadId);
+    
+    ChatMessage getTheLastMessage(long threadId);
+    String  getThreadIdByNumber(in List<String> numbers);    
+    MessageSessionModel getMessageSessionByThreadId(long threadId);
+    String getFilepath(in ChatMessage message);
+    String getThumbFilepath(in ChatMessage message);
+    
+    List<TopMessageData> getTopMsgsInOrder(boolean asc);
+    void backupAllMessage();
+    void restoreAllMessage();
+    void collectMessage(in List<SimpleMsg> simpleMsgList);
+    void accuseMessage(long thread_id, String id);
+    
+    List<ChatMessage> getMessageOfSpecialService();
+    List<ChatMessage> getMessageOfStrangeNumber();
+    
+    List<MessageSessionModel> qryNotifyArchiveMsgSessionList();
+    List<MessageSessionModel> qryNonFriendMsgSessionList();
+    
+    void sendOne2ManyPaidEmoMessage(long thread_id, long sms_id, in List<String> numbers,
+            String emoid, String emoImgFileName);
+    void sendGroupPaidEmo(long thread_id, String conversationId, long sms_id, 
+            String emoid, String emoImgFileName, String groupId);
+            
+    List<ChatMessage> getMsgListGreatOrLessThanSpecifiedForBlack(long threadId, boolean less, int specifiedId, int number);
+    MessageSessionModel getMessageSessionByThreadIdForBlack(String threadId);
+    List<MessageSessionModel> getMessageSessionListForBlack(int offset, int number);
+    ChatMessage getTheLastMsgOfThreadForBlack(long threadId);
+    
+    void sendOne2ManyVCard(long thread_id, long sms_id, 
+            in List<String> numbers, in RCSContact rcsContact);
+    void sendOne2ManyVCardByPath(long thread_id, long sms_id, 
+            in List<String> numbers, String vcardFilePath);
+            
+    int recoveBlackMsgByMessageId(String messageId);
+    int recoveBlackMsgByThreadId(long threadId);
+    int recoveBlackMsgAll();
+    
+    void retransmitMessageById(String id);
+    void sendDisplayNotification(String conversationId, String number, String messageId);
+    
+    List<GroupChatModel> getAllGroupChat();
+    void burnMessage(String id);
+    
+    void cancelCollectSimpleMsg(in List<SimpleMsg> simpleMsgList);
+    List<FavoriteMessage> getFavouriteMessageList();
+    void burnMessageAtOnce(String id);
+    
+    String getAccuseNumber();
+    byte[] getImageThumbnails(String filepath);
+    byte[] getVideoThumbnails(String filepath);
+    
+    int getUnreadMsgCountByThreadId(String threadId);
+    int getAllUnreadCount();
+    void removeUnreadMessageByThreadId(String threadId);
+    
+    int getMsgSendPolicy();
+    
+    void setMsgSendPolicy(int policy);
+    
+    int updateMessageRead(String id);
+    void uploadFile(in ChatMessage chatMessage);
+    
+    int getPlayTime(int msgType, String data);
+
+    GroupChatModel getGroupChatByConversationId(String conversationId);
+
+    void setSMSSentRemind(int policy);
+
+    int getSMSSentRemind();
+
+    void burnAllMsgAtOnce();
+
+    void sendComposingMsg(long threadId, String contact, String contentType, int seconds);
+
+    void sendCancelComposingMsg(long threadId, String contact, String contentType, long lastActive);
+
+    void sendComposingMsgToGroup(long threadId, int id, String contentType, int seconds);
+
+    void sendCancelComposingMsgToGroup(long threadId, int id, String contentType, long lastActive);
+
+    void sendVCardList(long thread_id, long sms_id, String number, in List<RCSContact> contactList, int chatType);
+
+    void sendOne2ManyVCardList(long thread_id, long sms_id, in List<String> numbers, in List<RCSContact> contactList);
+
+    void sendGroupVCardList(long thread_id, String conversationId, long sms_id, in List<RCSContact> contactList, String groupId);
+
+    long getImageFtMaxSize();
+
+    long getAudioMaxTime();
+
+    long getVideoMaxTime();
+
+    long getVideoFtMaxSize();
+
+    void removeMsgWithNotificationByThread(long threadId);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/im/IPaMessageApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/im/IPaMessageApi.aidl
new file mode 100644
index 0000000..c9349c7
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/im/IPaMessageApi.aidl
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.im;
+
+import com.suntek.mway.rcs.client.api.contacts.RCSContact;
+
+interface IPaMessageApi{
+    
+    void sendTextMessage(long thread_id, long sms_id, String uuid, String text);
+    
+    void sendImageFile(long thread_id, long sms_id, String uuid , String filepath, int quality);
+    
+    void sendAudioFile(long thread_id, long sms_id, String uuid, String filepath, int recordTime);
+    
+    void sendVideoFile(long thread_id, long sms_id, String uuid, String filepath, int length);
+    
+    void sendLocation(long thread_id, long sms_id, String uuid, double lat, double lng, String text);
+    
+    void sendVCard(long thread_id, long sms_id, String uuid, in RCSContact rcsContact);
+    
+    void sendVCardByPath(long thread_id, long sms_id, String uuid, in String vcardFilePath);
+    
+    void sendVCardList(long thread_id, long sms_id, String uuid, in List<RCSContact> contactList);
+    
+    void sendMenuMessage(String uuid, String text);
+    
+    void deleteMessage(String messageId);
+    
+    void deleteMessageByThreadId(long thread_id);
+    
+    void deleteMessageByUuid(String uuid);
+
+    long getImageFtMaxSize();
+
+    long getAudioMaxTime();
+
+    long getVideoMaxTime();
+
+    long getVideoFtMaxSize();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/login/ILoginApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/login/ILoginApi.aidl
new file mode 100644
index 0000000..f69f7e4
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/login/ILoginApi.aidl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.login;
+
+import com.suntek.mway.rcs.client.api.login.ILoginEventListener;
+import com.suntek.mway.rcs.client.api.setting.LoginUser;
+
+interface ILoginApi {
+    void login(in LoginUser userModel, ILoginEventListener listener);
+    void logout();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/login/ILoginEventListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/login/ILoginEventListener.aidl
new file mode 100644
index 0000000..0e97a2d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/login/ILoginEventListener.aidl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.login;
+
+interface ILoginEventListener {
+
+    void onLoginEventChanged(int resultCode, String resultDesc);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/mcloud/IMcloudFileApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/mcloud/IMcloudFileApi.aidl
new file mode 100644
index 0000000..cb26a3f
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/mcloud/IMcloudFileApi.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.mcloud;
+
+interface IMcloudFileApi {
+    void putFile(String localPath, String remotePath, int transOper);
+    void shareFile(String fullPathInID, String shareDesc);
+    void shareFileAndSend(String fullPathInID, String shareDesc, String contact, long threadId, String beforeText, String afterText);
+    void getShareFileList(int beginIndex, int endIndex);
+    void downloadFileFromUrl(String remoteUrl, String fileName, int transOper);
+
+    void shareFileAndSendGroup(String fullPathInID, String shareDesc, long threadId, String conversationId, String groupId, String beforeText, String afterText);
+    void shareFileAndSendOne2Many(String fullPathInID, String shareDesc, in List<String> contacts, long threadId, String beforeText, String afterText);
+
+    void getRemoteFileList(String remotePath, int beginIndex, int endIndex, int fileNodeOrder);
+
+}
+
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/mcontact/IMcontactApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/mcontact/IMcontactApi.aidl
new file mode 100644
index 0000000..af31e6f
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/mcontact/IMcontactApi.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.mcontact;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IMContactSyncListener;
+
+interface IMcontactApi {
+    void doSync(int action, IMContactSyncListener listener);
+    void startIntervalSync(int action, int interval, long time); 
+    void cancelIntervalSync();
+    void setEnableAutoSync(boolean status,int syncAction);
+    boolean getEnableAutoSync();
+    int getAutoSync();
+    void setOnlySyncEnableViaWifi(boolean status);
+    boolean getOnlySyncEnableViaWifi();
+    int getLocalContactCounts();
+    int getRemoteContactCounts();
+    int getIntervalSyncMode();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IMcloudFileApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IMcloudFileApi.aidl
new file mode 100644
index 0000000..d83ffa5
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IMcloudFileApi.aidl
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudOperationCtrl;
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudAuthListener;
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudSdkListener;
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudConfListener;
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudFileListener;
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudMsgListener;
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudShareListener;
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudTransListener;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.MsgNode;
+
+interface IMcloudFileApi
+{
+    void init( IMcloudSdkListener sdkListener );
+    boolean checkParam( String key, String value );
+    String getParam( String name );
+    void setParam(String name, String value);
+    
+    IMcloudOperationCtrl checkUpdate( IMcloudAuthListener authListener, String userAccount );
+    IMcloudOperationCtrl login( IMcloudAuthListener authListener, String userName, String userPass, String verifyCode, int passType, boolean isAuto, in Map extInfo );
+    IMcloudOperationCtrl logout( IMcloudAuthListener authListener, boolean waitTag );
+    IMcloudOperationCtrl refresh( IMcloudAuthListener authListener, boolean forceTag );
+    IMcloudOperationCtrl ssoLogin( IMcloudAuthListener authListener, String account, String ssoToken, String ssoKey, String verifyCode, String clientType, String cpid, String version, String channel, in Map extInfo );
+    IMcloudOperationCtrl modifyPwd( IMcloudAuthListener authListener, String msisdn, String dycPwd, String passPwd );
+    IMcloudOperationCtrl prepairRegister( IMcloudAuthListener authListener, String userName, int type );
+    IMcloudOperationCtrl prepairResetPwd( IMcloudAuthListener authListener, String userName, int type );
+    IMcloudOperationCtrl register( IMcloudAuthListener authListener, String msisdn, String dycPwd, String userPass, String clientType );
+    IMcloudOperationCtrl resetPwd( IMcloudAuthListener authListener, String userName, String userPass, int type, String verifyCode );
+    
+    IMcloudOperationCtrl getServerConfig( IMcloudConfListener confListener, boolean reset );
+
+    IMcloudOperationCtrl copy( IMcloudFileListener callback, in String[] sourcePath, String destPath );
+    IMcloudOperationCtrl delete( IMcloudFileListener callback, in String[] path );
+    IMcloudOperationCtrl getDiskSize( IMcloudFileListener callback );
+    IMcloudOperationCtrl getFileInfo( IMcloudFileListener callback, in String[] path, boolean isFromCache );
+    IMcloudOperationCtrl listDir( IMcloudFileListener callback, String path, int startIndex, int endIndex, int order, in int syncType );
+    IMcloudOperationCtrl mkdir( IMcloudFileListener callback, in String[] dirPath );
+    IMcloudOperationCtrl move( IMcloudFileListener callback, in String[] sourcePath, String destPath );
+    IMcloudOperationCtrl rename( IMcloudFileListener callback, in String[] originalPaths, in String[] newNames );
+    IMcloudOperationCtrl search( IMcloudFileListener callback, String path, String query, int startIndex, int endIndex, int type, int order );
+    void emptyCache( );
+
+    IMcloudOperationCtrl backupMsg( IMcloudMsgListener listener, in MsgNode[] nodes, in String[] sessionIDs );
+    IMcloudOperationCtrl deleteMsg( IMcloudMsgListener listener, in MsgNode[] nodes, in String[] msgContacts, boolean recyFlag );
+    IMcloudOperationCtrl listMsg( IMcloudMsgListener listener, int beginIndex, int endIndex, int order, String msgContact );
+    IMcloudOperationCtrl listMsgSession( IMcloudMsgListener listener, int beginIndex, int endIndex );
+    IMcloudOperationCtrl restoreMsg( IMcloudMsgListener listener, in MsgNode[] nodes, in String[] msgContacts );
+    IMcloudOperationCtrl sumMsg( IMcloudMsgListener listener, int type );
+    
+    IMcloudOperationCtrl addLink( IMcloudShareListener listener, in String[] paths, String desc);
+    IMcloudOperationCtrl delLink( IMcloudShareListener listener, in String[] shareIDs);
+    IMcloudOperationCtrl listLink( IMcloudShareListener listener, int beginIndex, int endIndex, int order);
+    
+    IMcloudOperationCtrl getFile( IMcloudTransListener callback, String remotePath, String localPath, int oper );
+    IMcloudOperationCtrl getFileFromURL( IMcloudTransListener callback, String url, String localPath, int oper );
+    IMcloudOperationCtrl getThumb( IMcloudTransListener callback, String remotePath, String localPath, int oper, int thumbType );
+    IMcloudOperationCtrl putFile( IMcloudTransListener callback, String remotePath, String localPath, int oper );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IProfileApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IProfileApi.aidl
new file mode 100644
index 0000000..a273b08
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IProfileApi.aidl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IProfileListener;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Profile;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Avatar;
+
+interface IProfileApi
+{
+    void setMyProfile(in Profile profile, IProfileListener listener);
+    
+    void setMyHeadPic(in Avatar avatar, IProfileListener listener);
+    
+    void getMyProfile(IProfileListener listener);
+    
+    void getMyHeadPic(IProfileListener listener);
+    
+    void getHeadPicByContact(long contactId, IProfileListener listener);
+
+    void getHeadPicByNumber(String number, int pixel, IProfileListener listener);
+
+    void refreshMyQRImg(in Profile profile, boolean includeEInfo, IProfileListener listener);
+    
+    void updateContactsHeadPicAtFixedRateEveryDay(String hhmm,IProfileListener listener);
+    
+    String getUpdateTimeOfContactsHeadPic();
+    
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IPublicAccountAPI.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IPublicAccountAPI.aidl
new file mode 100644
index 0000000..2e19436
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IPublicAccountAPI.aidl
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IPublicAccountCallbackAPI;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.MsgContent;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccountReqEntity;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccountsDetail;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccounts;
+
+/**
+ * <p>Title: Public account api</p>
+ * <p>Description: The public account api implemented by the plugin center, The client app will invoke the plugin center by this interface</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>
+ * 
+ * @author zrq
+ * @version 1.0
+ * 
+ */
+interface IPublicAccountAPI
+{
+    
+    /**
+     * follow some public account.
+     *
+     * @param uuid            the public account uuid
+     * @return the account info will return by asynchronous callback, here only
+     *         return invoke result if it has exception
+     */
+    boolean addSubscribe( String uuid );
+
+    /**
+     * cancel some followed public account.
+     *
+     * @param uuid            the public account uuid
+     * @return the account info will return by asynchronous callback, here only
+     *         return invoke result if it has exception
+     */
+    boolean cancelSubscribe( String uuid );
+
+    /**
+     * complain one public account.
+     *
+     * @param uuid            the public account uuid
+     * @param reason            the reason of complaint
+     * @param description            the description of complaint
+     * @return the result of complaint will return by asynchronous callback,
+     *         here only return invoke result if it has exception
+     */
+    boolean complainPublic( String uuid, String reason, String description, int type, String data );
+
+    /**
+     * query the public account history message.
+     *
+     * @param uuid            the public account uuid
+     * @param timestamp            the begin query time
+     * @param order            the query order, default is 0, 0 is asc, 1 is desc
+     * @param pageSize            the query result page size
+     * @param pageNum            the query result page number
+     * @return the query result will return by asynchronous callback, here only
+     *         return invoke result if it has exception
+     */
+    boolean getPreMessage( String uuid, String timestamp, int order, int pageSize, int pageNum );
+    
+    /**
+     * query the public account detail info.
+     *
+     * @param uuid            the public account uuid
+     * @return the query result will return by asynchronous callback, here only
+     *         return invoke result if it has exception
+     */
+    boolean getPublicDetail( String uuid );
+
+    /**
+     * search the public account by keyword.
+     *
+     * @param keywords            the search keyword
+     * @param pageSize            the query result page size
+     * @param pageNum            the query result page number
+     * @param order            the query result order, default is 0, 0 is desc order by the
+     *            follow time; 1 is order by the public account name
+     * @return the query result will return by asynchronous callback, here only
+     *         return invoke result if it has exception
+     */
+    boolean getPublicList( String keywords, int pageSize, int pageNum, int order );
+    
+    /**
+     * query the public account's menu info.
+     *
+     * @param uuid            the public account uuid
+     * @return the query result will return by asynchronous callback, here only
+     *         return invoke result if it has exception
+     */
+    boolean getPublicMenuInfo( String uuid );
+
+    /**
+     * query the user had follow public account.
+     *
+     * @param order            the query result order, default is 0, 0 is desc order by the
+     *            follow time; 1 is order by the public account name
+     * @param pageSize            the query result page size
+     * @param pageNum            the query result page number
+     * @return the query result will return by asynchronous callback, here only
+     *         return invoke result if it has exception
+     */
+    boolean getUserSubscribePublicList( int order, int pageSize, int pageNum );
+
+    /**
+     * parse response message to message content entity json string.
+     *
+     * @param xml            the response message body, content format is xml
+     * @return the parse result, message content entity json string
+     */
+    MsgContent parseContentMessage( String xml );
+
+    
+    /**
+     * register the public account callback handler
+     * @param callback the public account callback handler
+     */
+    void registerCallback( IPublicAccountCallbackAPI callback );
+    
+    /**
+     * unregister the registered public account callback handler
+     * @param callback the public account callback handler
+     */
+    void unregisterCallback( IPublicAccountCallbackAPI callback );   
+    
+    /**
+     * get recommend public account.
+     *
+     * @param type                the type
+     * @param pageSize          the query result page size
+     * @param pageNum           the query result page number
+     * @return the query result of recommend public account
+     */
+    boolean getRecommendPublic(int type, int pagesize, int pagenum);
+    
+     /**
+     * query the public account detail info from database cache.
+     *
+     * @param uuid            the public account uuid
+     * @return the public accounts detail entity
+     */
+    PublicAccountsDetail getPublicDetailCache( String uuid );
+    
+    /**
+     * query the user had follow public account.
+     *
+     * @param order            the query result order, default is 0, 0 is desc order by the
+     *            follow time; 1 is order by the public account name
+     * @param pageSize            the query result page size
+     * @param pageNum            the query result page number
+     * @return the list of public accounts entity
+     */
+    List<PublicAccounts> getUserSubscribePublicListCache( int order, int pageSize, int pageNum );
+    
+    /**
+     * set accept status.
+     *
+     * @param uuid            the public account uuid
+     * @param acceptStatus    the accept status  1:accept, 0:do not accept
+     * @return the query result of recommend public account
+     */
+    boolean setAcceptStatus(String uuid, int acceptStatus);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IRichScreenApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IRichScreenApi.aidl
new file mode 100644
index 0000000..dc2fbd0
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/IRichScreenApi.aidl
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.richscrn.ResultInfo;
+import com.suntek.mway.rcs.client.api.plugin.entity.richscrn.ResultUtil;
+import com.suntek.mway.rcs.client.api.plugin.entity.richscrn.PhoneList;
+import com.suntek.mway.rcs.client.api.plugin.entity.richscrn.RichScrnShowing;
+
+/**
+ * <p>
+ * Title: The rich screen api
+ * </p>
+ * <p>
+ * Description: The rich screen api
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * 
+ * @author zrq
+ * @version 1.0
+ * 
+ */
+interface IRichScreenApi
+{
+
+    /**
+     * Gets the rich screen object.
+     * 
+     * @param missdn
+     *            the missdn
+     * @param phoneEvent
+     *            the phone event
+     * @return the rich screen object
+     */
+    ResultUtil getRichScrnObj( String missdn, String phoneEvent );
+
+    /**
+     * Download rich screen object.
+     * 
+     * @param missdn
+     *            the missdn
+     * @param phoneEvent
+     *            the phone event
+     * @return the result info
+     */
+    ResultInfo downloadRichScrnObj( String missdn, String phoneEvent );
+
+    /**
+     * Clear rich screen local cache.
+     * 
+     * @param phoneEvent
+     *            the phone event
+     * @return the result info
+     */
+    ResultInfo clearRichScrnLocalCache( String phoneEvent );
+    /**
+     * Inits the handler.
+     * 
+     * @param cacheSize
+     *            the cache size
+     * @return the result info
+     */
+    ResultInfo init( int cacheSize );
+
+     /**
+     * Generated by the terminal authentication token and a generation
+     * sourceId token to use, and then call the interface to the unified
+     * authentication service platform for authentication certification
+     * 
+     * @return the result info
+     */
+    ResultInfo richScrnCMCCSSOLogin();
+    /**
+     * Download home local rules.
+     * 
+     * @param phoneEvent
+     *            the phone event
+     * @return the result info
+     */
+    ResultInfo downloadHomeLocRules( String phoneEvent );
+    /**
+     * Switching network terminal case,
+     * notice enhanced screen SDK interface.
+     * Trigger operation is completed without
+     * major network under conditions
+     */
+    ResultInfo richScrnChangeNetWork();
+    /**
+     * When come and go electric, terminals see favorite 
+     * pictures resources, you can call this interface Collection
+     *
+      * @param sourceType
+     *            Resource type: 0 for static images, one for dynamic
+     *            pictures, two said the video, three unknown
+     * 
+     * @param cId
+     *            the cId is RichScreen id
+     */
+    ResultInfo collectRichScrnObj (String sourceType, String cId);
+    /**
+     *start site rich screen apk
+     *
+     *@param mobile 
+     *             Phone number is null, the setting for everyone ,
+     *             otherwise the numbers for
+     */
+    void startSiteApk(in PhoneList mobile);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/ICapabiltyListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/ICapabiltyListener.aidl
new file mode 100644
index 0000000..d577fd6
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/ICapabiltyListener.aidl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.capability.RCSCapabilities;
+
+interface ICapabiltyListener
+{
+    void onCallback(in RCSCapabilities capabilities, int resultCode, String resultDesc, String number);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IConferenceCallback.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IConferenceCallback.aidl
new file mode 100644
index 0000000..ecc7207
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IConferenceCallback.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Avatar;
+
+interface IConferenceCallback
+{
+    
+    void onRefreshAvatar( in Avatar avatar, int resultCode, String resultDesc );
+    
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonCallbackApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonCallbackApi.aidl
new file mode 100644
index 0000000..d088862
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonCallbackApi.aidl
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.EmoticonBO;
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.ResultBO;
+
+/**
+ * <p>
+ * Title: The emoticon callback api interface
+ * </p>
+ * <p>
+ * Description: The emoticon encapsulate the plugin emoticon api
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * 
+ * @author zrq
+ * @version 1.0
+ * 
+ */
+interface IEmoticonCallbackApi
+{
+    /**
+     * on receive accept emoticon event.
+     * 
+     * @param what
+     *            the event message flag, 0 is MSG4FAILURE, 1 is MSG4SUCCESS, 2 is MSG4LOADING
+     * @param emoticon
+     *            the success event body, other is null
+     */
+    void onAcceptEmoticon( int what, in EmoticonBO emoticon );
+
+    /**
+     * on receive authenticate user emoticon right event.
+     * 
+     * @param what
+     *            the event message flag, 0 is MSG4FAILURE, 1 is MSG4SUCCESS, 2 is MSG4LOADING
+     * @param authResult
+     *            the authenticate result, true or false
+     */
+    //void onAuthUseEmoticon( int what, boolean authResult );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonCanSendCallback.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonCanSendCallback.aidl
new file mode 100644
index 0000000..16d38d9
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonCanSendCallback.aidl
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+/**
+ * <p>
+ * Title: The emoticon callback CanSendCallback interface
+ * </p>
+ * <p>
+ * Description: The emoticon encapsulate the China Mobile emoticon CanSendCallback
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * 
+ * @author wy
+ * @version 1.0
+ * 
+ */
+interface IEmoticonCanSendCallback
+{
+    /**
+     * 
+     * 
+     * @param paramBoolean
+     *            
+     * @param paramString1
+     *            
+     * @param paramString2
+     */
+    void canSend(boolean paramBoolean, String paramString1, String paramString2);
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonPackagesNetCallbackApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonPackagesNetCallbackApi.aidl
new file mode 100644
index 0000000..853512d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonPackagesNetCallbackApi.aidl
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.EmojiPackageBO;
+/**
+ * <p>
+ * Title: The emoticon callback api interface
+ * </p>
+ * <p>
+ * Description: The emoticon encapsulate the China Mobile emoticon api
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * 
+ * @author zrq
+ * @version 1.0
+ * 
+ */
+interface IEmoticonPackagesNetCallbackApi
+{
+    /**
+     * on receive accept emoticon event.
+     * 
+     * @param what
+     *            the event message flag, 0 is MSG4FAILURE, 1 is MSG4SUCCESS, 2 is MSG4LOADING
+     * @param emoticon
+     *            the success event body, other is null
+     */
+    void queryPackagesNet( int what, in List<EmojiPackageBO> emoticon );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonSetSuccessDownListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonSetSuccessDownListener.aidl
new file mode 100644
index 0000000..425dd54
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IEmoticonSetSuccessDownListener.aidl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.EmojiPackageBO;
+/**
+ * <p>Title: The emoticon sdk listener</p>
+ * <p>Description: the emoticon sdk listener used in the emoticon api</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>
+ * 
+ * @author zrq
+ * @version 1.0
+ * 
+ */
+interface IEmoticonSetSuccessDownListener
+{
+    /**
+     * emoticon sdk callback event
+     * 
+     * @param event the event type
+     * @param type the sdk type
+     * @param mcloudParam the mcloud param
+     * @return the mcloud sdk callback event result
+     * 
+     */
+    void dosuccess(in EmojiPackageBO emojipackagebo);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMContactSyncListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMContactSyncListener.aidl
new file mode 100644
index 0000000..3b1ae92
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMContactSyncListener.aidl
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.mcontact.Auth;
+
+/**
+ * <p>
+ * Title: The synchronization callback listener
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * 
+ * @author yzx
+ * @version 1.0
+ * 
+ */
+interface IMContactSyncListener
+{
+
+    void onPreExecuteAuthSession(in Auth auth);
+    void onAuthSession(in Auth auth, boolean timeout);
+    void onExecuting(in Auth auth, int syncAction);
+    void onProgress(in Auth auth, int contactAction, int value, int max);
+    void onHttpResponeText(String message, String resultcode);
+    void onSync(in Auth auth, int syncAction, boolean success);
+    //void onThrowException(in Auth auth, int syncAction, Exception e);
+    void onRunning();
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudAuthListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudAuthListener.aidl
new file mode 100644
index 0000000..b60567f
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudAuthListener.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudOperationCtrl;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.Param;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.AuthNode;
+
+interface IMcloudAuthListener
+{
+    int onMcloudAuthEvent( IMcloudOperationCtrl operation, int event, in Param param, in AuthNode node );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudConfListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudConfListener.aidl
new file mode 100644
index 0000000..f6dbf34
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudConfListener.aidl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudOperationCtrl;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.ConfNode;
+
+interface IMcloudConfListener
+{
+    int onMcsConfEvent( IMcloudOperationCtrl operation, int event, in ConfNode node);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudFileListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudFileListener.aidl
new file mode 100644
index 0000000..f27a673
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudFileListener.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudOperationCtrl;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.Param;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.FileNode;
+
+interface IMcloudFileListener
+{
+    int onMcloudFileEvent( IMcloudOperationCtrl operation, int event, in Param param, in FileNode[] nodes );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudMsgListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudMsgListener.aidl
new file mode 100644
index 0000000..7994ec5
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudMsgListener.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudOperationCtrl;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.Param;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.MsgNode;
+
+interface IMcloudMsgListener
+{
+    int onMcloudMsgEvent( IMcloudOperationCtrl operation, int event, in Param param, in MsgNode[] nodes );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudOperationCtrl.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudOperationCtrl.aidl
new file mode 100644
index 0000000..60711f5
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudOperationCtrl.aidl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.Result;
+
+interface IMcloudOperationCtrl
+{
+    void cancel();
+    void exec();
+    void hangup();
+    void option( in Map param );
+    void pause();
+    Result getResult();
+    int getStatus();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudSdkListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudSdkListener.aidl
new file mode 100644
index 0000000..961ee04
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudSdkListener.aidl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.Param;
+
+interface IMcloudSdkListener
+{
+    int onMcloudSdkEvent( int event, int sdkType, in Param mcsParam );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudShareListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudShareListener.aidl
new file mode 100644
index 0000000..9e32320
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudShareListener.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudOperationCtrl;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.Param;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.ShareNode;
+
+interface IMcloudShareListener
+{
+    int onMcloudShareEvent( IMcloudOperationCtrl operation, int event, in Param param, in ShareNode[] nodes);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudTransListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudTransListener.aidl
new file mode 100644
index 0000000..e2fee72
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IMcloudTransListener.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IMcloudOperationCtrl;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.Param;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.TransNode;
+
+interface IMcloudTransListener
+{
+    int onMcloudTransEvent( IMcloudOperationCtrl operation, int event, in Param param, in TransNode[] nodes);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IProfileGetCallback.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IProfileGetCallback.aidl
new file mode 100644
index 0000000..6677bfa
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IProfileGetCallback.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+interface IProfileGetCallback
+{
+    void success( in List objects, String message );
+    
+    void sameToCache();
+    
+    void error( int responesCode, String message );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IProfileListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IProfileListener.aidl
new file mode 100644
index 0000000..fa53fdf
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IProfileListener.aidl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Avatar;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Profile;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.QRCardImg;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.QRCardInfo;
+
+interface IProfileListener
+{
+    void onProfileUpdated( int resultCode, String resultDesc );
+    
+    void onAvatarUpdated( int resultCode, String resultDesc );
+    
+    void onAvatarGet( in Avatar avatar, int resultCode, String resultDesc );
+    
+    void onProfileGet( in Profile profile, int resultCode, String resultDesc );
+    
+    void onQRImgGet( in QRCardImg qrImgObj, int resultCode, String resultDesc );
+    
+    void onQRImgDecode( in QRCardInfo qrCardInfo, int resultCode, String resultDesc );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IProfilePutCallback.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IProfilePutCallback.aidl
new file mode 100644
index 0000000..7f84544
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IProfilePutCallback.aidl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+interface IProfilePutCallback
+{
+    void error( int responesCode, String message );
+    void success( int responesCode, String message );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IPublicAccountCallbackAPI.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IPublicAccountCallbackAPI.aidl
new file mode 100644
index 0000000..1353eca
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/callback/IPublicAccountCallbackAPI.aidl
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.MsgContent;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.MenuInfo;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccounts;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccountsDetail;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccounts;
+
+/**
+ * <p>Title: Public account callback api</p>
+ * <p>Description: The public account callback api need the client app to implement, The plugin center will invoke the client app by this interface</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>
+ * 
+ * @author zrq
+ * @version 1.0
+ * 
+ */
+interface IPublicAccountCallbackAPI
+{
+    /**
+     * response the follow public account result
+     * 
+     * @param result
+     *            if follow success
+     */
+    //void respAddSubscribe( boolean result );
+
+    /**
+     * response the cancel public account result
+     * 
+     * @param result
+     *            if cancel success
+     */
+    //void respCancelSubscribe( boolean result );
+
+    /**
+     * response the complain public account result
+     * @param result if complain success
+     */
+    //void respComplainPublic( boolean result );
+
+    /**
+     * response the query public account history message result
+     * @param result if query success
+     * @param msgContent the message content entity list
+     */
+    void respGetPreMessage( boolean result, in List<MsgContent> msgContent );
+    
+    /**
+     * response the query public account menu info
+     * @param result if query success
+     * @param menus the menu's entity list
+     */
+    void respGetPublicMenuInfo( boolean result, in List<MenuInfo> menus );
+    
+    /**
+     * response the query user follow public account list
+     * @param result if query success
+     * @param pubAcctList the public accounts entity list
+     */
+    void respGetUserSubscribePublicList( boolean result, in List<PublicAccounts> pubAcctList );
+    
+    /**
+     * response the query public account detail
+     * @param result if query success
+     * @param accountDetail the public account detail entity
+     */
+    void respGetPublicDetail( boolean result, in PublicAccountsDetail accountDetail );
+    
+    /**
+     * response the query public accounts
+     * @param result if query success
+     * @param accountList the public account entity list
+     */
+    void respGetPublicList( boolean result, in List<PublicAccounts> accountList );
+    
+    /**
+     * response the follow public account entity
+     * @param result if query success
+     * @param account public account
+     */
+    void respAddSubscribeAccount(boolean result, in PublicAccounts account);
+    
+    /**
+     * response the follow public account
+     * @param result if query success
+     * @param account public account
+     */
+    void respCancelSubscribeAccount(boolean result, in PublicAccounts account);
+    
+    /**
+     * response the follow public account
+     * @param result if query success
+     * @param account public account
+     */
+    void respComplainPublicAccount(boolean result, in PublicAccounts account);
+    
+    /**
+     * response the follow public account
+     * @param result if query success
+     * @param account public account
+     */
+    //void respGetPreMessageAccount(boolean result, in PublicAccounts account);
+    
+    /**
+     * response the follow public menu info xml string
+     * @param result if query success
+     * @param xmlString public menu info xml string
+     */
+    //void respGetPublicMenuInfoString(boolean result, String xmlString);
+    
+    /**
+     * response the follow public account
+     * @param result if query success
+     * @param account public account
+     */
+    //void respGetPublicMenuInfoAccount(boolean result, in PublicAccounts account);
+    
+    /**
+     * response the query recommend public accounts
+     * @param result if query success
+     * @param accountList the public account entity list
+     */
+    void respGetPublicRecommend(boolean result, in List<PublicAccounts> accountList);
+    
+    /**
+     * response the set accept status
+     * @param result if query success
+     * @param uuid the public account uuid
+     */
+    void respSetAcceptStatus(boolean result, String uuid);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmojiPackageBO.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmojiPackageBO.aidl
new file mode 100644
index 0000000..8c13101
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmojiPackageBO.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.emoticon;
+
+parcelable EmojiPackageBO;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmojiPackageBO.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmojiPackageBO.java
new file mode 100644
index 0000000..d33f9d8
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmojiPackageBO.java
@@ -0,0 +1,434 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.emoticon;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: The emoticon package entity class</p>
+ * <p>Description: The emoticon package entity save some package info, such as package id, package name and so on</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class EmojiPackageBO implements Parcelable
+{
+
+      /** The package id. */
+      private String packageId;
+
+      /** The package name. */
+      private String packageName;
+
+      /** The package icon. */
+      private String packageIcon;
+
+      /** The package size. */
+      private String packageSize;
+
+      /** The package state. 1 had buyed, 0 havnt buyed*/
+      private String packageState;
+
+      /** The package price. */
+      private String packagePrice;
+
+      /** The package use limited time. */
+      private String packageUseTime;
+
+      /** The package cp id. */
+      private String packageCpId;
+
+      /** The package cp name. */
+      private String packageCpName;
+
+      /** The package description. */
+      private String packageDesc;
+
+      /** The package zip icon. */
+      private String packageZipIcon;
+
+      /** The package zip name. */
+      private String packageZipName;
+
+      /** The package zip path. */
+      private String packageZipPath;
+
+        /**
+         * The parcel describe contents, defaul is 0.
+         *
+         * @return the int
+         */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the emoticon package entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest the dest
+     * @param flags the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( packageId );
+        dest.writeString( packageName );
+        dest.writeString( packageIcon );
+        dest.writeString( packageSize );
+        dest.writeString( packageState );
+        dest.writeString( packagePrice );
+        dest.writeString( packageUseTime );
+        dest.writeString( packageCpId );
+        dest.writeString( packageCpName );
+        dest.writeString( packageDesc );
+        dest.writeString( packageZipIcon );
+        dest.writeString( packageZipName );
+        dest.writeString( packageZipPath );
+    }
+
+    /**
+     * Create the emoticon package entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        packageId = source.readString();
+        packageName = source.readString();
+        packageIcon = source.readString();
+        packageSize = source.readString();
+        packageState = source.readString();
+        packagePrice = source.readString();
+        packageUseTime = source.readString();
+        packageCpId = source.readString();
+        packageCpName = source.readString();
+        packageDesc = source.readString();
+        packageZipIcon = source.readString();
+        packageZipName = source.readString();
+        packageZipPath = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<EmojiPackageBO>    CREATOR    = new Parcelable.Creator<EmojiPackageBO>() {
+        @Override
+        public EmojiPackageBO createFromParcel( Parcel source )
+        {
+            return new EmojiPackageBO( source );
+        }
+
+        @Override
+        public EmojiPackageBO[] newArray( int size )
+        {
+            return new EmojiPackageBO[ size ];
+        }
+    };
+
+    /**
+     * Instantiates a new emoji package bo.
+     */
+    public EmojiPackageBO()
+    {}
+
+    /**
+     * Instantiates a new emoji package bo.
+     *
+     * @param source the source
+     */
+    public EmojiPackageBO( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * Gets the package id.
+     *
+     * @return the package id
+     */
+    public String getPackageId()
+    {
+        return packageId;
+    }
+
+    /**
+     * Sets the package id.
+     *
+     * @param packageId the new package id
+     */
+    public void setPackageId( String packageId )
+    {
+        this.packageId = packageId;
+    }
+
+    /**
+     * Gets the package name.
+     *
+     * @return the package name
+     */
+    public String getPackageName()
+    {
+        return packageName;
+    }
+
+    /**
+     * Sets the package name.
+     *
+     * @param packageName the new package name
+     */
+    public void setPackageName( String packageName )
+    {
+        this.packageName = packageName;
+    }
+
+    /**
+     * Gets the package icon.
+     *
+     * @return the package icon
+     */
+    public String getPackageIcon()
+    {
+        return packageIcon;
+    }
+
+    /**
+     * Sets the package icon.
+     *
+     * @param packageIcon the new package icon
+     */
+    public void setPackageIcon( String packageIcon )
+    {
+        this.packageIcon = packageIcon;
+    }
+
+    /**
+     * Gets the package size.
+     *
+     * @return the package size
+     */
+    public String getPackageSize()
+    {
+        return packageSize;
+    }
+
+    /**
+     * Sets the package size.
+     *
+     * @param packageSize the new package size
+     */
+    public void setPackageSize( String packageSize )
+    {
+        this.packageSize = packageSize;
+    }
+
+    /**
+     * Gets the package state.
+     *
+     * @return the package state
+     */
+    public String getPackageState()
+    {
+        return packageState;
+    }
+
+    /**
+     * Sets the package state.
+     *
+     * @param packageState the new package state
+     */
+    public void setPackageState( String packageState )
+    {
+        this.packageState = packageState;
+    }
+
+    /**
+     * Gets the package price.
+     *
+     * @return the package price
+     */
+    public String getPackagePrice()
+    {
+        return packagePrice;
+    }
+
+    /**
+     * Sets the package price.
+     *
+     * @param packagePrice the new package price
+     */
+    public void setPackagePrice( String packagePrice )
+    {
+        this.packagePrice = packagePrice;
+    }
+
+    /**
+     * Gets the package use limited time.
+     *
+     * @return the package use limited time
+     */
+    public String getPackageUseTime()
+    {
+        return packageUseTime;
+    }
+
+    /**
+     * Sets the package use limited time.
+     *
+     * @param packageUseTime the new package use limited time
+     */
+    public void setPackageUseTime( String packageUseTime )
+    {
+        this.packageUseTime = packageUseTime;
+    }
+
+    /**
+     * Gets the package cp id.
+     *
+     * @return the package cp id
+     */
+    public String getPackageCpId()
+    {
+        return packageCpId;
+    }
+
+    /**
+     * Sets the package cp id.
+     *
+     * @param packageCpId the new package cp id
+     */
+    public void setPackageCpId( String packageCpId )
+    {
+        this.packageCpId = packageCpId;
+    }
+
+    /**
+     * Gets the package cp name.
+     *
+     * @return the package cp name
+     */
+    public String getPackageCpName()
+    {
+        return packageCpName;
+    }
+
+    /**
+     * Sets the package cp name.
+     *
+     * @param packageCpName the new package cp name
+     */
+    public void setPackageCpName( String packageCpName )
+    {
+        this.packageCpName = packageCpName;
+    }
+
+    /**
+     * Gets the package description.
+     *
+     * @return the package description
+     */
+    public String getPackageDesc()
+    {
+        return packageDesc;
+    }
+
+    /**
+     * Sets the package description.
+     *
+     * @param packageDesc the new package description
+     */
+    public void setPackageDesc( String packageDesc )
+    {
+        this.packageDesc = packageDesc;
+    }
+
+    /**
+     * Gets the package zip icon.
+     *
+     * @return the package zip icon
+     */
+    public String getPackageZipIcon()
+    {
+        return packageZipIcon;
+    }
+
+    /**
+     * Sets the package zip icon.
+     *
+     * @param packageZipIcon the new package zip icon
+     */
+    public void setPackageZipIcon( String packageZipIcon )
+    {
+        this.packageZipIcon = packageZipIcon;
+    }
+
+    /**
+     * Gets the package zip name.
+     *
+     * @return the package zip name
+     */
+    public String getPackageZipName()
+    {
+        return packageZipName;
+    }
+
+    /**
+     * Sets the package zip name.
+     *
+     * @param packageZipName the new package zip name
+     */
+    public void setPackageZipName( String packageZipName )
+    {
+        this.packageZipName = packageZipName;
+    }
+
+    /**
+     * Gets the package zip path.
+     *
+     * @return the package zip path
+     */
+    public String getPackageZipPath()
+    {
+        return packageZipPath;
+    }
+
+    /**
+     * Sets the package zip path.
+     *
+     * @param packageZipPath the new package zip path
+     */
+    public void setPackageZipPath( String packageZipPath )
+    {
+        this.packageZipPath = packageZipPath;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmoticonBO.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmoticonBO.aidl
new file mode 100644
index 0000000..c9acf16
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmoticonBO.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.emoticon;
+
+parcelable EmoticonBO;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmoticonBO.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmoticonBO.java
new file mode 100644
index 0000000..2bf0bcb
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmoticonBO.java
@@ -0,0 +1,335 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.emoticon;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: The emoticon entity class</p>
+ * <p>Description: The emoticon entity save some emoticon info, such as emoticon id, name and so on</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class EmoticonBO implements Parcelable
+{
+      /** The emoticon id. */
+      private String emoticonId;
+
+      /** The emoticon name. */
+      private String emoticonName;
+
+      /** The emoticon static url. */
+      private String emoticonStatic;
+
+      /** The emoticon dynamic url. */
+      private String emoticonDynamic;
+
+      /** The package id. */
+      private String packageId;
+
+      /** The static emoticon bytes. */
+      private byte[] emoticonStaticByte;
+
+      /** The dynamic emoticon bytes. */
+      private byte[] emoticonDynamicByte;
+
+      /** The user phone number. */
+      private String userPhone;
+
+      /** The is only browse. */
+      private boolean isOnlyBrowse;
+
+        /**
+         * The parcel describe contents, defaul is 0.
+         *
+         * @return the int
+         */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the emoticon entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest the dest
+     * @param flags the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( emoticonId );
+        dest.writeString( emoticonName );
+        dest.writeString( emoticonStatic );
+        dest.writeString( emoticonDynamic );
+        dest.writeString( packageId );
+        dest.writeByteArray( emoticonStaticByte );
+        dest.writeByteArray( emoticonDynamicByte );
+        dest.writeString( userPhone );
+        dest.writeBooleanArray( new boolean[]{ isOnlyBrowse } );
+    }
+
+    /**
+     * Create the emoticon entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        emoticonId = source.readString();
+        emoticonName = source.readString();
+        emoticonStatic = source.readString();
+        emoticonDynamic = source.readString();
+        packageId = source.readString();
+        source.readByteArray( emoticonStaticByte );
+        source.readByteArray( emoticonDynamicByte );
+        userPhone = source.readString();
+        boolean[] val = new boolean[ 1 ];
+        source.readBooleanArray( val );
+        isOnlyBrowse = val[ 0 ];
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<EmoticonBO>    CREATOR    = new Parcelable.Creator<EmoticonBO>() {
+        @Override
+        public EmoticonBO createFromParcel( Parcel source )
+        {
+            return new EmoticonBO( source );
+        }
+
+        @Override
+        public EmoticonBO[] newArray( int size )
+        {
+            return new EmoticonBO[ size ];
+        }
+    };
+
+    /**
+     * Instantiates a new emoticon entity.
+     */
+    public EmoticonBO()
+    {}
+
+    /**
+     * Instantiates a new emoticon entity.
+     *
+     * @param source the source parcel
+     */
+    public EmoticonBO( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * Gets the emoticon id.
+     *
+     * @return the emoticon id
+     */
+    public String getEmoticonId()
+    {
+        return emoticonId;
+    }
+
+    /**
+     * Sets the emoticon id.
+     *
+     * @param emoticonId the new emoticon id
+     */
+    public void setEmoticonId( String emoticonId )
+    {
+        this.emoticonId = emoticonId;
+    }
+
+    /**
+     * Gets the emoticon name.
+     *
+     * @return the emoticon name
+     */
+    public String getEmoticonName()
+    {
+        return emoticonName;
+    }
+
+    /**
+     * Sets the emoticon name.
+     *
+     * @param emoticonName the new emoticon name
+     */
+    public void setEmoticonName( String emoticonName )
+    {
+        this.emoticonName = emoticonName;
+    }
+
+    /**
+     * Gets the emoticon static url.
+     *
+     * @return the emoticon static url
+     */
+    public String getEmoticonStatic()
+    {
+        return emoticonStatic;
+    }
+
+    /**
+     * Sets the emoticon static url.
+     *
+     * @param emoticonStatic the new emoticon static url
+     */
+    public void setEmoticonStatic( String emoticonStatic )
+    {
+        this.emoticonStatic = emoticonStatic;
+    }
+
+    /**
+     * Gets the emoticon dynamic url.
+     *
+     * @return the emoticon dynamic url
+     */
+    public String getEmoticonDynamic()
+    {
+        return emoticonDynamic;
+    }
+
+    /**
+     * Sets the emoticon dynamic url.
+     *
+     * @param emoticonDynamic the new emoticon dynamic url
+     */
+    public void setEmoticonDynamic( String emoticonDynamic )
+    {
+        this.emoticonDynamic = emoticonDynamic;
+    }
+
+    /**
+     * Gets the package id.
+     *
+     * @return the package id
+     */
+    public String getPackageId()
+    {
+        return packageId;
+    }
+
+    /**
+     * Sets the package id.
+     *
+     * @param packageId the new package id
+     */
+    public void setPackageId( String packageId )
+    {
+        this.packageId = packageId;
+    }
+
+    /**
+     * Gets the static emoticon bytes.
+     *
+     * @return the static emoticon bytes
+     */
+    public byte[] getEmoticonStaticByte()
+    {
+        return emoticonStaticByte;
+    }
+
+    /**
+     * Sets the static emoticon bytes.
+     *
+     * @param emoticonStaticByte the new static emoticon bytes
+     */
+    public void setEmoticonStaticByte( byte[] emoticonStaticByte )
+    {
+        this.emoticonStaticByte = emoticonStaticByte;
+    }
+
+    /**
+     * Gets the dynamic emoticon bytes.
+     *
+     * @return the dynamic emoticon bytes
+     */
+    public byte[] getEmoticonDynamicByte()
+    {
+        return emoticonDynamicByte;
+    }
+
+    /**
+     * Sets the dynamic emoticon bytes.
+     *
+     * @param emoticonDynamicByte the new dynamic emoticon bytes
+     */
+    public void setEmoticonDynamicByte( byte[] emoticonDynamicByte )
+    {
+        this.emoticonDynamicByte = emoticonDynamicByte;
+    }
+
+    /**
+     * Gets the user phone number.
+     *
+     * @return the user phone number
+     */
+    public String getUserPhone()
+    {
+        return userPhone;
+    }
+
+    /**
+     * Sets the user phone number.
+     *
+     * @param userPhone the new user phone number
+     */
+    public void setUserPhone( String userPhone )
+    {
+        this.userPhone = userPhone;
+    }
+
+    /**
+     * Checks if is only browse.
+     *
+     * @return true, if is only browse
+     */
+    public boolean isOnlyBrowse()
+    {
+        return isOnlyBrowse;
+    }
+
+    /**
+     * Sets the only browse.
+     *
+     * @param isOnlyBrowse the new only browse
+     */
+    public void setOnlyBrowse( boolean isOnlyBrowse )
+    {
+        this.isOnlyBrowse = isOnlyBrowse;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmoticonConstant.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmoticonConstant.java
new file mode 100644
index 0000000..487b91a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/EmoticonConstant.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.emoticon;
+
+/**
+ * The Class EmoticonConstant.
+ */
+public class EmoticonConstant {
+
+    /** The Constant EMO_STATIC_FILE. */
+    public static final int EMO_STATIC_FILE = 1;
+
+    /** The Constant EMO_DYNAMIC_FILE. */
+    public static final int EMO_DYNAMIC_FILE = 2;
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/ResultBO.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/ResultBO.aidl
new file mode 100644
index 0000000..672b600
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/ResultBO.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.emoticon;
+
+parcelable ResultBO;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/ResultBO.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/ResultBO.java
new file mode 100644
index 0000000..e97913d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/ResultBO.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.emoticon;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The emotion result entity class
+ * </p>
+ * <p>
+ * Description: The emotion result entity class, identify the result if succ and
+ * result additional object, different conditions have different result
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class ResultBO implements Parcelable
+{
+    /** The result succ flag, true is succ, otherwise it is fail. */
+    private boolean                                        resultFlag;
+
+    /** The result info. */
+    private String                                        resultMsg;
+    /**
+     * The result additional object, different conditions have different result
+     * object.
+     */
+    private Object                                        resultObj;
+
+    /**
+     * The parcel creator
+     */
+    public static final Parcelable.Creator<ResultBO>    CREATOR    = new Parcelable.Creator<ResultBO>() {
+        @Override
+        public ResultBO createFromParcel( Parcel source )
+        {
+            return new ResultBO( source );
+        }
+
+        @Override
+        public ResultBO[] newArray( int size )
+        {
+            return new ResultBO[ size ];
+        }
+    };
+
+    /**
+     * Instantiates a new result entity.
+     */
+    public ResultBO()
+    {}
+
+    /**
+     * Instantiates a new result entity from parcel.
+     *
+     * @param source the parcel source.
+     */
+    public ResultBO( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The result entity write to parcel stream. Pay attention to write
+     * variables and read the ordering of the variables should be consistent or
+     * not the correct results.
+     *
+     * @param dest
+     *            The parcel stream
+     * @param flags
+     *            The write to parcel flag
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeBooleanArray( new boolean[] { resultFlag } );
+        dest.writeString( resultMsg );
+        dest.writeValue( resultObj );
+    }
+
+    /**
+     * Create the result entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        boolean[] val = new boolean[ 1 ];
+        source.readBooleanArray( val );
+        resultFlag = val[ 0 ];
+        resultMsg = source.readString();
+        resultObj = source.readValue( this.getClass().getClassLoader() );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Checks if is result succ
+     *
+     * @return true, if is result succ
+     */
+    public boolean isResultFlag()
+    {
+        return resultFlag;
+    }
+
+    /**
+     * Sets the result flag.
+     *
+     * @param resultFlag
+     *            the new result flag
+     */
+    public void setResultFlag( boolean resultFlag )
+    {
+        this.resultFlag = resultFlag;
+    }
+
+    /**
+     * Gets the result info.
+     *
+     * @return the result info
+     */
+    public String getResultMsg()
+    {
+        return resultMsg;
+    }
+
+    /**
+     * Sets the result info.
+     *
+     * @param resultMsg
+     *            the new result info.
+     */
+    public void setResultMsg( String resultMsg )
+    {
+        this.resultMsg = resultMsg;
+    }
+
+    /**
+     * Gets the result object.
+     *
+     * @return the result object
+     */
+    public Object getResultObj()
+    {
+        return resultObj;
+    }
+
+    /**
+     * Sets the result object.
+     *
+     * @param resultObj
+     *            the new result object
+     */
+    public void setResultObj( Object resultObj )
+    {
+        this.resultObj = resultObj;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/UserBO.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/UserBO.aidl
new file mode 100644
index 0000000..68020c2
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/UserBO.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.emoticon;
+
+parcelable UserBO;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/UserBO.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/UserBO.java
new file mode 100644
index 0000000..1694f41
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/emoticon/UserBO.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.emoticon;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: The emotion user entity class</p>
+ * <p>Description: The emotion user entity save some user info</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class UserBO implements Parcelable
+{
+    /** The user's phone number. */
+    private String    userPhone;
+    /** The user's nickname. */
+    private String    userNick;
+    /** The user login time. */
+    private String    userLoginTime;
+    /** The user current state. */
+    private String    userState;
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the user entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest the dest
+     * @param flags the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( userPhone );
+        dest.writeString( userNick );
+        dest.writeString( userLoginTime );
+        dest.writeString( userState );
+    }
+
+    /**
+     * Create the user entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        userPhone = source.readString();
+        userNick = source.readString();
+        userLoginTime = source.readString();
+        userState = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<UserBO>    CREATOR    = new Parcelable.Creator<UserBO>() {
+        @Override
+        public UserBO createFromParcel( Parcel source )
+        {
+            return new UserBO( source );
+        }
+
+        @Override
+        public UserBO[] newArray( int size )
+        {
+            return new UserBO[ size ];
+        }
+    };
+
+    /**
+     * Instantiates a new user entity.
+     */
+    public UserBO()
+    {}
+
+    /**
+     * Instantiates a new user entity from parcel.
+     *
+     * @param source the parcel source
+     */
+    public UserBO( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * Gets the user phone number.
+     *
+     * @return the user phone number
+     */
+    public String getUserPhone()
+    {
+        return userPhone;
+    }
+
+    /**
+     * Sets the user phone number.
+     *
+     * @param userPhone the new user phone number
+     */
+    public void setUserPhone( String userPhone )
+    {
+        this.userPhone = userPhone;
+    }
+
+    /**
+     * Gets the user nickname.
+     *
+     * @return the user nickname
+     */
+    public String getUserNick()
+    {
+        return userNick;
+    }
+
+    /**
+     * Sets the user nickname.
+     *
+     * @param userNick the new user nickname
+     */
+    public void setUserNick( String userNick )
+    {
+        this.userNick = userNick;
+    }
+
+    /**
+     * Gets the user login time.
+     *
+     * @return the user login time
+     */
+    public String getUserLoginTime()
+    {
+        return userLoginTime;
+    }
+
+    /**
+     * Sets the user login time.
+     *
+     * @param userLoginTime the new user login time
+     */
+    public void setUserLoginTime( String userLoginTime )
+    {
+        this.userLoginTime = userLoginTime;
+    }
+
+    /**
+     * Gets the user state.
+     *
+     * @return the user state
+     */
+    public String getUserState()
+    {
+        return userState;
+    }
+
+    /**
+     * Sets the user state.
+     *
+     * @param userState the new user state
+     */
+    public void setUserState( String userState )
+    {
+        this.userState = userState;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNode.aidl
new file mode 100644
index 0000000..63a56ab
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNode.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable AuthNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNode.java
new file mode 100644
index 0000000..0dc078a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNode.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+import java.util.Map;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class AuthNode implements Parcelable
+{
+    private byte[]                captcha;
+    private boolean                isOffline;
+    private AuthNodeUpdateInfo            updateInfo;
+    private int                    timeout;
+    private UserType                userType;
+    private PwdType                pwdType;
+    private RegType                regType;
+    private ResetType            resetType;
+    private Map<String, String>    fields;
+
+    public AuthNode()
+    {}
+
+    public AuthNode( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the mcloud result entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeByteArray( captcha );
+        dest.writeBooleanArray( new boolean[]{ isOffline } );
+        dest.writeValue( updateInfo );
+        dest.writeInt( timeout );
+        dest.writeInt( userType.ordinal() );
+        dest.writeInt( pwdType.ordinal() );
+        dest.writeInt( regType.ordinal() );
+        dest.writeInt( resetType.ordinal() );
+        dest.writeMap( fields );
+    }
+
+    /**
+     * Create the mcloud result entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    @SuppressWarnings( "unchecked" )
+    public void readFromParcel( Parcel source )
+    {
+        captcha = source.createByteArray();
+        boolean[] val = new boolean[ 1 ];
+        source.readBooleanArray( val );
+        isOffline = val[ 0 ];
+        updateInfo = ( AuthNodeUpdateInfo )source.readValue( this.getClass().getClassLoader() );
+        userType = UserType.valueOf( source.readInt() );
+        pwdType = PwdType.valueOf( source.readInt() );
+        regType = RegType.valueOf( source.readInt() );
+        resetType = ResetType.valueOf( source.readInt() );
+        fields = source.readHashMap( this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<AuthNode>    CREATOR    = new Parcelable.Creator<AuthNode>() {
+        @Override
+        public AuthNode createFromParcel( Parcel source )
+        {
+            return new AuthNode( source );
+        }
+
+        @Override
+        public AuthNode[] newArray( int size )
+        {
+            return new AuthNode[ size ];
+        }
+    };
+
+
+    public byte[] getCaptcha()
+    {
+        return captcha;
+    }
+
+    public void setCaptcha( byte[] captcha )
+    {
+        this.captcha = captcha;
+    }
+
+    public boolean isOffline()
+    {
+        return isOffline;
+    }
+
+    public void setOffline( boolean isOffline )
+    {
+        this.isOffline = isOffline;
+    }
+
+    public AuthNodeUpdateInfo getUpdateInfo()
+    {
+        return updateInfo;
+    }
+
+    public void setUpdateInfo( AuthNodeUpdateInfo updateInfo )
+    {
+        this.updateInfo = updateInfo;
+    }
+
+    public int getTimeout()
+    {
+        return timeout;
+    }
+
+    public void setTimeout( int timeout )
+    {
+        this.timeout = timeout;
+    }
+
+    public UserType getUserType()
+    {
+        return userType;
+    }
+
+    public void setUserType( UserType userType )
+    {
+        this.userType = userType;
+    }
+
+    public PwdType getPwdType()
+    {
+        return pwdType;
+    }
+
+    public void setPwdType( PwdType pwdType )
+    {
+        this.pwdType = pwdType;
+    }
+
+    public RegType getRegType()
+    {
+        return regType;
+    }
+
+    public void setRegType( RegType regType )
+    {
+        this.regType = regType;
+    }
+
+    public ResetType getResetType()
+    {
+        return resetType;
+    }
+
+    public void setResetType( ResetType resetType )
+    {
+        this.resetType = resetType;
+    }
+
+    public Map<String, String> getFields()
+    {
+        return fields;
+    }
+
+    public void setFields( Map<String, String> fields )
+    {
+        this.fields = fields;
+    }
+
+    public static enum PwdType {
+        encrypted,
+
+        original,
+
+        dynamic,
+
+        thirdParty;
+
+        public static PwdType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum RegType {
+        cellPhone;
+
+        public static RegType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum ResetType {
+        cellPhone,
+
+        thirdParty;
+
+        public static ResetType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum UserType {
+        account,
+
+        bindMobile,
+
+        bindEmail,
+
+        email;
+
+        public static UserType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNodeUpdateInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNodeUpdateInfo.aidl
new file mode 100644
index 0000000..5c1e618
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNodeUpdateInfo.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable AuthNodeUpdateInfo;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNodeUpdateInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNodeUpdateInfo.java
new file mode 100644
index 0000000..27db0e2
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/AuthNodeUpdateInfo.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class AuthNodeUpdateInfo implements Parcelable
+{
+    private String    name;
+    private String    version;
+    private String    description;
+    private String    url;
+    private String    forceupdate;
+    private String    md5;
+    private String    size;
+    private String    updateMode;
+
+    public AuthNodeUpdateInfo()
+    {}
+
+    public AuthNodeUpdateInfo( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the auth node update info entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( name );
+        dest.writeString( version );
+        dest.writeString( description );
+        dest.writeString( url );
+        dest.writeString( forceupdate );
+        dest.writeString( md5 );
+        dest.writeString( size );
+        dest.writeString( updateMode );
+    }
+
+    /**
+     * Create the auth node update info entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        name = source.readString();
+        version = source.readString();
+        description = source.readString();
+        url = source.readString();
+        forceupdate = source.readString();
+        md5 = source.readString();
+        size = source.readString();
+        updateMode = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<AuthNodeUpdateInfo>    CREATOR = new Parcelable.Creator<AuthNodeUpdateInfo>() {
+        @Override
+        public AuthNodeUpdateInfo createFromParcel( Parcel source )
+        {
+            return new AuthNodeUpdateInfo( source );
+        }
+
+        @Override
+        public AuthNodeUpdateInfo[] newArray( int size )
+        {
+            return new AuthNodeUpdateInfo[ size ];
+        }
+    };
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion( String version )
+    {
+        this.version = version;
+    }
+
+    public String getDescription()
+    {
+        return description;
+    }
+
+    public void setDescription( String description )
+    {
+        this.description = description;
+    }
+
+    public String getUrl()
+    {
+        return url;
+    }
+
+    public void setUrl( String url )
+    {
+        this.url = url;
+    }
+
+    public String getForceupdate()
+    {
+        return forceupdate;
+    }
+
+    public void setForceupdate( String forceupdate )
+    {
+        this.forceupdate = forceupdate;
+    }
+
+    public String getMd5()
+    {
+        return md5;
+    }
+
+    public void setMd5( String md5 )
+    {
+        this.md5 = md5;
+    }
+
+    public String getSize()
+    {
+        return size;
+    }
+
+    public void setSize( String size )
+    {
+        this.size = size;
+    }
+
+    public String getUpdateMode()
+    {
+        return updateMode;
+    }
+
+    public void setUpdateMode( String updateMode )
+    {
+        this.updateMode = updateMode;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ConfNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ConfNode.aidl
new file mode 100644
index 0000000..db782b2
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ConfNode.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable ConfNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ConfNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ConfNode.java
new file mode 100644
index 0000000..505518a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ConfNode.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+import java.util.Map;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class ConfNode implements Parcelable
+{
+    private String version;
+    private Map<String, String> fields;
+
+    public ConfNode()
+    {}
+
+    public ConfNode( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the configure node entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( version );
+        dest.writeMap( fields );
+    }
+
+    /**
+     * Create the configure node entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    @SuppressWarnings( "unchecked" )
+    public void readFromParcel( Parcel source )
+    {
+        version = source.readString();
+        fields = source.readHashMap( this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<ConfNode>    CREATOR    = new Parcelable.Creator<ConfNode>() {
+        @Override
+        public ConfNode createFromParcel( Parcel source )
+        {
+            return new ConfNode( source );
+        }
+
+        @Override
+        public ConfNode[] newArray( int size )
+        {
+            return new ConfNode[ size ];
+        }
+    };
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion( String version )
+    {
+        this.version = version;
+    }
+
+    public Map<String, String> getFields()
+    {
+        return fields;
+    }
+
+    public void setFields( Map<String, String> fields )
+    {
+        this.fields = fields;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Config.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Config.aidl
new file mode 100644
index 0000000..daed9ab
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Config.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable Config;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Config.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Config.java
new file mode 100644
index 0000000..d256fcd
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Config.java
@@ -0,0 +1,468 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+/**
+ * The Class Config.
+ */
+public class Config {
+
+    /** The Constant USER_ACCOUNT. */
+    public static final String USER_ACCOUNT = "user_account";
+
+      /** The Constant USER_PASS_SHA. */
+      public static final String USER_PASS_SHA = "user_pass_sha";
+
+      /** The Constant USER_TOKEN. */
+      public static final String USER_TOKEN = "user_token";
+
+      /** The Constant USER_TOKEN_EXPIRE. */
+      public static final String USER_TOKEN_EXPIRE = "user_token_expire";
+
+      /** The Constant USER_ACCESS_TOKEN. */
+      public static final String USER_ACCESS_TOKEN = "userext_accessToken";
+
+      /** The Constant USER_AUTHOR_KEY. */
+      public static final String USER_AUTHOR_KEY = "user_author_key";
+
+      /** The Constant USER_SYSID. */
+      public static final String USER_SYSID = "user_sysid";
+
+      /** The Constant USER_LOGIN_ID. */
+      public static final String USER_LOGIN_ID = "user_loginid";
+
+      /** The Constant USER_PINTYPE. */
+      public static final String USER_PINTYPE = "user_pintype";
+
+      /** The Constant USER_SECURE1. */
+      public static final String USER_SECURE1 = "user_secure1";
+
+      /** The Constant USER_SECURE2. */
+      public static final String USER_SECURE2 = "user_secure2";
+
+      /** The Constant ADDR_AAS. */
+      public static final String ADDR_AAS = "addr_aas";
+
+      /** The Constant ADDR_AAS_HTTPS. */
+      public static final String ADDR_AAS_HTTPS = "addr_aas_https";
+
+      /** The Constant ADDR_RIF. */
+      public static final String ADDR_RIF = "addr_rif";
+
+      /** The Constant ADDR_RIF_HTTPS. */
+      public static final String ADDR_RIF_HTTPS = "addr_rif_https";
+
+      /** The Constant INFO_MARKET_URL. */
+      public static final String INFO_MARKET_URL = "Info_marketurl";
+
+      /** The Constant INFO_FEEDBACK_URL. */
+      public static final String INFO_FEEDBACK_URL = "Info_fburl";
+
+      /** The Constant INFO_CYTXL_URL. */
+      public static final String INFO_CYTXL_URL = "Info_cytxlurl";
+
+      /** The Constant ADDR_IMS. */
+      public static final String ADDR_IMS = "addr_ims";
+
+      /** The Constant ADDR_INNERIMS. */
+      public static final String ADDR_INNERIMS = "addr_innerims";
+
+      /** The Constant ADDR_XMPP. */
+      public static final String ADDR_XMPP = "addr_xmpp";
+
+      /** The Constant ADDR_XMPPADAPTOR. */
+      public static final String ADDR_XMPPADAPTOR = "addr_xmppadaptor";
+
+      /** The Constant ADDR_AP. */
+      public static final String ADDR_AP = "addr_ap";
+
+      /** The Constant ADDR_CABSYNCML. */
+      public static final String ADDR_CABSYNCML = "addr_cabsyncml";
+
+      /** The Constant ADDR_CABGROUP. */
+      public static final String ADDR_CABGROUP = "addr_cabgroup";
+
+      /** The Constant ADDR_CAB_HTTP. */
+      public static final String ADDR_CAB_HTTP = "addr_cab_http";
+
+      /** The Constant ADDR_CAB_HTTPS. */
+      public static final String ADDR_CAB_HTTPS = "addr_cab_https";
+
+      /** The Constant ADDR_TEP. */
+      public static final String ADDR_TEP = "addr_tep";
+
+      /** The Constant ADDR_VOIPSTUN. */
+      public static final String ADDR_VOIPSTUN = "addr_voipstun";
+
+      /** The Constant ADDR_PORTAL. */
+      public static final String ADDR_PORTAL = "addr_portal";
+
+      /** The Constant ADDR_LIVEUPDATE. */
+      public static final String ADDR_LIVEUPDATE = "addr_liveupdate";
+
+      /** The Constant ADDR_SNSCONNECTOR. */
+      public static final String ADDR_SNSCONNECTOR = "addr_snsconnector";
+
+      /** The Constant ADDR_BOSH. */
+      public static final String ADDR_BOSH = "addr_bosh";
+
+      /** The Constant ADDR_CHATSIPURI. */
+      public static final String ADDR_CHATSIPURI = "addr_chatsipuri";
+
+      /** The Constant ADDR_SVNLIST. */
+      public static final String ADDR_SVNLIST = "addr_svnlist";
+
+      /** The Constant CONF_IMSDOMAIN. */
+      public static final String CONF_IMSDOMAIN = "conf_imsdomain";
+
+      /** The Constant CONF_IMSUSER. */
+      public static final String CONF_IMSUSER = "conf_imsuser";
+
+      /** The Constant CONF_IMSPWD. */
+      public static final String CONF_IMSPWD = "conf_imspwd";
+
+      /** The Constant CONF_SVNUSER. */
+      public static final String CONF_SVNUSER = "conf_svnuser";
+
+      /** The Constant CONF_SVNPWD. */
+      public static final String CONF_SVNPWD = "conf_svnpwd";
+
+      /** The Constant CONF_POPUP. */
+      public static final String CONF_POPUP = "conf_popup";
+
+      /** The Constant CONF_SMS_SCHEDULE. */
+      public static final String CONF_SMS_SCHEDULE = "conf_sms_schedule";
+
+      /** The Constant CONF_SMS_MAXSIZE. */
+      public static final String CONF_SMS_MAXSIZE = "conf_sms_maxsize";
+
+      /** The Constant CONF_MMS_MAXSIZE. */
+      public static final String CONF_MMS_MAXSIZE = "conf_mms_maxsize";
+
+      /** The Constant CONF_EMAIL_MAXSIZE. */
+      public static final String CONF_EMAIL_MAXSIZE = "conf_email_maxsize";
+
+      /** The Constant CONF_RVCENABLED. */
+      public static final String CONF_RVCENABLED = "conf_rvcenabled";
+
+      /** The Constant CONF_HBTIME. */
+      public static final String CONF_HBTIME = "conf_hbtime";
+
+      /** The Constant CONF_ORDERSTAT. */
+      public static final String CONF_ORDERSTAT = "conf_orderstat";
+
+      /** The Constant CONF_ENDDATE. */
+      public static final String CONF_ENDDATE = "conf_enddate";
+
+      /** The Constant CONF_PUBKEY. */
+      public static final String CONF_PUBKEY = "conf_pubkey";
+
+      /** The Constant CONF_CTDACCESSCODE. */
+      public static final String CONF_CTDACCESSCODE = "conf_ctdaccesscode";
+
+      /** The Constant CONF_SERVER_VER. */
+      public static final String CONF_SERVER_VER = "conf_server_ver";
+
+      /** The Constant INFO. */
+      public static final String INFO = "Info_";
+
+      /** The Constant USER_NDUID. */
+      public static final String USER_NDUID = "user_nduid";
+
+      /** The Constant USER_EXT_PASSID. */
+      public static final String USER_EXT_PASSID = "Userext_passID";
+
+      /** The Constant USER_EXT. */
+      public static final String USER_EXT = "Userext_";
+
+      /** The Constant USER_HTTPS_AUTH. */
+      public static final String USER_HTTPS_AUTH = "use_https_auth";
+
+      /** The Constant USER_HTTPS_HICLOUD_FILE. */
+      public static final String USER_HTTPS_HICLOUD_FILE = "use_https_hicloud_file";
+
+      /** The Constant USER_HTTPS_HICLOUD_MSG. */
+      public static final String USER_HTTPS_HICLOUD_MSG = "use_https_hicloud_msg";
+
+      /** The Constant USER_HTTPS_HICLOUD_SHARE. */
+      public static final String USER_HTTPS_HICLOUD_SHARE = "use_https_hicloud_share";
+
+      /** The Constant USER_HTTPS_HICLOUD_TRANS. */
+      public static final String USER_HTTPS_HICLOUD_TRANS = "use_https_hicloud_trans";
+
+      /** The Constant USER_HTTPS_HICLOUD_CONF. */
+      public static final String USER_HTTPS_HICLOUD_CONF = "use_https_hicloud_conf";
+
+      /** The Constant USER_HTTPS_HICLOUD_CONTACT. */
+      public static final String USER_HTTPS_HICLOUD_CONTACT = "use_https_hicloud_contact";
+
+      /** The Constant USER_HTTPS_ALL. */
+      public static final String USER_HTTPS_ALL = "use_https_all";
+
+      /** The Constant OSE_TATA_HTTPS_NEED. */
+      public static final String OSE_TATA_HTTPS_NEED = "ose_tata_https_need";
+
+      /** The Constant HICLOUD_USERROOT_ID. */
+      public static final String HICLOUD_USERROOT_ID = "hiCloud_userroot_id";
+
+      /** The Constant HICLOUD_FOLDER_PRESET_ID. */
+      public static final String HICLOUD_FOLDER_PRESET_ID = "hiCloud_Folder_Preset_ID";
+
+      /** The Constant HICLOUD_FLASHUPLOAD. */
+      public static final String HICLOUD_FLASHUPLOAD = "hiCloud_flashupload";
+
+      /** The Constant HICLOUD_FILE_EXTINFO. */
+      public static final String HICLOUD_FILE_EXTINFO = "hiCloud_File_ExtInfo";
+
+      /** The Constant MCS_PROGRESSINTERVAL. */
+      public static final String MCS_PROGRESSINTERVAL = "Mcs_ProgressInterval";
+
+      /** The Constant HICLOUD_GZIP_DOWNLOAD. */
+      public static final String HICLOUD_GZIP_DOWNLOAD = "hiCloud_GZip_Download";
+
+      /** The Constant HICLOUD_GZIP_UPLOAD. */
+      public static final String HICLOUD_GZIP_UPLOAD = "hiCloud_GZip_Upload";
+
+      /** The Constant MCS_GZIP_REQUEST. */
+      public static final String MCS_GZIP_REQUEST = "Mcs_GZip_Request";
+
+      /** The Constant MCS_GZIP_RESPONSE. */
+      public static final String MCS_GZIP_RESPONSE = "Mcs_GZip_Response";
+
+      /** The Constant HICLOUD_FILEOPRLISTDIRSYNCTYPE. */
+      public static final String HICLOUD_FILEOPRLISTDIRSYNCTYPE = "hiCloud_FileOprListDirSyncType";
+
+      /** The Constant HICLOUD_FILEOPRLISTDIRRATE. */
+      public static final String HICLOUD_FILEOPRLISTDIRRATE = "hiCloud_FileOprListDirRate";
+
+      /** The Constant HICLOUD_UPLOAD_EXPIRETIME. */
+      public static final String HICLOUD_UPLOAD_EXPIRETIME = "hiCloud_Upload_ExpireTime";
+
+      /** The Constant HICLOUD_SYNCACHEOPRETION. */
+      public static final String HICLOUD_SYNCACHEOPRETION = "hiCloud_SyncCacheOperation";
+
+      /** The Constant HICLOUD_SYNCCACHETIMEOUT. */
+      public static final String HICLOUD_SYNCCACHETIMEOUT = "hiCloud_SyncCacheTimeout";
+
+      /** The Constant AUTH_TOKEN_TIMEOUT. */
+      public static final String AUTH_TOKEN_TIMEOUT = "Auth_Token_Timeout";
+
+      /** The Constant MCS_CONFLICTSTATUS_REPORT. */
+      public static final String MCS_CONFLICTSTATUS_REPORT = "Mcs_ConflictStatus_Report";
+
+      /** The Constant HICLOUD_MSG_BACKUP_THREADS. */
+      public static final String HICLOUD_MSG_BACKUP_THREADS = "HiCloudMsgBackupThreads";
+
+      /** The Constant HICLOUD_MSG_IGNOREMMS. */
+      public static final String HICLOUD_MSG_IGNOREMMS = "HiCloud_Msg_IgnorMMS";
+
+      /** The Constant HICLOUD_MSG_IGNORDRAF. */
+      public static final String HICLOUD_MSG_IGNORDRAF = "HiCloud_Msg_IgnorDraft";
+
+      /** The Constant SMS_BACKUP_BATCH_COUNT. */
+      public static final String SMS_BACKUP_BATCH_COUNT = "SmsBackupBatchCount";
+
+      /** The Constant HICLOUD_MSG_DELSESSIONMSGS. */
+      public static final String HICLOUD_MSG_DELSESSIONMSGS = "HiCloud_Msg_DelSessionMsgs";
+
+      /** The Constant HICLOUD_MSG_DELSESSIONMAX. */
+      public static final String HICLOUD_MSG_DELSESSIONMAX = "HiCloud_Msg_DelSessionMax";
+
+      /** The Constant STATUS_NETWORK_ID. */
+      public static final String STATUS_NETWORK_ID = "Status_Network_ID";
+
+      /** The Constant STATUS_NETWORK_TYPE. */
+      public static final String STATUS_NETWORK_TYPE = "Status_Network_Type";
+
+      /** The Constant STATUS_NETWORK_STATE. */
+      public static final String STATUS_NETWORK_STATE = "Status_Network_State";
+
+      /** The Constant NETMONITOR_STABLEDELAY_WIFI. */
+      public static final String NETMONITOR_STABLEDELAY_WIFI = "NetMonitor_StableDelay_WIFI";
+
+      /** The Constant NETMONITOR_STABLESIGNAL_WIFI. */
+      public static final String NETMONITOR_STABLESIGNAL_WIFI = "NetMonitor_StableSignal_WIFI";
+
+      /** The Constant NETMONITOR_STABLEDELAY_MOBILE. */
+      public static final String NETMONITOR_STABLEDELAY_MOBILE = "NetMonitor_StableDelay_Mobile";
+
+      /** The Constant NETMONITOR_STABLESIGNAL_MOBILE. */
+      public static final String NETMONITOR_STABLESIGNAL_MOBILE = "NetMonitor_StableSignal_Mobile";
+
+      /** The Constant HICLOUD_TRANSTASK_MAXTOTAL. */
+      public static final String HICLOUD_TRANSTASK_MAXTOTAL = "HiCloud_TransTask_MaxTotal";
+
+      /** The Constant HICLOUD_FILETASK_THREADS. */
+      public static final String HICLOUD_FILETASK_THREADS = "HiCloud_FileTask_Threads";
+
+      /** The Constant HICLOUD_FILETASK_OVERWRITE. */
+      public static final String HICLOUD_FILETASK_OVERWRITE = "HiCloud_FileTask_Overwrite";
+
+      /** The Constant HICLOUD_BAKTASK_OVERWRITE. */
+      public static final String HICLOUD_BAKTASK_OVERWRITE = "HiCloud_BakTask_Overwrite";
+
+      /** The Constant HICLOUD_TRANSTASK_PHOTOQUALITY. */
+      public static final String HICLOUD_TRANSTASK_PHOTOQUALITY = "HiCloud_TransTask_PhotoQuality";
+
+      /** The Constant HICLOUD_TRANSTASK_ORDER_START. */
+      public static final String HICLOUD_TRANSTASK_ORDER_START = "HiCloud_TransTask_Order_Start";
+
+      /** The Constant HICLOUD_TRANSTASK_ORDER_PAUSE. */
+      public static final String HICLOUD_TRANSTASK_ORDER_PAUSE = "HiCloud_TransTask_Order_Pause";
+
+      /** The Constant HICLOUD_TRANSTASK_ORDER_FAIL. */
+      public static final String HICLOUD_TRANSTASK_ORDER_FAIL = "HiCloud_TransTask_Order_Fail";
+
+      /** The Constant HICLOUD_TRANSTASK_DELTMPFILE. */
+      public static final String HICLOUD_TRANSTASK_DELTMPFILE = "HiCloud_TransTask_DelTmpFile";
+
+      /** The Constant MCS_NETWORK_RETRYCOUNT. */
+      public static final String MCS_NETWORK_RETRYCOUNT = "Mcs_Network_RetryCount";
+
+      /** The Constant HICLOUD_X_USERAGENT. */
+      public static final String HICLOUD_X_USERAGENT = "hiCloud_X_UserAgent";
+
+      /** The Constant MCS_REQUEST_SOCKETBUFFER. */
+      public static final String MCS_REQUEST_SOCKETBUFFER = "Mcs_Request_SocketBuffer";
+
+      /** The Constant HICLOUD_TIMELINE_BACKUP_PHOTO. */
+      public static final String HICLOUD_TIMELINE_BACKUP_PHOTO = "HiCloud_TimeLine_Backup_Photo";
+
+      /** The Constant HICLOUD_TIMELINE_BACKUP_APP. */
+      public static final String HICLOUD_TIMELINE_BACKUP_APP = "HiCloud_TimeLine_Backup_App";
+
+      /** The Constant HICLOUD_TIMELINE_BACKUP_VIDEO. */
+      public static final String HICLOUD_TIMELINE_BACKUP_VIDEO = "HiCloud_TimeLine_Backup_Video";
+
+      /** The Constant HICLOUD_TIMELINE_RESTORE_PHOTO. */
+      public static final String HICLOUD_TIMELINE_RESTORE_PHOTO = "HiCloud_TimeLine_Restore_Photo";
+
+      /** The Constant HICLOUD_TIMELINE_RESTORE_APP. */
+      public static final String HICLOUD_TIMELINE_RESTORE_APP = "HiCloud_TimeLine_Restore_App";
+
+      /** The Constant HICLOUD_TIMELINE_RESTORE_VIDEO. */
+      public static final String HICLOUD_TIMELINE_RESTORE_VIDEO = "HiCloud_TimeLine_Restore_Video";
+
+      /** The Constant CAB_HTTPS_NEED. */
+      public static final String CAB_HTTPS_NEED = "cab_https_need";
+
+      /** The Constant HICLOUD_SYNCACHEOPRETION_DEF. */
+      public static final int HICLOUD_SYNCACHEOPRETION_DEF = 1;
+
+      /** The Constant HICLOUD_SYNCACHEOPRETION_LOC. */
+      public static final int HICLOUD_SYNCACHEOPRETION_LOC = 0;
+
+      /** The Constant HICLOUD_SYNCACHEOPRETION_SYNC. */
+      public static final int HICLOUD_SYNCACHEOPRETION_SYNC = 2;
+
+      /** The Constant HICLOUD_FILEOPRLISTDIRSYNCTYPE_DEF. */
+      public static final int HICLOUD_FILEOPRLISTDIRSYNCTYPE_DEF = 0;
+
+      /** The Constant HICLOUD_FILEOPRLISTDIRSYNCTYPE_ROOT. */
+      public static final int HICLOUD_FILEOPRLISTDIRSYNCTYPE_ROOT = 1;
+
+      /** The Constant HICLOUD_FILEOPRLISTDIRRATE_DEF. */
+      public static final int HICLOUD_FILEOPRLISTDIRRATE_DEF = 200;
+
+      /** The Constant HICLOUD_UPLOAD_EXPIRETIME_DEF. */
+      public static final int HICLOUD_UPLOAD_EXPIRETIME_DEF = 7;
+
+      /** The Constant HICLOUD_SYNCCACHETIMEOUT_DEF. */
+      public static final int HICLOUD_SYNCCACHETIMEOUT_DEF = 60;
+
+      /** The Constant HICLOUD_PROGRESSINTERVAL_DEF. */
+      public static final int HICLOUD_PROGRESSINTERVAL_DEF = 1000;
+
+      /** The Constant AUTH_TOKEN_TIMEOUT_DEF. */
+      public static final int AUTH_TOKEN_TIMEOUT_DEF = 600;
+
+      /** The Constant HICLOUD_CONFLICTSTATUS_REPORT_NO. */
+      public static final int HICLOUD_CONFLICTSTATUS_REPORT_NO = 0;
+
+      /** The Constant HICLOUD_CONFLICTSTATUS_REPORT_YES. */
+      public static final int HICLOUD_CONFLICTSTATUS_REPORT_YES = 1;
+
+      /** The Constant HICLOUD_SDK_VERSION. */
+      public static final String HICLOUD_SDK_VERSION = "SDKVersion";
+
+      /** The Constant HICLOUD_SDK_VERSION_FILE. */
+      public static final String HICLOUD_SDK_VERSION_FILE = "SDKVersionFILE";
+
+      /** The Constant HICLOUD_SDK_VERSION_MSG. */
+      public static final String HICLOUD_SDK_VERSION_MSG = "SDKVersionMSG";
+
+      /** The Constant HICLOUD_APP_CHANNEL. */
+      public static final String HICLOUD_APP_CHANNEL = "AppChannel";
+
+      /** The Constant MCS_APPLICATION_VERSION. */
+      public static final String MCS_APPLICATION_VERSION = "applicationVersion";
+
+      /** The Constant MCS_SDK_VERSION_BASE. */
+      public static final String MCS_SDK_VERSION_BASE = "SDKVersionBase";
+
+      /** The Constant MCS_APPLICATION_CLIENTTYPE. */
+      public static final String MCS_APPLICATION_CLIENTTYPE = "applicationClientType";
+
+      /** The Constant AUTH_AUTOFILL_CHECKVERSION. */
+      public static final String AUTH_AUTOFILL_CHECKVERSION = "autoFillCheckVersion";
+
+      /** The Constant AUTH_AUTOFILL_ROUTECODE. */
+      public static final String AUTH_AUTOFILL_ROUTECODE = "autoFillRouteCode";
+
+      /** The Constant USER_DEVICEID. */
+      public static final String USER_DEVICEID = "user_deviceid";
+
+      /** The Constant USER_LOGIN_NAME. */
+      public static final String USER_LOGIN_NAME = "user_loginname";
+
+      /** The Constant USER_LOGIN_TYPE. */
+      public static final String USER_LOGIN_TYPE = "user_logintype";
+
+      /** The Constant USER_LOGIN_PASS. */
+      public static final String USER_LOGIN_PASS = "user_loginpass";
+
+      /** The Constant USER_PASS_TYPE. */
+      public static final String USER_PASS_TYPE = "user_passtype";
+
+      /** The Constant USER_LOGIN_EXTINFO. */
+      public static final String USER_LOGIN_EXTINFO = "user_loginextinfo";
+
+      /** The Constant USER_LOGIN_SOURCE. */
+      public static final String USER_LOGIN_SOURCE = "user_loginxsource";
+
+      /** The Constant COM_CONF_VERSION. */
+      public static final String COM_CONF_VERSION = "ComConf_Version";
+
+      /** The Constant COM_CONF. */
+      public static final String COM_CONF = "ComConf_";
+
+      /** The Constant CONFIG_XML_NAME. */
+      public static final String CONFIG_XML_NAME = "mcsConfig";
+
+      /** The Constant SERVER_CERT_CONTENT. */
+      public static final String SERVER_CERT_CONTENT = "server_cert_content";
+
+      /** The Constant SERVER_CERT_NOT_BEFORE. */
+      public static final String SERVER_CERT_NOT_BEFORE = "server_cert_not_before";
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Error.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Error.java
new file mode 100644
index 0000000..98af8bc
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Error.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+
+public enum Error {
+    Timeout,
+
+    SocketError,
+
+    HttpError,
+
+    ServerError,
+
+    NotFound,
+
+    NotAvaliable,
+
+    NotPermite,
+
+    NotSupportted,
+
+    notConfiged,
+
+    NotLogin,
+
+    FsNotSynced,
+
+    FsNotFound,
+
+    FsChanged,
+
+    FsTooBig,
+
+    FsFileExists,
+
+    LocalFileExist,
+
+    LocalFileNotFound,
+
+    TaskExist,
+
+    TaskNotExist,
+
+    IllegalInputParam,
+
+    IllegalOutputParam,
+
+    MaxiumLimitted,
+
+    UnKonw,
+
+    McsError,
+
+    xmlParseError,
+
+    stateError,
+
+    resumeTaskIdNotExsit,
+
+    newTaskExist,
+
+    SyncTokenNotChanged,
+
+    sdkInnerError;
+
+    public static Error valueOf( int ordinal )
+    {
+        if( ordinal < 0 || ordinal >= values().length )
+        {
+            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        }
+
+        return values()[ ordinal ];
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Event.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Event.java
new file mode 100644
index 0000000..6db1c7d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Event.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+
+public enum Event {
+      started,
+
+      success,
+
+      error,
+
+      canceled,
+
+      progress,
+
+      paused,
+
+      resumed,
+
+      pendding,
+
+      sub_started;
+
+    public static Event valueOf( int ordinal )
+    {
+        if( ordinal < 0 || ordinal >= values().length )
+        {
+            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        }
+
+        return values()[ ordinal ];
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/FileNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/FileNode.aidl
new file mode 100644
index 0000000..08291c3
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/FileNode.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable FileNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/FileNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/FileNode.java
new file mode 100644
index 0000000..b80780b
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/FileNode.java
@@ -0,0 +1,641 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+import java.util.Map;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class FileNode implements Parcelable
+{
+    private boolean isFile;
+    private boolean isShared;
+    private boolean isFixed;
+    private boolean isNeedUpdate;
+    private boolean isNeedUpload;
+    private boolean isSuccess;
+    private long uploadSize;
+    private FileType type;
+    private int dirLevel;
+    private long eTag;
+    private String name;
+    private String suffix;
+    private ShareType shareType;
+    private String createTime;
+    private String updateTime;
+    private long size;
+    private String digest;
+    private String remotePath;
+    private String oldName;
+    private String oldRemotePath;
+    private String localPath;
+    private String parentPath;
+    private String thumbnailURL;
+    private String localThumbPath;
+    private String bigThumbURL;
+    private String localBigThumbPath;
+    private long version;
+    private String id;
+    private String parentID;
+    private String fullPathInID;
+    private String shareParentID;
+    private Map<String, String> fields;
+
+    public FileNode()
+    {}
+
+    public FileNode( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the mcloud result entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( name );
+        dest.writeString( suffix );
+        dest.writeString( createTime );
+        dest.writeString( updateTime );
+        dest.writeString( digest );
+        dest.writeString( remotePath );
+        dest.writeString( oldName );
+        dest.writeString( oldRemotePath );
+        dest.writeString( localPath );
+        dest.writeString( parentPath );
+        dest.writeString( thumbnailURL );
+        dest.writeString( localThumbPath );
+        dest.writeString( bigThumbURL );
+        dest.writeString( localBigThumbPath );
+        dest.writeString( id );
+        dest.writeString( parentID );
+        dest.writeString( fullPathInID );
+        dest.writeString( shareParentID );
+
+        dest.writeBooleanArray( new boolean[]{ isFile } );
+        dest.writeBooleanArray( new boolean[]{ isShared } );
+        dest.writeBooleanArray( new boolean[]{ isFixed } );
+        dest.writeBooleanArray( new boolean[]{ isNeedUpdate } );
+        dest.writeBooleanArray( new boolean[]{ isNeedUpload } );
+        dest.writeBooleanArray( new boolean[]{ isSuccess } );
+
+        dest.writeLong( uploadSize );
+        dest.writeInt( dirLevel );
+        dest.writeLong( eTag );
+        dest.writeLong( size );
+        dest.writeLong( version );
+
+        dest.writeInt( shareType.ordinal() );
+        dest.writeInt( type.ordinal() );
+
+        dest.writeMap( fields );
+    }
+
+    /**
+     * Create the mcloud result entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    @SuppressWarnings( "unchecked" )
+    public void readFromParcel( Parcel source )
+    {
+        name = source.readString();
+        suffix = source.readString();
+        createTime = source.readString();
+        updateTime = source.readString();
+        digest = source.readString();
+        remotePath = source.readString();
+        oldName = source.readString();
+        oldRemotePath = source.readString();
+        localPath = source.readString();
+        parentPath = source.readString();
+        thumbnailURL = source.readString();
+        localThumbPath = source.readString();
+        bigThumbURL = source.readString();
+        localBigThumbPath = source.readString();
+        id = source.readString();
+        parentID = source.readString();
+        fullPathInID = source.readString();
+        shareParentID = source.readString();
+
+        isFile = source.createBooleanArray()[ 0 ];
+        isShared = source.createBooleanArray()[ 0 ];
+        isFixed = source.createBooleanArray()[ 0 ];
+        isNeedUpdate = source.createBooleanArray()[ 0 ];
+        isNeedUpload = source.createBooleanArray()[ 0 ];
+        isSuccess = source.createBooleanArray()[ 0 ];
+
+        uploadSize = source.readLong();
+        dirLevel = source.readInt();
+        eTag = source.readLong();
+        size = source.readLong();
+        version = source.readLong();
+
+        shareType = ShareType.valueOf( source.readInt() );
+        type = FileType.valueOf( source.readInt() );
+
+        fields = source.readHashMap( this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<FileNode>    CREATOR    = new Parcelable.Creator<FileNode>() {
+        @Override
+        public FileNode createFromParcel( Parcel source )
+        {
+            return new FileNode( source );
+        }
+
+        @Override
+        public FileNode[] newArray( int size )
+        {
+            return new FileNode[ size ];
+        }
+    };
+
+    public boolean isFile()
+    {
+        return isFile;
+    }
+
+    public void setFile( boolean isFile )
+    {
+        this.isFile = isFile;
+    }
+
+    public boolean isShared()
+    {
+        return isShared;
+    }
+
+    public void setShared( boolean isShared )
+    {
+        this.isShared = isShared;
+    }
+
+    public boolean isFixed()
+    {
+        return isFixed;
+    }
+
+    public void setFixed( boolean isFixed )
+    {
+        this.isFixed = isFixed;
+    }
+
+    public boolean isNeedUpdate()
+    {
+        return isNeedUpdate;
+    }
+
+    public void setNeedUpdate( boolean isNeedUpdate )
+    {
+        this.isNeedUpdate = isNeedUpdate;
+    }
+
+    public boolean isNeedUpload()
+    {
+        return isNeedUpload;
+    }
+
+    public void setNeedUpload( boolean isNeedUpload )
+    {
+        this.isNeedUpload = isNeedUpload;
+    }
+
+    public boolean isSuccess()
+    {
+        return isSuccess;
+    }
+
+    public void setSuccess( boolean isSuccess )
+    {
+        this.isSuccess = isSuccess;
+    }
+
+    public long getUploadSize()
+    {
+        return uploadSize;
+    }
+
+    public void setUploadSize( long uploadSize )
+    {
+        this.uploadSize = uploadSize;
+    }
+
+    public FileType getType()
+    {
+        return type;
+    }
+
+    public void setType( FileType type )
+    {
+        this.type = type;
+    }
+
+    public int getDirLevel()
+    {
+        return dirLevel;
+    }
+
+    public void setDirLevel( int dirLevel )
+    {
+        this.dirLevel = dirLevel;
+    }
+
+    public long geteTag()
+    {
+        return eTag;
+    }
+
+    public void seteTag( long eTag )
+    {
+        this.eTag = eTag;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    public String getSuffix()
+    {
+        return suffix;
+    }
+
+    public void setSuffix( String suffix )
+    {
+        this.suffix = suffix;
+    }
+
+    public ShareType getShareType()
+    {
+        return shareType;
+    }
+
+    public void setShareType( ShareType shareType )
+    {
+        this.shareType = shareType;
+    }
+
+    public String getCreateTime()
+    {
+        return createTime;
+    }
+
+    public void setCreateTime( String createTime )
+    {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateTime()
+    {
+        return updateTime;
+    }
+
+    public void setUpdateTime( String updateTime )
+    {
+        this.updateTime = updateTime;
+    }
+
+    public long getSize()
+    {
+        return size;
+    }
+
+    public void setSize( long size )
+    {
+        this.size = size;
+    }
+
+    public String getDigest()
+    {
+        return digest;
+    }
+
+    public void setDigest( String digest )
+    {
+        this.digest = digest;
+    }
+
+    public String getRemotePath()
+    {
+        return remotePath;
+    }
+
+    public void setRemotePath( String remotePath )
+    {
+        this.remotePath = remotePath;
+    }
+
+    public String getOldName()
+    {
+        return oldName;
+    }
+
+    public void setOldName( String oldName )
+    {
+        this.oldName = oldName;
+    }
+
+    public String getOldRemotePath()
+    {
+        return oldRemotePath;
+    }
+
+    public void setOldRemotePath( String oldRemotePath )
+    {
+        this.oldRemotePath = oldRemotePath;
+    }
+
+    public String getLocalPath()
+    {
+        return localPath;
+    }
+
+    public void setLocalPath( String localPath )
+    {
+        this.localPath = localPath;
+    }
+
+    public String getParentPath()
+    {
+        return parentPath;
+    }
+
+    public void setParentPath( String parentPath )
+    {
+        this.parentPath = parentPath;
+    }
+
+    public String getThumbnailURL()
+    {
+        return thumbnailURL;
+    }
+
+    public void setThumbnailURL( String thumbnailURL )
+    {
+        this.thumbnailURL = thumbnailURL;
+    }
+
+    public String getLocalThumbPath()
+    {
+        return localThumbPath;
+    }
+
+    public void setLocalThumbPath( String localThumbPath )
+    {
+        this.localThumbPath = localThumbPath;
+    }
+
+    public String getBigThumbURL()
+    {
+        return bigThumbURL;
+    }
+
+    public void setBigThumbURL( String bigThumbURL )
+    {
+        this.bigThumbURL = bigThumbURL;
+    }
+
+    public String getLocalBigThumbPath()
+    {
+        return localBigThumbPath;
+    }
+
+    public void setLocalBigThumbPath( String localBigThumbPath )
+    {
+        this.localBigThumbPath = localBigThumbPath;
+    }
+
+    public long getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion( long version )
+    {
+        this.version = version;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+
+    public void setId( String id )
+    {
+        this.id = id;
+    }
+
+    public String getParentID()
+    {
+        return parentID;
+    }
+
+    public void setParentID( String parentID )
+    {
+        this.parentID = parentID;
+    }
+
+    public String getFullPathInID()
+    {
+        return fullPathInID;
+    }
+
+    public void setFullPathInID( String fullPathInID )
+    {
+        this.fullPathInID = fullPathInID;
+    }
+
+    public String getShareParentID()
+    {
+        return shareParentID;
+    }
+
+    public void setShareParentID( String shareParentID )
+    {
+        this.shareParentID = shareParentID;
+    }
+
+    public Map<String, String> getFields()
+    {
+        return fields;
+    }
+
+    public void setFields( Map<String, String> fields )
+    {
+        this.fields = fields;
+    }
+
+    public static enum FileType {
+        photo,
+
+        audio,
+
+        video,
+
+        document,
+
+        application,
+
+        all,
+
+        searchByName,
+
+        searchByExt;
+
+        public static FileType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum ShareType {
+        outlink,
+
+        p2pshare,
+
+        both;
+
+        public static ShareType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum Order
+    {
+        name,
+
+        name_revers,
+
+        createdate,
+
+        createdate_revers,
+
+        updatedate,
+
+        updatedate_revers;
+
+        public static Order valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum SyncType
+    {
+        noSync,
+
+        autoSync,
+
+        forceSync;
+
+        public static SyncType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    /**
+     * The Enum ThumbType.
+     */
+    public static enum ThumbType
+    {
+
+        /** The big thumb. */
+        bigThumb,
+
+        /** The middle thumb. */
+        middleThumb,
+
+        /** The small thumb. */
+        smallThumb;
+
+        /**
+         * Value of.
+         *
+         * @param ordinal the ordinal
+         * @return the thumb type
+         */
+        public static ThumbType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/MsgNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/MsgNode.aidl
new file mode 100644
index 0000000..4e0015f
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/MsgNode.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable MsgNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/MsgNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/MsgNode.java
new file mode 100644
index 0000000..ba5edc1
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/MsgNode.java
@@ -0,0 +1,386 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+import java.util.Map;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class MsgNode implements Parcelable
+{
+    private String content;
+    private String sender;
+    private String receiver;
+    private String time;
+    private String id;
+    private MsgType msgType;
+    private BoxType boxType;
+    private MsgResult result;
+    private boolean isSend;
+    private boolean isRead;
+    private int size;
+    private int number;
+    private int locked;
+    private byte[] attachment;
+    private Map<String, String> fields;
+
+    public MsgNode()
+    {}
+
+    public MsgNode( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the configure node entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( content );
+        dest.writeString( sender );
+        dest.writeString( receiver );
+        dest.writeString( time );
+        dest.writeString( id );
+
+        dest.writeInt( size );
+        dest.writeInt( number );
+        dest.writeInt( locked );
+
+        dest.writeInt( msgType.ordinal() );
+        dest.writeInt( boxType.ordinal() );
+        dest.writeInt( result.ordinal() );
+
+        dest.writeBooleanArray( new boolean[]{ isSend } );
+        dest.writeBooleanArray( new boolean[]{ isRead } );
+
+        dest.writeByteArray( attachment );
+
+        dest.writeMap( fields );
+    }
+
+    /**
+     * Create the configure node entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    @SuppressWarnings( "unchecked" )
+    public void readFromParcel( Parcel source )
+    {
+        content = source.readString();
+        sender = source.readString();
+        receiver = source.readString();
+        time = source.readString();
+        id = source.readString();
+
+        size = source.readInt();
+        number = source.readInt();
+        locked = source.readInt();
+
+        msgType = MsgType.valueOf( source.readInt() );
+        boxType = BoxType.valueOf( source.readInt() );
+        result = MsgResult.valueOf( source.readInt() );
+
+        isSend = source.createBooleanArray()[ 0 ];
+        isRead = source.createBooleanArray()[ 0 ];
+
+        attachment = source.createByteArray();
+
+        fields = source.readHashMap( this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<MsgNode>    CREATOR    = new Parcelable.Creator<MsgNode>() {
+        @Override
+        public MsgNode createFromParcel( Parcel source )
+        {
+            return new MsgNode( source );
+        }
+
+        @Override
+        public MsgNode[] newArray( int size )
+        {
+            return new MsgNode[ size ];
+        }
+    };
+
+    public String getContent()
+    {
+        return content;
+    }
+
+    public void setContent( String content )
+    {
+        this.content = content;
+    }
+
+    public String getSender()
+    {
+        return sender;
+    }
+
+    public void setSender( String sender )
+    {
+        this.sender = sender;
+    }
+
+    public String getReceiver()
+    {
+        return receiver;
+    }
+
+    public void setReceiver( String receiver )
+    {
+        this.receiver = receiver;
+    }
+
+    public String getTime()
+    {
+        return time;
+    }
+
+    public void setTime( String time )
+    {
+        this.time = time;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+
+    public void setId( String id )
+    {
+        this.id = id;
+    }
+
+    public MsgType getMsgType()
+    {
+        return msgType;
+    }
+
+    public void setMsgType( MsgType msgType )
+    {
+        this.msgType = msgType;
+    }
+
+    public BoxType getBoxType()
+    {
+        return boxType;
+    }
+
+    public void setBoxType( BoxType boxType )
+    {
+        this.boxType = boxType;
+    }
+
+    public MsgResult getResult()
+    {
+        return result;
+    }
+
+    public void setResult( MsgResult result )
+    {
+        this.result = result;
+    }
+
+    public boolean isSend()
+    {
+        return isSend;
+    }
+
+    public void setSend( boolean isSend )
+    {
+        this.isSend = isSend;
+    }
+
+    public boolean isRead()
+    {
+        return isRead;
+    }
+
+    public void setRead( boolean isRead )
+    {
+        this.isRead = isRead;
+    }
+
+    public int getSize()
+    {
+        return size;
+    }
+
+    public void setSize( int size )
+    {
+        this.size = size;
+    }
+
+    public int getNumber()
+    {
+        return number;
+    }
+
+    public void setNumber( int number )
+    {
+        this.number = number;
+    }
+
+    public int getLocked()
+    {
+        return locked;
+    }
+
+    public void setLocked( int locked )
+    {
+        this.locked = locked;
+    }
+
+    public byte[] getAttachment()
+    {
+        return attachment;
+    }
+
+    public void setAttachment( byte[] attachment )
+    {
+        this.attachment = attachment;
+    }
+
+    public Map<String, String> getFields()
+    {
+        return fields;
+    }
+
+    public void setFields( Map<String, String> fields )
+    {
+        this.fields = fields;
+    }
+
+    public static enum BoxType
+    {
+        inbox,
+
+        outbox,
+
+        draft;
+
+        public static BoxType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum MsgType
+    {
+        sms,
+
+        mms;
+
+        public static MsgType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum Order
+    {
+        date,
+
+        date_Reverse,
+
+        sender,
+
+        sender_Reverse,
+
+        receiver,
+
+        receiver_Reverse,
+
+        thread,
+
+        thread_Reverse;
+
+        public static Order valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum MsgResult
+    {
+        success,
+
+        duplication,
+
+        fail,
+
+        ignor;
+
+        public static MsgResult valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Param.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Param.aidl
new file mode 100644
index 0000000..f1d3fce
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Param.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable Param;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Param.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Param.java
new file mode 100644
index 0000000..04e1611
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Param.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class Param implements Parcelable
+{
+    private int[]        paramInt;
+    private long[]        paramLong;
+    private String[]    paramString;
+
+    public Param()
+    {}
+
+    public Param( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the param entity to parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeIntArray( paramInt );
+        dest.writeLongArray( paramLong );
+        dest.writeStringArray( paramString );
+    }
+
+    /**
+     * Create the param entity from parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        paramInt = source.createIntArray();
+        paramLong = source.createLongArray();
+        paramString = source.createStringArray();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<Param>    CREATOR    = new Parcelable.Creator<Param>() {
+        @Override
+        public Param createFromParcel( Parcel source )
+        {
+            return new Param( source );
+        }
+
+        @Override
+        public Param[] newArray( int size )
+        {
+            return new Param[ size ];
+        }
+    };
+
+    public int[] getParamInt()
+    {
+        return paramInt;
+    }
+
+    public void setParamInt( int[] paramInt )
+    {
+        this.paramInt = paramInt;
+    }
+
+    public long[] getParamLong()
+    {
+        return paramLong;
+    }
+
+    public void setParamLong( long[] paramLong )
+    {
+        this.paramLong = paramLong;
+    }
+
+    public String[] getParamString()
+    {
+        return paramString;
+    }
+
+    public void setParamString( String[] paramString )
+    {
+        this.paramString = paramString;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Result.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Result.aidl
new file mode 100644
index 0000000..9af04af
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Result.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable Result;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Result.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Result.java
new file mode 100644
index 0000000..355fe1b
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Result.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class Result implements Parcelable
+{
+    private Error    mcloudError;
+    private String        mcloudDesc;
+    private String        socketCode;
+    private String        httpCode;
+    private String        serverCode;
+
+    public Result()
+    {
+    }
+
+    public Result( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the mcloud result entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeInt( mcloudError.ordinal() );
+        dest.writeString( mcloudDesc );
+        dest.writeString( socketCode );
+        dest.writeString( httpCode );
+        dest.writeString( serverCode );
+    }
+
+    /**
+     * Create the mcloud result entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        mcloudError = Error.valueOf( source.readInt() );
+        mcloudDesc = source.readString();
+        socketCode = source.readString();
+        httpCode = source.readString();
+        serverCode = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<Result>    CREATOR    = new Parcelable.Creator<Result>() {
+        @Override
+        public Result createFromParcel( Parcel source )
+        {
+            return new Result( source );
+        }
+
+        @Override
+        public Result[] newArray( int size )
+        {
+            return new Result[ size ];
+        }
+    };
+
+    public Error getMcloudError()
+    {
+        return mcloudError;
+    }
+
+    public void setMcloudError( Error mcloudError )
+    {
+        this.mcloudError = mcloudError;
+    }
+
+    public String getMcloudDesc()
+    {
+        return mcloudDesc;
+    }
+
+    public void setMcloudDesc( String mcloudDesc )
+    {
+        this.mcloudDesc = mcloudDesc;
+    }
+
+    public String getSocketCode()
+    {
+        return socketCode;
+    }
+
+    public void setSocketCode( String socketCode )
+    {
+        this.socketCode = socketCode;
+    }
+
+    public String getHttpCode()
+    {
+        return httpCode;
+    }
+
+    public void setHttpCode( String httpCode )
+    {
+        this.httpCode = httpCode;
+    }
+
+    public String getServerCode()
+    {
+        return serverCode;
+    }
+
+    public void setServerCode( String serverCode )
+    {
+        this.serverCode = serverCode;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/SdkType.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/SdkType.java
new file mode 100644
index 0000000..e60c853
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/SdkType.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+public enum SdkType {
+    Static,
+
+    Service,
+
+    Plugin,
+
+    None;
+
+    public static SdkType valueOf( int ordinal )
+    {
+        if( ordinal < 0 || ordinal >= values().length )
+        {
+            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        }
+
+        return values()[ ordinal ];
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ShareNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ShareNode.aidl
new file mode 100644
index 0000000..0605166
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ShareNode.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable ShareNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ShareNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ShareNode.java
new file mode 100644
index 0000000..a2d2348
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/ShareNode.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class ShareNode implements Parcelable
+{
+    private String url;
+    private String thumbUrl;
+    private String createTime;
+    private String updateTime;
+    private ShareType type;
+    private String desc;
+    private int downloads;
+    private FileNode[] file;
+    private ShareNode[] subShares;
+    private String id;
+    private boolean isSuccess;
+    private Order order;
+    private Map<String, String> fields;
+
+    public ShareNode()
+    {}
+
+    public ShareNode( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the configure node entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( url );
+        dest.writeString( thumbUrl );
+        dest.writeString( createTime );
+        dest.writeString( updateTime );
+        dest.writeInt(type.ordinal());
+        dest.writeString( desc );
+        dest.writeInt(downloads);
+        dest.writeParcelableArray(file, flags);
+        dest.writeParcelableArray(subShares, flags);
+        dest.writeString( id );
+        dest.writeInt(isSuccess ? 1 : 0);
+        dest.writeInt(order.ordinal());
+        dest.writeMap( fields );
+    }
+
+    /**
+     * Create the share node entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    @SuppressWarnings( "unchecked" )
+    public void readFromParcel( Parcel source )
+    {
+        url = source.readString();
+        thumbUrl = source.readString();
+        createTime = source.readString();
+        updateTime = source.readString();
+        type = ShareType.valueOf( source.readInt() );
+        desc = source.readString();
+        downloads = source.readInt();
+//        file = (FileNode[])source.readParcelableArray( this.getClass().getClassLoader() );
+//        subShares = (ShareNode[])source.readParcelableArray( this.getClass().getClassLoader() );
+        Parcelable[] fileParcelableArray = source.readParcelableArray( this.getClass().getClassLoader() );
+        file = new FileNode[]{};
+        if (fileParcelableArray != null) {
+            file = Arrays.copyOf(fileParcelableArray, fileParcelableArray.length, FileNode[].class);
+        }
+
+        Parcelable[] subSharesParcelableArray = source.readParcelableArray( this.getClass().getClassLoader() );
+        subShares = new ShareNode[]{};
+        if (subSharesParcelableArray != null) {
+            subShares = Arrays.copyOf(subSharesParcelableArray, subSharesParcelableArray.length, ShareNode[].class);
+        }
+        id = source.readString();
+        isSuccess = source.readInt() == 1 ? true : false;
+        order = Order.valueOf(source.readInt());
+        fields = source.readHashMap( this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<ShareNode>    CREATOR    = new Parcelable.Creator<ShareNode>() {
+        @Override
+        public ShareNode createFromParcel( Parcel source )
+        {
+            return new ShareNode( source );
+        }
+
+        @Override
+        public ShareNode[] newArray( int size )
+        {
+            return new ShareNode[ size ];
+        }
+    };
+
+    public String getUrl()
+    {
+        return url;
+    }
+
+    public void setUrl( String url )
+    {
+        this.url = url;
+    }
+
+    public String getThumbUrl()
+    {
+        return thumbUrl;
+    }
+
+    public void setThumbUrl( String thumbUrl )
+    {
+        this.thumbUrl = thumbUrl;
+    }
+
+    public String getCreateTime()
+    {
+        return createTime;
+    }
+
+    public void setCreateTime( String createTime )
+    {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateTime()
+    {
+        return updateTime;
+    }
+
+    public void setUpdateTime( String updateTime )
+    {
+        this.updateTime = updateTime;
+    }
+
+    public ShareType getType()
+    {
+        return type;
+    }
+
+    public void setType( ShareType type )
+    {
+        this.type = type;
+    }
+
+    public String getDesc()
+    {
+        return desc;
+    }
+
+    public void setDesc( String desc )
+    {
+        this.desc = desc;
+    }
+
+    public int getDownloads()
+    {
+        return downloads;
+    }
+
+    public void setDownloads( int downloads )
+    {
+        this.downloads = downloads;
+    }
+
+    public FileNode[] getFile()
+    {
+        return file;
+    }
+
+    public void setFile( FileNode[] file )
+    {
+        this.file = file;
+    }
+
+    public ShareNode[] getSubShares()
+    {
+        return subShares;
+    }
+
+    public void setSubShares( ShareNode[] subShares )
+    {
+        this.subShares = subShares;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+
+    public void setId( String id )
+    {
+        this.id = id;
+    }
+
+    public boolean isSuccess()
+    {
+        return isSuccess;
+    }
+
+    public void setSuccess( boolean isSuccess )
+    {
+        this.isSuccess = isSuccess;
+    }
+
+    public Order getOrder()
+    {
+        return order;
+    }
+
+    public void setOrder( Order order )
+    {
+        this.order = order;
+    }
+
+    public Map<String, String> getFields()
+    {
+        return fields;
+    }
+
+    public void setFields( Map<String, String> fields )
+    {
+        this.fields = fields;
+    }
+
+    public static enum Order
+    {
+        createTime,
+
+        createTime_Reverse,
+
+        UpdateTime,
+
+        UpdateTime_Reverse,
+
+        Downloads,
+
+        Downloads_Reverse;
+
+        public static Order valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum ShareType
+    {
+        sharedFile,
+
+        sharedFolder,
+
+        sharedGroup;
+
+        public static ShareType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Status.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Status.java
new file mode 100644
index 0000000..0638387
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/Status.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+
+public enum Status {
+    waitting,
+
+    running,
+
+    pendding,
+
+    succeed,
+
+    paused,
+
+    canceled,
+
+    failed;
+
+    public static Status valueOf( int ordinal )
+    {
+        if( ordinal < 0 || ordinal >= values().length )
+        {
+            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        }
+
+        return values()[ ordinal ];
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/TransNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/TransNode.aidl
new file mode 100644
index 0000000..1872506
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/TransNode.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+parcelable TransNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/TransNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/TransNode.java
new file mode 100644
index 0000000..1e8d282
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcloudfile/TransNode.java
@@ -0,0 +1,374 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile;
+
+import java.util.Map;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class TransNode implements Parcelable
+{
+    private String id;
+    private long completeSize;
+    private String url;
+    private String localPath;
+    private TransType type;
+    private FileNode file;
+    private Status status;
+    private boolean isSuccess;
+    private String uploadID;
+    private String batchID;
+    private int speed;
+    private int percent;
+    private FileNode.FileType mode;
+    private String param;
+    private long order;
+    private Result result;
+    private Map<String, String> fields;
+
+    public TransNode()
+    {}
+
+    public TransNode( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the mcloud result entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( id );
+        dest.writeString( url );
+        dest.writeString( localPath );
+        dest.writeString( param );
+        dest.writeString( uploadID );
+        dest.writeString( batchID );
+
+        dest.writeLong( completeSize );
+        dest.writeLong( order );
+        dest.writeInt( speed );
+        dest.writeInt( percent );
+
+        dest.writeBooleanArray( new boolean[]{ isSuccess } );
+
+        dest.writeInt( type.ordinal() );
+        dest.writeInt( mode.ordinal() );
+        dest.writeInt( status.ordinal() );
+
+        dest.writeValue( file );
+        dest.writeValue( result );
+
+        dest.writeMap( fields );
+    }
+
+    /**
+     * Create the mcloud result entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    @SuppressWarnings( "unchecked" )
+    public void readFromParcel( Parcel source )
+    {
+        id = source.readString();
+        url = source.readString();
+        localPath = source.readString();
+        param = source.readString();
+        uploadID = source.readString();
+        batchID = source.readString();
+
+        completeSize = source.readLong();
+        order = source.readLong();
+        speed = source.readInt();
+        percent = source.readInt();
+
+        isSuccess = source.createBooleanArray()[ 0 ];
+
+        type = TransType.valueOf( source.readInt() );
+        mode = FileNode.FileType.valueOf( source.readInt() );
+        status = Status.valueOf( source.readInt() );
+
+        file = ( FileNode )source.readValue( this.getClass().getClassLoader() );
+        result = ( Result )source.readValue( this.getClass().getClassLoader() );
+
+        fields = source.readHashMap( this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<TransNode>    CREATOR    = new Parcelable.Creator<TransNode>() {
+        @Override
+        public TransNode createFromParcel( Parcel source )
+        {
+            return new TransNode( source );
+        }
+
+        @Override
+        public TransNode[] newArray( int size )
+        {
+            return new TransNode[ size ];
+        }
+    };
+
+    public String getId()
+    {
+        return id;
+    }
+
+    public void setId( String id )
+    {
+        this.id = id;
+    }
+
+    public long getCompleteSize()
+    {
+        return completeSize;
+    }
+
+    public void setCompleteSize( long completeSize )
+    {
+        this.completeSize = completeSize;
+    }
+
+    public String getUrl()
+    {
+        return url;
+    }
+
+    public void setUrl( String url )
+    {
+        this.url = url;
+    }
+
+    public String getLocalPath()
+    {
+        return localPath;
+    }
+
+    public void setLocalPath( String localPath )
+    {
+        this.localPath = localPath;
+    }
+
+    public TransType getType()
+    {
+        return type;
+    }
+
+    public void setType( TransType type )
+    {
+        this.type = type;
+    }
+
+    public FileNode getFile()
+    {
+        return file;
+    }
+
+    public void setFile( FileNode file )
+    {
+        this.file = file;
+    }
+
+    public Status getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus( Status status )
+    {
+        this.status = status;
+    }
+
+    public boolean isSuccess()
+    {
+        return isSuccess;
+    }
+
+    public void setSuccess( boolean isSuccess )
+    {
+        this.isSuccess = isSuccess;
+    }
+
+    public String getUploadID()
+    {
+        return uploadID;
+    }
+
+    public void setUploadID( String uploadID )
+    {
+        this.uploadID = uploadID;
+    }
+
+    public String getBatchID()
+    {
+        return batchID;
+    }
+
+    public void setBatchID( String batchID )
+    {
+        this.batchID = batchID;
+    }
+
+    public int getSpeed()
+    {
+        return speed;
+    }
+
+    public void setSpeed( int speed )
+    {
+        this.speed = speed;
+    }
+
+    public int getPercent()
+    {
+        return percent;
+    }
+
+    public void setPercent( int percent )
+    {
+        this.percent = percent;
+    }
+
+    public FileNode.FileType getMode()
+    {
+        return mode;
+    }
+
+    public void setMode( FileNode.FileType mode )
+    {
+        this.mode = mode;
+    }
+
+    public String getParam()
+    {
+        return param;
+    }
+
+    public void setParam( String param )
+    {
+        this.param = param;
+    }
+
+    public long getOrder()
+    {
+        return order;
+    }
+
+    public void setOrder( long order )
+    {
+        this.order = order;
+    }
+
+    public Result getResult()
+    {
+        return result;
+    }
+
+    public void setResult( Result result )
+    {
+        this.result = result;
+    }
+
+    public Map<String, String> getFields()
+    {
+        return fields;
+    }
+
+    public void setFields( Map<String, String> fields )
+    {
+        this.fields = fields;
+    }
+
+    public static enum TransOper
+    {
+        NEW,
+
+        OVER_WRITE,
+
+        RESUME,
+
+        GET_INFO;
+
+        public static TransOper valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+    public static enum TransType
+    {
+        UPLOAD,
+
+        DOWNLOAD,
+
+        DOWNLOADTHUMBNAIL,
+
+        DOWNLOADURL,
+
+        BACKUP,
+
+        RESTORE,
+
+        SHOOT;
+
+        public static TransType valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/Auth.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/Auth.aidl
new file mode 100644
index 0000000..0b76ec5
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/Auth.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcontact;
+
+parcelable Auth;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/Auth.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/Auth.java
new file mode 100644
index 0000000..291c763
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/Auth.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcontact;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class Auth implements Parcelable{
+
+    private String username;
+    private String session;
+    private String userId;
+    private String sessionkey;
+    private String message;
+    private String imei;
+    private String deviceId;
+    private String token;
+    private String version;
+    private String mContact_session;
+    private boolean enableSync;
+    private boolean isAutoSync;
+    private String syncSn;
+    private String aoiToken;
+    private String contactUserId;
+    private boolean isLocalIntent;
+    private String channelId;
+    private boolean isThirdPart = false;
+    private int error_code;
+    private String error_message;
+    private String syncFrequency;
+    private int result_code;
+
+    public Auth(){}
+
+    public Auth(Parcel source){
+        readFromParcel( source );
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+    @Override
+    public void writeToParcel(Parcel paramParcel, int paramInt) {
+        paramParcel.writeString(this.username);
+        paramParcel.writeString(this.session);
+        paramParcel.writeString(this.userId);
+        paramParcel.writeString(this.sessionkey);
+        paramParcel.writeString(this.message);
+        paramParcel.writeString(this.imei);
+        paramParcel.writeString(this.deviceId);
+        paramParcel.writeString(this.token);
+        paramParcel.writeString(this.version);
+        paramParcel.writeString(this.mContact_session);
+        paramParcel.writeInt(this.enableSync == true ? 1 : 0);
+        paramParcel.writeInt(this.isAutoSync == true ? 1 : 0);
+        paramParcel.writeString(this.syncSn);
+        paramParcel.writeString(this.aoiToken);
+        paramParcel.writeString(this.contactUserId);
+        paramParcel.writeInt(this.isLocalIntent == true ? 1 : 0);
+        paramParcel.writeString(this.channelId);
+        paramParcel.writeInt(this.isThirdPart == true ? 1 : 0);
+        paramParcel.writeInt(this.error_code);
+        paramParcel.writeString(this.error_message);
+        paramParcel.writeString(this.syncFrequency);
+        paramParcel.writeInt(this.result_code);
+    }
+
+    public void readFromParcel( Parcel paramParcel ){
+        String str1 = paramParcel.readString();
+        setUsername(str1);
+        String str2 = paramParcel.readString();
+        setSession(str2);
+        String str3 = paramParcel.readString();
+        setUserId(str3);
+        String str4 = paramParcel.readString();
+        setSessionkey(str4);
+        String str5 = paramParcel.readString();
+        setMessage(str5);
+        String str6 = paramParcel.readString();
+        setImei(str6);
+        String str7 = paramParcel.readString();
+        setDeviceId(str7);
+        String str8 = paramParcel.readString();
+        setToken(str8);
+        String str9 = paramParcel.readString();
+        setVersion(str9);
+        String str10 = paramParcel.readString();
+        setmContact_session(str10);
+        boolean bool1 = paramParcel.readInt() > 0;
+        setEnableSync(bool1);
+        boolean bool2 = paramParcel.readInt() > 0;
+        setAutoSync(bool2);
+        String str11 = paramParcel.readString();
+        setSyncSn(str11);
+        String str12 = paramParcel.readString();
+        setAoiToken(str12);
+        String str13 = paramParcel.readString();
+        setContactUserId(str13);
+        boolean bool3 = paramParcel.readInt() > 0;
+        setLocalIntent(bool3);
+        String str14 = paramParcel.readString();
+        setChannelId(str14);
+        boolean bool4 = paramParcel.readInt() > 0;
+        setThirdPart(bool4);
+        int i = paramParcel.readInt();
+        setError_code(i);
+        String str15 = paramParcel.readString();
+        setError_message(str15);
+        String str16 = paramParcel.readString();
+        setSyncFrequency(str16);
+        setResult_code(paramParcel.readInt());
+
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<Auth>    CREATOR    = new Parcelable.Creator<Auth>() {
+        @Override
+        public Auth createFromParcel( Parcel source )
+        {
+            return new Auth( source );
+        }
+
+        @Override
+        public Auth[] newArray( int size )
+        {
+            return new Auth[ size ];
+        }
+    };
+
+    public String getUsername() {
+        return username;
+    }
+    public void setUsername(String username) {
+        this.username = username;
+    }
+    public String getSession() {
+        return session;
+    }
+    public void setSession(String session) {
+        this.session = session;
+    }
+    public String getUserId() {
+        return userId;
+    }
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+    public String getSessionkey() {
+        return sessionkey;
+    }
+    public void setSessionkey(String sessionkey) {
+        this.sessionkey = sessionkey;
+    }
+    public String getMessage() {
+        return message;
+    }
+    public void setMessage(String message) {
+        this.message = message;
+    }
+    public String getImei() {
+        return imei;
+    }
+    public void setImei(String imei) {
+        this.imei = imei;
+    }
+    public String getDeviceId() {
+        return deviceId;
+    }
+    public void setDeviceId(String deviceId) {
+        this.deviceId = deviceId;
+    }
+    public String getToken() {
+        return token;
+    }
+    public void setToken(String token) {
+        this.token = token;
+    }
+    public String getVersion() {
+        return version;
+    }
+    public void setVersion(String version) {
+        this.version = version;
+    }
+    public String getmContact_session() {
+        return mContact_session;
+    }
+    public void setmContact_session(String mContact_session) {
+        this.mContact_session = mContact_session;
+    }
+    public boolean isEnableSync() {
+        return enableSync;
+    }
+    public void setEnableSync(boolean enableSync) {
+        this.enableSync = enableSync;
+    }
+    public boolean isAutoSync() {
+        return isAutoSync;
+    }
+    public void setAutoSync(boolean isAutoSync) {
+        this.isAutoSync = isAutoSync;
+    }
+    public String getSyncSn() {
+        return syncSn;
+    }
+    public void setSyncSn(String syncSn) {
+        this.syncSn = syncSn;
+    }
+    public String getAoiToken() {
+        return aoiToken;
+    }
+    public void setAoiToken(String aoiToken) {
+        this.aoiToken = aoiToken;
+    }
+    public String getContactUserId() {
+        return contactUserId;
+    }
+    public void setContactUserId(String contactUserId) {
+        this.contactUserId = contactUserId;
+    }
+    public boolean isLocalIntent() {
+        return isLocalIntent;
+    }
+    public void setLocalIntent(boolean isLocalIntent) {
+        this.isLocalIntent = isLocalIntent;
+    }
+    public String getChannelId() {
+        return channelId;
+    }
+    public void setChannelId(String channelId) {
+        this.channelId = channelId;
+    }
+    public boolean isThirdPart() {
+        return isThirdPart;
+    }
+    public void setThirdPart(boolean isThirdPart) {
+        this.isThirdPart = isThirdPart;
+    }
+    public int getError_code() {
+        return error_code;
+    }
+    public void setError_code(int error_code) {
+        this.error_code = error_code;
+    }
+    public String getError_message() {
+        return error_message;
+    }
+    public void setError_message(String error_message) {
+        this.error_message = error_message;
+    }
+    public String getSyncFrequency() {
+        return syncFrequency;
+    }
+    public void setSyncFrequency(String syncFrequency) {
+        this.syncFrequency = syncFrequency;
+    }
+    public int getResult_code() {
+        return result_code;
+    }
+    public void setResult_code(int result_code) {
+        this.result_code = result_code;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/ContactAction.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/ContactAction.java
new file mode 100644
index 0000000..d63d131
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/ContactAction.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcontact;
+
+
+public enum ContactAction {
+    CONTACT_ACTION_READ,
+    CONTACT_ACTION_ADD,
+    CONTACT_ACTION_DELETE,
+    CONTACT_ACTION_UPDATE,
+    CONTACT_ACTION_UNKNOWN;
+
+    /**
+     * Value of.
+     *
+     * @param ordinal the ordinal
+     * @return the event
+     */
+    public static ContactAction valueOf( int ordinal )
+    {
+        if( ordinal < 0 || ordinal >= values().length )
+        {
+            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        }
+
+        return values()[ ordinal ];
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/IntervalAction.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/IntervalAction.java
new file mode 100644
index 0000000..1116e1d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/IntervalAction.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcontact;
+
+public enum IntervalAction {
+    INTERVAL_SYNC_ONE_DAY,
+    INTERVAL_SYNC_ONE_WEEK,
+    INTERVAL_SYNC_ONE_MONTH,
+    INTERVAL_SYNC_SELF_DEFINE;
+
+    /**
+     * Value of.
+     *
+     * @param ordinal the ordinal
+     * @return the event
+     */
+    public static IntervalAction valueOf( int ordinal )
+    {
+        if( ordinal < 0 || ordinal >= values().length )
+        {
+            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        }
+
+        return values()[ ordinal ];
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/SyncAction.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/SyncAction.java
new file mode 100644
index 0000000..23e5bae
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/mcontact/SyncAction.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.mcontact;
+
+public enum SyncAction {
+    CONTACT_DOWNLOAD,
+    CONTACT_DOWNLOAD_APPEND,
+    CONTACT_UPLOAD,
+    CONTACT_UPLOAD_APPEND;
+
+    /**
+     * Value of.
+     *
+     * @param ordinal the ordinal
+     * @return the event
+     */
+    public static SyncAction valueOf( int ordinal )
+    {
+        if( ordinal < 0 || ordinal >= values().length )
+        {
+            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        }
+
+        return values()[ ordinal ];
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Avatar.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Avatar.aidl
new file mode 100644
index 0000000..28f2c68
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Avatar.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+parcelable Avatar;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Avatar.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Avatar.java
new file mode 100644
index 0000000..814cdf3
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Avatar.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: The profile avatar entity class</p>
+ * <p>Description: the profile avatar include image encoding type and image base64 string</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class Avatar extends BaseModel implements Parcelable,Serializable
+{
+    private static final long serialVersionUID = -47856440160432L;
+
+    /** The avatar image type. */
+    private IMAGE_TYPE    avatarImgType    = IMAGE_TYPE.PNG;
+
+    /** The image encoding. */
+    private String        imgEncoding        = "BASE64";
+
+    /** The image base64 str. */
+    private String        imgBase64Str;
+
+    /**
+     * Instantiates a new avatar.
+     */
+    public Avatar()
+    {}
+
+    /**
+     * Instantiates a new avatar.
+     *
+     * @param source the source
+     */
+    public Avatar( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the avatar entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest the dest
+     * @param flags the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        super.writeToParcel( dest, flags );
+        dest.writeInt( avatarImgType.ordinal() );
+        dest.writeString( imgEncoding );
+        dest.writeString( imgBase64Str );
+    }
+
+    /**
+     * Create the avatar entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        super.readFromParcel( source );
+        avatarImgType = IMAGE_TYPE.valueOf( source.readInt() );
+        imgEncoding = source.readString();
+        imgBase64Str = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<Avatar>    CREATOR    = new Parcelable.Creator<Avatar>() {
+        @Override
+        public Avatar createFromParcel( Parcel source )
+        {
+            return new Avatar( source );
+        }
+
+        @Override
+        public Avatar[] newArray( int size )
+        {
+            return new Avatar[ size ];
+        }
+    };
+
+    /**
+     * Gets the avatar image type.
+     *
+     * @return the avatar image type
+     */
+    public IMAGE_TYPE getAvatarImgType()
+    {
+        return avatarImgType;
+    }
+
+    /**
+     * Sets the avatar image type.
+     *
+     * @param avatarImgType the new avatar image type
+     */
+    public void setAvatarImgType( IMAGE_TYPE avatarImgType )
+    {
+        this.avatarImgType = avatarImgType;
+    }
+
+    /**
+     * Gets the image base64 string.
+     *
+     * @return the image base64 string
+     */
+    public String getImgBase64Str()
+    {
+        return imgBase64Str;
+    }
+
+    /**
+     * Sets the image base64 string.
+     *
+     * @param imgBase64Str the new image base64 string
+     */
+    public void setImgBase64Str( String imgBase64Str )
+    {
+        this.imgBase64Str = imgBase64Str;
+    }
+
+    /**
+     * The Enum IMAGE_TYPE.
+     */
+    public static enum IMAGE_TYPE {
+        PNG, JPG, GIF;
+
+        public static IMAGE_TYPE valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+
+
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("avatarImgType="+ this.avatarImgType);
+        list.add("account="+getAccount());
+        list.add("etag=" + getEtag());
+        list.add("imgEncoding="+ this.imgEncoding);
+        list.add("imgBase64Str="+ this.imgBase64Str);
+
+        return list.toString();
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/BaseModel.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/BaseModel.aidl
new file mode 100644
index 0000000..57f9644
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/BaseModel.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+parcelable BaseModel;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/BaseModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/BaseModel.java
new file mode 100644
index 0000000..888583a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/BaseModel.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: The profile base model entity class</p>
+ * <p>Description: the profile base model include the account and the etag</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class BaseModel implements Parcelable,Serializable
+{
+
+    private static final long serialVersionUID = -1599075631882399753L;
+
+    /** The account. */
+    private String    account;
+
+    /** The etag. */
+    private String    etag;
+    public BaseModel(){
+
+    }
+    /**
+     * Instantiates a new BaseModel.
+     *
+     * @param source the source
+     */
+    public BaseModel( Parcel source )
+    {
+        readFromParcel( source );
+    }
+    @Override
+    public void writeToParcel(Parcel dest, int arg1) {
+        dest.writeString( account );
+        dest.writeString( etag );
+    }
+
+    /**
+     * Read from parcel.
+     *
+     * @param source the source parcel
+     */
+    public void readFromParcel( Parcel source )
+    {
+        account = source.readString();
+        etag = source.readString();
+    }
+
+    /**
+     * Gets the account.
+     *
+     * @return the account
+     */
+    public String getAccount()
+    {
+        return account;
+    }
+
+    /**
+     * Sets the account.
+     *
+     * @param account the new account
+     */
+    public void setAccount( String account )
+    {
+        this.account = account;
+    }
+
+    /**
+     * Gets the etag.
+     *
+     * @return the etag
+     */
+    public String getEtag()
+    {
+        return etag;
+    }
+
+    /**
+     * Sets the etag.
+     *
+     * @param etag the new etag
+     */
+    public void setEtag( String etag )
+    {
+        this.etag = etag;
+    }
+
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("account="+this.account);
+        list.add("etag=" + this.etag);
+        return list.toString();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<BaseModel>    CREATOR    = new Parcelable.Creator<BaseModel>() {
+        @Override
+        public BaseModel createFromParcel( Parcel source )
+        {
+            return new BaseModel( source );
+        }
+
+        @Override
+        public BaseModel[] newArray( int size )
+        {
+            return new BaseModel[ size ];
+        }
+    };
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/OtherTels.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/OtherTels.aidl
new file mode 100644
index 0000000..05c645a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/OtherTels.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+parcelable OtherTels;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/OtherTels.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/OtherTels.java
new file mode 100644
index 0000000..e41bdc4
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/OtherTels.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class OtherTels implements Parcelable
+{
+    //private String                    homeTel;
+
+    //private String                    mobilePhone;
+
+    //private String                    fixedTel;
+
+    private HashMap<String, String>    otherTels    ;
+
+    public OtherTels()
+    {otherTels = new HashMap<String, String>();}
+
+    public OtherTels( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the avatar entity to parcel stream. Pay attention to read and write
+     * variables variables sequence should be consistent or not the correct
+     * results
+     *
+     * @param dest
+     *            the dest
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        //dest.writeString( homeTel );
+        //dest.writeString( mobilePhone );
+        //dest.writeString( fixedTel );
+        dest.writeMap( otherTels );
+    }
+
+    /**
+     * Create the avatar entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    @SuppressWarnings( "unchecked" )
+    public void readFromParcel( Parcel source )
+    {
+        //homeTel = source.readString();
+        //mobilePhone = source.readString();
+        //fixedTel = source.readString();
+        source.readMap(otherTels, this.getClass().getClassLoader());
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<OtherTels>    CREATOR    = new Parcelable.Creator<OtherTels>() {
+        @Override
+        public OtherTels createFromParcel( Parcel source )
+        {
+            return new OtherTels( source );
+        }
+
+        @Override
+        public OtherTels[] newArray( int size )
+        {
+            return new OtherTels[ size ];
+        }
+    };
+/*
+    public String getHomeTel()
+    {
+        return homeTel;
+    }
+
+    public void setHomeTel( String homeTel )
+    {
+        this.homeTel = homeTel;
+    }
+
+    public String getMobilePhone()
+    {
+        return mobilePhone;
+    }
+
+    public void setMobilePhone( String mobilePhone )
+    {
+        this.mobilePhone = mobilePhone;
+    }
+
+    public String getFixedTel()
+    {
+        return fixedTel;
+    }
+
+    public void setFixedTel( String fixedTel )
+    {
+        this.fixedTel = fixedTel;
+    }
+*/
+    public HashMap<String, String> getOtherTels()
+    {
+        return otherTels;
+    }
+
+    public void setOtherTels( HashMap<String, String> otherTels )
+    {
+        this.otherTels = otherTels;
+    }
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        //list.add("homeTel="+ this.homeTel);
+        //list.add("mobilePhone="+ this.mobilePhone);
+        //list.add("fixedTel="+ this.fixedTel);
+        list.add("otherTels="+otherTels);
+        return list.toString();
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Profile.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Profile.aidl
new file mode 100644
index 0000000..bfe7e6f
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Profile.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+parcelable Profile;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Profile.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Profile.java
new file mode 100644
index 0000000..6dd5900
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/Profile.java
@@ -0,0 +1,467 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+
+/**
+ * <p>Title: The profile entity class</p>
+ * <p>Description: the profile include the home address, the email …… and so on</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>.
+ *
+ * @author zrq
+ * @version 1.0
+ */
+public class Profile extends BaseModel implements Parcelable,Serializable
+{
+
+    /** The Constant serialVersionUID. */
+    private static final long serialVersionUID = -8351378268771321120L;
+
+    /** The home address. */
+    private String homeAddress;
+
+      /** The email. */
+      private String email;
+
+      /** The birthday. */
+      private String birthday;
+
+      /** The company name. */
+      private String companyName;
+
+      /** The company duty. */
+      private String companyDuty;
+
+      /** The company tel. */
+      private String companyTel;
+
+      /** The company address. */
+      private String companyAddress;
+
+      /** The company fax. */
+      private String companyFax;
+
+      /** The first name. */
+      private String firstName;
+
+      /** The last name. */
+      private String lastName;
+
+      /** The other tels. */
+      private ArrayList<TelephoneModel> otherTels;
+
+      /**
+       * Instantiates a new profile.
+       */
+      public Profile()
+      {}
+
+      /**
+       * Instantiates a new profile.
+       *
+       * @param source the source
+       */
+      public Profile( Parcel source )
+      {
+          readFromParcel( source );
+      }
+
+      /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the profile entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest the dest
+     * @param flags the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        super.writeToParcel( dest,flags );
+        dest.writeString( homeAddress );
+        dest.writeString( email );
+        dest.writeString( birthday );
+        dest.writeString( companyName );
+        dest.writeString( companyDuty );
+        dest.writeString( companyTel );
+        dest.writeString( companyAddress );
+        dest.writeString( companyFax );
+        dest.writeString( this.firstName );
+        dest.writeString( this.lastName );
+        dest.writeList(otherTels);
+    }
+
+    /**
+     * Create the profile entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        super.readFromParcel( source );
+        homeAddress = source.readString();
+        email = source.readString();
+        birthday = source.readString();
+        companyName = source.readString();
+        companyDuty = source.readString();
+        companyTel = source.readString();
+        companyAddress = source.readString();
+        companyFax = source.readString();
+        firstName = source.readString();
+        lastName = source.readString();
+
+        otherTels = new ArrayList<TelephoneModel>();
+        source.readList(otherTels, this.getClass().getClassLoader());
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<Profile>    CREATOR    = new Parcelable.Creator<Profile>() {
+        @Override
+        public Profile createFromParcel( Parcel source )
+        {
+            return new Profile( source );
+        }
+
+        @Override
+        public Profile[] newArray( int size )
+        {
+            return new Profile[ size ];
+        }
+    };
+
+    /**
+     * Gets the home address.
+     *
+     * @return the home address
+     */
+    public String getHomeAddress()
+    {
+        return homeAddress;
+    }
+
+    /**
+     * Sets the home address.
+     *
+     * @param homeAddress the new home address
+     */
+    public void setHomeAddress( String homeAddress )
+    {
+        this.homeAddress = homeAddress;
+    }
+
+    /**
+     * Gets the email.
+     *
+     * @return the email
+     */
+    public String getEmail()
+    {
+        return email;
+    }
+
+    /**
+     * Sets the email.
+     *
+     * @param email the new email
+     */
+    public void setEmail( String email )
+    {
+        this.email = email;
+    }
+
+    /**
+     * Gets the birthday.
+     *
+     * @return the birthday
+     */
+    public String getBirthday()
+    {
+        return birthday;
+    }
+
+    /**
+     * Sets the birthday.
+     *
+     * @param birthday the new birthday
+     */
+    public void setBirthday( String birthday )
+    {
+        this.birthday = birthday;
+    }
+
+    /**
+     * Gets the company name.
+     *
+     * @return the company name
+     */
+    public String getCompanyName()
+    {
+        return companyName;
+    }
+
+    /**
+     * Sets the company name.
+     *
+     * @param companyName the new company name
+     */
+    public void setCompanyName( String companyName )
+    {
+        this.companyName = companyName;
+    }
+
+    /**
+     * Gets the company duty.
+     *
+     * @return the company duty
+     */
+    public String getCompanyDuty()
+    {
+        return companyDuty;
+    }
+
+    /**
+     * Sets the company duty.
+     *
+     * @param companyDuty the new company duty
+     */
+    public void setCompanyDuty( String companyDuty )
+    {
+        this.companyDuty = companyDuty;
+    }
+
+    /**
+     * Gets the company tel.
+     *
+     * @return the company tel
+     */
+    public String getCompanyTel()
+    {
+        return companyTel;
+    }
+
+    /**
+     * Sets the company tel.
+     *
+     * @param companyTel the new company tel
+     */
+    public void setCompanyTel( String companyTel )
+    {
+        this.companyTel = companyTel;
+    }
+
+    /**
+     * Gets the company address.
+     *
+     * @return the company address
+     */
+    public String getCompanyAddress()
+    {
+        return companyAddress;
+    }
+
+    /**
+     * Sets the company address.
+     *
+     * @param companyAddress the new company address
+     */
+    public void setCompanyAddress( String companyAddress )
+    {
+        this.companyAddress = companyAddress;
+    }
+
+    /**
+     * Gets the company fax.
+     *
+     * @return the company fax
+     */
+    public String getCompanyFax()
+    {
+        return companyFax;
+    }
+
+    /**
+     * Sets the company fax.
+     *
+     * @param companyFax the new company fax
+     */
+    public void setCompanyFax( String companyFax )
+    {
+        this.companyFax = companyFax;
+    }
+
+
+
+    /**
+     * Gets the first name.
+     *
+     * @return the first name
+     */
+    public String getFirstName() {
+        return firstName;
+    }
+
+    /**
+     * Sets the first name.
+     *
+     * @param firstName the new first name
+     */
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    /**
+     * Gets the last name.
+     *
+     * @return the last name
+     */
+    public String getLastName() {
+        return lastName;
+    }
+
+    /**
+     * Combine the first name and the last name.
+     *
+     * @return displayName
+     */
+    public String getDisplayName() {
+        String first = firstName; // given name.
+        String last = lastName; // family name.
+
+        // 按照中文名/英文名决定排序
+        boolean isLettersOnly = true;
+
+           isLettersOnly = isLettersOnly && isNullOrLettersOnly(first);
+        isLettersOnly = isLettersOnly && isNullOrLettersOnly(last);
+
+        // Avoid "null" to show in the UI.
+        if (first == null) {
+            first = "";
+        }
+        if (last == null) {
+            last = "";
+        }
+
+        if (isLettersOnly) {
+            return first + " " + last;
+        } else {
+            return last + first;
+        }
+    }
+
+    private boolean isNullOrLettersOnly(String text) {
+        if (text == null) {
+            return true;
+        }
+
+        return isLettersOnly(text.trim());
+    }
+
+    /**
+     * Returns whether the given CharSequence contains only letters.
+     */
+    public static boolean isLettersOnly(CharSequence str) {
+        final int len = str.length();
+        for (int i = 0; i < len; i++) {
+            char c = str.charAt(i);
+            if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z')) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Sets the last name.
+     *
+     * @param lastName the new last name
+     */
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    /**
+     * Gets the other tels.
+     *
+     * @return the other tels
+     */
+    public ArrayList<TelephoneModel> getOtherTels() {
+        if(otherTels == null){
+            return new ArrayList<TelephoneModel>();
+        }
+        return otherTels;
+    }
+
+    /**
+     * Sets the other tels.
+     *
+     * @param otherTels the new other tels
+     */
+    public void setOtherTels(ArrayList<TelephoneModel> otherTels) {
+        this.otherTels = otherTels;
+    }
+
+    /*
+     * @see com.suntek.mway.rcs.client.api.plugin.entity.profile.BaseModel#toString()
+     */
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("homeAddress="+ this.homeAddress);
+        list.add("email="+ this.email);
+        list.add("birthday="+ this.birthday);
+        list.add("companyName="+ this.companyName);
+        list.add("companyDuty="+ this.companyDuty);
+        list.add("companyTel="+ this.companyTel);
+        list.add("companyAddress="+ this.companyAddress);
+        list.add("companyFax="+ this.companyFax);
+        list.add("firstName="+ this.firstName);
+        list.add("lastName="+ this.lastName);
+        list.add("otherTels="+ (this.otherTels == null ? null : this.otherTels.toString()));
+        list.add("account="+getAccount());
+        list.add("etag=" + getEtag());
+        return list.toString();
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/ProfileName.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/ProfileName.aidl
new file mode 100644
index 0000000..0c6114f
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/ProfileName.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+parcelable ProfileName; 
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/ProfileName.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/ProfileName.java
new file mode 100644
index 0000000..1bc7bd9
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/ProfileName.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class ProfileName implements Parcelable
+{
+      private String displayName = null;
+
+      private String nickName = null;
+
+      private String familyName = null;
+
+      private String firstName = null;
+
+      private String givenName = null;
+
+      private String middleName = null;
+
+      private String nameSuffix = null;
+
+      private String namePrefix = null;
+
+      public ProfileName()
+      {}
+
+      public ProfileName( Parcel source )
+      {
+          readFromParcel( source );
+      }
+
+      /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the avatar entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest the dest
+     * @param flags the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+          dest.writeString( displayName );
+          dest.writeString( nickName );
+          dest.writeString( familyName );
+          dest.writeString( firstName );
+          dest.writeString( givenName );
+          dest.writeString( middleName );
+          dest.writeString( nameSuffix );
+          dest.writeString( namePrefix );
+    }
+
+    /**
+     * Create the avatar entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+          displayName = source.readString();
+          nickName = source.readString();
+          familyName = source.readString();
+          firstName = source.readString();
+          givenName = source.readString();
+          middleName = source.readString();
+          nameSuffix = source.readString();
+          namePrefix = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<ProfileName>    CREATOR    = new Parcelable.Creator<ProfileName>() {
+        @Override
+        public ProfileName createFromParcel( Parcel source )
+        {
+            return new ProfileName( source );
+        }
+
+        @Override
+        public ProfileName[] newArray( int size )
+        {
+            return new ProfileName[ size ];
+        }
+    };
+
+    public String getDisplayName()
+    {
+        return displayName;
+    }
+
+    public void setDisplayName( String displayName )
+    {
+        this.displayName = displayName;
+    }
+
+    public String getNickName()
+    {
+        return nickName;
+    }
+
+    public void setNickName( String nickName )
+    {
+        this.nickName = nickName;
+    }
+
+    public String getFamilyName()
+    {
+        return familyName;
+    }
+
+    public void setFamilyName( String familyName )
+    {
+        this.familyName = familyName;
+    }
+
+    public String getFirstName()
+    {
+        return firstName;
+    }
+
+    public void setFirstName( String firstName )
+    {
+        this.firstName = firstName;
+    }
+
+    public String getGivenName()
+    {
+        return givenName;
+    }
+
+    public void setGivenName( String givenName )
+    {
+        this.givenName = givenName;
+    }
+
+    public String getMiddleName()
+    {
+        return middleName;
+    }
+
+    public void setMiddleName( String middleName )
+    {
+        this.middleName = middleName;
+    }
+
+    public String getNameSuffix()
+    {
+        return nameSuffix;
+    }
+
+    public void setNameSuffix( String nameSuffix )
+    {
+        this.nameSuffix = nameSuffix;
+    }
+
+    public String getNamePrefix()
+    {
+        return namePrefix;
+    }
+
+    public void setNamePrefix( String namePrefix )
+    {
+        this.namePrefix = namePrefix;
+    }
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("displayName="+ this.displayName);
+        list.add("nickName="+ this.nickName);
+        list.add("familyName="+ this.familyName);
+        list.add("firstName="+ this.firstName);
+        list.add("givenName="+ this.givenName);
+        list.add("middleName="+ this.middleName);
+        list.add("nameSuffix="+ this.nameSuffix);
+        list.add("namePrefix="+ this.namePrefix);
+        return list.toString();
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardBusinessFlag.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardBusinessFlag.aidl
new file mode 100644
index 0000000..2ad1001
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardBusinessFlag.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+parcelable QRCardBusinessFlag;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardBusinessFlag.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardBusinessFlag.java
new file mode 100644
index 0000000..30f0e40
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardBusinessFlag.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class QRCardBusinessFlag extends BaseModel implements Parcelable
+{
+    private boolean businessFlag;
+
+    public QRCardBusinessFlag()
+    {}
+
+    public QRCardBusinessFlag( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the qr card business flag entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        super.writeToParcel( dest,flags );
+        dest.writeBooleanArray( new boolean[]{ businessFlag } );
+    }
+
+    /**
+     * Create the qr card business flag entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        super.readFromParcel( source );
+        boolean[] val = new boolean[ 1 ];
+        source.readBooleanArray( val );
+        businessFlag = val[ 0 ];
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<QRCardBusinessFlag>    CREATOR    = new Parcelable.Creator<QRCardBusinessFlag>() {
+        @Override
+        public QRCardBusinessFlag createFromParcel( Parcel source )
+        {
+            return new QRCardBusinessFlag( source );
+        }
+
+        @Override
+        public QRCardBusinessFlag[] newArray( int size )
+        {
+            return new QRCardBusinessFlag[ size ];
+        }
+    };
+
+    public boolean isBusinessFlag()
+    {
+        return businessFlag;
+    }
+
+    public void setBusinessFlag( boolean businessFlag )
+    {
+        this.businessFlag = businessFlag;
+    }
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("businessFlag="+ this.businessFlag);
+        list.add("account="+getAccount());
+        list.add("etag=" + getEtag());
+        return list.toString();
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardImg.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardImg.aidl
new file mode 100644
index 0000000..98e8f13
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardImg.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+parcelable QRCardImg;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardImg.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardImg.java
new file mode 100644
index 0000000..b038ecc
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardImg.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class QRCardImg extends BaseModel implements Parcelable,Serializable
+{
+    private static final long serialVersionUID = 4674425471217216710L;
+
+    private boolean        businessFlag;
+
+    private IMAGE_TYPE    imgType        = IMAGE_TYPE.PNG;
+
+    private String        imgEncoding    = "BASE64";
+
+    private String        description;
+
+    private String        imgBase64Str;
+
+    public QRCardImg()
+    {}
+
+    public QRCardImg( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the qr card image entity to parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        super.writeToParcel( dest,flags );
+        dest.writeBooleanArray( new boolean[] { businessFlag } );
+        dest.writeInt( imgType.ordinal() );
+        dest.writeString( imgEncoding );
+        dest.writeString( description );
+        dest.writeString( imgBase64Str );
+    }
+
+    /**
+     * Create the qr card image entity from parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        super.readFromParcel( source );
+        boolean[] val = new boolean[ 1 ];
+        source.readBooleanArray( val );
+        businessFlag = val[ 0 ];
+        imgType = IMAGE_TYPE.valueOf( source.readInt() );
+        imgEncoding = source.readString();
+        description = source.readString();
+        imgBase64Str = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<QRCardImg>    CREATOR    = new Parcelable.Creator<QRCardImg>() {
+        @Override
+        public QRCardImg createFromParcel( Parcel source )
+        {
+            return new QRCardImg( source );
+        }
+
+        @Override
+        public QRCardImg[] newArray( int size )
+        {
+            return new QRCardImg[ size ];
+        }
+    };
+
+    public boolean isBusinessFlag()
+    {
+        return businessFlag;
+    }
+
+    public void setBusinessFlag( boolean businessFlag )
+    {
+        this.businessFlag = businessFlag;
+    }
+
+    public IMAGE_TYPE getImgType()
+    {
+        return imgType;
+    }
+
+    public void setImgType( IMAGE_TYPE imgType )
+    {
+        this.imgType = imgType;
+    }
+
+    public String getImgEncoding()
+    {
+        return imgEncoding;
+    }
+
+    public void setImgEncoding( String imgEncoding )
+    {
+        this.imgEncoding = imgEncoding;
+    }
+
+    public String getDescription()
+    {
+        return description;
+    }
+
+    public void setDescription( String description )
+    {
+        this.description = description;
+    }
+
+    public String getImgBase64Str()
+    {
+        return imgBase64Str;
+    }
+
+    public void setImgBase64Str( String imgBase64Str )
+    {
+        this.imgBase64Str = imgBase64Str;
+    }
+
+    public static enum IMAGE_TYPE {
+        PNG, JPG, GIF;
+
+        public static IMAGE_TYPE valueOf( int ordinal )
+        {
+            if( ordinal < 0 || ordinal >= values().length )
+            {
+                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+            }
+
+            return values()[ ordinal ];
+        }
+    }
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("businessFlag="+ this.businessFlag);
+        list.add("imgEncoding="+ this.imgEncoding);
+        list.add("imgBase64Str="+ this.imgBase64Str);
+        list.add("imgType="+ this.imgType);
+        list.add("description="+ this.description);
+        list.add("account=" + getAccount());
+        list.add("etag=" + getEtag());
+        return list.toString();
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardInfo.aidl
new file mode 100644
index 0000000..cf0a486
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardInfo.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+parcelable QRCardInfo;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardInfo.java
new file mode 100644
index 0000000..1c1e37d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/QRCardInfo.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class QRCardInfo extends BaseModel implements Parcelable,Serializable
+{
+    private static final long serialVersionUID = 5140344570754052168L;
+    private String    name;
+    private String    tel;
+    //private String    imgUrl;
+    private String    companyTel;
+    private String    companyFax;
+    private String    companyName;
+    private String    companyDuty;
+    private String    companyEmail;
+
+    public QRCardInfo()
+    {}
+
+    public QRCardInfo( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the qr card entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        super.writeToParcel( dest,flags );
+        dest.writeString( name );
+        dest.writeString( tel );
+        //dest.writeString( imgUrl );
+        dest.writeString( companyTel );
+        dest.writeString( companyFax );
+        dest.writeString( companyName );
+        dest.writeString( companyDuty );
+        dest.writeString( companyEmail );
+    }
+
+    /**
+     * Create the qr card entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        super.readFromParcel( source );
+        name = source.readString();
+        tel = source.readString();
+        //imgUrl = source.readString();
+        companyTel = source.readString();
+        companyFax = source.readString();
+        companyName = source.readString();
+        companyDuty = source.readString();
+        companyEmail = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<QRCardInfo>    CREATOR    = new Parcelable.Creator<QRCardInfo>() {
+        @Override
+        public QRCardInfo createFromParcel( Parcel source )
+        {
+            return new QRCardInfo( source );
+        }
+
+        @Override
+        public QRCardInfo[] newArray( int size )
+        {
+            return new QRCardInfo[ size ];
+        }
+    };
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    public String getTel()
+    {
+        return tel;
+    }
+
+    public void setTel( String tel )
+    {
+        this.tel = tel;
+    }
+
+    /*
+    public String getImgUrl()
+    {
+        return imgUrl;
+    }
+
+    public void setImgUrl( String imgUrl )
+    {
+        this.imgUrl = imgUrl;
+    }
+    */
+    public String getCompanyTel()
+    {
+        return companyTel;
+    }
+
+    public void setCompanyTel( String companyTel )
+    {
+        this.companyTel = companyTel;
+    }
+
+    public String getCompanyFax()
+    {
+        return companyFax;
+    }
+
+    public void setCompanyFax( String companyFax )
+    {
+        this.companyFax = companyFax;
+    }
+
+    public String getCompanyName()
+    {
+        return companyName;
+    }
+
+    public void setCompanyName( String companyName )
+    {
+        this.companyName = companyName;
+    }
+
+    public String getCompanyDuty()
+    {
+        return companyDuty;
+    }
+
+    public void setCompanyDuty( String companyDuty )
+    {
+        this.companyDuty = companyDuty;
+    }
+
+    public String getCompanyEmail()
+    {
+        return companyEmail;
+    }
+
+    public void setCompanyEmail( String companyEmail )
+    {
+        this.companyEmail = companyEmail;
+    }
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("name="+ this.name);
+        list.add("tel="+ this.tel);
+        //list.add("imgUrl="+ this.imgUrl);
+        list.add("companyTel="+ this.companyTel);
+        list.add("companyFax="+ this.companyFax);
+        list.add("companyName="+ this.companyName);
+        list.add("companyDuty="+ this.companyDuty);
+        list.add("companyEmail="+ this.companyEmail);
+        list.add("account=" + getAccount());
+        list.add("etag=" + getEtag());
+        return list.toString();
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/TelephoneModel.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/TelephoneModel.aidl
new file mode 100644
index 0000000..2e04a37
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/TelephoneModel.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+parcelable TelephoneModel;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/TelephoneModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/TelephoneModel.java
new file mode 100644
index 0000000..89d6f2a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/profile/TelephoneModel.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+
+package com.suntek.mway.rcs.client.api.plugin.entity.profile;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class TelephoneModel implements Parcelable,Serializable{
+
+    private static final long serialVersionUID = 2509804884372655920L;
+    public static int TYPE_HOME = 1;
+    public static int TYPE_MOBILE = 2;
+    public static int TYPE_FIXED = 3;
+    public static int TYPE_WORK = 4;
+    public static int TYPE_OTHER = 5;
+
+    private int type;
+    private String telephone;
+
+    public TelephoneModel()
+    {}
+
+    public TelephoneModel( Parcel source )
+    {
+        this.type = source.readInt();
+        this.telephone = source.readString();
+    }
+
+    public int getType() {
+        return type;
+    }
+    public void setType(int type) {
+        this.type = type;
+    }
+    public String getTelephone() {
+        return telephone;
+    }
+    public void setTelephone(String telephone) {
+        this.telephone = telephone;
+    }
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+    @Override
+    public void writeToParcel(Parcel dest, int arg1) {
+        dest.writeInt(this.type);
+        dest.writeString(this.telephone);
+    }
+
+    public static final Parcelable.Creator<TelephoneModel>    CREATOR    = new Parcelable.Creator<TelephoneModel>() {
+        @Override
+        public TelephoneModel createFromParcel( Parcel source )
+        {
+            return new TelephoneModel( source );
+        }
+
+        @Override
+        public TelephoneModel[] newArray( int size )
+        {
+            return new TelephoneModel[ size ];
+        }
+    };
+
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("type=" + type);
+        list.add("telephone=" + telephone);
+        return list.toString();
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaArticle.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaArticle.aidl
new file mode 100644
index 0000000..d513aad
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaArticle.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+parcelable MediaArticle;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaArticle.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaArticle.java
new file mode 100644
index 0000000..c186e4f
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaArticle.java
@@ -0,0 +1,492 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The media article entity
+ * </p>
+ * <p>
+ * Description: The media article entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class MediaArticle implements Parcelable
+{
+
+    /** The title. */
+    private String                title;
+
+    /** The author. */
+    private String                author;
+
+    /** The thumb picture link. */
+    private String                thumbLink;
+
+    /** The original picture link. */
+    private String                originalLink;
+
+    /** The source link. */
+    private String                sourceLink;
+
+    /** The main text. */
+    private String                mainText;
+
+    /** The media uuid. */
+    private String                mediaUuid;
+
+    /** The middle link. */
+//    private String                middleLink;
+
+    /** The media type. */
+//    private String                mediaType;
+
+    /** The digest. */
+    private String                digest;
+
+    /** The view type. */
+//    private String                viewType;
+
+    /** The major article. */
+    private int                    majorArticle;
+
+    /** The child articles. */
+//    private List<MediaArticle>    childArticles;
+
+    /**
+     * Instantiates a new media article.
+     */
+    public MediaArticle()
+    {}
+
+    /**
+     * Instantiates a new media article.
+     *
+     * @param source
+     *            the source
+     */
+    public MediaArticle( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the media article entity to parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( title );
+        dest.writeString( author );
+        dest.writeString( thumbLink );
+        dest.writeString( originalLink );
+        dest.writeString( sourceLink );
+        dest.writeString( mainText );
+        dest.writeString( mediaUuid );
+//        dest.writeString( middleLink );
+//        dest.writeString( mediaType );
+        dest.writeString( digest );
+//        dest.writeString( viewType );
+        dest.writeInt(majorArticle);
+//        dest.writeList( childArticles );
+    }
+
+    /**
+     * Create the media article entity from parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        title = source.readString();
+        author = source.readString();
+        thumbLink = source.readString();
+        originalLink = source.readString();
+        sourceLink = source.readString();
+        mainText = source.readString();
+        mediaUuid = source.readString();
+//        middleLink = source.readString();
+//        mediaType = source.readString();
+        digest = source.readString();
+//        viewType = source.readString();
+        majorArticle = source.readInt();
+//        childArticles = new LinkedList<MediaArticle>();
+//        source.readList( childArticles, this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<MediaArticle>    CREATOR    = new Parcelable.Creator<MediaArticle>() {
+                                                                        @Override
+                                                                        public MediaArticle createFromParcel( Parcel source )
+                                                                        {
+                                                                            return new MediaArticle( source );
+                                                                        }
+
+                                                                        @Override
+                                                                        public MediaArticle[] newArray( int size )
+                                                                        {
+                                                                            return new MediaArticle[ size ];
+                                                                        }
+                                                                    };
+
+    /**
+     * Gets the title.
+     *
+     * @return the title
+     */
+    public String getTitle()
+    {
+        return title;
+    }
+
+    /**
+     * Sets the title.
+     *
+     * @param title
+     *            the new title
+     */
+    public void setTitle( String title )
+    {
+        this.title = title;
+    }
+
+    /**
+     * Gets the author.
+     *
+     * @return the author
+     */
+    public String getAuthor()
+    {
+        return author;
+    }
+
+    /**
+     * Sets the author.
+     *
+     * @param author
+     *            the new author
+     */
+    public void setAuthor( String author )
+    {
+        this.author = author;
+    }
+
+    /**
+     * Gets the thumb picture link.
+     *
+     * @return the thumb picture link
+     */
+    public String getThumbLink()
+    {
+        return thumbLink;
+    }
+
+    /**
+     * Sets the thumb picture link.
+     *
+     * @param thumbLink
+     *            the new thumb picture link
+     */
+    public void setThumbLink( String thumbLink )
+    {
+        this.thumbLink = thumbLink;
+    }
+
+    /**
+     * Gets the original picture link.
+     *
+     * @return the original picture link
+     */
+    public String getOriginalLink()
+    {
+        return originalLink;
+    }
+
+    /**
+     * Sets the original picture link.
+     *
+     * @param originalLink
+     *            the new original picture link
+     */
+    public void setOriginalLink( String originalLink )
+    {
+        this.originalLink = originalLink;
+    }
+
+    /**
+     * Gets the source link.
+     *
+     * @return the source link
+     */
+    public String getSourceLink()
+    {
+        return sourceLink;
+    }
+
+    /**
+     * Sets the source link.
+     *
+     * @param sourceLink
+     *            the new source link
+     */
+    public void setSourceLink( String sourceLink )
+    {
+        this.sourceLink = sourceLink;
+    }
+
+    /**
+     * Gets the main text.
+     *
+     * @return the main text
+     */
+    public String getMainText()
+    {
+        return mainText;
+    }
+
+    /**
+     * Sets the main text.
+     *
+     * @param mainText
+     *            the new main text
+     */
+    public void setMainText( String mainText )
+    {
+        this.mainText = mainText;
+    }
+
+    /**
+     * Gets the media uuid.
+     *
+     * @return the media uuid
+     */
+    public String getMediaUuid()
+    {
+        return mediaUuid;
+    }
+
+    /**
+     * Sets the media uuid.
+     *
+     * @param mediaUuid
+     *            the new media uuid
+     */
+    public void setMediaUuid( String mediaUuid )
+    {
+        this.mediaUuid = mediaUuid;
+    }
+
+    /**
+     * Gets the middle link.
+     *
+     * @return the middle link
+     */
+//    public String getMiddleLink()
+//    {
+//        return middleLink;
+//    }
+
+    /**
+     * Sets the middle link.
+     *
+     * @param middleLink
+     *            the new middle link
+     */
+//    public void setMiddleLink( String middleLink )
+//    {
+//        this.middleLink = middleLink;
+//    }
+
+    /**
+     * Gets the media type.
+     *
+     * @return the media type
+     */
+//    public String getMediaType()
+//    {
+//        return mediaType;
+//    }
+
+    /**
+     * Sets the media type.
+     *
+     * @param mediaType
+     *            the new media type
+     */
+//    public void setMediaType( String mediaType )
+//    {
+//        this.mediaType = mediaType;
+//    }
+
+    /**
+     * Gets the digest.
+     *
+     * @return the digest
+     */
+    public String getDigest()
+    {
+        return digest;
+    }
+
+    /**
+     * Sets the digest.
+     *
+     * @param digest
+     *            the new digest
+     */
+    public void setDigest( String digest )
+    {
+        this.digest = digest;
+    }
+
+    /**
+     * Gets the view type.
+     *
+     * @return the view type
+     */
+//    public String getViewType()
+//    {
+//        return viewType;
+//    }
+
+    /**
+     * Sets the view type.
+     *
+     * @param viewType
+     *            the new view type
+     */
+//    public void setViewType( String viewType )
+//    {
+//        this.viewType = viewType;
+//    }
+
+    /**
+     * Gets the major article.
+     *
+     * @return the major article
+     */
+    public int getMajorArticle()
+    {
+        return majorArticle;
+    }
+
+    /**
+     * Sets the major article.
+     *
+     * @param majorArticle
+     *            the new major article
+     */
+    public void setMajorArticle( int majorArticle )
+    {
+        this.majorArticle = majorArticle;
+    }
+
+    /**
+     * Gets the child articles.
+     *
+     * @return the child articles
+     */
+//    public List<MediaArticle> getChildArticles()
+//    {
+//        return childArticles;
+//    }
+
+    /**
+     * Sets the child articles.
+     *
+     * @param childArticles
+     *            the new child articles
+     */
+//    public void setChildArticles( List<MediaArticle> childArticles )
+//    {
+//        this.childArticles = childArticles;
+//    }
+
+    @Override
+    public String toString() {
+        StringBuffer sbuffer = new StringBuffer();
+        if(null != this.title){
+            sbuffer.append(",title=").append(this.title);
+        }
+        if(null != this.thumbLink){
+            sbuffer.append(",thumbLink=").append(this.thumbLink);
+        }
+        if(null != this.originalLink){
+            sbuffer.append(",originalLink=").append(this.originalLink);
+        }
+        if(null != this.sourceLink){
+            sbuffer.append(",sourceLink=").append(this.sourceLink);
+        }
+        if(null != this.mainText){
+            sbuffer.append(",mainText=").append(this.mainText);
+        }
+        if(null != this.mediaUuid){
+            sbuffer.append(",mediaUuid=").append(this.mediaUuid);
+        }
+        if(null != this.digest){
+            sbuffer.append(",digest=").append(this.digest);
+        }
+        sbuffer.append(",majorArticle=").append(this.majorArticle);
+
+        if(sbuffer.length() > 1){
+            return sbuffer.substring(1).toString();
+        }else{
+            return "";
+        }
+
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaBasic.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaBasic.aidl
new file mode 100644
index 0000000..61ba226
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaBasic.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+parcelable MediaBasic;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaBasic.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaBasic.java
new file mode 100644
index 0000000..a534c24
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MediaBasic.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The media basic entity
+ * </p>
+ * <p>
+ * Description: The media basic entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class MediaBasic implements Parcelable
+{
+    /** The thumb picture link. */
+    private String    thumbLink;
+
+    /** The original picture link. */
+    private String    originalLink;
+
+    /** The title. */
+    private String    title;
+
+    /** The file size. */
+    private String    fileSize;
+
+    /** The duration. */
+    private String    duration;
+
+    /** The file type. */
+    private String    fileType;
+
+    /** The create time. */
+    private String    createTime;
+
+    /** The media uuid. */
+    private String    mediaUuid;
+
+    /** The pa uuid. */
+    private String    paUuid;
+
+    /**
+     * Instantiates a new media basic.
+     */
+    public MediaBasic()
+    {}
+
+    /**
+     * Instantiates a new media basic.
+     *
+     * @param source
+     *            the source
+     */
+    public MediaBasic( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the media basic entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( thumbLink );
+        dest.writeString( originalLink );
+        dest.writeString( title );
+        dest.writeString( fileSize );
+        dest.writeString( duration );
+        dest.writeString( fileType );
+        dest.writeString( createTime );
+        dest.writeString( mediaUuid );
+        dest.writeString( paUuid );
+    }
+
+    /**
+     * Create the media basic entity from parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        thumbLink = source.readString();
+        originalLink = source.readString();
+        title = source.readString();
+        fileSize = source.readString();
+        duration = source.readString();
+        fileType = source.readString();
+        createTime = source.readString();
+        mediaUuid = source.readString();
+        paUuid = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<MediaBasic>    CREATOR    = new Parcelable.Creator<MediaBasic>() {
+                                                                    @Override
+                                                                    public MediaBasic createFromParcel( Parcel source )
+                                                                    {
+                                                                        return new MediaBasic( source );
+                                                                    }
+
+                                                                    @Override
+                                                                    public MediaBasic[] newArray( int size )
+                                                                    {
+                                                                        return new MediaBasic[ size ];
+                                                                    }
+                                                                };
+
+    /**
+     * Gets the thumb picture link.
+     *
+     * @return the thumb picture link
+     */
+    public String getThumbLink()
+    {
+        return thumbLink;
+    }
+
+    /**
+     * Sets the thumb picture link.
+     *
+     * @param thumbLink
+     *            the new thumb picture link
+     */
+    public void setThumbLink( String thumbLink )
+    {
+        this.thumbLink = thumbLink;
+    }
+
+    /**
+     * Gets the original link.
+     *
+     * @return the original link
+     */
+    public String getOriginalLink()
+    {
+        return originalLink;
+    }
+
+    /**
+     * Sets the original link.
+     *
+     * @param originalLink
+     *            the new original link
+     */
+    public void setOriginalLink( String originalLink )
+    {
+        this.originalLink = originalLink;
+    }
+
+    /**
+     * Gets the title.
+     *
+     * @return the title
+     */
+    public String getTitle()
+    {
+        return title;
+    }
+
+    /**
+     * Sets the title.
+     *
+     * @param title
+     *            the new title
+     */
+    public void setTitle( String title )
+    {
+        this.title = title;
+    }
+
+    /**
+     * Gets the file size.
+     *
+     * @return the file size
+     */
+    public String getFileSize()
+    {
+        return fileSize;
+    }
+
+    /**
+     * Sets the file size.
+     *
+     * @param fileSize
+     *            the new file size
+     */
+    public void setFileSize( String fileSize )
+    {
+        this.fileSize = fileSize;
+    }
+
+    /**
+     * Gets the duration.
+     *
+     * @return the duration
+     */
+    public String getDuration()
+    {
+        return duration;
+    }
+
+    /**
+     * Sets the duration.
+     *
+     * @param duration
+     *            the new duration
+     */
+    public void setDuration( String duration )
+    {
+        this.duration = duration;
+    }
+
+    /**
+     * Gets the file type.
+     *
+     * @return the file type
+     */
+    public String getFileType()
+    {
+        return fileType;
+    }
+
+    /**
+     * Sets the file type.
+     *
+     * @param fileType
+     *            the new file type
+     */
+    public void setFileType( String fileType )
+    {
+        this.fileType = fileType;
+    }
+
+    /**
+     * Gets the creates the time.
+     *
+     * @return the creates the time
+     */
+    public String getCreateTime()
+    {
+        return createTime;
+    }
+
+    /**
+     * Sets the creates the time.
+     *
+     * @param createTime
+     *            the new creates the time
+     */
+    public void setCreateTime( String createTime )
+    {
+        this.createTime = createTime;
+    }
+
+    /**
+     * Gets the media uuid.
+     *
+     * @return the media uuid
+     */
+    public String getMediaUuid()
+    {
+        return mediaUuid;
+    }
+
+    /**
+     * Sets the media uuid.
+     *
+     * @param mediaUuid
+     *            the new media uuid
+     */
+    public void setMediaUuid( String mediaUuid )
+    {
+        this.mediaUuid = mediaUuid;
+    }
+
+    /**
+     * Gets the pa uuid.
+     *
+     * @return the pa uuid
+     */
+    public String getPaUuid()
+    {
+        return paUuid;
+    }
+
+    /**
+     * Sets the pa uuid.
+     *
+     * @param paUuid
+     *            the new pa uuid
+     */
+    public void setPaUuid( String paUuid )
+    {
+        this.paUuid = paUuid;
+    }
+
+    @Override
+    public String toString() {
+        StringBuffer sbuffer = new StringBuffer();
+        if(null != this.thumbLink){
+            sbuffer.append(",thumbLink=").append(this.thumbLink);
+        }
+        if(null != this.originalLink){
+            sbuffer.append(",originalLink=").append(this.originalLink);
+        }
+        if(null != this.title){
+            sbuffer.append(",title=").append(this.title);
+        }
+        if(null != this.fileSize){
+            sbuffer.append(",fileSize=").append(this.fileSize);
+        }
+        if(null != this.duration){
+            sbuffer.append(",duration=").append(this.duration);
+        }
+        if(null != this.fileType){
+            sbuffer.append(",fileType=").append(this.fileType);
+        }
+        if(null != this.createTime){
+            sbuffer.append(",createTime=").append(this.createTime);
+        }
+        if(null != this.mediaUuid){
+            sbuffer.append(",mediaUuid=").append(this.mediaUuid);
+        }
+        if(null != this.paUuid){
+            sbuffer.append(",paUuid=").append(this.paUuid);
+        }
+
+        if(sbuffer.length() > 1){
+            return sbuffer.substring(1).toString();
+        }else{
+            return "";
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MenuInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MenuInfo.aidl
new file mode 100644
index 0000000..04248dd
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MenuInfo.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+parcelable MenuInfo;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MenuInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MenuInfo.java
new file mode 100644
index 0000000..4b237ca
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MenuInfo.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: The menu info entity</p>
+ * <p>Description: The menu info entity</p>
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>.
+ *
+ * @author zrq
+ * @version 1.0
+ */
+public class MenuInfo implements Parcelable
+{
+
+    /** The command id. */
+    private String commandId;
+
+    /** The title. */
+    private String title;
+
+    /** The type. */
+    private int type;
+
+    /** The priority. */
+    private int priority;
+
+    /** The sub menu list. */
+    private List<MenuInfo> subMenuList;
+
+    /**
+     * Instantiates a new menu info.
+     */
+    public MenuInfo( )
+    {}
+
+    /**
+     * Instantiates a new menu info.
+     *
+     * @param source the source
+     */
+    public MenuInfo( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the menu entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( commandId );
+        dest.writeString( title );
+        dest.writeInt( type );
+        dest.writeInt( priority );
+        dest.writeList( subMenuList );
+    }
+
+    /**
+     * Create the menu entity from parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        commandId = source.readString();
+        title = source.readString();
+        type = source.readInt();
+        priority = source.readInt();
+        subMenuList = new LinkedList<MenuInfo>();
+        source.readList( subMenuList, this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<MenuInfo>    CREATOR    = new Parcelable.Creator<MenuInfo>() {
+                                                                    @Override
+                                                                    public MenuInfo createFromParcel( Parcel source )
+                                                                    {
+                                                                        return new MenuInfo( source );
+                                                                    }
+
+                                                                    @Override
+                                                                    public MenuInfo[] newArray( int size )
+                                                                    {
+                                                                        return new MenuInfo[ size ];
+                                                                    }
+                                                                };
+
+    /**
+     * Gets the command id.
+     *
+     * @return the command id
+     */
+    public String getCommandId()
+    {
+        return commandId;
+    }
+
+    /**
+     * Sets the command id.
+     *
+     * @param commandId the new command id
+     */
+    public void setCommandId( String commandId )
+    {
+        this.commandId = commandId;
+    }
+
+    /**
+     * Gets the title.
+     *
+     * @return the title
+     */
+    public String getTitle()
+    {
+        return title;
+    }
+
+    /**
+     * Sets the title.
+     *
+     * @param title the new title
+     */
+    public void setTitle( String title )
+    {
+        this.title = title;
+    }
+
+    /**
+     * Gets the type.
+     *
+     * @return the type
+     */
+    public int getType()
+    {
+        return type;
+    }
+
+    /**
+     * Sets the type.
+     *
+     * @param type the new type
+     */
+    public void setType( int type )
+    {
+        this.type = type;
+    }
+
+    /**
+     * Gets the priority.
+     *
+     * @return the priority
+     */
+    public int getPriority()
+    {
+        return priority;
+    }
+
+    /**
+     * Sets the priority.
+     *
+     * @param priority the new priority
+     */
+    public void setPriority( int priority )
+    {
+        this.priority = priority;
+    }
+
+    /**
+     * Gets the sub menu list.
+     *
+     * @return the sub menu list
+     */
+    public List<MenuInfo> getSubMenuList()
+    {
+        return subMenuList;
+    }
+
+    /**
+     * Sets the sub menu list.
+     *
+     * @param subMenuList the new sub menu list
+     */
+    public void setSubMenuList( List<MenuInfo> subMenuList )
+    {
+        this.subMenuList = subMenuList;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        StringBuffer sbuffer = new StringBuffer();
+        sbuffer.append("commandId=").append(this.commandId)
+               .append(",title=").append(this.title)
+               .append(",type=").append(this.type)
+               .append(",priority=").append(this.priority)
+        ;
+        if(null != this.subMenuList && this.subMenuList.size() > 0){
+            sbuffer.append(",subMenuList=").append("[");
+            for(MenuInfo menu : this.subMenuList){
+                sbuffer.append(menu.toString());
+            }
+            sbuffer.append("]");
+        }
+
+        return sbuffer.toString();
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MsgContent.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MsgContent.aidl
new file mode 100644
index 0000000..e21af9b
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MsgContent.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+parcelable MsgContent;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MsgContent.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MsgContent.java
new file mode 100644
index 0000000..d325940
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MsgContent.java
@@ -0,0 +1,372 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The message content entity
+ * </p>
+ * <p>
+ * Description: The message content entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class MsgContent implements Parcelable
+{
+    /** The media type. */
+    private String                mediaType;
+
+    /** The create time. */
+    private String                createTime;
+
+    /** The message uuid. */
+    private String                msgUuid;
+
+    /** The sms digest. */
+    private String                smsDigest;
+
+    /** The text. */
+    private String                text;
+
+    /** The public account uuid. */
+    private String                paUuid;
+
+    /** The basic. */
+    private MediaBasic            basic;
+
+    /** The article list. */
+    private List<MediaArticle>    articleList;
+
+    /**
+     * Instantiates a new message content.
+     */
+    public MsgContent()
+    {}
+
+    /**
+     * Instantiates a new message content.
+     *
+     * @param source
+     *            the source parcel stream
+     */
+    public MsgContent( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the message content entity to parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( mediaType );
+        dest.writeString( createTime );
+        dest.writeString( msgUuid );
+        dest.writeString( smsDigest );
+        dest.writeString( text );
+        dest.writeString( paUuid );
+        dest.writeValue( basic );
+        dest.writeList( articleList );
+    }
+
+    /**
+     * Create the message content entity from parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        mediaType = source.readString();
+        createTime = source.readString();
+        msgUuid = source.readString();
+        smsDigest = source.readString();
+        text = source.readString();
+        paUuid = source.readString();
+        basic = ( MediaBasic )source.readValue( this.getClass().getClassLoader() );
+        articleList = new LinkedList<MediaArticle>();
+        source.readList( articleList, this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<MsgContent>    CREATOR    = new Parcelable.Creator<MsgContent>() {
+                                                                    @Override
+                                                                    public MsgContent createFromParcel( Parcel source )
+                                                                    {
+                                                                        return new MsgContent( source );
+                                                                    }
+
+                                                                    @Override
+                                                                    public MsgContent[] newArray( int size )
+                                                                    {
+                                                                        return new MsgContent[ size ];
+                                                                    }
+                                                                };
+
+    /**
+     * Gets the media type.
+     *
+     * @return the media type
+     */
+    public String getMediaType()
+    {
+        return mediaType;
+    }
+
+    /**
+     * Sets the media type.
+     *
+     * @param mediaType
+     *            the new media type
+     */
+    public void setMediaType( String mediaType )
+    {
+        this.mediaType = mediaType;
+    }
+
+    /**
+     * Gets the creates time.
+     *
+     * @return the creates time
+     */
+    public String getCreateTime()
+    {
+        return createTime;
+    }
+
+    /**
+     * Sets the creates time.
+     *
+     * @param createTime
+     *            the new creates time
+     */
+    public void setCreateTime( String createTime )
+    {
+        this.createTime = createTime;
+    }
+
+    /**
+     * Gets the msg_ uuid.
+     *
+     * @return the message uuid
+     */
+    public String getMsgUuid()
+    {
+        return msgUuid;
+    }
+
+    /**
+     * Sets the message uuid.
+     *
+     * @param msg_Uuid
+     *            the new message uuid
+     */
+    public void setMsgUuid( String msgUuid )
+    {
+        this.msgUuid = msgUuid;
+    }
+
+    /**
+     * Gets the sms digest.
+     *
+     * @return the sms digest
+     */
+    public String getSmsDigest()
+    {
+        return smsDigest;
+    }
+
+    /**
+     * Sets the sms digest.
+     *
+     * @param smsDigest
+     *            the new sms digest
+     */
+    public void setSmsDigest( String smsDigest )
+    {
+        this.smsDigest = smsDigest;
+    }
+
+    /**
+     * Gets the text.
+     *
+     * @return the text
+     */
+    public String getText()
+    {
+        return text;
+    }
+
+    /**
+     * Sets the text.
+     *
+     * @param text
+     *            the new text
+     */
+    public void setText( String text )
+    {
+        this.text = text;
+    }
+
+    /**
+     * Gets the public account uuid.
+     *
+     * @return the public account uuid
+     */
+    public String getPaUuid()
+    {
+        return paUuid;
+    }
+
+    /**
+     * Sets the public account uuid.
+     *
+     * @param paUuid
+     *            the new public account uuid
+     */
+    public void setPaUuid( String paUuid )
+    {
+        this.paUuid = paUuid;
+    }
+
+    /**
+     * Gets the basic.
+     *
+     * @return the basic
+     */
+    public MediaBasic getBasic()
+    {
+        return basic;
+    }
+
+    /**
+     * Sets the basic.
+     *
+     * @param basic
+     *            the new basic
+     */
+    public void setBasic( MediaBasic basic )
+    {
+        this.basic = basic;
+    }
+
+    /**
+     * Gets the article list.
+     *
+     * @return the article list
+     */
+    public List<MediaArticle> getArticleList()
+    {
+        return articleList;
+    }
+
+    /**
+     * Sets the article list.
+     *
+     * @param articleList
+     *            the new article list
+     */
+    public void setArticleList( List<MediaArticle> articleList )
+    {
+        this.articleList = articleList;
+    }
+
+    @Override
+    public String toString() {
+        StringBuffer sbuffer = new StringBuffer();
+        if(null != this.mediaType){
+            sbuffer.append(",mediaType=").append(this.mediaType);
+        }
+        if(null != this.createTime){
+            sbuffer.append(",createTime=").append(this.createTime);
+        }
+        if(null != this.msgUuid){
+            sbuffer.append(",msgUuid=").append(this.msgUuid);
+        }
+        if(null != this.smsDigest){
+            sbuffer.append(",smsDigest=").append(this.smsDigest);
+        }
+        if(null != this.text){
+            sbuffer.append(",text=").append(this.text);
+        }
+        if(null != this.paUuid){
+            sbuffer.append(",paUuid=").append(this.paUuid);
+        }
+        if(null != this.basic){
+            sbuffer.append(",basic=").append("{")
+                   .append(this.basic.toString())
+                   .append("}");
+        }
+
+        if(null != this.articleList && this.articleList.size() > 0){
+            sbuffer.append(",articleList=").append("[");
+            for(MediaArticle article : this.articleList){
+                sbuffer.append(article.toString());
+            }
+            sbuffer.append("]");
+        }
+
+        if(sbuffer.length() > 1){
+            return sbuffer.substring(1).toString();
+        }else{
+            return "";
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountCallbackType.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountCallbackType.aidl
new file mode 100644
index 0000000..60f03cb
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountCallbackType.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+parcelable PublicAccountCallbackType;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountCallbackType.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountCallbackType.java
new file mode 100644
index 0000000..2c19d62
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountCallbackType.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+
+/**
+ * The Class PublicAccountCallbackType.
+ */
+public class PublicAccountCallbackType{
+
+      /** The Constant TAG_GET_PUBLIC_LIST_RETURN_CODE. */
+      public static final int TAG_GET_PUBLIC_LIST_RETURN_CODE = 1001;
+
+      /** The Constant TAG_GET_PUBLIC_LIST_RETURN_ENTITY. */
+      public static final int TAG_GET_PUBLIC_LIST_RETURN_ENTITY = 1002;
+
+      /** The Constant TAG_GET_PUBLIC_DETAIL_RETURN_CODE. */
+      public static final int TAG_GET_PUBLIC_DETAIL_RETURN_CODE = 1003;
+
+      /** The Constant TAG_GET_PUBLIC_DETAIL_RETURN_ENTITY. */
+      public static final int TAG_GET_PUBLIC_DETAIL_RETURN_ENTITY = 1004;
+
+      /** The Constant TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_CODE. */
+      public static final int TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_CODE = 1005;
+
+      /** The Constant TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_ENTITY. */
+      public static final int TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_ENTITY = 1006;
+
+      /** The Constant TAG_ADD_SUBSCRIBE_RETURN_CODE. */
+      public static final int TAG_ADD_SUBSCRIBE_RETURN_CODE = 1007;
+
+      /** The Constant TAG_ADD_SUBSCRIBE_RETURN_ENTITY. */
+      public static final int TAG_ADD_SUBSCRIBE_RETURN_ENTITY = 1008;
+
+      /** The Constant TAG_CANCEL_SUBSCRIBE_RETURN_CODE. */
+      public static final int TAG_CANCEL_SUBSCRIBE_RETURN_CODE = 1009;
+
+      /** The Constant TAG_CANCEL_SUBSCRIBE_RETURN_ENTITY. */
+      public static final int TAG_CANCEL_SUBSCRIBE_RETURN_ENTITY = 1010;
+
+      /** The Constant TAG_GET_PRE_MESSAGE_RETURN_CODE. */
+      public static final int TAG_GET_PRE_MESSAGE_RETURN_CODE = 1011;
+
+      /** The Constant TAG_GET_PRE_MESSAGE_RETURN_ENTITY. */
+      public static final int TAG_GET_PRE_MESSAGE_RETURN_ENTITY = 1012;
+
+      /** The Constant TAG_COMPLAIN_PUBLIC_RETURN_CODE. */
+      public static final int TAG_COMPLAIN_PUBLIC_RETURN_CODE = 1013;
+
+      /** The Constant TAG_COMPLAIN_PUBLIC_RETURN_ENTITY. */
+      public static final int TAG_COMPLAIN_PUBLIC_RETURN_ENTITY = 1014;
+
+      /** The Constant TAG_GET_PUBLIC_MENU_INFO_RETURN_CODE. */
+      public static final int TAG_GET_PUBLIC_MENU_INFO_RETURN_CODE = 1015;
+
+      /** The Constant TAG_GET_PUBLIC_MENU_INFO_RETURN_ENTITY. */
+      public static final int TAG_GET_PUBLIC_MENU_INFO_RETURN_ENTITY = 1016;
+
+      /** The Constant TAG_GET_PUBLIC_MENU_STRING. */
+      public static final int TAG_GET_PUBLIC_MENU_STRING = 1017;
+
+      /** The Constant TAG_GET_PUBLIC_RECOMMEND_RETURN_CODE. */
+      public static final int TAG_GET_PUBLIC_RECOMMEND_RETURN_CODE = 1018;
+
+      /** The Constant TAG_GET_PUBLIC_RECOMMEND_RETURN_ENTITY. */
+      public static final int TAG_GET_PUBLIC_RECOMMEND_RETURN_ENTITY = 1019;
+
+      /** The Constant TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_CODE. */
+      public static final int TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_CODE = 1020;
+
+      /** The Constant TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_ENTITY. */
+      public static final int TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_ENTITY = 1021;
+
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountConstant.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountConstant.java
new file mode 100644
index 0000000..76dcb45
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountConstant.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+public class PublicAccountConstant {
+
+    /** order type: 0 is desc order by the follow time */
+    public static final int ORDER_TYPE_FOLLOWTIME_DESC = 0;
+
+    /** order type: 0 is asc order by the public account */
+    public static final int ORDER_TYPE_ACCOUNT_NAME_ASC = 1;
+
+
+    /** The Constant ACCEPT_STATUS_ACCEPT. */
+    public static final int ACCEPT_STATUS_ACCEPT = 1;
+
+    /** The Constant ACCEPT_STATUS_NOT. */
+    public static final int ACCEPT_STATUS_NOT = 0;
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountReqEntity.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountReqEntity.aidl
new file mode 100644
index 0000000..8d6f181
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountReqEntity.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+parcelable PublicAccountReqEntity;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountReqEntity.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountReqEntity.java
new file mode 100644
index 0000000..321c92d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountReqEntity.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The public account request entity
+ * </p>
+ * <p>
+ * Description: The public account request entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * .
+ *
+ * @author zrq
+ * @version 1.0
+ */
+public class PublicAccountReqEntity implements Parcelable
+{
+    /** the public account uuid. */
+    private String    paUuid;
+    /** the public account name. */
+    private String    name;
+    /**
+     * the public account recommend level. the value range is 1-5, default value
+     * is 1.
+     */
+    private int        recommendLevel;
+    /** the public account logo url. */
+    private String    logo;
+
+    /**
+     * Instantiates a new public account request entity.
+     */
+    public PublicAccountReqEntity()
+    {}
+
+    /**
+     * Instantiates a new public account request entity.
+     *
+     * @param source
+     *            the parcel source
+     */
+    public PublicAccountReqEntity( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    /**
+     * write the public account request entity to parcel stream. Pay attention
+     * to read and write variables variables sequence should be consistent or
+     * not the correct results
+     *
+     * @param dest
+     *            the dest
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( paUuid );
+        dest.writeString( name );
+        dest.writeInt( recommendLevel );
+        dest.writeString( logo );
+    }
+
+    /**
+     * Create the public account request entity from parcel stream. Pay
+     * attention to read and write variables variables sequence should be
+     * consistent or not the correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        paUuid = source.readString();
+        name = source.readString();
+        recommendLevel = source.readInt();
+        logo = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<PublicAccountReqEntity>    CREATOR    = new Parcelable.Creator<PublicAccountReqEntity>() {
+                                                                                @Override
+                                                                                public PublicAccountReqEntity createFromParcel( Parcel source )
+                                                                                {
+                                                                                    return new PublicAccountReqEntity( source );
+                                                                                }
+
+                                                                                @Override
+                                                                                public PublicAccountReqEntity[] newArray( int size )
+                                                                                {
+                                                                                    return new PublicAccountReqEntity[ size ];
+                                                                                }
+                                                                            };
+
+    /**
+     * Gets the public account uuid.
+     *
+     * @return the public account uuid
+     */
+    public String getPaUuid()
+    {
+        return paUuid;
+    }
+
+    /**
+     * Sets the public account uuid.
+     *
+     * @param paUuid
+     *            the new public account uuid
+     */
+    public void setPaUuid( String paUuid )
+    {
+        this.paUuid = paUuid;
+    }
+
+    /**
+     * Gets the public account name.
+     *
+     * @return the public account name
+     */
+    public String getName()
+    {
+        return name;
+    }
+
+    /**
+     * Sets the public account name.
+     *
+     * @param name
+     *            the new public account name
+     */
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    /**
+     * Gets the recommend level.
+     *
+     * @return the recommend level
+     */
+    public int getRecommendLevel()
+    {
+        return recommendLevel;
+    }
+
+    /**
+     * Sets the recommend level.
+     *
+     * @param recommendLevel
+     *            the new recommend level
+     */
+    public void setRecommendLevel( int recommendLevel )
+    {
+        this.recommendLevel = recommendLevel;
+    }
+
+    /**
+     * Gets the logo url.
+     *
+     * @return the logo url
+     */
+    public String getLogo()
+    {
+        return logo;
+    }
+
+    /**
+     * Sets the logo url.
+     *
+     * @param logo
+     *            the new logo url
+     */
+    public void setLogo( String logo )
+    {
+        this.logo = logo;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccounts.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccounts.aidl
new file mode 100644
index 0000000..7e05818
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccounts.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+parcelable PublicAccounts;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccounts.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccounts.java
new file mode 100644
index 0000000..b1d8ed0
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccounts.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The public account entity
+ * </p>
+ * <p>
+ * Description: The public account entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class PublicAccounts implements Parcelable
+{
+    /** The logo url. */
+    private String    logo;
+
+    /** The name. */
+    private String    name;
+
+    /** The public account uuid. */
+    private String    paUuid;
+
+    /** The recommend level. */
+    private int        recommendLevel;
+
+    /** The sip uri. */
+    private String    sipUri;
+
+    /** The subscribestatus. */
+    private int    subscribestatus;
+
+    /**
+     * Instantiates a new public accounts.
+     */
+    public PublicAccounts()
+    {}
+
+    /**
+     * Instantiates a new public accounts.
+     *
+     * @param source
+     *            the source
+     */
+    public PublicAccounts( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * write the public account entity to parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param dest
+     *            the dest
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( paUuid );
+        dest.writeString( name );
+        dest.writeInt( recommendLevel );
+        dest.writeString( logo );
+        dest.writeString( sipUri );
+        dest.writeInt(subscribestatus);
+    }
+
+    /**
+     * Create the public account entity from parcel stream. Pay attention to
+     * read and write variables variables sequence should be consistent or not
+     * the correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        paUuid = source.readString();
+        name = source.readString();
+        recommendLevel = source.readInt();
+        logo = source.readString();
+        sipUri = source.readString();
+        subscribestatus = source.readInt();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<PublicAccounts>    CREATOR    = new Parcelable.Creator<PublicAccounts>() {
+        @Override
+        public PublicAccounts createFromParcel( Parcel source )
+        {
+            return new PublicAccounts( source );
+        }
+
+        @Override
+        public PublicAccounts[] newArray( int size )
+        {
+            return new PublicAccounts[ size ];
+        }
+    };
+
+    /**
+     * Gets the logo url.
+     *
+     * @return the logo url
+     */
+    public String getLogo()
+    {
+        return logo;
+    }
+
+    /**
+     * Sets the logo url.
+     *
+     * @param logo
+     *            the new logo url
+     */
+    public void setLogo( String logo )
+    {
+        this.logo = logo;
+    }
+
+    /**
+     * Gets the name.
+     *
+     * @return the name
+     */
+    public String getName()
+    {
+        return name;
+    }
+
+    /**
+     * Sets the name.
+     *
+     * @param name
+     *            the new name
+     */
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    /**
+     * Gets the public account uuid.
+     *
+     * @return the public account uuid
+     */
+    public String getPaUuid()
+    {
+        return paUuid;
+    }
+
+    /**
+     * Sets the public account uuid.
+     *
+     * @param paUuid
+     *            the new public account uuid
+     */
+    public void setPaUuid( String paUuid )
+    {
+        this.paUuid = paUuid;
+    }
+
+    /**
+     * Gets the recommend level.
+     *
+     * @return the recommend level
+     */
+    public int getRecommendLevel()
+    {
+        return recommendLevel;
+    }
+
+    /**
+     * Sets the recommend level.
+     *
+     * @param recommendLevel
+     *            the new recommend level
+     */
+    public void setRecommendLevel( int recommendLevel )
+    {
+        this.recommendLevel = recommendLevel;
+    }
+
+    /**
+     * Gets the sip uri.
+     *
+     * @return the sip uri
+     */
+    public String getSipUri()
+    {
+        return sipUri;
+    }
+
+    /**
+     * Sets the sip uri.
+     *
+     * @param sipUri
+     *            the new sip uri
+     */
+    public void setSipUri( String sipUri )
+    {
+        this.sipUri = sipUri;
+    }
+
+
+    /**
+     * Gets the subscribestatus.
+     *
+     * @return the subscribestatus
+     */
+    public int getSubscribestatus() {
+        return subscribestatus;
+    }
+
+    /**
+     * Sets the subscribestatus.
+     *
+     * @param subscribestatus the new subscribestatus
+     */
+    public void setSubscribestatus(int subscribestatus) {
+        this.subscribestatus = subscribestatus;
+    }
+
+    @Override
+    public String toString() {
+        StringBuffer sbuffer = new StringBuffer();
+        sbuffer.append("paUuid=").append(this.paUuid)
+               .append(",name=").append(this.name)
+               .append(",logo=").append(this.logo)
+               .append(",recommendLevel=").append(this.recommendLevel)
+               .append(",sipUri=").append(this.sipUri)
+        ;
+
+        return sbuffer.toString();
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountsDetail.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountsDetail.aidl
new file mode 100644
index 0000000..ba3c85f
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountsDetail.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+parcelable PublicAccountsDetail;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountsDetail.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountsDetail.java
new file mode 100644
index 0000000..75a92a3
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/PublicAccountsDetail.java
@@ -0,0 +1,652 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.pubacct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+// TODO: Auto-generated Javadoc
+/**
+ * <p>
+ * Title: The public account detail entity
+ * </p>
+ * <p>
+ * Description: The public account detail entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>.
+ *
+ * @author zrq
+ * @version 1.0
+ */
+public class PublicAccountsDetail implements Parcelable
+{
+    /** The public account uuid. */
+    private String    paUuid;
+
+    /** The name. */
+    private String    name;
+
+    /** The company. */
+    private String    company;
+
+    /** The introduce. */
+    private String    intro;
+
+    /** The type. */
+    private String    type;
+
+    /** The recommend level. */
+    private int        recommendLevel;
+
+    /** The update time. */
+    private String    updateTime;
+
+    /** The menu type. */
+    private int        menuType;
+
+    /** The menu timestamp. */
+    private String    menuTimestamp;
+
+    /** The subscribe status. */
+    private int        subscribeStatus;
+
+    /** The accept status. */
+    private int acceptstatus;
+
+    /** The active status. */
+    private int activeStatus;
+
+    /** The tel. */
+    private String tel;
+
+    /** The email. */
+    private String email;
+
+    /** The zip. */
+    private String zip;
+
+    /** The addr. */
+    private String addr;
+
+    /** The field. */
+    private String field;
+
+    /** The qr code. */
+    private String    qrCode;
+
+    /** The logo url. */
+    private String    logoUrl;
+
+    /** The sip uri. */
+//    private String    sipUri;
+
+    /**
+     * Instantiates a new public accounts detail.
+     */
+    public PublicAccountsDetail()
+    {}
+
+    /**
+     * Instantiates a new public accounts detail.
+     *
+     * @param source
+     *            the source
+     */
+    public PublicAccountsDetail( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * write the public account detail entity to parcel stream. Pay attention to
+     * read and write variables variables sequence should be consistent or not
+     * the correct results
+     *
+     * @param dest
+     *            the dest
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( paUuid );
+        dest.writeString( name );
+        dest.writeString( company );
+        dest.writeString( intro );
+        dest.writeString( type );
+        dest.writeInt( recommendLevel );
+        dest.writeString( updateTime );
+        dest.writeInt( menuType );
+        dest.writeString( menuTimestamp );
+        dest.writeInt( subscribeStatus );
+        dest.writeInt( acceptstatus );
+        dest.writeInt( activeStatus );
+        dest.writeString( tel );
+        dest.writeString( email );
+        dest.writeString( zip );
+        dest.writeString( addr );
+        dest.writeString( field );
+        dest.writeString( qrCode );
+        dest.writeString( logoUrl );
+//        dest.writeString( sipUri );
+    }
+
+    /**
+     * Create the public account detail entity from parcel stream. Pay attention
+     * to read and write variables variables sequence should be consistent or
+     * not the correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        paUuid = source.readString();
+        name = source.readString();
+        company = source.readString();
+        intro = source.readString();
+        type = source.readString();
+        recommendLevel = source.readInt();
+        updateTime = source.readString();
+        menuType = source.readInt();
+        menuTimestamp = source.readString();
+        subscribeStatus = source.readInt();
+        acceptstatus = source.readInt();
+        activeStatus = source.readInt();
+        tel = source.readString();
+        email = source.readString();
+        zip = source.readString();
+        addr = source.readString();
+        field = source.readString();
+        qrCode = source.readString();
+        logoUrl = source.readString();
+//        sipUri = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<PublicAccountsDetail>    CREATOR    = new Parcelable.Creator<PublicAccountsDetail>() {
+        @Override
+        public PublicAccountsDetail createFromParcel( Parcel source )
+        {
+            return new PublicAccountsDetail( source );
+        }
+
+        @Override
+        public PublicAccountsDetail[] newArray( int size )
+        {
+            return new PublicAccountsDetail[ size ];
+        }
+    };
+
+    /**
+     * Gets the public account uuid.
+     *
+     * @return the public account uuid
+     */
+    public String getPaUuid()
+    {
+        return paUuid;
+    }
+
+    /**
+     * Sets the public account uuid.
+     *
+     * @param paUuid
+     *            the new public account uuid
+     */
+    public void setPaUuid( String paUuid )
+    {
+        this.paUuid = paUuid;
+    }
+
+    /**
+     * Gets the name.
+     *
+     * @return the name
+     */
+    public String getName()
+    {
+        return name;
+    }
+
+    /**
+     * Sets the name.
+     *
+     * @param name
+     *            the new name
+     */
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    /**
+     * Gets the company.
+     *
+     * @return the company
+     */
+    public String getCompany()
+    {
+        return company;
+    }
+
+    /**
+     * Sets the company.
+     *
+     * @param company
+     *            the new company
+     */
+    public void setCompany( String company )
+    {
+        this.company = company;
+    }
+
+    /**
+     * Gets the introduce.
+     *
+     * @return the introduce
+     */
+    public String getIntro()
+    {
+        return intro;
+    }
+
+    /**
+     * Sets the introduce.
+     *
+     * @param intro
+     *            the new introduce
+     */
+    public void setIntro( String intro )
+    {
+        this.intro = intro;
+    }
+
+    /**
+     * Gets the type.
+     *
+     * @return the type
+     */
+    public String getType()
+    {
+        return type;
+    }
+
+    /**
+     * Sets the type.
+     *
+     * @param type
+     *            the new type
+     */
+    public void setType( String type )
+    {
+        this.type = type;
+    }
+
+    /**
+     * Gets the recommend level.
+     *
+     * @return the recommend level
+     */
+    public int getRecommendLevel()
+    {
+        return recommendLevel;
+    }
+
+    /**
+     * Sets the recommend level.
+     *
+     * @param recommendLevel
+     *            the new recommend level
+     */
+    public void setRecommendLevel( int recommendLevel )
+    {
+        this.recommendLevel = recommendLevel;
+    }
+
+    /**
+     * Gets the update time.
+     *
+     * @return the update time
+     */
+    public String getUpdateTime()
+    {
+        return updateTime;
+    }
+
+    /**
+     * Sets the update time.
+     *
+     * @param updateTime
+     *            the new update time
+     */
+    public void setUpdateTime( String updateTime )
+    {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * Gets the menu type.
+     *
+     * @return the menu type
+     */
+    public int getMenuType()
+    {
+        return menuType;
+    }
+
+    /**
+     * Sets the menu type.
+     *
+     * @param menuType
+     *            the new menu type
+     */
+    public void setMenuType( int menuType )
+    {
+        this.menuType = menuType;
+    }
+
+    /**
+     * Gets the menu timestamp.
+     *
+     * @return the menu timestamp
+     */
+    public String getMenuTimestamp()
+    {
+        return menuTimestamp;
+    }
+
+    /**
+     * Sets the menu timestamp.
+     *
+     * @param menuTimestamp
+     *            the new menu timestamp
+     */
+    public void setMenuTimestamp( String menuTimestamp )
+    {
+        this.menuTimestamp = menuTimestamp;
+    }
+
+    /**
+     * Gets the subscribe status.
+     *
+     * @return the subscribe status
+     */
+    public int getSubscribeStatus()
+    {
+        return subscribeStatus;
+    }
+
+    /**
+     * Sets the subscribe status.
+     *
+     * @param subscribeStatus
+     *            the new subscribe status
+     */
+    public void setSubscribeStatus( int subscribeStatus )
+    {
+        this.subscribeStatus = subscribeStatus;
+    }
+
+    /**
+     * Gets the acceptstatus.
+     *
+     * @return the acceptstatus
+     */
+    public int getAcceptstatus() {
+        return acceptstatus;
+    }
+
+    /**
+     * Sets the acceptstatus.
+     *
+     * @param acceptstatus the new acceptstatus
+     */
+    public void setAcceptstatus(int acceptstatus) {
+        this.acceptstatus = acceptstatus;
+    }
+
+    /**
+     * Gets the active status.
+     *
+     * @return the active status
+     */
+    public int getActiveStatus() {
+        return activeStatus;
+    }
+
+    /**
+     * Sets the active status.
+     *
+     * @param activeStatus the new active status
+     */
+    public void setActiveStatus(int activeStatus) {
+        this.activeStatus = activeStatus;
+    }
+
+    /**
+     * Gets the tel.
+     *
+     * @return the tel
+     */
+    public String getTel() {
+        return tel;
+    }
+
+    /**
+     * Sets the tel.
+     *
+     * @param tel the new tel
+     */
+    public void setTel(String tel) {
+        this.tel = tel;
+    }
+
+    /**
+     * Gets the email.
+     *
+     * @return the email
+     */
+    public String getEmail() {
+        return email;
+    }
+
+    /**
+     * Sets the email.
+     *
+     * @param email the new email
+     */
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    /**
+     * Gets the zip.
+     *
+     * @return the zip
+     */
+    public String getZip() {
+        return zip;
+    }
+
+    /**
+     * Sets the zip.
+     *
+     * @param zip the new zip
+     */
+    public void setZip(String zip) {
+        this.zip = zip;
+    }
+
+    /**
+     * Gets the addr.
+     *
+     * @return the addr
+     */
+    public String getAddr() {
+        return addr;
+    }
+
+    /**
+     * Sets the addr.
+     *
+     * @param addr the new addr
+     */
+    public void setAddr(String addr) {
+        this.addr = addr;
+    }
+
+    /**
+     * Gets the field.
+     *
+     * @return the field
+     */
+    public String getField() {
+        return field;
+    }
+
+    /**
+     * Sets the field.
+     *
+     * @param field the new field
+     */
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    /**
+     * Gets the qr code.
+     *
+     * @return the qr code
+     */
+    public String getQrCode()
+    {
+        return qrCode;
+    }
+
+    /**
+     * Sets the qr code.
+     *
+     * @param qrCode
+     *            the new qr code
+     */
+    public void setQrCode( String qrCode )
+    {
+        this.qrCode = qrCode;
+    }
+
+    /**
+     * Gets the logo url.
+     *
+     * @return the logo url
+     */
+    public String getLogoUrl()
+    {
+        return logoUrl;
+    }
+
+    /**
+     * Sets the logo url.
+     *
+     * @param logoUrl
+     *            the new logo url
+     */
+    public void setLogoUrl( String logoUrl )
+    {
+        this.logoUrl = logoUrl;
+    }
+
+    /**
+     * Gets the sip uri.
+     *
+     * @return the sip uri
+     */
+//    public String getSipUri()
+//    {
+//        return sipUri;
+//    }
+
+    /**
+     * Sets the sip uri.
+     *
+     * @param sipUri
+     *            the new sip uri
+     */
+//    public void setSipUri( String sipUri )
+//    {
+//        this.sipUri = sipUri;
+//    }
+
+    /**
+     * toString
+     *
+     * @return the gson string
+     */
+    @Override
+    public String toString()
+    {
+//        return new Gson().toJson( this );
+        StringBuffer sbuffer = new StringBuffer();
+        sbuffer.append("paUuid=").append(this.paUuid)
+               .append(",name=").append(this.name)
+               .append(",logoUrl=").append(this.logoUrl)
+               .append(",recommendLevel=").append(this.recommendLevel)
+//               .append(",sipUri=").append(this.sipUri)
+               .append(",company=").append(this.company)
+               .append(",intro=").append(this.intro)
+               .append(",type=").append(this.type)
+               .append(",updateTime=").append(this.updateTime)
+               .append(",menuType=").append(this.menuType)
+               .append(",menuTimestamp=").append(this.menuTimestamp)
+               .append(",subscribeStatus=").append(this.subscribeStatus)
+               .append(",acceptstatus=").append(this.acceptstatus)
+               .append(",activeStatus=").append(this.activeStatus)
+               .append(",tel=").append(this.tel)
+               .append(",email=").append(this.email)
+               .append(",zip=").append(this.zip)
+               .append(",addr=").append(this.addr)
+               .append(",field=").append(this.field)
+               .append(",qrCode=").append(this.qrCode)
+        ;
+
+        return sbuffer.toString();
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneEvent.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneEvent.java
new file mode 100644
index 0000000..4f8d4db
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneEvent.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.richscrn;
+
+/**
+ * <p>Title: The phone event</p>
+ * <p>Description: Coding scheme defined by terminal. The suggestion part coding rules supports the following events and code.</p>
+ * <p>PhoneEvent = A B C DE FGHIJ code</p>
+ * <p>The A:< event classification >, 1 char , A=1 -- a voice call; 2 -- 9 -- video call, terminal event, other reservations.</p>
+ * <p>The B:< participant ID >, 1 char. When the A=1 or 2, B=1 -- 2 -- calling, called, 3 -- 4 -- card terminal.</p>
+ * <p>The C:< process description >, 1 char. When the A=1 or 2, C=1- issued a session request, 2- receives the session invitation, 3- session has been established, the 4- session termination.</p>
+ * <p>The DE:< extended description >, 2 char. Therefore, the default 0.</p>
+ * <p>The FGHIJ:< reference code >, 5 char. Therefore, the default 0. Can carry relevant information, such as the SIP message code and expansion, said 180xx SIP 180 ringing message and other instructions.</p>
+ *
+ * <p>Copyright: Copyright (c) 2014</p>
+ * <p>Company: pci-suntek</p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public enum PhoneEvent {
+
+    /** Non specific events. */
+    DEFAULT_EVENT( "0000000000" ),
+
+    /** The launch the voice call. */
+    LAUNCH_V_CALL( "1110000000" ),
+
+    /** A voice call incoming, terminal began ringing. */
+    V_CALL_IN_RINGING( "1220018000" ),
+
+    /** Voice call connection ( caller side ). */
+    V_CALL_CONN_CALLER( "1130020000" ),
+
+    /** Voice call connection ( called side ). */
+    V_CALL_CONN_CALLED( "123 00 20000" ),
+
+    /** Voice call hang up ( caller side ). */
+    V_CALL_HANG_UP_CALLER( "1140020000" ),
+
+    /** Voice call hung ( called side ). */
+    V_CALL_HANG_UP_CALLED( "1240020000" ),
+
+    /** Start a video call out. */
+    LAUNCH_VD_CALL( "2110000000" ),
+
+    /** A video call incoming, terminal began ringing. */
+    VD_CALL_IN_RINGING( "2220000000" ),
+
+    /** Video call connection ( caller side ). */
+    VD_CALL_CONN_CALLER( "2130020000" ),
+
+    /** Video call connection ( called side ). */
+    VD_CALL_CONN_CALLED( "2230020000" ),
+
+    /** Video call hang up ( caller side ). */
+    VD_CALL_HANG_UP_CALLER( "2140020000" ),
+
+    /** Video call hung ( called side ). */
+    VD_CALL_HANG_UP_CALLED( "2240020000" ),
+
+    /** Terminal communications, is being viewed, main requirements for reinforced screen. */
+    CONTACT_READING_REQ_SCRN( "9331011000" ),
+
+    /** Terminal communications, is viewed, the main requirements set enhanced screen. */
+    CONTACT_READING_SET_SCRN( "9331012000" ),
+
+    /** Terminal contacts to complete the update (such as add or revise a contact). */
+    CONTACT_UPDATE_FINISH( "9341020000" ),
+
+    /** Terminal is to restore the factory settings. */
+    FACTORY_SETTING_READY_RESTORE( "9319030000" ),
+
+    /** The terminal has been completed to restore factory settings. */
+    FACTORY_SETTING_RESTORE_FINISH( "9349030000" ),
+
+    /** The terminal has replaced the SIM card. */
+    SIM_CARD_CHANGED( "9449040000" );
+
+    /** The ctrl string. */
+    private String    ctrlString;
+
+    /**
+     * Instantiates a new phone event.
+     *
+     * @param ctrlString the ctrl string
+     */
+    private PhoneEvent( String ctrlString )
+    {
+        this.ctrlString = ctrlString;
+    }
+
+    /**
+     * Gets the control string.
+     *
+     * @return the control string
+     */
+    public String getCtrlStr()
+    {
+        return ctrlString;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneList.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneList.aidl
new file mode 100644
index 0000000..3c74e43
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneList.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.richscrn;
+
+parcelable PhoneList;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneList.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneList.java
new file mode 100644
index 0000000..1257478
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneList.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.richscrn;
+
+import java.util.ArrayList;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The PhoneList entity
+ * </p>
+ * <p>
+ * Description: the Phone List entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class PhoneList implements Parcelable
+{
+
+    /** The phone list . */
+    private ArrayList<String>    phoneList;
+
+    public ArrayList<String> getPhoneList() {
+        return phoneList;
+    }
+
+    public void setPhoneList(ArrayList<String> phoneList) {
+        this.phoneList = phoneList;
+    }
+
+    /**
+     * Instantiates a new phone list.
+     */
+    public PhoneList()
+    {}
+
+    /**
+     * Instantiates a new phone list.
+     *
+     * @param source
+     *            the source
+     */
+    public PhoneList( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the result entity to parcel stream. Pay attention to read and write
+     * variables variables sequence should be consistent or not the correct
+     * results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeStringList(phoneList);
+    }
+
+    /**
+     * Create the result entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        phoneList = source.createStringArrayList();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<PhoneList>    CREATOR    = new Parcelable.Creator<PhoneList>() {
+        @Override
+        public PhoneList createFromParcel( Parcel source )
+        {
+            return new PhoneList( source );
+        }
+
+        @Override
+        public PhoneList[] newArray( int size )
+        {
+            return new PhoneList[ size ];
+        }
+    };
+
+
+
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultInfo.aidl
new file mode 100644
index 0000000..28cc497
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultInfo.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.richscrn;
+
+parcelable ResultInfo;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultInfo.java
new file mode 100644
index 0000000..f7d68dc
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultInfo.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.richscrn;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The result entity
+ * </p>
+ * <p>
+ * Description: the result info entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class ResultInfo implements Parcelable
+{
+
+    /** The is success flag. */
+    private boolean    isSuccess;
+
+    /** The result message. */
+    private String    resultMsg;
+
+    /**
+     * Instantiates a new result info.
+     */
+    public ResultInfo()
+    {}
+
+    /**
+     * Instantiates a new result info.
+     *
+     * @param source
+     *            the source
+     */
+    public ResultInfo( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the result entity to parcel stream. Pay attention to read and write
+     * variables variables sequence should be consistent or not the correct
+     * results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeBooleanArray( new boolean[] { isSuccess } );
+        dest.writeString( resultMsg );
+    }
+
+    /**
+     * Create the result entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        boolean[] value = new boolean[ 1 ];
+
+        source.readBooleanArray( value );
+        isSuccess = value[ 0 ];
+        resultMsg = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<ResultInfo>    CREATOR    = new Parcelable.Creator<ResultInfo>() {
+                                                                    @Override
+                                                                    public ResultInfo createFromParcel( Parcel source )
+                                                                    {
+                                                                        return new ResultInfo( source );
+                                                                    }
+
+                                                                    @Override
+                                                                    public ResultInfo[] newArray( int size )
+                                                                    {
+                                                                        return new ResultInfo[ size ];
+                                                                    }
+                                                                };
+
+    /**
+     * Checks if is success flag.
+     *
+     * @return true, if is success flag
+     */
+    public boolean isSuccess()
+    {
+        return isSuccess;
+    }
+
+    /**
+     * Sets the success flag.
+     *
+     * @param isSuccess
+     *            the new success flag
+     */
+    public void setSuccess( boolean isSuccess )
+    {
+        this.isSuccess = isSuccess;
+    }
+
+    /**
+     * Gets the result message.
+     *
+     * @return the result message
+     */
+    public String getResultMsg()
+    {
+        return resultMsg;
+    }
+
+    /**
+     * Sets the result message.
+     *
+     * @param resultMsg
+     *            the new result message
+     */
+    public void setResultMsg( String resultMsg )
+    {
+        this.resultMsg = resultMsg;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultUtil.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultUtil.aidl
new file mode 100644
index 0000000..b25c304
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultUtil.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.richscrn;
+
+parcelable ResultUtil;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultUtil.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultUtil.java
new file mode 100644
index 0000000..bb7b8d6
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/ResultUtil.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.richscrn;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The reslt util entity
+ * </p>
+ * <p>
+ * Description: The reslt util entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class ResultUtil implements Parcelable
+{
+    /** The result succ flag, true is succ, otherwise it is fail. */
+    private boolean                                        resultFlag;
+
+    /** The result info. */
+    private String                                        resultMsg;
+    /**
+     * The result additional object, different conditions have different result
+     * object.
+     */
+    private Object                                        resultObj;
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<ResultUtil>    CREATOR    = new Parcelable.Creator<ResultUtil>() {
+                                                                    @Override
+                                                                    public ResultUtil createFromParcel( Parcel source )
+                                                                    {
+                                                                        return new ResultUtil( source );
+                                                                    }
+
+                                                                    @Override
+                                                                    public ResultUtil[] newArray( int size )
+                                                                    {
+                                                                        return new ResultUtil[ size ];
+                                                                    }
+                                                                };
+
+    /**
+     * Instantiates a new result entity.
+     */
+    public ResultUtil()
+    {}
+
+    /**
+     * Instantiates a new result entity from parcel.
+     *
+     * @param source
+     *            the parcel source.
+     */
+    public ResultUtil( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The result entity write to parcel stream. Pay attention to write
+     * variables and read the ordering of the variables should be consistent or
+     * not the correct results.
+     *
+     * @param dest
+     *            The parcel stream
+     * @param flags
+     *            The write to parcel flag
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeBooleanArray( new boolean[] { resultFlag } );
+        dest.writeString( resultMsg );
+        dest.writeValue( resultObj );
+    }
+
+    /**
+     * Create the result entity from parcel stream. Pay attention to read and
+     * write variables variables sequence should be consistent or not the
+     * correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        boolean[] val = new boolean[ 1 ];
+        source.readBooleanArray( val );
+        resultFlag = val[ 0 ];
+        resultMsg = source.readString();
+        resultObj = source.readValue( this.getClass().getClassLoader() );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Checks if is result succ.
+     *
+     * @return true, if is result succ
+     */
+    public boolean isResultFlag()
+    {
+        return resultFlag;
+    }
+
+    /**
+     * Sets the result flag.
+     *
+     * @param resultFlag
+     *            the new result flag
+     */
+    public void setResultFlag( boolean resultFlag )
+    {
+        this.resultFlag = resultFlag;
+    }
+
+    /**
+     * Gets the result info.
+     *
+     * @return the result info
+     */
+    public String getResultMsg()
+    {
+        return resultMsg;
+    }
+
+    /**
+     * Sets the result info.
+     *
+     * @param resultMsg
+     *            the new result info.
+     */
+    public void setResultMsg( String resultMsg )
+    {
+        this.resultMsg = resultMsg;
+    }
+
+    /**
+     * Gets the result object.
+     *
+     * @return the result object
+     */
+    public Object getResultObj()
+    {
+        return resultObj;
+    }
+
+    /**
+     * Sets the result object.
+     *
+     * @param resultObj
+     *            the new result object
+     */
+    public void setResultObj( Object resultObj )
+    {
+        this.resultObj = resultObj;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/RichScrnShowing.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/RichScrnShowing.aidl
new file mode 100644
index 0000000..9f73553
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/RichScrnShowing.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.richscrn;
+
+parcelable RichScrnShowing; 
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/RichScrnShowing.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/RichScrnShowing.java
new file mode 100644
index 0000000..6b83942
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/RichScrnShowing.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugin.entity.richscrn;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>
+ * Title: The rich screen showing entity
+ * </p>
+ * <p>
+ * Description: The rich screen showing entity
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ *
+ * @author zrq
+ * @version 1.0
+ *
+ */
+public class RichScrnShowing implements Parcelable
+{
+    /** The missdn. */
+    private String    missdn;
+
+    /** The cid. */
+    private String    cid;
+
+    /** The greeting. */
+    private String    greeting;
+
+    /** The source type. */
+    private String    sourceType;
+
+    /** The missdn address. */
+    private String    missdnAddress;
+
+    /** The local source url. */
+    private String    localSourceUrl;
+
+    /**
+     * Instantiates a new rich scrn showing.
+     */
+    public RichScrnShowing()
+    {}
+
+    /**
+     * Instantiates a new rich scrn showing.
+     *
+     * @param source
+     *            the source
+     */
+    public RichScrnShowing( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /**
+     * The parcel describe contents, defaul is 0.
+     *
+     * @return the int
+     */
+    @Override
+    public int describeContents()
+    {
+        return 0;
+    }
+
+    /**
+     * Write the rich screen showing entity to parcel stream. Pay attention to
+     * read and write variables variables sequence should be consistent or not
+     * the correct results
+     *
+     * @param dest
+     *            the dest parcel stream
+     * @param flags
+     *            the flags
+     */
+    @Override
+    public void writeToParcel( Parcel dest, int flags )
+    {
+        dest.writeString( missdn );
+        dest.writeString( cid );
+        dest.writeString( greeting );
+        dest.writeString( sourceType );
+        dest.writeString( missdnAddress );
+        dest.writeString( localSourceUrl );
+    }
+
+    /**
+     * Create the rich screen showing entity from parcel stream. Pay attention
+     * to read and write variables variables sequence should be consistent or
+     * not the correct results
+     *
+     * @param source
+     *            The parcel stream
+     */
+    public void readFromParcel( Parcel source )
+    {
+        missdn = source.readString();
+        cid = source.readString();
+        greeting = source.readString();
+        sourceType = source.readString();
+        missdnAddress = source.readString();
+        localSourceUrl = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<RichScrnShowing>    CREATOR    = new Parcelable.Creator<RichScrnShowing>() {
+                                                                        @Override
+                                                                        public RichScrnShowing createFromParcel( Parcel source )
+                                                                        {
+                                                                            return new RichScrnShowing( source );
+                                                                        }
+
+                                                                        @Override
+                                                                        public RichScrnShowing[] newArray( int size )
+                                                                        {
+                                                                            return new RichScrnShowing[ size ];
+                                                                        }
+                                                                    };
+
+    /**
+     * Gets the missdn.
+     *
+     * @return the missdn
+     */
+    public String getMissdn()
+    {
+        return missdn;
+    }
+
+    /**
+     * Sets the missdn.
+     *
+     * @param missdn
+     *            the new missdn
+     */
+    public void setMissdn( String missdn )
+    {
+        this.missdn = missdn;
+    }
+
+    /**
+     * Gets the cid.
+     *
+     * @return the cid
+     */
+    public String getCid()
+    {
+        return cid;
+    }
+
+    /**
+     * Sets the cid.
+     *
+     * @param cid
+     *            the new cid
+     */
+    public void setCid( String cid )
+    {
+        this.cid = cid;
+    }
+
+    /**
+     * Gets the greeting.
+     *
+     * @return the greeting
+     */
+    public String getGreeting()
+    {
+        return greeting;
+    }
+
+    /**
+     * Sets the greeting.
+     *
+     * @param greeting
+     *            the new greeting
+     */
+    public void setGreeting( String greeting )
+    {
+        this.greeting = greeting;
+    }
+
+    /**
+     * Gets the source type.
+     *
+     * @return the source type
+     */
+    public String getSourceType()
+    {
+        return sourceType;
+    }
+
+    /**
+     * Sets the source type.
+     *
+     * @param sourceType
+     *            the new source type
+     */
+    public void setSourceType( String sourceType )
+    {
+        this.sourceType = sourceType;
+    }
+
+    /**
+     * Gets the missdn address.
+     *
+     * @return the missdn address
+     */
+    public String getMissdnAddress()
+    {
+        return missdnAddress;
+    }
+
+    /**
+     * Sets the missdn address.
+     *
+     * @param missdnAddress
+     *            the new missdn address
+     */
+    public void setMissdnAddress( String missdnAddress )
+    {
+        this.missdnAddress = missdnAddress;
+    }
+
+    /**
+     * Gets the local source url.
+     *
+     * @return the local source url
+     */
+    public String getLocalSourceUrl()
+    {
+        return localSourceUrl;
+    }
+
+    /**
+     * Sets the local source url.
+     *
+     * @param localSourceUrl
+     *            the new local source url
+     */
+    public void setLocalSourceUrl( String localSourceUrl )
+    {
+        this.localSourceUrl = localSourceUrl;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugincenter/IPluginCenterApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugincenter/IPluginCenterApi.aidl
new file mode 100644
index 0000000..d8aaf34
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugincenter/IPluginCenterApi.aidl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugincenter;
+
+interface IPluginCenterApi {
+    void intentApk();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/GroupUserData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/GroupUserData.java
new file mode 100644
index 0000000..a76dcf0
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/GroupUserData.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider;
+
+import java.io.Serializable;
+
+public class GroupUserData implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -6652084152928469940L;
+
+    public static final String TABLE_GROUP_USER = "chatGroupUser";
+
+    public static final String KEY_ID = "_id";
+
+    public static final String KEY_URI = "_uri";
+
+    public static final String KEY_GROUP_ID = "_groupid";
+
+    public static final String KEY_NAME = "_name";
+
+    public static final String KEY_NUMBER = "_number";
+
+    public static final String KEY_ROLE = "_role";
+
+    public static final String KEY_TIME = "_time";
+
+    public static final String KEY_AGREE_TO_JOIN = "_agreetojoin";
+
+    public static final String KEY_INVITE_NUMBER = "_invitenumber";
+
+    public static final String KEY_ETYPE = "_etype";
+
+    /**
+     * Column name about alias of member.
+     */
+    public static final String KEY_ALIAS = "_alias";
+
+    /**
+     * Column name about etag.
+     */
+    public static final String KEY_ETAG = "_etag";
+
+    /**
+     * Column name about image type.
+     */
+    public static final String KEY_IMG_TYPE = "_imgtype";
+
+    /**
+     * Column name about header image.
+     */
+    public static final String KEY_HEADER_IMG = "_headimg";
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/NewAddressBookData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/NewAddressBookData.java
new file mode 100644
index 0000000..391fafa
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/NewAddressBookData.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider;
+
+import android.net.Uri;
+
+/**
+ * <p>Title: NewAddressBookData class</p>
+ * <p>
+ * Description: The class <code>NewAddressBookData</code> represents a new address book data database
+ * definition used by RCS.
+ * The constants definition include the access database URI and some column names.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class NewAddressBookData {
+
+    /** The Constant CONTENT_URI. */
+    public static final Uri CONTENT_URI = Uri.parse("content://com.suntek.mway.rcs.new.contacts/contacts");
+
+    /** The Constant ID. */
+    public static final String ID = "_id";
+
+
+    /** The Constant CONTACT_NUMBER. */
+    public static final String CONTACT_NUMBER = "contact_number";
+
+    /** The Constant PRESENCE_SHARING_STATUS. */
+    public static final String PRESENCE_SHARING_STATUS = "presence_sharing_status";
+
+
+    /** The Constant TIMESTAMP. */
+    public static final String TIMESTAMP = "timestamp";
+
+    /** The Constant RCS_STATUS. */
+    public static final String RCS_STATUS = "rcs_status";
+
+
+    /** The Constant REGISTRATION_STATE. */
+    public static final String REGISTRATION_STATE = "registration_state";
+
+
+    /** The Constant RCS_STATUS_TIMESTAMP. */
+    public static final String RCS_STATUS_TIMESTAMP = "rcs_status_timestamp";
+
+
+    /** The Constant PRESENCE_FREE_TEXT. */
+    public static final String PRESENCE_FREE_TEXT = "presence_free_text";
+
+
+    /** The Constant PRESENCE_WEBLINK_NAME. */
+    public static final String PRESENCE_WEBLINK_NAME = "presence_weblink_name";
+
+    /** The Constant PRESENCE_WEBLINK_URL. */
+    public static final String PRESENCE_WEBLINK_URL = "presence_weblink_url";
+
+    /** The Constant PRESENCE_PHOTO_EXIST_FLAG. */
+    public static final String PRESENCE_PHOTO_EXIST_FLAG = "presence_photo_exist_flag";
+
+    /** The Constant PRESENCE_PHOTO_ETAG. */
+    public static final String PRESENCE_PHOTO_ETAG = "presence_photo_etag";
+
+
+    /** The Constant PRESENCE_PHOTO_DATA. */
+    public static final String PRESENCE_PHOTO_DATA = "presence_photo_data";
+
+
+    /** The Constant PRESENCE_GEOLOC_EXIST_FLAG. */
+    public static final String PRESENCE_GEOLOC_EXIST_FLAG = "presence_geoloc_exist_flag";
+
+
+    /** The Constant PRESENCE_GEOLOC_LATITUDE. */
+    public static final String PRESENCE_GEOLOC_LATITUDE = "presence_geoloc_latitude";
+
+    /** The Constant PRESENCE_GEOLOC_LONGITUDE. */
+    public static final String PRESENCE_GEOLOC_LONGITUDE = "presence_geoloc_longitude";
+
+
+    /** The Constant PRESENCE_GEOLOC_ALTITUDE. */
+    public static final String PRESENCE_GEOLOC_ALTITUDE = "presence_geoloc_altitude";
+
+
+    /** The Constant PRESENCE_TIMESTAMP. */
+    public static final String PRESENCE_TIMESTAMP = "presence_timestamp";
+
+
+    /** The Constant CAPABILITY_TIMESTAMP. */
+    public static final String CAPABILITY_TIMESTAMP = "capability_timestamp";
+
+    /** The Constant CAPABILITY_CS_VIDEO. */
+    public static final String CAPABILITY_CS_VIDEO = "capability_cs_video";
+
+
+    /** The Constant CAPABILITY_IMAGE_SHARING. */
+    public static final String CAPABILITY_IMAGE_SHARING = "capability_image_sharing";
+
+
+    /** The Constant CAPABILITY_VIDEO_SHARING. */
+    public static final String CAPABILITY_VIDEO_SHARING = "capability_video_sharing";
+
+    /** The Constant CAPABILITY_IP_VOICE_CALL. */
+    public static final String CAPABILITY_IP_VOICE_CALL = "capability_ip_voice_call";
+
+
+    /** The Constant CAPABILITY_IP_VIDEO_CALL. */
+    public static final String CAPABILITY_IP_VIDEO_CALL = "capability_ip_video_call";
+
+
+    /** The Constant CAPABILITY_IM_SESSION. */
+    public static final String CAPABILITY_IM_SESSION = "capability_im_session";
+
+
+    /** The Constant CAPABILITY_FILE_TRANSFER. */
+    public static final String CAPABILITY_FILE_TRANSFER = "capability_file_transfer";
+
+    /** The Constant CAPABILITY_PRESENCE_DISCOVERY. */
+    public static final String CAPABILITY_PRESENCE_DISCOVERY = "capability_presence_discovery";
+
+
+    /** The Constant CAPABILITY_SOCIAL_PRESENCE. */
+    public static final String CAPABILITY_SOCIAL_PRESENCE = "capability_social_presence";
+
+
+    /** The Constant CAPABILITY_GEOLOCATION_PUSH. */
+    public static final String CAPABILITY_GEOLOCATION_PUSH = "capability_geolocation_push";
+
+
+    /** The Constant CAPABILITY_FILE_TRANSFER_HTTP. */
+    public static final String CAPABILITY_FILE_TRANSFER_HTTP = "capability_file_transfer_http";
+
+    /** The Constant CAPABILITY_FILE_TRANSFER_THUMBNAIL. */
+    public static final String CAPABILITY_FILE_TRANSFER_THUMBNAIL = "capability_file_transfer_thumbnail";
+
+
+    /** The Constant CAPABILITY_FILE_TRANSFER_SF. */
+    public static final String CAPABILITY_FILE_TRANSFER_SF = "capability_file_transfer_sf";
+
+
+    /** The Constant CAPABILITY_GROUP_CHAT_SF. */
+    public static final String CAPABILITY_GROUP_CHAT_SF = "capability_group_chat_sf";
+
+
+    /** The Constant CAPABILITY_EXTENSIONS. */
+    public static final String CAPABILITY_EXTENSIONS = "capability_extensions";
+
+
+    /** The Constant CAPABILITY_COMMON_EXTENSION. */
+    public static final String CAPABILITY_COMMON_EXTENSION = "capability_common_extension";
+
+
+    /** The Constant IM_BLOCKED. */
+    public static final String IM_BLOCKED = "im_blocked";
+
+
+    /** The Constant CAPABILITY_IM_BLOCKED_TIMESTAMP. */
+    public static final String CAPABILITY_IM_BLOCKED_TIMESTAMP = "im_blocked_timestamp";
+
+    /** The Constant TRUE. */
+    public static final String TRUE = Boolean.toString(true);
+
+    /** The Constant FALSE. */
+    public static final String FALSE = Boolean.toString(false);
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/PublicAccountData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/PublicAccountData.java
new file mode 100644
index 0000000..e07d3a8
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/PublicAccountData.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider;
+
+import android.net.Uri;
+
+/**
+ * The Class PublicAccountData.
+ */
+public class PublicAccountData {
+
+    /** The Constant PUBLIC_ACCOUNT_AUTHORITY. */
+    public static final String PUBLIC_ACCOUNT_AUTHORITY = "com.suntek.mway.rcs.pubacct";
+
+    /** The Constant TABLE_ACCOUNT. */
+    public static final String TABLE_ACCOUNT = "publicAccount";
+
+    /** The Constant PUBLIC_ACCOUNT_CONTENT_URI. */
+    public static final Uri PUBLIC_ACCOUNT_CONTENT_URI = Uri.parse("content://" + PUBLIC_ACCOUNT_AUTHORITY + "/" + TABLE_ACCOUNT);
+
+    /** The Constant ID. */
+    public static final String ID = "_id";
+
+    /** The Constant ACCOUNT_ID. */
+    public static final String ACCOUNT_ID = "_pa_uuid";
+
+    /** The Constant ACCOUNT_NAME. */
+    public static final String ACCOUNT_NAME = "_name";
+
+    /** The Constant ACCOUNT_PHOTO_URL. */
+    public static final String ACCOUNT_LOGO = "_logo";
+
+    /** The Constant ACCOUNT_ENTERPRISE. */
+    public static final String ACCOUNT_RECOMMEND_LEVEL = "_recommend_level";
+
+    /** The Constant ACCOUNT_FUNTION. */
+    public static final String ACCOUNT_SIP_URI = "_sip_uri";
+
+    /** The Constant ACCOUNT_FOLLOWRD. */
+    public static final String ACCOUNT_FOLLOWRD = "_followed";
+
+    /** The Constant ACCOUNT_ACCEPT. */
+    public static final String ACCOUNT_ACCEPT = "_accept";
+
+    /** The Constant ACCOUNT_FOLLOWRD_TIME. */
+    public static final String ACCOUNT_FOLLOWRD_TIME = "_followed_time";
+
+    /** The Constant ACCOUNT_COMPANY. */
+    public static final String ACCOUNT_COMPANY = "_company";
+
+    /** The Constant ACCOUNT_INTRO. */
+    public static final String ACCOUNT_INTRO = "_intro";
+
+    /** The Constant ACCOUNT_TYPE. */
+    public static final String ACCOUNT_TYPE = "_type";
+
+    /** The Constant ACCOUNT_UPDATETIME. */
+    public static final String ACCOUNT_UPDATETIME = "_updateTime";
+
+    /** The Constant ACCOUNT_MENUTYPE. */
+    public static final String ACCOUNT_MENUTYPE = "_menuType";
+
+    /** The Constant ACCOUNT_MENUTIMESTAMP. */
+    public static final String ACCOUNT_MENUTIMESTAMP = "_menuTimestamp";
+
+    /** The Constant ACCOUNT_SUBSCRIBESTATUS. */
+    public static final String ACCOUNT_SUBSCRIBESTATUS = "_subscribeStatus";
+
+    /** The Constant ACCOUNT_ACTIVESTATUS. */
+    public static final String ACCOUNT_ACTIVESTATUS = "_activeStatus";
+
+    /** The Constant ACCOUNT_TEL. */
+    public static final String ACCOUNT_TEL = "_tel";
+
+    /** The Constant ACCOUNT_EMAIL. */
+    public static final String ACCOUNT_EMAIL = "_email";
+
+    /** The Constant ACCOUNT_ZIP. */
+    public static final String ACCOUNT_ZIP = "_zip";
+
+    /** The Constant ACCOUNT_ADDR. */
+    public static final String ACCOUNT_ADDR = "_addr";
+
+    /** The Constant ACCOUNT_FIELD. */
+    public static final String ACCOUNT_FIELD = "_field";
+
+    /** The Constant ACCOUNT_QRCODE. */
+    public static final String ACCOUNT_QRCODE = "_qrCode";
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/SuntekMessageData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/SuntekMessageData.java
new file mode 100644
index 0000000..e2e4cd5
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/SuntekMessageData.java
@@ -0,0 +1,402 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider;
+
+import android.net.Uri;
+
+/**
+ * <p>Title: SuntekMessageData class</p>
+ * <p>
+ * Description: The class <code>SuntekMessageData</code> represents a rich message data database
+ * definition used by RCS.
+ * The constants definition include the access database URI, some column names, chat types,
+ * message status and so on.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class SuntekMessageData {
+
+    /**
+     * Database URI prefix.
+     */
+    public static final String MESSAGE_AUTHORITY = "com.suntek.mway.rcs.message";
+
+    /** Table name of thread */
+    public static final String TABLE_MESSAGE_THREAD = "stkThread";
+
+    /** Table name of message */
+    public static final String TABLE_RICH_MESSAGE = "stkMessage";
+
+    /** Table name of message backup */
+    public static final String TABLE_RICH_MESSAGE_BACKUP = "stkMessageBak";
+
+    /** Table name of group */
+    public static final String TABLE_CHAT_GROUP= "chatGroup";
+
+    /** The Constant SUNTEK_MESSAGE_CONTENT_URI. */
+    public static final Uri SUNTEK_MESSAGE_CONTENT_URI = Uri.parse("content://" + MESSAGE_AUTHORITY + "/" + TABLE_RICH_MESSAGE);
+
+    /** The Constant CHAT_GROUP_CONTENT_URI. */
+    public static final Uri CHAT_GROUP_CONTENT_URI = Uri.parse("content://" + MESSAGE_AUTHORITY + "/" + TABLE_CHAT_GROUP);
+
+    /**
+     * Chat type about one to one.
+     */
+    public static final int CHAT_TYPE_ONE2ONE = 1;
+
+    /**
+     *  Chat type about group chat.
+     */
+    public static final int CHAT_TYPE_ONE2GROUP = 2;
+
+    /**
+     *  Chat type about group chat.
+     */
+    public static final int CHAT_TYPE_GROUP = 3;
+
+
+    /**
+     * Chat type about group-sent message.
+     */
+    public static final int CHAT_TYPE_PUBLIC = 4;
+
+    /**
+     * Message type about text message.
+     */
+    public static final int MSG_TYPE_TEXT = 0;
+    /**
+     * Message type about image message.
+     */
+    public static final int MSG_TYPE_IMAGE = 1;
+    /**
+     * Message type about audio message.
+     */
+    public static final int MSG_TYPE_AUDIO = 2;
+    /**
+     * Message type about video message.
+     */
+    public static final int MSG_TYPE_VIDEO = 3;
+    /**
+     * Message type about map message.
+     */
+    public static final int MSG_TYPE_MAP = 4;
+    /**
+     * Message type about contact message.
+     */
+    public static final int MSG_TYPE_CONTACT = 5;
+    /**
+     * Message type about gif message.
+     */
+    public static final int MSG_TYPE_GIF = 6;
+    /**
+     * Message type about group message.
+     */
+    public static final int MSG_TYPE_GROUP_INFO = 7;
+    /**
+     * Message type about public account message.
+     */
+    public static final int MSG_TYPE_PUBLIC_TOPIC = 8;
+
+    /** Message type about notification. */
+    public static final int MSG_TYPE_NOTIFICATION = 9;
+
+    /** Message type about MMS. */
+    public static final int MSG_TYPE_MMS = 10;
+
+    /** Message type about paid emo. */
+    public static final int MSG_TYPE_PAID_EMO = 11;
+
+    /** Message type for MMS. */
+    public static final int MSG_TYPE_MMS_SEND_REQ = 128;
+
+    /** Message type for MMS. */
+    public static final int MSG_TYPE_MMS_NOTIFICATION_IND = 130;
+
+    /** Message type for MMS. */
+    public static final int MSG_TYPE_MMS_RETRIEVE_CONF = 132;
+
+    /** Message type about SMS. */
+    public static final int MSG_TYPE_SMS = 12;
+
+    /**
+     * Message sent status that the opposite has received.
+     */
+    public static final int MSG_STATE_SEND_REC = -1;
+
+    /**
+     * Message status about message is sent out but not received by the other side.
+     */
+    public static final int MSG_STATE_SENDED = 32;
+
+    /**
+     * Message status about message is in the queue waiting for sending.
+     */
+    public static final int MSG_STATE_SEND_ING = 64;
+
+    /**
+     * Message status about message is sent failure.
+     */
+    public static final int MSG_STATE_SEND_FAIL = 128;
+
+    /**
+     * Message status about video download failure.
+     */
+    public static final int MSG_STATE_DOWNLOAD_FAIL = 5;
+
+    /**
+     * Message status about read status.
+     */
+    public static final int MSG_READ = 1;
+
+    /**
+     * Message status about unread status.
+     */
+    public static final int MSG_UNREAD = 0;
+
+    /**
+     * Message status about send.
+     * Ue send message to another
+     */
+    public static final int MSG_SEND = 2;
+
+    /**
+     * Message status about receive.
+     * Ue received message from another
+     */
+    public static final int MSG_RECEIVE = 1;
+
+    /** The message which not burn message. */
+    public static final int MSG_BURN_AFTER_READ_NOT = 0;
+
+    /** The message which is burn message. */
+    public static final int MSG_BURN_AFTER_READ_FLAG = 1;
+
+    /** The Constant MSG_BAR_CYCLE_NONE. */
+    public static final int MSG_BAR_CYCLE_NONE = 0;
+
+    /** The message is unread. */
+    public static final int MSG_BURN_UNREAD = MSG_UNREAD;
+
+    /** The message has been readed. */
+    public static final int MSG_BURN_READED = MSG_READ;
+
+    /** The message has been burned. */
+    public static final int MSG_BURN_HAS_BEEN_BURNED = 2;
+
+    /** The message which not blacklist message */
+    public static final int MSG_BLACK_NOT = 0;
+
+    /** The message which is blacklist message */
+    public static final int MSG_BLACK_FLAG = 1;
+
+    /** no need to continue */
+    public static final int CONTINUE_NONE = 0;
+
+    /** need continue upload */
+    public static final int CONTINUE_UPLOAD = 1;
+
+    /** need continue download */
+    public static final int CONTINUE_DOWNLOAD = 2;
+
+    /**
+     * Column name about key id of message.
+     */
+    public static final String KEY_ID = "_id";
+
+    /**
+     * Column name about contact of message.
+     */
+    public static final String KEY_CONTACT = "_contact";
+    /**
+     * Column name about message id of message.
+     */
+    public static final String KEY_MESSAGE_ID = "_message_id";
+
+    /**
+     * Column name about data of message.
+     */
+    public static final String KEY_DATA = "_data";
+    /**
+     * Column name about time of message.
+     */
+    public static final String KEY_TIME = "_time";
+    /**
+     * Column name about file name of message.
+     */
+    public static final String KEY_FILENAME = "_filename";
+    /**
+     * Column name about file size of message.
+     */
+    public static final String KEY_FILESIZE = "_filesize";
+    /**
+     * Column name about mine type of message.
+     */
+    public static final String KEY_MIME_TYPE = "_mime_type";
+    /**
+     * Column name about type of message.
+     */
+    public static final String KEY_MSG_TYPE = "_msg_type";
+    /**
+     * Column name about send and receive of message.
+     */
+    public static final String KEY_SEND_RECEIVE = "_send_receive";
+
+    /**
+     * Column name about whether message is read or not.
+     */
+    public static final String KEY_IS_READ = "_is_read";
+
+    /**
+     * Column name about status of message.
+     */
+    public static final String KEY_MSG_STATE = "_msg_state";
+    /**
+     * Column name about thread id of message.
+     */
+    public static final String KEY_THREAD_ID = "_thread_id";
+    /**
+     * Column name about chat type of message.
+     */
+    public static final String KEY_CHAT_TYPE = "_chat_type";
+
+    /**
+    * Column name about contribution id of chat message.
+    */
+    public static final String KEY_CONTRIBUTION_ID = "_contribution_id";
+
+    /**
+     * column name about conversation id of chat message.
+     */
+    public static final String KEY_CONVERSATION_ID = "_conversation_id";
+
+    /** file selector. */
+    public static final String KEY_FILE_SELECTOR = "_file_selector";
+
+    /** File transfer id. */
+    public static final String KEY_FILE_TRANSFER_ID = "_file_transfer_id";
+
+    /** File transfer name. */
+    public static final String KEY_FILE_TRANSFER_EXT = "_file_transfer_ext";
+
+    /** File icon. */
+    public static final String KEY_FILE_ICON = "_file_icon";
+
+    /** Flag of message which is burn after reading. */
+    public static final String KEY_MSG_BURN_AFTER_READ_FLAG = "_burn_flag";
+
+    /** The barCycle of message which is burn after reading. */
+    public static final String KEY_MSG_BURN_BAR_CYCLE = "_barcycle";
+
+    /** The Constant kEY_MSG_HEADER. */
+    public static final String kEY_MSG_HEADER = "_header";
+
+    /** The Constant KEY_MSG_BODY. */
+    public static final String KEY_MSG_BODY = "_body";
+
+    /**
+     * Column name about subject of group chat.
+     */
+    public static final String KEY_SUBJECT = "_subject";
+
+    /**
+     * Column name about chat uri of group chat.
+     */
+    public static final String KEY_CHAT_URI = "_chat_uri";
+
+    /**
+     * Column name about status of group chat.
+     */
+    public static final String KEY_GROUP_STATUS = "_status";
+
+    /**
+     * Column name about data members of group chat.
+     */
+    public static final String KEY_DATA_MEMBERS = "_data_members";
+
+    /**
+     * column name about group last chat time.
+     */
+    public static final String KEY_LAST_CHAT_TIME = "_last_chat_time";
+
+    /**
+     * Column name about contact group id of group chat.
+     */
+    public static final String KEY_CONTACT_GROUP_ID = "_contact_group_id";
+
+    /**
+     * Column name about max count of members.
+     */
+    public static final String KEY_MAX_COUNT = "_maxcount";
+
+    /**
+     * Column name about remark of group.
+     */
+    public static final String KEY_REMARK = "_remark";
+
+    /**
+     * Column name about remind policy of group.
+     */
+    public static final String KEY_REMIND_POLICY = "_policy";
+
+    /** Flag of message which is blacklist message. */
+    public static final String KEY_MSG_BLACK_FLAG = "_black_flag";
+
+    /** Last message identity. */
+    public static final String KEY_LAST_MSG_ID = "_lstMsgId";
+
+    /** Last message data. */
+    public static final String KEY_LAST_MSG = "_lstData";
+
+    /** Last message time. */
+    public static final String KEY_LAST_TIME = "_lstTime";
+
+    /** Count of message. */
+    public static final String KEY_THREAD_COUNT = "_count";
+
+    /** Count of unread message. */
+    public static final String KEY_THREAD_UNREAD_COUNT = "_unReadCount";
+
+    /**
+     * Column name about SMS of store type.
+     */
+    public static final int STORE_TYPE_SMS = 1;
+
+    /**
+     * Column name about MMS of store type.
+     */
+    public static final int STORE_TYPE_MMS = 2;
+
+    /**
+     * Column name about new message of store type.
+     */
+    public static final int STORE_TYPE_NEW_MSG = 3;
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/SuntekMessageDbSlct.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/SuntekMessageDbSlct.java
new file mode 100644
index 0000000..b919d8a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/SuntekMessageDbSlct.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+
+import com.suntek.mway.rcs.client.api.provider.model.ChatMessage;
+import com.suntek.mway.rcs.client.api.provider.model.ChatThread;
+import com.suntek.mway.rcs.client.api.provider.model.GroupChatModel;
+
+/**
+ * <p>Title: SuntekMessageDbSlct class</p>
+ * <p>
+ * Description: The class <code>SuntekMessageDbSlct</code> offers functions for query rich message database.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-sunteck
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class SuntekMessageDbSlct {
+
+    /**
+     * a singleton instance of SuntekMessageDbSlct
+     */
+    private static SuntekMessageDbSlct instance;
+
+    /**
+     * an instance of android.content.ContentResolver
+     */
+    private ContentResolver contentResolver;
+
+    /**
+     * Static method for instance creation with the specified subclass of android.content.Context,
+     * here is the instance of RCSApplication.
+     * @param context subclass of android.content.Context, here is the instance of RCSApplication.
+     * @return instance of SuntekMessageDbSlct
+     */
+    public static SuntekMessageDbSlct createInstance(Context context) {
+        if(instance == null){
+            synchronized(SuntekMessageDbSlct.class){
+                if(instance == null){
+                    instance = new SuntekMessageDbSlct(context);
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * Private constructor to avoid creating instance directly
+     * @param context subclass of android.content.Context, here is the instance of RCSApplication.
+     */
+    private SuntekMessageDbSlct(Context context) {
+        contentResolver = context.getContentResolver();
+    }
+
+
+    /**
+     * Query all phone numbers of contact by thread id.
+     * @param threadId a thread id that identities a chat session.
+     * @return phone numbers which are semicolon-separated.
+     */
+    public String getAllNumbersByThreadId(String threadId) {
+        StringBuffer sb = new StringBuffer();
+        Cursor cursor = contentResolver.query(SuntekMessageData.SUNTEK_MESSAGE_CONTENT_URI, new String[] {
+                "distinct " + SuntekMessageData.KEY_CONTACT
+        },
+        SuntekMessageData.KEY_THREAD_ID + "=?", new String[] {
+                threadId + ""
+                }, null);
+        if (cursor != null) {
+            cursor.moveToFirst();
+            while (!cursor.isAfterLast()) {
+                sb.append(cursor.getString(0));
+                sb.append(";");
+                cursor.moveToNext();
+            }
+            cursor.close();
+        }
+
+        String number = sb.toString();
+        if (number.endsWith(";")) {
+            number = number.substring(0, number.length() - 1);
+        }
+        return number;
+    }
+
+    /**
+     * Query chat group detail information by thread id. The chat group information is represented by class {@link  com.suntek.mway.rcs.client.api.provider.model.ChatGroupModel}
+     * @param threadId thread_id a thread id that identities a chat session.
+     * @return return null if can not find record
+     */
+    public GroupChatModel getChatGroupByThreadId(String threadId) {
+        String[] projection = new String[]{SuntekMessageData.KEY_ID,
+                SuntekMessageData.KEY_SUBJECT,
+                SuntekMessageData.KEY_CHAT_URI,
+                SuntekMessageData.KEY_CONTRIBUTION_ID,
+                SuntekMessageData.KEY_CONTACT_GROUP_ID,
+                SuntekMessageData.KEY_DATA_MEMBERS,
+                SuntekMessageData.KEY_THREAD_ID};
+        Cursor cursor = contentResolver.query(SuntekMessageData.CHAT_GROUP_CONTENT_URI, projection, SuntekMessageData.KEY_THREAD_ID+"=?",
+                new String[]{threadId}, null);
+        if(cursor != null) {
+            while(cursor.moveToNext()) {
+                GroupChatModel model = cursorToChatGroupModel(cursor);
+                return model;
+            }
+            cursor.close();
+        }
+        return null;
+    }
+
+    /**
+     * Query a list of chat group information which is represented by class {@link  com.suntek.mway.rcs.client.api.provider.model.ChatGroupModel}
+     * @return a list of chat group
+     */
+    public List<GroupChatModel> getChatGroupList() {
+        List<GroupChatModel> list = new ArrayList<GroupChatModel>();
+        String[] projection = new String[]{SuntekMessageData.KEY_ID,
+                SuntekMessageData.KEY_SUBJECT,
+                SuntekMessageData.KEY_CHAT_URI,
+                SuntekMessageData.KEY_CONTRIBUTION_ID,
+                SuntekMessageData.KEY_CONTACT_GROUP_ID,
+                SuntekMessageData.KEY_DATA_MEMBERS,
+                SuntekMessageData.KEY_THREAD_ID};
+        Cursor cursor = contentResolver.query(SuntekMessageData.CHAT_GROUP_CONTENT_URI, projection, null,
+                null, null);
+        if(cursor != null) {
+            while(cursor.moveToNext()) {
+                GroupChatModel model = cursorToChatGroupModel(cursor);
+                list.add(model);
+            }
+            cursor.close();
+        }
+        return list;
+    }
+
+    /**
+     * Transform a record pointed by an android.database.Cursor to
+     * a chat group information represented by class {@link com.suntek.mway.rcs.client.api.contacts.ChatGroupModel}
+     * @param cursor an android.database.Cursor
+     * @return a chat group information represented by class {@link  com.suntek.mway.rcs.client.api.provider.model.ChatGroupModel}
+     */
+    private GroupChatModel cursorToChatGroupModel(Cursor cursor) {
+        int id = cursor.getInt(cursor.getColumnIndex(SuntekMessageData.KEY_ID));
+        String subject = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_SUBJECT));
+        String chatUri = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_CHAT_URI));
+        String contributionId = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_CONTRIBUTION_ID));
+        String contactGroupId = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_CONTACT_GROUP_ID));
+        String dataMembers = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_DATA_MEMBERS));
+        long threadId = cursor.getLong(cursor.getColumnIndex(SuntekMessageData.KEY_THREAD_ID));
+        GroupChatModel model = new GroupChatModel();
+        model.setId(id);
+        model.setSubject(subject);
+        model.setChatUri(chatUri);
+        model.setContributionId(contributionId);
+        model.setContactGroupId(contactGroupId);
+        model.setDataMembers(dataMembers);
+        model.setThreadId(threadId);
+        return model;
+
+    }
+
+    /**
+     * Transform a record pointed by an android.database.Cursor to
+     * a chat message information represented by class {@link com.suntek.mway.rcs.client.api.contacts.ChatMessage}
+     * @param cursor an android.database.Cursor
+     * @return a chat message information represented by class {@link  com.suntek.mway.rcs.client.api.provider.model.ChatMessage}
+     */
+    private ChatMessage cursorToChatMessage(Cursor cursor) {
+        int id = cursor.getInt(cursor.getColumnIndex(SuntekMessageData.KEY_ID));
+        String contact = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_CONTACT));
+        String messageId = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_MESSAGE_ID));
+        String data = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_DATA));
+        long time = cursor.getLong(cursor.getColumnIndex(SuntekMessageData.KEY_TIME));
+        String filename = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_FILENAME));
+        long filesize = cursor.getLong(cursor.getColumnIndex(SuntekMessageData.KEY_FILESIZE));
+        String mimeType = cursor.getString(cursor.getColumnIndex(SuntekMessageData.KEY_MIME_TYPE));
+        int msgType = cursor.getInt(cursor.getColumnIndex(SuntekMessageData.KEY_MSG_TYPE));
+        int sendReceive = cursor.getInt(cursor.getColumnIndex(SuntekMessageData.KEY_SEND_RECEIVE));
+        int isRead = cursor.getInt(cursor.getColumnIndex(SuntekMessageData.KEY_IS_READ));
+        int msgState = cursor.getInt(cursor.getColumnIndex(SuntekMessageData.KEY_MSG_STATE));
+        int chatType = cursor.getInt(cursor.getColumnIndex(SuntekMessageData.KEY_CHAT_TYPE));
+        long threadId = cursor.getLong(cursor.getColumnIndex(SuntekMessageData.KEY_THREAD_ID));
+        ChatMessage model = new ChatMessage();
+        model.setId(id);
+        model.setContact(contact);
+        model.setMessageId(messageId);
+        model.setData(data);
+        model.setTime(time);
+        model.setFilename(filename);
+        model.setFilesize(filesize);
+        model.setMimeType(mimeType);
+        model.setMsgType(msgType);
+        model.setSendReceive(sendReceive);
+        model.setIsRead(isRead);
+        model.setMsgState(msgState);
+        model.setChatType(chatType);
+        model.setThreadId(threadId);
+        return model;
+
+    }
+
+    /**
+     * Query a list of chat message by thread id.
+     * @param threadId a thread id that identities a chat session.
+     * @return a list of chat message
+     */
+    public List<ChatMessage> getChatMessageListByThreadId(String threadId) {
+        List<ChatMessage> list = new ArrayList<ChatMessage>();
+        String[] projection = new String[]{SuntekMessageData.KEY_ID,
+                SuntekMessageData.KEY_CONTACT,
+                SuntekMessageData.KEY_MESSAGE_ID,
+                SuntekMessageData.KEY_DATA,
+                SuntekMessageData.KEY_TIME,
+                SuntekMessageData.KEY_FILENAME,
+                SuntekMessageData.KEY_FILESIZE,
+                SuntekMessageData.KEY_MIME_TYPE,
+                SuntekMessageData.KEY_MSG_TYPE,
+                SuntekMessageData.KEY_SEND_RECEIVE,
+                SuntekMessageData.KEY_IS_READ,
+                SuntekMessageData.KEY_MSG_STATE,
+                SuntekMessageData.KEY_CHAT_TYPE,
+                SuntekMessageData.KEY_THREAD_ID
+                };
+        String selection = SuntekMessageData.KEY_THREAD_ID+"=?";
+        String[] selectionArgs = new String[]{threadId};
+        Cursor cursor = contentResolver.query(SuntekMessageData.SUNTEK_MESSAGE_CONTENT_URI, projection, selection,
+                selectionArgs, null);
+        if(cursor != null) {
+            while(cursor.moveToNext()) {
+                ChatMessage model = cursorToChatMessage(cursor);
+                list.add(model);
+            }
+            cursor.close();
+        }
+        return list;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ChatMessage.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ChatMessage.aidl
new file mode 100644
index 0000000..bbff80b
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ChatMessage.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+parcelable ChatMessage;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ChatMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ChatMessage.java
new file mode 100644
index 0000000..31c382b
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ChatMessage.java
@@ -0,0 +1,814 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: ChatMessage class</p>
+ * <p>
+ * Description: The class <code>ChatMessage</code> represents a chat message information
+ * which is indicated by the field definition in this class.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class ChatMessage implements Parcelable, Comparable<ChatMessage> {
+    /**
+     * The chat message record id.
+     */
+    private int id = -1;
+
+    /**
+     * The chat message contact.
+     */
+    private String contact;
+
+    /**
+     * The chat message id.
+     */
+    private String messageId;
+
+    /**
+     * The chat message data.
+     */
+    private String data;
+    /**
+     * The chat message time.
+     */
+    private long time;
+
+    /**
+     * The filename of chat message.
+     */
+    private String filename;
+    /**
+     * The file size of file name.
+     */
+    private long filesize;
+
+    /**
+     * The chat message mine type.
+     */
+    private String mimeType;
+
+    /**
+     * The chat message type.
+     */
+    private int msgType;
+    /**
+     * Whether send or receive of chat message.
+     */
+    private int sendReceive;
+
+    /**
+     * The chat message is read.
+     */
+    private int isRead;
+
+    /**
+     * The state of chat message.
+     */
+    private int msgState;
+
+    /**
+     * The chat type of chat message.
+     */
+    private int chatType;
+
+    /**
+     * The thread id of chat message.
+     */
+    private long threadId;
+
+    /**
+     * conversation id of chat message.
+     */
+    private String conversationId;
+
+    /**
+     * contribution id of chat message.
+     */
+    private String contributionId;
+
+    /** The file selector. */
+    private String fileSelector;
+
+    /** The file transfer ext. */
+    private String fileTransferExt;
+
+    /** The file transfer id. */
+    private String fileTransferId;
+
+    /** The file icon. */
+    private String fileIcon;
+
+    /**
+     * Mark message that is burn after reading message.
+     */
+    private int msgBurnAfterReadFlag = 0;
+
+    /**
+     * Read the message after N seconds then burn it.
+     */
+    private int barCycle = 0;
+
+    /** Header of message, when receive message then set the header. */
+    private String header;
+
+    /** Body of message, when receive message then set the body. */
+    private String body ;
+
+    /** public account message. */
+    private PublicMessage publicMessage;
+
+    /**
+     * Mark message that is blacklist message.
+     */
+    private int msgBlackFlag = 0;
+
+    /**
+     * Mark message need transfer continue
+     */
+    private int continueFlag;
+
+    /**
+     * Instantiates a new Chat Messages.
+     */
+    public ChatMessage()
+    {
+    }
+
+    /**
+     * Instantiates a new Chat Messages.
+     *
+     * @param source
+     *            the source
+     */
+    public ChatMessage( Parcel source )
+    {
+        readFromParcel( source );
+    }
+    /**
+     * Get the record id.
+     * @return the record id
+     */
+    public int getId() {
+        return id;
+    }
+    /**
+     * set the record id.
+     * @param id the record id
+     */
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    /**
+     * Get contact.
+     *
+     * @return contact
+     */
+    public String getContact() {
+        return contact;
+    }
+
+    /**
+     * Set contact.
+     *
+     * @param contact contact
+     */
+    public void setContact(String contact) {
+        this.contact = contact;
+    }
+    /**
+     * Get message id.
+     * @return message id
+     */
+    public String getMessageId() {
+        return messageId;
+    }
+
+    /**
+     * Set message id.
+     *
+     * @param messageId the new message id
+     */
+    public void setMessageId(String messageId) {
+        this.messageId = messageId;
+    }
+    /**
+     * Get message content.
+     * @return If message type is RichMessageData.MSG_TYPE_FILE, then return file path;
+     * If message type is RichMessageData.MSG_TYPE_LOCATION, then return a formatted string in the form of "longitude,latitude,information of geographical location";
+     * If message type is RichMessageData.MSG_TYPE_CONTACT, the return data of Vcard.
+     */
+    public String getData() {
+        return data;
+    }
+
+    /**
+     * Set the message content.
+     *
+     * @param data the new data
+     */
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    /**
+     * Get message time.
+     *
+     * @return the time
+     */
+    public long getTime() {
+        return time;
+    }
+
+    /**
+     * Set message time.
+     *
+     * @param time the new time
+     */
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    /**
+     * Get file name.
+     *
+     * @return the filename
+     */
+    public String getFilename() {
+        return filename;
+    }
+
+    /**
+     * Set file name.
+     *
+     * @param filename the new filename
+     */
+    public void setFilename(String filename) {
+        this.filename = filename;
+    }
+
+    /**
+     * Get file size.
+     *
+     * @return the filesize
+     */
+    public long getFilesize() {
+        return filesize;
+    }
+
+    /**
+     * Set file size.
+     *
+     * @param filesize the new filesize
+     */
+    public void setFilesize(long filesize) {
+        this.filesize = filesize;
+    }
+
+    /**
+     * Get mine type.
+     *
+     * @return the mime type
+     */
+    public String getMimeType() {
+        return mimeType;
+    }
+
+    /**
+     * Set mini type.
+     *
+     * @param mimeType the new mime type
+     */
+    public void setMimeType(String mimeType) {
+        this.mimeType = mimeType;
+    }
+    /**
+     * Get the message type.
+     * @return The possible value can be<br/>
+     * RichMessageData.MSG_TYPE_TEXT,<br/>
+     * RichMessageData.MSG_TYPE_FILE,<br/>
+     * RichMessageData.MSG_TYPE_LOCATION,<br/>
+     * RichMessageData.MSG_TYPE_CONTACT,<br/>
+     * RichMessageData.MSG_TYPE_GROUP_INFO
+     */
+    public int getMsgType() {
+        return msgType;
+    }
+    /**
+     * Set the message type.
+     * @param msgType  The possible value can be<br/>
+     * RichMessageData.MSG_TYPE_TEXT,<br/>
+     * RichMessageData.MSG_TYPE_FILE,<br/>
+     * RichMessageData.MSG_TYPE_LOCATION,<br/>
+     * RichMessageData.MSG_TYPE_CONTACT,<br/>
+     * RichMessageData.MSG_TYPE_GROUP_INFO
+     */
+    public void setMsgType(int msgType) {
+        this.msgType = msgType;
+    }
+
+    /**
+     * Get whether send or receive.
+     *
+     * @return  The possible value can be<br/>
+     * RichMessageData.MSG_SEND,<br/>
+     * RichMessageData.MSG_RECEIVE
+     */
+    public int getSendReceive() {
+        return sendReceive;
+    }
+
+    /**
+     * Set send or receive.
+     *
+     * @param sendReceive  The possible value can be<br/>
+     * RichMessageData.MSG_SEND,<br/>
+     * RichMessageData.MSG_RECEIVE
+     */
+    public void setSendReceive(int sendReceive) {
+        this.sendReceive = sendReceive;
+    }
+
+    /**
+     * Get whether the message id read or not.
+     *
+     * @return the checks if is read
+     */
+    public int getIsRead() {
+        return isRead;
+    }
+
+    /**
+     * Set whether the message id read or not.
+     *
+     * @param isRead the new checks if is read
+     */
+    public void setIsRead(int isRead) {
+        this.isRead = isRead;
+    }
+    /**
+     * Get status of message.
+     * @return  The possible value can be<br/>
+     * RichMessageData.MSG_STATE_SEND_OK,<br/>
+     * RichMessageData.MSG_STATE_SEND_REC,<br/>
+     * RichMessageData.MSG_STATE_SENDED,<br/>
+     * RichMessageData.MSG_STATE_SEND_ING,<br/>
+     * RichMessageData.MSG_STATE_SEND_FAIL
+     */
+    public int getMsgState() {
+        return msgState;
+    }
+
+    /**
+     * Set status of message.
+     *
+     * @param msgState the new msg state
+     */
+    public void setMsgState(int msgState) {
+        this.msgState = msgState;
+    }
+
+    /**
+     * Get the thread id.
+     *
+     * @return the thread id
+     */
+    public long getThreadId() {
+        return threadId;
+    }
+
+    /**
+     * Set the thread id.
+     *
+     * @param threadId the thread id
+     */
+    public void setThreadId(long threadId) {
+        this.threadId = threadId;
+    }
+    /**
+     * Get the chat type.
+     * @return  The possible value can be<br/>
+     * SuntekMessageData.CHAT_TYPE_ONE2ONE,<br/>
+     * SuntekMessageData.CHAT_TYPE_GROUPCHAT,<br/>
+     * SuntekMessageData.CHAT_TYPE_MULTICHAT
+     */
+    public int getChatType() {
+        return chatType;
+    }
+
+    /**
+     * Set the chat type.
+     *
+     * @param chatType the new chat type
+     */
+    public void setChatType(int chatType) {
+        this.chatType = chatType;
+    }
+
+    /**
+     * Get message conversation id.
+     *
+     * @return chat message conversation id
+     */
+    public String getConversationId() {
+        return conversationId;
+    }
+
+    /**
+     * Set message conversation id.
+     *
+     * @param conversationId the new conversation id
+     * @return conversationId
+     */
+    public void setConversationId(String conversationId) {
+        this.conversationId = conversationId;
+    }
+
+    /**
+     * Get message contribution id.
+     *
+     * @return chat message contribution id
+     */
+    public String getContributionId() {
+        return contributionId;
+    }
+
+    /**
+     * Set message contribution id.
+     *
+     * @param contributionId the new contribution id
+     * @return contributionId
+     */
+    public void setContributionId(String contributionId) {
+        this.contributionId = contributionId;
+    }
+
+    /**
+     * Get file selector.
+     *
+     * @return the file selector
+     */
+    public String getFileSelector() {
+        return fileSelector;
+    }
+
+    /**
+     * Set file selector .
+     *
+     * @param fileSelector the new file selector
+     */
+    public void setFileSelector(String fileSelector) {
+        this.fileSelector = fileSelector;
+    }
+
+    /**
+     * Get file transfer extend info.
+     *
+     * @return the file transfer ext
+     */
+    public String getFileTransferExt() {
+        return fileTransferExt;
+    }
+
+    /**
+     * Set file transfer extend info.
+     *
+     * @param fileTransferExt the new file transfer ext
+     */
+    public void setFileTransferExt(String fileTransferExt) {
+        this.fileTransferExt = fileTransferExt;
+    }
+
+    /**
+     * Get file transfer extend info id.
+     *
+     * @return the file transfer id
+     */
+    public String getFileTransferId() {
+        return fileTransferId;
+    }
+
+    /**
+     * Set file transfer extend info id.
+     *
+     * @param fileTransferId the new file transfer id
+     */
+    public void setFileTransferId(String fileTransferId) {
+        this.fileTransferId = fileTransferId;
+    }
+
+    /**
+     * Get transfer file icon.
+     *
+     * @return the file icon
+     */
+    public String getFileIcon() {
+        return fileIcon;
+    }
+
+    /**
+     * Set transfer file icon.
+     *
+     * @param fileIcon the new file icon
+     */
+    public void setFileIcon(String fileIcon) {
+        this.fileIcon = fileIcon;
+    }
+
+    /**
+     * Get message burn after reading flag.
+     *
+     * @return the msg burn after read flag
+     */
+    public int getMsgBurnAfterReadFlag() {
+        return msgBurnAfterReadFlag;
+    }
+
+    /**
+     * Set message burn after reading flag.
+     *
+     * @param msgBurnAfterReadFlag the new msg burn after read flag
+     */
+    public void setMsgBurnAfterReadFlag(int msgBurnAfterReadFlag) {
+        this.msgBurnAfterReadFlag = msgBurnAfterReadFlag;
+    }
+
+    /**
+     * Get barCycle of burn after reading message.
+     *
+     * @return the bar cycle
+     */
+    public int getBarCycle() {
+        return barCycle;
+    }
+
+    /**
+     * Set barCycle of burn after reading message.
+     *
+     * @param barCycle the new bar cycle
+     */
+    public void setBarCycle(int barCycle) {
+        this.barCycle = barCycle;
+    }
+
+    /**
+     * Gets the public message.
+     *
+     * @return the public message
+     */
+    public PublicMessage getPublicMessage() {
+        return publicMessage;
+    }
+
+    /**
+     * Sets the public message.
+     *
+     * @param publicMessage the new public message
+     */
+    public void setPublicMessage(PublicMessage publicMessage) {
+        this.publicMessage = publicMessage;
+    }
+
+    /**
+     * Get the message body.
+     *
+     * @return the body
+     */
+    public String getBody() {
+        return body;
+    }
+
+    /**
+     * Set the message body.
+     *
+     * @param body the new body
+     */
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+    /**
+     * Get the message header.
+     *
+     * @return the header
+     */
+    public String getHeader() {
+        return header;
+    }
+
+    /**
+     * Set the message header.
+     *
+     * @param header the new header
+     */
+    public void setHeader(String header) {
+        this.header = header;
+    }
+
+    /**
+     * Gets the msg black flag.
+     *
+     * @return the msg black flag
+     */
+    public int getMsgBlackFlag() {
+        return msgBlackFlag;
+    }
+
+    /**
+     * Sets the msg black flag.
+     *
+     * @param msgBlackFlag the new msg black flag
+     */
+    public void setMsgBlackFlag(int msgBlackFlag) {
+        this.msgBlackFlag = msgBlackFlag;
+    }
+
+    /**
+     * Get the continue flag.
+     *
+     * @return the continue flag
+     */
+    public int getContinueFlag() {
+        return continueFlag;
+    }
+
+    /**
+     * Set the continue flag.
+     *
+     * @param continueFlag
+     */
+    public void setContinueFlag(int continueFlag) {
+        this.continueFlag = continueFlag;
+    }
+
+    /* (non-Javadoc)
+     * @see android.os.Parcelable#describeContents()
+     */
+    @Override
+    public int describeContents() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    /* (non-Javadoc)
+     * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        // TODO Auto-generated method stub
+        dest.writeInt( id );
+        dest.writeString( contact );
+        dest.writeString( messageId );
+        dest.writeString( data );
+        dest.writeLong( time );
+        dest.writeString( filename );
+        dest.writeLong( filesize );
+        dest.writeString( mimeType );
+        dest.writeInt( msgType );
+        dest.writeInt( sendReceive );
+        dest.writeInt( isRead );
+        dest.writeInt( msgState );
+        dest.writeInt( chatType );
+        dest.writeLong( threadId );
+        dest.writeString( conversationId );
+        dest.writeString( contributionId );
+        dest.writeString( fileSelector );
+
+        dest.writeString( fileTransferExt );
+        dest.writeString( fileTransferId );
+        dest.writeString( fileIcon );
+        dest.writeInt( msgBurnAfterReadFlag );
+        dest.writeInt( barCycle );
+        dest.writeString( header );
+        dest.writeString( body );
+        dest.writeValue( publicMessage );
+        dest.writeInt( msgBlackFlag );
+        dest.writeInt( continueFlag );
+
+    }
+
+    /**
+     * Read from parcel.
+     *
+     * @param source the source
+     */
+    public void readFromParcel( Parcel source )
+    {
+        id = source.readInt();
+        contact = source.readString();
+        messageId = source.readString();
+        data = source.readString();
+        time = source.readLong();
+        filename = source.readString();
+        filesize = source.readLong();
+        mimeType = source.readString();
+        msgType = source.readInt();
+        sendReceive = source.readInt();
+        isRead = source.readInt();
+        msgState = source.readInt();
+        chatType = source.readInt();
+        threadId = source.readLong();
+
+        conversationId = source.readString();
+        contributionId = source.readString();
+        fileSelector = source.readString();
+
+        fileTransferExt = source.readString();
+        fileTransferId = source.readString();
+        fileIcon = source.readString();
+
+        msgBurnAfterReadFlag = source.readInt();
+        barCycle = source.readInt();
+
+        header = source.readString();
+        body = source.readString();
+        publicMessage = (PublicMessage) source.readValue(PublicMessage.class.getClassLoader());
+        msgBlackFlag = source.readInt();
+        continueFlag = source.readInt();
+    }
+
+    /** The Constant CREATOR. */
+    public static final Parcelable.Creator<ChatMessage> CREATOR = new Parcelable.Creator<ChatMessage>() {
+        public ChatMessage createFromParcel(Parcel in) {
+            return new ChatMessage(in);
+        }
+
+        @Override
+        public ChatMessage[] newArray(int size) {
+            // TODO Auto-generated method stub
+            return new ChatMessage[ size ];
+        }
+
+    };
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return "ChatMessage [id=" + id + ", contact=" + contact
+                + ", messageId=" + messageId + ", data=" + data + ", time="
+                + time + ", filename=" + filename + ", filesize=" + filesize
+                + ", mimeType=" + mimeType + ", msgType=" + msgType
+                + ", sendReceive=" + sendReceive + ", isRead=" + isRead
+                + ", msgState=" + msgState + ", chatType=" + chatType
+                + ", threadId=" + threadId + ", conversationId="
+                + conversationId + ", contributionId=" + contributionId
+                + ", fileSelector=" + fileSelector + ", fileTransferExt="
+                + fileTransferExt + ", fileTransferId=" + fileTransferId
+                + ", fileIcon=" + fileIcon + ", msgBurnAfterReadFlag="
+                + msgBurnAfterReadFlag + ", barCycle=" + barCycle
+//                + ", header=" + header + ", body=" + body
+                + ", publicMessage="
+                + publicMessage + "], msgBlackFlag = " + msgBlackFlag
+                + ", continueFlag = " + continueFlag;
+    }
+
+    @Override
+    public int compareTo(ChatMessage message) {
+        // TODO Auto-generated method stub
+        if (time - message.getTime()>0) {
+            return 1;
+        }else if (time - message.getTime()==0) {
+            return 0;
+        } else {
+            return -1;
+        }
+//        return (int) (time - message.getTime());
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ChatThread.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ChatThread.java
new file mode 100644
index 0000000..77a251c
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ChatThread.java
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: ChatThread class</p>
+ * <p>
+ * Description: The class <code>ChatThread</code> represents a chat thread information
+ * which is indicated by the field definition in this class.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class ChatThread implements Parcelable {
+
+    /**
+     * The chat thread record id.
+     */
+    private long threadId;
+
+    /**
+     * The contact.
+     */
+    private String contact;
+
+    /**
+     * The chat type.
+     */
+    private int chatType;
+
+    /**
+     * The message type.
+     */
+    private int msgType;
+
+    /**
+     * The last message.
+     */
+    private String lastMsg;
+
+    /**
+     * The last time of message.
+     */
+    private long lastTime;
+
+    /**
+     * The last message identity
+     */
+    private int lastMsgId;
+
+    /**
+     * The count of thread
+     */
+    private int count;
+
+    /**
+     * The unread count of thread
+     */
+    private int unreadCount;
+
+    /**
+     * The message conversation id
+     */
+    private String conversationId;
+
+    /**
+     * The group identity
+     */
+    private String groupId;
+
+    /**
+     * Get the thread id.
+     * @return
+     */
+    public long getThreadId() {
+        return threadId;
+    }
+    /**
+     * Set the thread id.
+     * @param threadId
+     */
+    public void setThreadId(long threadId) {
+        this.threadId = threadId;
+    }
+    /**
+     * Get the chat type.
+     * @return  The possible value can be<br/>
+     */
+    public int getChatType() {
+        return chatType;
+    }
+    /**
+     * Set the chat type.
+     * @param chatType
+     */
+    public void setChatType(int chatType) {
+        this.chatType = chatType;
+    }
+    /**
+     * Get the last message content.
+     * @return the last message content
+     */
+    public String getLastMsg() {
+        return lastMsg;
+    }
+    /**
+     * Set the last message content.
+     * @param lastMsg  the last message content
+     */
+    public void setLastMsg(String lastMsg) {
+        this.lastMsg = lastMsg;
+    }
+    /**
+     * Get the last time of the message.
+     * @return the last time of the message.
+     */
+    public long getLastTime() {
+        return lastTime;
+    }
+    /**
+     * Set the last time of the message.
+     * @param lastTime
+     */
+    public void setLastTime(long lastTime) {
+        this.lastTime = lastTime;
+    }
+    /**
+     * Get the message type.
+     * @return The possible value can be<br/>
+     */
+    public int getMsgType() {
+        return msgType;
+    }
+    /**
+     * Set the message type.
+     * @param msgType  The possible value can be<br/>
+     */
+    public void setMsgType(int msgType) {
+        this.msgType = msgType;
+    }
+    /**
+     * Get contact
+     * @return contact
+     */
+    public String getContact() {
+        return contact;
+    }
+    /**
+     * Set contact
+     * @param contact contact
+     */
+    public void setContact(String contact) {
+        this.contact = contact;
+    }
+    /**
+     * Get last message identity
+     * @return
+     */
+    public int getLastMsgId() {
+        return lastMsgId;
+    }
+    /**
+     * Set last message identity
+     * @param lastMsgId
+     */
+    public void setLastMsgId(int lastMsgId) {
+        this.lastMsgId = lastMsgId;
+    }
+    /**
+     * Get Count of message
+     * @return
+     */
+    public int getCount() {
+        return count;
+    }
+    /**
+     * Set Count of message
+     * @param count
+     */
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    /**
+     * Get count of unread message
+     * @return
+     */
+    public int getUnreadCount() {
+        return unreadCount;
+    }
+
+    /**
+     * Set count of unread message
+     * @param unreadCount
+     */
+    public void setUnreadCount(int unreadCount) {
+        this.unreadCount = unreadCount;
+    }
+
+    /**
+     * Get group identity
+     * @return
+     */
+    public String getGroupId() {
+        return groupId;
+    }
+
+    /**
+     * Set group identity
+     * @param groupId
+     */
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    /**
+     * Get message conversation id
+     * @return
+     */
+    public String getConversationId() {
+        return conversationId;
+    }
+
+    /**
+     * Set message conversation id
+     * @param conversationId
+     */
+    public void setConversationId(String conversationId) {
+        this.conversationId = conversationId;
+    }
+
+    @Override
+    public int describeContents() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        // TODO Auto-generated method stub
+        dest.writeLong(threadId);
+        dest.writeString(contact);
+        dest.writeInt(lastMsgId);
+        dest.writeLong(lastTime);
+        dest.writeString(lastMsg);
+        dest.writeInt(count);
+        dest.writeInt(unreadCount);
+        dest.writeInt(chatType);
+        dest.writeInt(msgType);
+        dest.writeString(conversationId);
+        dest.writeString(groupId);
+    }
+
+    public void readFromParcel( Parcel source ) {
+        threadId = source.readLong();
+        contact = source.readString();
+        lastMsgId = source.readInt();
+        lastTime = source.readLong();
+        lastMsg = source.readString();
+        count = source.readInt();
+        unreadCount = source.readInt();
+        chatType = source.readInt();
+        msgType = source.readInt();
+        conversationId = source.readString();
+        groupId = source.readString();
+    }
+
+    @Override
+    public String toString() {
+        return "ChatThread [threadId=" + threadId + ", contact=" + contact
+                + ", lastMsgId=" + lastMsgId + ", lastTime=" + lastTime + ", lastMsg="
+                + lastMsg + ", count=" + count + ", unreadCount=" + unreadCount
+                + ", chatType=" + chatType + ", msgType=" + msgType
+                + ", conversationId=" + conversationId + ", groupId=" + groupId;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/FavoriteMessage.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/FavoriteMessage.aidl
new file mode 100644
index 0000000..d46dc0e
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/FavoriteMessage.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+parcelable FavoriteMessage;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/FavoriteMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/FavoriteMessage.java
new file mode 100644
index 0000000..c2419f9
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/FavoriteMessage.java
@@ -0,0 +1,305 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class FavoriteMessage implements Parcelable {
+
+    private int id;
+
+    private String contact;
+
+    private String messageId;
+
+    private String data;
+
+    private long time;
+
+    private String fileName;
+
+    private long fileSize;
+
+    private String mimeType;
+
+    private int msgType;
+
+    private int sendReceive;
+
+    private int chatType;
+
+    private String fileIcon;
+
+    private long favoriteTime;
+
+    private String mmsSub;
+
+    private String type;
+
+    private String mmsBody;
+
+    private String smsPerson;
+
+    private String smsProtocol;
+
+    private String smsServiceCenter;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getContact() {
+        return contact;
+    }
+
+    public void setContact(String contact) {
+        this.contact = contact;
+    }
+
+    public String getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(String messageId) {
+        this.messageId = messageId;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public long getTime() {
+        return time;
+    }
+
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public long getFileSize() {
+        return fileSize;
+    }
+
+    public void setFileSize(long fileSize) {
+        this.fileSize = fileSize;
+    }
+
+    public String getMimeType() {
+        return mimeType;
+    }
+
+    public void setMimeType(String mimeType) {
+        this.mimeType = mimeType;
+    }
+
+    public int getMsgType() {
+        return msgType;
+    }
+
+    public void setMsgType(int msgType) {
+        this.msgType = msgType;
+    }
+
+    public int getSendReceive() {
+        return sendReceive;
+    }
+
+    public void setSendReceive(int sendReceive) {
+        this.sendReceive = sendReceive;
+    }
+
+    public int getChatType() {
+        return chatType;
+    }
+
+    public void setChatType(int chatType) {
+        this.chatType = chatType;
+    }
+
+    public String getFileIcon() {
+        return fileIcon;
+    }
+
+    public void setFileIcon(String fileIcon) {
+        this.fileIcon = fileIcon;
+    }
+
+    public long getFavoriteTime() {
+        return favoriteTime;
+    }
+
+    public void setFavoriteTime(long favoriteTime) {
+        this.favoriteTime = favoriteTime;
+    }
+
+    public String getMmsSub() {
+        return mmsSub;
+    }
+
+    public void setMmsSub(String mmsSub) {
+        this.mmsSub = mmsSub;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getMmsBody() {
+        return mmsBody;
+    }
+
+    public void setMmsBody(String mmsBody) {
+        this.mmsBody = mmsBody;
+    }
+
+    public String getSmsPerson() {
+        return smsPerson;
+    }
+
+    public void setSmsPerson(String smsPerson) {
+        this.smsPerson = smsPerson;
+    }
+
+    public String getSmsProtocol() {
+        return smsProtocol;
+    }
+
+    public void setSmsProtocol(String smsProtocol) {
+        this.smsProtocol = smsProtocol;
+    }
+
+    public String getSmsServiceCenter() {
+        return smsServiceCenter;
+    }
+
+    public void setSmsServiceCenter(String smsServiceCenter) {
+        this.smsServiceCenter = smsServiceCenter;
+    }
+
+    public FavoriteMessage() {
+    }
+
+    public FavoriteMessage(Parcel source) {
+        readFromParcel(source);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(id);
+        dest.writeString(contact);
+        dest.writeString(messageId);
+        dest.writeString(data);
+        dest.writeLong(time);
+        dest.writeString(fileName);
+        dest.writeLong(fileSize);
+        dest.writeString(mimeType);
+        dest.writeInt(msgType);
+        dest.writeInt(sendReceive);
+        dest.writeInt(chatType);
+        dest.writeString(fileIcon);
+        dest.writeLong(favoriteTime);
+        dest.writeString(mmsSub);
+        dest.writeString(type);
+        dest.writeString(mmsBody);
+        dest.writeString(smsPerson);
+        dest.writeString(smsProtocol);
+        dest.writeString(smsServiceCenter);
+    }
+
+    public void readFromParcel(Parcel source) {
+        id = source.readInt();
+        contact = source.readString();
+        messageId = source.readString();
+        data = source.readString();
+        time = source.readLong();
+        fileName = source.readString();
+        fileSize = source.readLong();
+        mimeType = source.readString();
+        msgType = source.readInt();
+        sendReceive = source.readInt();
+        chatType = source.readInt();
+        fileIcon = source.readString();
+        favoriteTime = source.readLong();
+        mmsSub = source.readString();
+        type = source.readString();
+        mmsBody = source.readString();
+        smsPerson = source.readString();
+        smsProtocol = source.readString();
+        smsServiceCenter = source.readString();
+    }
+
+    /** The Constant CREATOR. */
+    public static final Parcelable.Creator<FavoriteMessage> CREATOR = new Parcelable.Creator<FavoriteMessage>() {
+        public FavoriteMessage createFromParcel(Parcel in) {
+            return new FavoriteMessage(in);
+        }
+
+        @Override
+        public FavoriteMessage[] newArray(int size) {
+            // TODO Auto-generated method stub
+            return new FavoriteMessage[size];
+        }
+
+    };
+
+    @Override
+    public String toString() {
+        return "FavoriteMessage [id=" + id + ", contact=" + contact
+                + ", messageId=" + messageId + ", data=" + data + ", time="
+                + time + ", fileName=" + fileName + ", fileSize=" + fileSize
+                + ", mimeType=" + mimeType + ", msgType=" + msgType
+                + ", sendReceive=" + sendReceive + ", chatType=" + chatType
+                + ", fileIcon=" + fileIcon + ", favoriteTime=" + favoriteTime
+                + ", mmsSub=" + mmsSub + ", type=" + type + ", mmsBody="
+                + mmsBody + ", smsPerson=" + smsPerson + ", smsProtocol="
+                + smsProtocol + ", smsServiceCenter=" + smsServiceCenter + "]";
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatModel.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatModel.aidl
new file mode 100644
index 0000000..343ab30
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatModel.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+parcelable GroupChatModel;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatModel.java
new file mode 100644
index 0000000..da040b1
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatModel.java
@@ -0,0 +1,510 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.TextUtils;
+
+/**
+ * <p>Title: ChatGroupModel class</p>
+ * <p>
+ * Description: The class <code>ChatGroupModel</code> represents a chat group information
+ * which is indicated by the field definition in this class.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class GroupChatModel implements Parcelable {
+
+    /**
+     * waiting others to join the group
+     */
+    public static final int GROUP_STATUS_AWAIT = 0;
+
+    /**
+     * group has created
+     */
+    public static final int GROUP_STATUS_COMPETE = 1;
+
+    /**
+     * group has deleted
+     */
+    public static final int GROUP_STATUS_DELETED = -1;
+
+    /**
+     * Receive message and reminding
+     */
+    public static final int POLICY_RCV_REMIND = 0;
+
+    /**
+     * Receive message but don't remind
+     */
+    public static final int POLICY_RCV = 1;
+
+    /**
+     * Don't Receive message
+     */
+    public static final int POLICY_NOT_RCV = 2;
+
+    /**
+     * The chat group record id.
+     */
+    private int id = -1;
+
+    /**
+     * The group chat uri.
+     */
+    private String chatUri;
+
+    /**
+     * The group chat subject.
+     */
+    private String subject;
+
+    /**
+     * Time of creating chat group
+     */
+    private long time;
+
+    /**
+     * The group status
+     */
+    private int status;
+
+    /**
+     * The group chat thread id.
+     */
+    private long threadId;
+
+    /**
+     * The group chat data members which are semicolon-separated.
+     */
+    private String dataMembers;
+
+    /**
+     * The group chat contribution id.
+     */
+    private String contributionId;
+
+    /**
+     * The group chat contact group id.
+     */
+    private String contactGroupId;
+
+    /**
+     * The list of chat group user represented by class {@link com.suntek.mway.rcs.client.api.provider.model.ChatGroupUser}
+     */
+    private List<GroupChatUser> userList = new ArrayList<GroupChatUser>();
+
+    /**
+     * The max count of members
+     */
+    private int maxCount;
+
+    /**
+     * The conversationId
+     */
+    private String conversationId;
+
+    /**
+     * The remark of group
+     */
+    private String remark;
+
+    /**
+     * The message reminding policy of group
+     */
+    private int remindPolicy;
+
+    public GroupChatModel(){
+    }
+
+    public GroupChatModel(Parcel in) {
+        readFromParcel(in);
+    }
+    /**
+     * Get the record id.
+     * @return the record id
+     */
+    public int getId() {
+        return id;
+    }
+    /**
+     * set the record id.
+     * @param id the record id
+     */
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    /**
+     * Get the chat group uri.
+     * @return the chat group uri
+     */
+    public String getChatUri() {
+        return chatUri;
+    }
+    /**
+     * Set the chat group uri
+     * @param chatUri the chat group uri
+     */
+    public void setChatUri(String chatUri) {
+        this.chatUri = chatUri;
+    }
+    /**
+     * Get the chat group name for display. Return 'subject' if the 'remark' is empry.
+     */
+    public String getDisplayName() {
+        if (!TextUtils.isEmpty(remark)) {
+            return remark;
+        } else {
+            return subject;
+        }
+    }
+    /**
+     * Get the chat group subject.
+     * @return the chat group subject
+     */
+    public String getSubject() {
+        return subject;
+    }
+    /**
+     * Set the chat group subject.
+     * @param subject the chat group subject
+     */
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+    /**
+     * Get the chat group thread id.
+     * @return the chat group thread id
+     */
+    public long getThreadId() {
+        return threadId;
+    }
+    /**
+     * Set the chat group thread id.
+     * @param threadId the chat group thread id
+     */
+    public void setThreadId(long threadId) {
+        this.threadId = threadId;
+    }
+    /**
+     * Get the chat group contribution id.
+     * @return the chat group contribution id
+     */
+    public String getContributionId() {
+        return contributionId;
+    }
+    /**
+     * Set the chat group contribution id.
+     * @param contributionId the chat group contribution id
+     */
+    public void setContributionId(String contributionId) {
+        this.contributionId = contributionId;
+    }
+    /**
+     * Get the contact group id.
+     * @return If the group chat is created by contact group, the id here is the contact group id.
+     */
+    public String getContactGroupId() {
+        return contactGroupId;
+    }
+    /**
+     * Set the contact group id.
+     * @param contactGroupId  the contact group id.
+     */
+    public void setContactGroupId(String contactGroupId) {
+        this.contactGroupId = contactGroupId;
+    }
+    /**
+     * Get a formatted string of Group chat contacts which are semicolon-separated.
+     * The every separated part is separated by commas, and each part separated by commas is
+     * phone number, display name, status and role of contact. The four parts is represented by class
+     * {@link com.suntek.mway.rcs.client.api.provider.model.ChatGroupUser}
+     * @return a formatted string of Group chat contacts which are semicolon-separated.
+     */
+    public String getDataMembers() {
+        return dataMembers;
+    }
+    /**
+     * Set a formatted string of Group chat contacts which are semicolon-separated.
+     * @param dataMembers a formatted string of Group chat contacts which are semicolon-separated.
+     * The every separated part is separated by commas, and each part separated by commas is
+     * phone number, display name, status and role of contact. The four parts is represented by class
+     * {@link com.suntek.mway.rcs.client.api.provider.model.ChatGroupUser}
+     */
+    public void setDataMembers(String dataMembers) {
+        this.dataMembers = dataMembers;
+        userList.clear();
+        if(this.dataMembers != null) {
+            String[] dataList = dataMembers.split(";");
+            for(int i = 0; i < dataList.length; i++) {
+                GroupChatUser groupUser = GroupChatUser.fromFormatString(dataMembers);
+                if(groupUser != null) {
+                    userList.add(groupUser);
+                }
+            }
+        }
+    }
+    /**
+     * Set phone numbers of chat group contacts.
+     * @param members phone numbers
+     */
+    public void setDataMemberList(List<String> members) {
+        List<GroupChatUser> users = new ArrayList<GroupChatUser>();
+        for(int i = 0; i < members.size(); i++) {
+            GroupChatUser user = new GroupChatUser();
+            user.setNumber(members.get(i));
+            users.add(user);
+        }
+        String str = formatToSaveNumberData(users);
+        setDataMembers(str);
+    }
+
+    /**
+     * Format a list chat group contact phone number to a string which are semicolon-separated.
+     * @param users
+     * @return
+     */
+    private String formatToSaveNumberData(List<GroupChatUser> users) {
+        StringBuffer sb = new StringBuffer();
+        for(int i = 0; i < users.size(); i++) {
+            GroupChatUser user = users.get(i);
+            sb.append(user.toFormatString());
+            if(i != users.size() - 1) {
+                sb.append(";");
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Get a list of chat group user.
+     * @return
+     */
+    public List<GroupChatUser> getUserList() {
+        return userList;
+    }
+
+    /**
+     * Get time of creating group
+     * @return
+     */
+    public long getTime() {
+        return time;
+    }
+
+    /**
+     * Set time of creating group
+     * @param time
+     */
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    /**
+     * Set group member
+     * @param userList
+     */
+    public void setUserList(List<GroupChatUser> userList) {
+        this.userList = userList;
+    }
+
+    /**
+     * Get group status
+     * @return
+     */
+    public int getStatus() {
+        return status;
+    }
+
+    /**
+     * Set group status
+     * @param status
+     */
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    /**
+     * Get max count of members
+     * @return
+     */
+    public int getMaxCount() {
+        return maxCount;
+    }
+
+    /**
+     * Set max count of members
+     * @param maxCount
+     */
+    public void setMaxCount(int maxCount) {
+        this.maxCount = maxCount;
+    }
+
+    /**
+     * Get conversationId
+     * @return
+     */
+    public String getConversationId() {
+        return conversationId;
+    }
+
+    /**
+     * Set conversationId
+     * @param conversationId
+     */
+    public void setConversationId(String conversationId) {
+        this.conversationId = conversationId;
+    }
+
+    /**
+     * Get remark
+     * @return remark
+     */
+    public String getRemark() {
+        return remark;
+    }
+
+    /**
+     * Set remark
+     * @param remark the remark of group
+     */
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    /**
+     * Get message reminding policy
+     * @return remindPolicy
+     */
+    public int getRemindPolicy() {
+        return remindPolicy;
+    }
+
+    /**
+     * Set message reminding policy
+     * @param remindPolicy
+     */
+    public void setRemindPolicy(int remindPolicy) {
+        this.remindPolicy = remindPolicy;
+    }
+
+    /**
+     * Find GroupChatUser from this group. May return null if not found.
+     */
+    public GroupChatUser getUserByNumber(String number) {
+        if (TextUtils.isEmpty(number)) {
+            return null;
+        }
+
+        for (GroupChatUser user : userList) {
+            if (number.equals(user.getNumber())) {
+                return user;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public int describeContents() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel arg0, int arg1) {
+        arg0.writeInt(id);
+        arg0.writeString(chatUri);
+        arg0.writeString(subject);
+        arg0.writeLong(time);
+        arg0.writeInt(status);
+        arg0.writeLong(threadId);
+        arg0.writeString(dataMembers);
+        arg0.writeString(contributionId);
+        arg0.writeString(contactGroupId);
+        arg0.writeList(userList);
+        arg0.writeInt(maxCount);
+        arg0.writeString(conversationId);
+        arg0.writeString(remark);
+        arg0.writeInt(remindPolicy);
+    }
+
+    @Override
+    public String toString() {
+        return "GroupChatModel [id=" + id + ", chatUri=" + chatUri
+                + ", subject=" + subject + ", time=" + time + ", status="
+                + status + ", threadId=" + threadId + ", dataMembers="
+                + dataMembers + ", contributionId=" + contributionId
+                + ", contactGroupId=" + contactGroupId + ", userList="
+                + userList + ", maxCount=" + maxCount + ", conversationId="
+                + conversationId + ", remark=" + remark + ", remindPolicy="
+                + remindPolicy + "]";
+    }
+
+    public void readFromParcel(Parcel source) {
+        id = source.readInt();
+        chatUri = source.readString();
+        subject = source.readString();
+        time = source.readLong();
+        status = source.readInt();
+        threadId = source.readLong();
+        dataMembers = source.readString();
+        contributionId = source.readString();
+        contactGroupId = source.readString();
+        userList = new LinkedList<GroupChatUser>();
+        source.readList(userList, this.getClass().getClassLoader());
+        maxCount = source.readInt();
+        conversationId = source.readString();
+        remark = source.readString();
+        remindPolicy = source.readInt();
+    }
+
+    public static final Parcelable.Creator<GroupChatModel> CREATOR = new Parcelable.Creator<GroupChatModel>() {
+        public GroupChatModel createFromParcel(Parcel in) {
+            return new GroupChatModel(in);
+        }
+
+        @Override
+        public GroupChatModel[] newArray(int arg0) {
+            return new GroupChatModel[arg0];
+        }
+
+    };
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatUser.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatUser.aidl
new file mode 100644
index 0000000..61d03ea
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatUser.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+parcelable GroupChatUser;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatUser.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatUser.java
new file mode 100644
index 0000000..15e2bdb
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupChatUser.java
@@ -0,0 +1,520 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.text.TextUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>Title: ChatGroupUser class</p>
+ * <p>
+ * Description: The class <code>ChatGroupUser</code> represents a chat group user information
+ * which is indicated by the field definition in this class.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class GroupChatUser implements Parcelable {
+
+    public static final int AWAIT_TO_JOIN = 0;
+    public static final int AGREE_TO_JOIN = 1;
+    public static final int REFUSE_TO_JOIN = 2;
+
+    /**
+     * User identity of group
+     */
+    private String id;
+
+    private String uri;
+
+    /**
+     * Group identity
+     */
+    private String groupId;
+
+    /**
+     * Display name of user
+     */
+    private String displayName = "";
+
+    /**
+     * Phone number
+     */
+    private String number = "";
+
+    /**
+     * Disconnection method
+     */
+    private String disconnectionMethod = "";
+
+    /**
+     * Role of user
+     */
+    private String role = "";
+
+    /**
+     * State of user
+     */
+    private String state = "";
+
+    /**
+     * Etype of user
+     */
+    private String etype = "unknow";
+
+    /**
+     * The alias of member in group
+     */
+    private String alias;
+
+    /**
+     * Status of user
+     */
+    private String status;
+
+    /**
+     * Time of join the group
+     */
+    private long time;
+
+    /**
+     * Agree to jion a group chat
+     */
+    private int agreeToJoin;
+
+    /**
+     * invite user's number
+     */
+    private String inviteNumber;
+
+    /**
+     * The administrator of group
+     */
+    public static final String ROLE_ADMIN = "chairman";
+
+    /**
+     * Member of group
+     */
+    public static final String ROLE_MEMBER = "participant";
+
+    /**
+     * Etype of user
+     */
+    public static final String ETYPE_CAN_ASSIGN_AS_CHAIRMAN = "cmcccb";
+
+    public GroupChatUser(){
+    }
+
+    public GroupChatUser(Parcel in) {
+        readFromParcel(in);
+    }
+
+    /**
+     * Get user uri
+     * @return
+     */
+    public String getUri() {
+        return uri;
+    }
+
+    /**
+     * Set user uri
+     * @param uri
+     */
+    public void setUri(String uri) {
+        this.uri = uri;
+    }
+
+    /**
+     * Get the display name
+     * @return the display name
+     */
+    public String getDisplayName() {
+        return displayName;
+    }
+    /**
+     * Get the display name
+     * @return the display name
+     */
+    public String getDisplayName(Context context) {
+        // alias>contact>phone number
+        if (!TextUtils.isEmpty(alias)) {
+            return alias;
+        }
+
+        if (!TextUtils.isEmpty(number)) {
+            String displayName = getDisplayNameOnContactsProviderByNumber(context, number); // TODO Add country code support.
+            if (!TextUtils.isEmpty(displayName)) {
+                return displayName;
+            }
+
+            return number;
+        }
+
+        return "";
+    }
+
+    private static String getDisplayNameOnContactsProviderByNumber(Context context, String number) {
+        Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI, new String[] {
+            Phone.DISPLAY_NAME
+        }, Phone.NUMBER + "=?", new String[] {
+            number
+        }, null);
+
+        if (cursor != null) {
+            try {
+                if (cursor.moveToFirst()) {
+                    String displayName = cursor.getString(0);
+                    if (!TextUtils.isEmpty(displayName)) {
+                        return displayName;
+                    }
+                }
+            } finally {
+                cursor.close();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Set the display name
+     * @param displayName the display name
+     */
+    public void setDisplayName(String displayName) {
+        this.displayName = displayName;
+    }
+    /**
+     * Get the phone number
+     * @return the phone number
+     */
+    public String getNumber() {
+        return number;
+    }
+    /**
+     * Set the phone number
+     * @param number the phone number
+     */
+    public void setNumber(String number) {
+        this.number = number;
+    }
+    /**
+     * Get role(ordinary member or administrator)
+     * @return
+     */
+    public String getRole() {
+        return role;
+    }
+
+    /**
+     * Whether user is group administrator
+     * @return if true then user is group administrator
+     */
+    public boolean isAdminRole() {
+        return ROLE_ADMIN.equals(role);
+    }
+
+    /**
+     * Set role
+     * @param role role
+     */
+    public void setRole(String role) {
+        this.role = role;
+    }
+    /**
+     * Get the formatted string which format is "number, displayName, status, role"
+     * @return
+     */
+    public String toFormatString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append(TextUtils.isEmpty(number)?" ":number).append(",");
+        sb.append(TextUtils.isEmpty(displayName)?" ":displayName).append(",");
+        sb.append(TextUtils.isEmpty(status)?" ":status).append(",");
+        sb.append(TextUtils.isEmpty(role)? " " : role);
+        return sb.toString();
+    }
+    /**
+     * Create an instance of the ChatGroupUser from formatted string which format is "number, displayName, status, role"
+     * @param data the formatted string which format is "number, displayName, status, role"
+     * @return an instance of the ChatGroupUser or null if the data is format error
+     */
+    public static GroupChatUser fromFormatString(String data) {
+        String[] strs = data.split(",");
+        if(strs.length == 4) {
+            GroupChatUser user = new GroupChatUser();
+            user.setNumber(strs[0].trim());
+            user.setDisplayName(strs[1].trim());
+            user.setRole(strs[3].trim());
+            return user;
+        }
+        return null;
+    }
+
+    /**
+     * Get disconnection method
+     * @return disconnection method
+     */
+    public String getDisconnectionMethod() {
+        return disconnectionMethod;
+    }
+
+    /**
+     * Set disconnection method
+     * @param disconnectionMethod disconnection method
+     */
+    public void setDisconnectionMethod(String disconnectionMethod) {
+        this.disconnectionMethod = disconnectionMethod;
+    }
+
+    /**
+     * Get state
+     * @return state
+     */
+    public String getState() {
+        return state;
+    }
+
+    /**
+     * Set state
+     * @param state state
+     */
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    /**
+     * Get status
+     * @return
+     */
+    public String getStatus() {
+        return status;
+    }
+
+    /**
+     * Set status
+     * @param status
+     */
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    /**
+     * Get time of join the group
+     * @return
+     */
+    public long getTime() {
+        return time;
+    }
+
+    /**
+     * Get user identity of group
+     * @return
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Set user identity of group
+     * @param id
+     */
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * Get group id
+     * @return
+     */
+    public String getGroupId() {
+        return groupId;
+    }
+
+    /**
+     * Set group id
+     * @param groupId
+     */
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    /**
+     * Set time of join the group
+     * @param time
+     */
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    /**
+     * Get agree to join
+     * @return
+     */
+    public int getAgreeToJoin() {
+        return agreeToJoin;
+    }
+
+    /**
+     * Set agree to join
+     * @param agreeToJoin
+     */
+    public void setAgreeToJoin(int agreeToJoin) {
+        this.agreeToJoin = agreeToJoin;
+    }
+
+    /**
+     * Get invite number
+     * @return
+     */
+    public String getInviteNumber() {
+        return inviteNumber;
+    }
+
+    /**
+     * Set invite number
+     * @param inviteNumber
+     */
+    public void setInviteNumber(String inviteNumber) {
+        this.inviteNumber = inviteNumber;
+    }
+
+    /**
+     * Set etype
+     * @return
+     */
+    public String getEtype() {
+        return etype;
+    }
+
+    /**
+     * Get etype
+     * @param etype
+     */
+    public void setEtype(String etype) {
+        this.etype = etype;
+    }
+
+    /**
+     * Get alias
+     * @return
+     */
+    public String getAlias() {
+        return alias;
+    }
+
+    /**
+     * Set alias
+     * @param alias
+     */
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel arg0, int arg1) {
+        arg0.writeString(id);
+        arg0.writeString(uri);
+        arg0.writeString(groupId);
+        arg0.writeString(displayName);
+        arg0.writeString(number);
+        arg0.writeString(disconnectionMethod);
+        arg0.writeString(role);
+        arg0.writeString(state);
+        arg0.writeString(etype);
+        arg0.writeString(alias);
+        arg0.writeString(status);
+        arg0.writeLong(time);
+        arg0.writeInt(agreeToJoin);
+        arg0.writeString(inviteNumber);
+    }
+
+    public void readFromParcel(Parcel source) {
+        id = source.readString();
+        uri = source.readString();
+        groupId = source.readString();
+        displayName = source.readString();
+        number = source.readString();
+        disconnectionMethod = source.readString();
+        role = source.readString();
+        state = source.readString();
+        etype = source.readString();
+        alias = source.readString();
+        status = source.readString();
+        time = source.readLong();
+        agreeToJoin = source.readInt();
+        inviteNumber = source.readString();
+    }
+
+
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("id=" + id);
+        list.add("uri=" + uri);
+        list.add("groupId=" + groupId);
+        list.add("displayName=" + displayName);
+        list.add("number=" + number);
+        list.add("disconnectionMethod=" + disconnectionMethod);
+        list.add("role=" + role);
+        list.add("state=" + state);
+        list.add("etype=" + etype);
+        list.add("alias=" + alias);
+        list.add("status=" + status);
+        list.add("time=" + time);
+        list.add("agreeToJoin=" + agreeToJoin);
+        list.add("inviteNumber=" + inviteNumber);
+        return list.toString();
+    }
+
+
+    public static final Parcelable.Creator<GroupChatUser> CREATOR = new Parcelable.Creator<GroupChatUser>() {
+        public GroupChatUser createFromParcel(Parcel in) {
+            return new GroupChatUser(in);
+        }
+
+        @Override
+        public GroupChatUser[] newArray(int arg0) {
+            return new GroupChatUser[arg0];
+        }
+
+    };
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupNotificationConst.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupNotificationConst.java
new file mode 100644
index 0000000..27d4b5f
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/GroupNotificationConst.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+public class GroupNotificationConst {
+
+    public static final String CREATE = "create";
+
+    public static final String CREATE_NOT_ACTIVE = "create_not_active";
+
+    public static final String MEMBER_JOIN = "join";
+
+    public static final String MODIFY_SUBJECT = "subject";
+
+    public static final String MODIFY_REMARK = "remark";
+
+    public static final String MODIFY_ALIAS = "alias";
+
+    public static final String MODIFY_CHAIRMAN = "chairman";
+
+    public static final String MODIFY_POLICY = "policy";
+
+    public static final String MEMBER_TICK_OUT = "tick";
+
+    public static final String MEMBER_QUIT = "quit";
+
+    public static final String DISBAND = "disband";
+
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ImdnNotification.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ImdnNotification.java
new file mode 100644
index 0000000..e4fbaa3
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/ImdnNotification.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+public class ImdnNotification {
+
+    private String messageId;
+    private String datetime;
+    private String recipientUri;
+    private String originalRecipientUri;
+    private String displayNotificationStatus;
+    private String deliveryNotificationStatus;
+    private int status;
+
+    public String getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(String messageId) {
+        this.messageId = messageId;
+    }
+
+    public String getDatetime() {
+        return datetime;
+    }
+
+    public void setDatetime(String datetime) {
+        this.datetime = datetime;
+    }
+
+    public String getRecipientUri() {
+        return recipientUri;
+    }
+
+    public void setRecipientUri(String recipientUri) {
+        this.recipientUri = recipientUri;
+    }
+
+    public String getOriginalRecipientUri() {
+        return originalRecipientUri;
+    }
+
+    public void setOriginalRecipientUri(String originalRecipientUri) {
+        this.originalRecipientUri = originalRecipientUri;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public String getDisplayNotificationStatus() {
+        return displayNotificationStatus;
+    }
+
+    public void setDisplayNotificationStatus(String displayNotificationStatus) {
+        this.displayNotificationStatus = displayNotificationStatus;
+    }
+
+    public String getDeliveryNotificationStatus() {
+        return deliveryNotificationStatus;
+    }
+
+    public void setDeliveryNotificationStatus(String deliveryNotificationStatus) {
+        this.deliveryNotificationStatus = deliveryNotificationStatus;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MMSMessage.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MMSMessage.aidl
new file mode 100644
index 0000000..86bf9ce
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MMSMessage.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+parcelable MMSMessage;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MMSMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MMSMessage.java
new file mode 100644
index 0000000..d752bb0
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MMSMessage.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.os.Parcel;
+
+public class MMSMessage extends ChatMessage {
+    private String subject;
+
+    @Override
+    public int describeContents() {
+        return super.describeContents();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeString(this.subject);
+    }
+
+    @Override
+    public void readFromParcel(Parcel source) {
+        super.readFromParcel(source);
+        this.subject = source.readString();
+    }
+
+    @Override
+    public String toString() {
+        return super.toString();
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MessageSessionModel.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MessageSessionModel.aidl
new file mode 100644
index 0000000..f13c901
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MessageSessionModel.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+parcelable MessageSessionModel;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MessageSessionModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MessageSessionModel.java
new file mode 100644
index 0000000..7b55335
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/MessageSessionModel.java
@@ -0,0 +1,310 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccounts;
+import com.suntek.mway.rcs.client.api.provider.SuntekMessageData;
+
+/**
+ * <p>
+ * Title:Message session object.
+ * </p>
+ * <p>
+ * Description: the message session
+ * </p>
+ * <p>
+ * Copyright:Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company:pci-suntek
+ * </p>
+ *
+ * @author YFB
+ * @version 1.0
+ */
+public class MessageSessionModel implements Parcelable, Comparable<MessageSessionModel> {
+
+    /**
+     * chat message id
+     */
+    private int messageId;
+
+    /**
+     * message thread id
+     */
+    private long threadId;
+
+    /**
+     * The chat message contact
+     */
+    private String contact;
+
+    /**
+     * The message content
+     */
+    private String data;
+
+    /**
+     * The time that received or sent message
+     */
+    private long time;
+
+    /**
+     * Receiving or sending messages
+     * send message @see {@link SuntekMessageData#MSG_SEND} or receive message @see {@link SuntekMessageData#MSG_RECEIVE}
+     */
+    private int sendReceive;
+
+    /**
+     * The chat type
+     * @see {@link SuntekMessageData#KEY_CHAT_TYPE}
+     */
+    private int chatType;
+
+    /**
+     * Number of messages in session
+     */
+    private int messageCount;
+
+    /**
+     * Time of the last message
+     */
+    private long lastTime;
+
+    /**
+     * The receivers of one to many chat message
+     * null if chat type is not @see {@link SuntekMessageData#CHAT_TYPE_ONE2GROUP}
+     */
+    private String receiversOfOne2Many;
+
+    /**
+     * The group chat info
+     * null if chat type is not @see {@link SuntekMessageData#CHAT_TYPE_GROUP}
+     */
+    private GroupChatModel groupChatModel;
+
+    private PublicAccounts publicAccountModel;
+
+    public static final String KEY_MSG_COUNT = "_msgCount";
+
+    public static final String KEY_LAST_TIME = "_lastTime";
+
+    private static final String KEY_COLUMN_NAME_COUNT = "count(distinct " + SuntekMessageData.KEY_THREAD_ID
+            + ") AS " + KEY_MSG_COUNT;
+
+    private static final String KEY_COLUMN_NAME_LASTTIME = "max(" + SuntekMessageData.KEY_TIME + ") AS "
+            + KEY_LAST_TIME;
+
+    public static final String[] SESSION_PROJECTION = {
+        SuntekMessageData.KEY_ID, SuntekMessageData.KEY_THREAD_ID, SuntekMessageData.KEY_CONTACT,
+        SuntekMessageData.KEY_DATA, SuntekMessageData.KEY_TIME, SuntekMessageData.KEY_SEND_RECEIVE,
+        SuntekMessageData.KEY_CHAT_TYPE,
+        KEY_COLUMN_NAME_COUNT, KEY_COLUMN_NAME_LASTTIME
+    };
+
+    public MessageSessionModel(){
+    }
+
+    public MessageSessionModel(Parcel in) {
+        readFromParcel(in);
+    }
+
+    @Override
+    public String toString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append("MessageSessionModel{")
+            .append("messageId:").append(messageId)
+            .append(",threadId:").append(threadId)
+            .append(",contact:").append(contact)
+            .append(",data:").append(data)
+            .append(",time:").append(time)
+            .append(",sendReceive:").append(sendReceive)
+            .append(",messageCount:").append(messageCount)
+            .append(",lastTime:").append(lastTime)
+            .append(",chatType:").append(chatType)
+            .append(",receiversOfOne2Many:").append(receiversOfOne2Many)
+            .append("}");
+        return buf.toString();
+    }
+
+    public int getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(int messageId) {
+        this.messageId = messageId;
+    }
+
+    public long getThreadId() {
+        return threadId;
+    }
+
+    public void setThreadId(long threadId) {
+        this.threadId = threadId;
+    }
+
+    public String getContact() {
+        return contact;
+    }
+
+    public void setContact(String contact) {
+        this.contact = contact;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public long getTime() {
+        return time;
+    }
+
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    public int getSendReceive() {
+        return sendReceive;
+    }
+
+    public void setSendReceive(int sendReceive) {
+        this.sendReceive = sendReceive;
+    }
+
+    public int getMessageCount() {
+        return messageCount;
+    }
+
+    public void setMessageCount(int messageCount) {
+        this.messageCount = messageCount;
+    }
+
+    public long getLastTime() {
+        return lastTime;
+    }
+
+    public void setLastTime(long lastTime) {
+        this.lastTime = lastTime;
+    }
+
+    public int getChatType() {
+        return chatType;
+    }
+
+    public void setChatType(int chatType) {
+        this.chatType = chatType;
+    }
+
+    public String getReceiversOfOne2Many() {
+        return receiversOfOne2Many;
+    }
+
+    public void setReceiversOfOne2Many(String receiversOfOne2Many) {
+        this.receiversOfOne2Many = receiversOfOne2Many;
+    }
+
+    public GroupChatModel getGroupChatModel() {
+        return groupChatModel;
+    }
+
+    public void setGroupChatModel(GroupChatModel groupChatModel) {
+        this.groupChatModel = groupChatModel;
+    }
+
+    public PublicAccounts getPublicAccountModel() {
+        return publicAccountModel;
+    }
+
+    public void setPublicAccountModel(PublicAccounts publicAccountModel) {
+        this.publicAccountModel = publicAccountModel;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel arg0, int arg1) {
+        arg0.writeInt(messageId);
+        arg0.writeLong(threadId);
+        arg0.writeString(contact);
+        arg0.writeString(data);
+        arg0.writeLong(time);
+        arg0.writeInt(sendReceive);
+        arg0.writeInt(messageCount);
+        arg0.writeLong(lastTime);
+        arg0.writeInt(chatType);
+        arg0.writeString(receiversOfOne2Many);
+        arg0.writeValue(groupChatModel);
+        arg0.writeValue(publicAccountModel);
+    }
+
+    public void readFromParcel(Parcel source) {
+        messageId = source.readInt();
+        threadId = source.readLong();
+        contact = source.readString();
+        data = source.readString();
+        time = source.readLong();
+        sendReceive = source.readInt();
+        messageCount = source.readInt();
+        lastTime = source.readLong();
+        chatType = source.readInt();
+        receiversOfOne2Many = source.readString();
+        groupChatModel = (GroupChatModel) source.readValue(this.getClass().getClassLoader());
+        publicAccountModel = (PublicAccounts) source.readValue(this.getClass().getClassLoader());
+    }
+
+    public static final Parcelable.Creator<MessageSessionModel> CREATOR = new Parcelable.Creator<MessageSessionModel>() {
+        public MessageSessionModel createFromParcel(Parcel in) {
+            return new MessageSessionModel(in);
+        }
+
+        @Override
+        public MessageSessionModel[] newArray(int arg0) {
+            return new MessageSessionModel[arg0];
+        }
+
+    };
+
+    @Override
+    public int compareTo(MessageSessionModel msgSession) {
+        // TODO Auto-generated method stub
+//        return (int) (time - msgSession.getTime());
+        if (time - msgSession.getTime()>0) {
+            return 1;
+        }else if (time - msgSession.getTime()==0) {
+            return 0;
+        } else {
+            return -1;
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicAccount.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicAccount.java
new file mode 100644
index 0000000..a2d109e
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicAccount.java
@@ -0,0 +1,525 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+/**
+ * The Class PublicAccount.
+ */
+public class PublicAccount {
+
+    /** The pa uuid. */
+    private String paUuid = null;
+
+    /** The name. */
+    private String name = null;
+
+    /** The logo. */
+    private String logo = null;
+
+    /** The recommend level. */
+    private int recommendLevel = 0;
+
+    /** The sip uri. */
+    private String sipUri = null;
+
+    /** The followed. */
+    private boolean followed = false;
+
+    /** The accept. */
+    private boolean accept = true;
+
+    /** The followed time. */
+    private String followedTime;
+
+    /** The company. */
+    private String company;
+
+    /** The intro. */
+    private String intro;
+
+    /** The type. */
+    private String type;
+
+    /** The update time. */
+    private String updateTime;
+
+    /** The menu type. */
+    private int    menuType;
+
+    /** The menu timestamp. */
+    private String menuTimestamp;
+
+    /** The subscribe status. */
+    private int    subscribeStatus;
+
+    /** The qr code. */
+    private String qrCode;
+
+    /** The active status. */
+    private int activeStatus;
+
+    /** The tel. */
+    private String tel;
+
+    /** The email. */
+    private String email;
+
+    /** The zip. */
+    private String zip;
+
+    /** The addr. */
+    private String addr;
+
+    /** The field. */
+    private String field;
+
+    /**
+     * Gets the pa uuid.
+     *
+     * @return the pa uuid
+     */
+    public String getPaUuid() {
+        return paUuid;
+    }
+
+    /**
+     * Sets the pa uuid.
+     *
+     * @param paUuid the new pa uuid
+     */
+    public void setPaUuid(String paUuid) {
+        this.paUuid = paUuid;
+    }
+
+    /**
+     * Gets the name.
+     *
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Sets the name.
+     *
+     * @param name the new name
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Gets the logo.
+     *
+     * @return the logo
+     */
+    public String getLogo() {
+        return logo;
+    }
+
+    /**
+     * Sets the logo.
+     *
+     * @param logo the new logo
+     */
+    public void setLogo(String logo) {
+        this.logo = logo;
+    }
+
+    /**
+     * Gets the recommend level.
+     *
+     * @return the recommend level
+     */
+    public int getRecommendLevel() {
+        return recommendLevel;
+    }
+
+    /**
+     * Sets the recommend level.
+     *
+     * @param recommendLevel the new recommend level
+     */
+    public void setRecommendLevel(int recommendLevel) {
+        this.recommendLevel = recommendLevel;
+    }
+
+    /**
+     * Gets the sip uri.
+     *
+     * @return the sip uri
+     */
+    public String getSipUri() {
+        return sipUri;
+    }
+
+    /**
+     * Sets the sip uri.
+     *
+     * @param sipUri the new sip uri
+     */
+    public void setSipUri(String sipUri) {
+        this.sipUri = sipUri;
+    }
+
+    /**
+     * Checks if is followed.
+     *
+     * @return true, if is followed
+     */
+    public boolean isFollowed() {
+        return followed;
+    }
+
+    /**
+     * Sets the followed.
+     *
+     * @param followed the new followed
+     */
+    public void setFollowed(boolean followed) {
+        this.followed = followed;
+    }
+
+    /**
+     * Checks if is accept.
+     *
+     * @return true, if is accept
+     */
+    public boolean isAccept() {
+        return accept;
+    }
+
+    /**
+     * Sets the accept.
+     *
+     * @param accept the new accept
+     */
+    public void setAccept(boolean accept) {
+        this.accept = accept;
+    }
+
+    /**
+     * Gets the followed time.
+     *
+     * @return the followed time
+     */
+    public String getFollowedTime() {
+        return followedTime;
+    }
+
+    /**
+     * Sets the followed time.
+     *
+     * @param followedTime the new followed time
+     */
+    public void setFollowedTime(String followedTime) {
+        this.followedTime = followedTime;
+    }
+
+    /**
+     * Gets the company.
+     *
+     * @return the company
+     */
+    public String getCompany() {
+        return company;
+    }
+
+    /**
+     * Sets the company.
+     *
+     * @param company the new company
+     */
+    public void setCompany(String company) {
+        this.company = company;
+    }
+
+    /**
+     * Gets the intro.
+     *
+     * @return the intro
+     */
+    public String getIntro() {
+        return intro;
+    }
+
+    /**
+     * Sets the intro.
+     *
+     * @param intro the new intro
+     */
+    public void setIntro(String intro) {
+        this.intro = intro;
+    }
+
+    /**
+     * Gets the type.
+     *
+     * @return the type
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Sets the type.
+     *
+     * @param type the new type
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * Gets the update time.
+     *
+     * @return the update time
+     */
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * Sets the update time.
+     *
+     * @param updateTime the new update time
+     */
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * Gets the menu type.
+     *
+     * @return the menu type
+     */
+    public int getMenuType() {
+        return menuType;
+    }
+
+    /**
+     * Sets the menu type.
+     *
+     * @param menuType the new menu type
+     */
+    public void setMenuType(int menuType) {
+        this.menuType = menuType;
+    }
+
+    /**
+     * Gets the menu timestamp.
+     *
+     * @return the menu timestamp
+     */
+    public String getMenuTimestamp() {
+        return menuTimestamp;
+    }
+
+    /**
+     * Sets the menu timestamp.
+     *
+     * @param menuTimestamp the new menu timestamp
+     */
+    public void setMenuTimestamp(String menuTimestamp) {
+        this.menuTimestamp = menuTimestamp;
+    }
+
+    /**
+     * Gets the subscribe status.
+     *
+     * @return the subscribe status
+     */
+    public int getSubscribeStatus() {
+        return subscribeStatus;
+    }
+
+    /**
+     * Sets the subscribe status.
+     *
+     * @param subscribeStatus the new subscribe status
+     */
+    public void setSubscribeStatus(int subscribeStatus) {
+        this.subscribeStatus = subscribeStatus;
+    }
+
+    /**
+     * Gets the qr code.
+     *
+     * @return the qr code
+     */
+    public String getQrCode() {
+        return qrCode;
+    }
+
+    /**
+     * Sets the qr code.
+     *
+     * @param qrCode the new qr code
+     */
+    public void setQrCode(String qrCode) {
+        this.qrCode = qrCode;
+    }
+
+    /**
+     * Gets the active status.
+     *
+     * @return the active status
+     */
+    public int getActiveStatus() {
+        return activeStatus;
+    }
+
+    /**
+     * Sets the active status.
+     *
+     * @param activeStatus the new active status
+     */
+    public void setActiveStatus(int activeStatus) {
+        this.activeStatus = activeStatus;
+    }
+
+    /**
+     * Gets the tel.
+     *
+     * @return the tel
+     */
+    public String getTel() {
+        return tel;
+    }
+
+    /**
+     * Sets the tel.
+     *
+     * @param tel the new tel
+     */
+    public void setTel(String tel) {
+        this.tel = tel;
+    }
+
+    /**
+     * Gets the email.
+     *
+     * @return the email
+     */
+    public String getEmail() {
+        return email;
+    }
+
+    /**
+     * Sets the email.
+     *
+     * @param email the new email
+     */
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    /**
+     * Gets the zip.
+     *
+     * @return the zip
+     */
+    public String getZip() {
+        return zip;
+    }
+
+    /**
+     * Sets the zip.
+     *
+     * @param zip the new zip
+     */
+    public void setZip(String zip) {
+        this.zip = zip;
+    }
+
+    /**
+     * Gets the addr.
+     *
+     * @return the addr
+     */
+    public String getAddr() {
+        return addr;
+    }
+
+    /**
+     * Sets the addr.
+     *
+     * @param addr the new addr
+     */
+    public void setAddr(String addr) {
+        this.addr = addr;
+    }
+
+    /**
+     * Gets the field.
+     *
+     * @return the field
+     */
+    public String getField() {
+        return field;
+    }
+
+    /**
+     * Sets the field.
+     *
+     * @param field the new field
+     */
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        StringBuffer sbuffer = new StringBuffer();
+        sbuffer.append("paUuid=").append(this.paUuid)
+               .append(",name=").append(this.name)
+               .append(",logo=").append(this.logo)
+               .append(",recommendLevel=").append(this.recommendLevel)
+               .append(",sipUri=").append(this.sipUri)
+               .append(",followed=").append(this.followed)
+               .append(",accept=").append(this.accept)
+               .append(",followedTime=").append(this.followedTime)
+               .append(",company=").append(this.company)
+               .append(",intro=").append(this.intro)
+               .append(",type=").append(this.type)
+               .append(",updateTime=").append(this.updateTime)
+               .append(",menuType=").append(this.menuType)
+               .append(",menuTimestamp=").append(this.menuTimestamp)
+               .append(",subscribeStatus=").append(this.subscribeStatus)
+               .append(",qrCode=").append(this.qrCode)
+               .append(",activeStatus=").append(this.activeStatus)
+               .append(",tel=").append(this.tel)
+               .append(",email=").append(this.email)
+               .append(",zip=").append(this.zip)
+               .append(",addr=").append(this.addr)
+               .append(",field=").append(this.field)
+        ;
+
+        return sbuffer.toString();
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicMediaMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicMediaMessage.java
new file mode 100644
index 0000000..4ca9e13
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicMediaMessage.java
@@ -0,0 +1,447 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * The Class PublicMediaMessage.
+ */
+public class PublicMediaMessage extends PublicMessage implements Parcelable{
+
+    /** The createtime. */
+    private String createtime;
+
+    /** The forwardable. */
+//    private String forwardable;
+
+    /** The msgtype. */
+    private String msgtype;
+
+    /** The msg id. */
+//    private String msgId;
+
+    /** The media. */
+    private PublicMediaContent media;
+
+    /**
+     * Instantiates a new public media message.
+     */
+    public PublicMediaMessage(){}
+
+    /**
+     * Instantiates a new public media message.
+     *
+     * @param source the source
+     */
+    public PublicMediaMessage( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /* (non-Javadoc)
+     * @see com.suntek.mway.rcs.client.api.provider.model.PublicMessage#describeContents()
+     */
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /* (non-Javadoc)
+     * @see com.suntek.mway.rcs.client.api.provider.model.PublicMessage#writeToParcel(android.os.Parcel, int)
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString( createtime );
+//        dest.writeString( forwardable );
+        dest.writeString( msgtype );
+//        dest.writeString( msgId );
+        dest.writeValue( media );
+    }
+
+    /**
+     * Read from parcel.
+     *
+     * @param source the source
+     */
+    public void readFromParcel( Parcel source )
+    {
+        createtime = source.readString();
+//        forwardable = source.readString();
+        msgtype = source.readString();
+//        msgId = source.readString();
+        media = (PublicMediaContent) source.readValue(this.getClass().getClassLoader());
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<PublicMediaMessage>    CREATOR    = new Parcelable.Creator<PublicMediaMessage>() {
+                                                                                @Override
+                                                                                public PublicMediaMessage createFromParcel( Parcel source )
+                                                                                {
+                                                                                    return new PublicMediaMessage( source );
+                                                                                }
+
+                                                                                @Override
+                                                                                public PublicMediaMessage[] newArray( int size )
+                                                                                {
+                                                                                    return new PublicMediaMessage[ size ];
+                                                                                }
+                                                                            };
+
+    /**
+     * Gets the createtime.
+     *
+     * @return the createtime
+     */
+    public String getCreatetime() {
+        return createtime;
+    }
+
+    /**
+     * Sets the createtime.
+     *
+     * @param createtime the new createtime
+     */
+    public void setCreatetime(String createtime) {
+        this.createtime = createtime;
+    }
+
+    /**
+     * Gets the forwardable.
+     *
+     * @return the forwardable
+     */
+//    public String getForwardable() {
+//        return forwardable;
+//    }
+
+    /**
+     * Sets the forwardable.
+     *
+     * @param forwardable the new forwardable
+     */
+//    public void setForwardable(String forwardable) {
+//        this.forwardable = forwardable;
+//    }
+
+    /**
+     * Gets the msgtype.
+     *
+     * @return the msgtype
+     */
+    public String getMsgtype() {
+        return msgtype;
+    }
+
+    /**
+     * Sets the msgtype.
+     *
+     * @param msgtype the new msgtype
+     */
+    public void setMsgtype(String msgtype) {
+        this.msgtype = msgtype;
+    }
+
+    /**
+     * Gets the msg id.
+     *
+     * @return the msg id
+     */
+//    public String getMsgId() {
+//        return msgId;
+//    }
+
+    /**
+     * Sets the msg id.
+     *
+     * @param msgId the new msg id
+     */
+//    public void setMsgId(String msgId) {
+//        this.msgId = msgId;
+//    }
+
+    /**
+     * Gets the media.
+     *
+     * @return the media
+     */
+    public PublicMediaContent getMedia() {
+        return media;
+    }
+
+    /**
+     * Sets the media.
+     *
+     * @param media the new media
+     */
+    public void setMedia(PublicMediaContent media) {
+        this.media = media;
+    }
+
+    /**
+     * The Class PublicMediaContent.
+     */
+    public static class PublicMediaContent implements Parcelable{
+
+        /** The thumb link. */
+        private String thumbLink;
+
+        /** The original link. */
+        private String originalLink;
+
+        /** The title. */
+        private String title;
+
+        /** The file size. */
+        private String fileSize;
+
+        /** The duration. */
+        private String duration;
+
+        /** The file type. */
+        private String fileType;
+
+        /** The createtime. */
+//        private String createtime;
+
+        /** The media uuid. */
+        private String mediaUuid;
+
+        /**
+         * Instantiates a new public media content.
+         */
+        public PublicMediaContent(){}
+
+        /**
+         * Instantiates a new public media content.
+         *
+         * @param source the source
+         */
+        public PublicMediaContent( Parcel source )
+        {
+            readFromParcel( source );
+        }
+
+        /* (non-Javadoc)
+         * @see android.os.Parcelable#describeContents()
+         */
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        /* (non-Javadoc)
+         * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
+         */
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeString( thumbLink );
+            dest.writeString( originalLink );
+            dest.writeString( title );
+            dest.writeString( fileSize );
+            dest.writeString( duration );
+            dest.writeString( fileType );
+//            dest.writeString( createtime );
+            dest.writeString( mediaUuid );
+        }
+
+        /**
+         * Read from parcel.
+         *
+         * @param source the source
+         */
+        public void readFromParcel( Parcel source )
+        {
+            thumbLink = source.readString();
+            originalLink = source.readString();
+            title = source.readString();
+            fileSize = source.readString();
+            duration = source.readString();
+            fileType = source.readString();
+//            createtime = source.readString();
+            mediaUuid = source.readString();
+        }
+
+        /** The parcel creator. */
+        public static final Parcelable.Creator<PublicMediaContent>    CREATOR    = new Parcelable.Creator<PublicMediaContent>() {
+                                                                                    @Override
+                                                                                    public PublicMediaContent createFromParcel( Parcel source )
+                                                                                    {
+                                                                                        return new PublicMediaContent( source );
+                                                                                    }
+
+                                                                                    @Override
+                                                                                    public PublicMediaContent[] newArray( int size )
+                                                                                    {
+                                                                                        return new PublicMediaContent[ size ];
+                                                                                    }
+                                                                                };
+
+        /**
+         * Gets the thumb link.
+         *
+         * @return the thumb link
+         */
+        public String getThumbLink() {
+            return thumbLink;
+        }
+
+        /**
+         * Sets the thumb link.
+         *
+         * @param thumbLink the new thumb link
+         */
+        public void setThumbLink(String thumbLink) {
+            this.thumbLink = thumbLink;
+        }
+
+        /**
+         * Gets the original link.
+         *
+         * @return the original link
+         */
+        public String getOriginalLink() {
+            return originalLink;
+        }
+
+        /**
+         * Sets the original link.
+         *
+         * @param originalLink the new original link
+         */
+        public void setOriginalLink(String originalLink) {
+            this.originalLink = originalLink;
+        }
+
+        /**
+         * Gets the title.
+         *
+         * @return the title
+         */
+        public String getTitle() {
+            return title;
+        }
+
+        /**
+         * Sets the title.
+         *
+         * @param title the new title
+         */
+        public void setTitle(String title) {
+            this.title = title;
+        }
+
+        /**
+         * Gets the file size.
+         *
+         * @return the file size
+         */
+        public String getFileSize() {
+            return fileSize;
+        }
+
+        /**
+         * Sets the file size.
+         *
+         * @param fileSize the new file size
+         */
+        public void setFileSize(String fileSize) {
+            this.fileSize = fileSize;
+        }
+
+        /**
+         * Gets the duration.
+         *
+         * @return the duration
+         */
+        public String getDuration() {
+            return duration;
+        }
+
+        /**
+         * Sets the duration.
+         *
+         * @param duration the new duration
+         */
+        public void setDuration(String duration) {
+            this.duration = duration;
+        }
+
+        /**
+         * Gets the file type.
+         *
+         * @return the file type
+         */
+        public String getFileType() {
+            return fileType;
+        }
+
+        /**
+         * Sets the file type.
+         *
+         * @param fileType the new file type
+         */
+        public void setFileType(String fileType) {
+            this.fileType = fileType;
+        }
+
+        /**
+         * Gets the createtime.
+         *
+         * @return the createtime
+        public String getCreatetime() {
+            return createtime;
+        }
+         */
+
+        /**
+         * Sets the createtime.
+         *
+         * @param createtime the new createtime
+        public void setCreatetime(String createtime) {
+            this.createtime = createtime;
+        }
+         */
+
+        /**
+         * Gets the media uuid.
+         *
+         * @return the media uuid
+         */
+        public String getMediaUuid() {
+            return mediaUuid;
+        }
+
+        /**
+         * Sets the media uuid.
+         *
+         * @param mediaUuid the new media uuid
+         */
+        public void setMediaUuid(String mediaUuid) {
+            this.mediaUuid = mediaUuid;
+        }
+
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicMessage.java
new file mode 100644
index 0000000..8a7e661
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicMessage.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * The Class PublicMessage.
+ */
+public class PublicMessage  implements Parcelable{
+
+    /** The Constant TEXT. */
+    public static final String TEXT = "10";
+
+    /** The Constant IMAGE. */
+    public static final String IMAGE = "20";
+
+    /** The Constant AUDIO. */
+    public static final String AUDIO = "40";
+
+    /** The Constant VIDEO. */
+    public static final String VEDIO = "30";
+
+    /** The Constant TOPIC. */
+    public static final String TOPIC = "50";
+
+    /** The Constant TOPIC SINGLE. */
+    public static final String TOPIC_SINGLE = "51";
+
+    /** The Constant TOPIC MORE. */
+    public static final String TOPIC_MORE = "52";
+
+    /**
+     * Instantiates a new public message.
+     */
+    public PublicMessage() {
+
+    }
+
+    /**
+     * Instantiates a new public message.
+     *
+     * @param source the source
+     */
+    public PublicMessage(Parcel source) {
+
+    }
+
+    /* (non-Javadoc)
+     * @see android.os.Parcelable#describeContents()
+     */
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /* (non-Javadoc)
+     * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
+     */
+    @Override
+    public void writeToParcel(Parcel arg0, int arg1) {
+
+    }
+
+    /** The Constant CREATOR. */
+    public static final Parcelable.Creator<PublicMessage> CREATOR = new Parcelable.Creator<PublicMessage>() {
+        public PublicMessage createFromParcel(Parcel in) {
+            return new PublicMessage(in);
+        }
+
+        @Override
+        public PublicMessage[] newArray(int size) {
+            return new PublicMessage[size];
+        }
+
+    };
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicTextMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicTextMessage.java
new file mode 100644
index 0000000..f0bcad2
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicTextMessage.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * The Class PublicTextMessage.
+ */
+public class PublicTextMessage extends PublicMessage implements Parcelable{
+
+    /** The createtime. */
+    private String createtime;
+
+    /** The forwardable. */
+//    private String forwardable;
+
+    /** The msgtype. */
+    private String msgtype;
+
+    /** The content. */
+    private String content;
+
+    /** The msg id. */
+//    private String msgId;
+
+    /**
+     * Instantiates a new public text message.
+     */
+    public PublicTextMessage(){}
+
+    /**
+     * Instantiates a new public text message.
+     *
+     * @param source the source
+     */
+    public PublicTextMessage( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString( createtime );
+//        dest.writeString( forwardable );
+        dest.writeString( msgtype );
+        dest.writeString( content );
+//        dest.writeString( msgId );
+    }
+
+    /**
+     * Read from parcel.
+     *
+     * @param source the source
+     */
+    public void readFromParcel( Parcel source )
+    {
+        createtime = source.readString();
+//        forwardable = source.readString();
+        msgtype = source.readString();
+        content = source.readString();
+//        msgId = source.readString();
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<PublicTextMessage>    CREATOR    = new Parcelable.Creator<PublicTextMessage>() {
+                                                                                @Override
+                                                                                public PublicTextMessage createFromParcel( Parcel source )
+                                                                                {
+                                                                                    return new PublicTextMessage( source );
+                                                                                }
+
+                                                                                @Override
+                                                                                public PublicTextMessage[] newArray( int size )
+                                                                                {
+                                                                                    return new PublicTextMessage[ size ];
+                                                                                }
+                                                                            };
+
+    /**
+     * Gets the createtime.
+     *
+     * @return the createtime
+     */
+    public String getCreatetime() {
+        return createtime;
+    }
+
+    /**
+     * Sets the createtime.
+     *
+     * @param createtime the new createtime
+     */
+    public void setCreatetime(String createtime) {
+        this.createtime = createtime;
+    }
+
+    /**
+     * Gets the forwardable.
+     *
+     * @return the forwardable
+     */
+//    public String getForwardable() {
+//        return forwardable;
+//    }
+
+    /**
+     * Sets the forwardable.
+     *
+     * @param forwardable the new forwardable
+     */
+//    public void setForwardable(String forwardable) {
+//        this.forwardable = forwardable;
+//    }
+
+    /**
+     * Gets the msgtype.
+     *
+     * @return the msgtype
+     */
+    public String getMsgtype() {
+        return msgtype;
+    }
+
+    /**
+     * Sets the msgtype.
+     *
+     * @param msgtype the new msgtype
+     */
+    public void setMsgtype(String msgtype) {
+        this.msgtype = msgtype;
+    }
+
+    /**
+     * Gets the content.
+     *
+     * @return the content
+     */
+    public String getContent() {
+        return content;
+    }
+
+    /**
+     * Sets the content.
+     *
+     * @param content the new content
+     */
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    /**
+     * Gets the msg id.
+     *
+     * @return the msg id
+     */
+//    public String getMsgId() {
+//        return msgId;
+//    }
+
+    /**
+     * Sets the msg id.
+     *
+     * @param msgId the new msg id
+     */
+//    public void setMsgId(String msgId) {
+//        this.msgId = msgId;
+//    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicTopicMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicTopicMessage.java
new file mode 100644
index 0000000..5dc8d2c
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/PublicTopicMessage.java
@@ -0,0 +1,497 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * The Class PublicTopicMessage.
+ */
+public class PublicTopicMessage extends PublicMessage implements Parcelable{
+
+    /** The createtime. */
+    private String createtime;
+
+    /** The forwardable. */
+//    private String forwardable;
+
+    /** The msgtype. */
+    private String msgtype;
+
+    /** The msg id. */
+//    private String msgId;
+
+    /** The smscontent. */
+//    private String smscontent;
+
+    /** The sectioncount. */
+//    private String sectioncount;
+
+    /** The topics. */
+    private List<PublicTopicContent> topics;
+
+    /**
+     * Instantiates a new public topic message.
+     */
+    public PublicTopicMessage(){}
+
+    /**
+     * Instantiates a new public topic message.
+     *
+     * @param source the source
+     */
+    public PublicTopicMessage( Parcel source )
+    {
+        readFromParcel( source );
+    }
+
+    /* (non-Javadoc)
+     * @see com.suntek.mway.rcs.client.api.provider.model.PublicMessage#describeContents()
+     */
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /* (non-Javadoc)
+     * @see com.suntek.mway.rcs.client.api.provider.model.PublicMessage#writeToParcel(android.os.Parcel, int)
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString( createtime );
+//        dest.writeString( forwardable );
+        dest.writeString( msgtype );
+//        dest.writeString( msgId );
+//        dest.writeString( smscontent );
+//        dest.writeString( sectioncount );
+        dest.writeList( topics );
+    }
+
+    /**
+     * Read from parcel.
+     *
+     * @param source the source
+     */
+    public void readFromParcel( Parcel source )
+    {
+        createtime = source.readString();
+//        forwardable = source.readString();
+        msgtype = source.readString();
+//        msgId = source.readString();
+//        smscontent = source.readString();
+//        sectioncount = source.readString();
+        topics = new LinkedList<PublicTopicContent>();
+        source.readList( topics, this.getClass().getClassLoader() );
+    }
+
+    /** The parcel creator. */
+    public static final Parcelable.Creator<PublicTopicMessage>    CREATOR    = new Parcelable.Creator<PublicTopicMessage>() {
+                                                                                @Override
+                                                                                public PublicTopicMessage createFromParcel( Parcel source )
+                                                                                {
+                                                                                    return new PublicTopicMessage( source );
+                                                                                }
+
+                                                                                @Override
+                                                                                public PublicTopicMessage[] newArray( int size )
+                                                                                {
+                                                                                    return new PublicTopicMessage[ size ];
+                                                                                }
+                                                                            };
+
+
+    /**
+     * Gets the createtime.
+     *
+     * @return the createtime
+     */
+    public String getCreatetime() {
+        return createtime;
+    }
+
+    /**
+     * Sets the createtime.
+     *
+     * @param createtime the new createtime
+     */
+    public void setCreatetime(String createtime) {
+        this.createtime = createtime;
+    }
+
+    /**
+     * Gets the forwardable.
+     *
+     * @return the forwardable
+     */
+//    public String getForwardable() {
+//        return forwardable;
+//    }
+
+    /**
+     * Sets the forwardable.
+     *
+     * @param forwardable the new forwardable
+     */
+//    public void setForwardable(String forwardable) {
+//        this.forwardable = forwardable;
+//    }
+
+    /**
+     * Gets the msgtype.
+     *
+     * @return the msgtype
+     */
+    public String getMsgtype() {
+        return msgtype;
+    }
+
+    /**
+     * Sets the msgtype.
+     *
+     * @param msgtype the new msgtype
+     */
+    public void setMsgtype(String msgtype) {
+        this.msgtype = msgtype;
+    }
+
+    /**
+     * Gets the msg id.
+     *
+     * @return the msg id
+     */
+//    public String getMsgId() {
+//        return msgId;
+//    }
+
+    /**
+     * Sets the msg id.
+     *
+     * @param msgId the new msg id
+     */
+//    public void setMsgId(String msgId) {
+//        this.msgId = msgId;
+//    }
+
+    /**
+     * Gets the smscontent.
+     *
+     * @return the smscontent
+     */
+//    public String getSmscontent() {
+//        return smscontent;
+//    }
+
+    /**
+     * Sets the smscontent.
+     *
+     * @param smscontent the new smscontent
+     */
+//    public void setSmscontent(String smscontent) {
+//        this.smscontent = smscontent;
+//    }
+
+    /**
+     * Gets the sectioncount.
+     *
+     * @return the sectioncount
+     */
+//    public String getSectioncount() {
+//        return sectioncount;
+//    }
+
+    /**
+     * Sets the sectioncount.
+     *
+     * @param sectioncount the new sectioncount
+     */
+//    public void setSectioncount(String sectioncount) {
+//        this.sectioncount = sectioncount;
+//    }
+
+    /**
+     * Gets the topics.
+     *
+     * @return the topics
+     */
+    public List<PublicTopicContent> getTopics() {
+        return topics;
+    }
+
+    /**
+     * Sets the topics.
+     *
+     * @param topics the new topics
+     */
+    public void setTopics(List<PublicTopicContent> topics) {
+        this.topics = topics;
+    }
+
+    /**
+     * The Class PublicTopicContent.
+     */
+    public static class PublicTopicContent implements Parcelable{
+
+        /** The title. */
+        private String title;
+
+        /** The author. */
+        private String author;
+
+        /** The thumb link. */
+        private String thumbLink;
+
+        /** The original link. */
+        private String originalLink;
+
+        /** The source link. */
+        private String sourceLink;
+
+        /** The media uuid. */
+        private String mediaUuid;
+
+        /** The main text. */
+        private String mainText;
+
+        /** The body link. */
+        private String bodyLink;
+
+        /**
+         * Instantiates a new public topic content.
+         */
+        public PublicTopicContent(){}
+
+        /**
+         * Instantiates a new public topic content.
+         *
+         * @param source the source
+         */
+        public PublicTopicContent(Parcel source){
+            readFromParcel( source );
+        }
+
+        /* (non-Javadoc)
+         * @see android.os.Parcelable#describeContents()
+         */
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        /* (non-Javadoc)
+         * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
+         */
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeString(title);
+            dest.writeString(author);
+            dest.writeString(thumbLink);
+            dest.writeString(originalLink);
+            dest.writeString(sourceLink);
+            dest.writeString(mediaUuid);
+            dest.writeString(mainText);
+            dest.writeString(bodyLink);
+        }
+
+        /**
+         * Read from parcel.
+         *
+         * @param source the source
+         */
+        public void readFromParcel( Parcel source ){
+            title = source.readString();
+            author = source.readString();
+            thumbLink = source.readString();
+            originalLink = source.readString();
+            sourceLink = source.readString();
+            mediaUuid = source.readString();
+            mainText = source.readString();
+            bodyLink = source.readString();
+        }
+
+        /** The parcel creator. */
+        public static final Parcelable.Creator<PublicTopicContent>    CREATOR    = new Parcelable.Creator<PublicTopicContent>() {
+                                                                                    @Override
+                                                                                    public PublicTopicContent createFromParcel( Parcel source )
+                                                                                    {
+                                                                                        return new PublicTopicContent( source );
+                                                                                    }
+
+                                                                                    @Override
+                                                                                    public PublicTopicContent[] newArray( int size )
+                                                                                    {
+                                                                                        return new PublicTopicContent[ size ];
+                                                                                    }
+                                                                                };
+
+        /**
+         * Gets the title.
+         *
+         * @return the title
+         */
+        public String getTitle() {
+            return title;
+        }
+
+        /**
+         * Sets the title.
+         *
+         * @param title the new title
+         */
+        public void setTitle(String title) {
+            this.title = title;
+        }
+
+        /**
+         * Gets the author.
+         *
+         * @return the author
+         */
+        public String getAuthor() {
+            return author;
+        }
+
+        /**
+         * Sets the author.
+         *
+         * @param author the new author
+         */
+        public void setAuthor(String author) {
+            this.author = author;
+        }
+
+        /**
+         * Gets the thumb link.
+         *
+         * @return the thumb link
+         */
+        public String getThumbLink() {
+            return thumbLink;
+        }
+
+        /**
+         * Sets the thumb link.
+         *
+         * @param thumbLink the new thumb link
+         */
+        public void setThumbLink(String thumbLink) {
+            this.thumbLink = thumbLink;
+        }
+
+        /**
+         * Gets the original link.
+         *
+         * @return the original link
+         */
+        public String getOriginalLink() {
+            return originalLink;
+        }
+
+        /**
+         * Sets the original link.
+         *
+         * @param originalLink the new original link
+         */
+        public void setOriginalLink(String originalLink) {
+            this.originalLink = originalLink;
+        }
+
+        /**
+         * Gets the source link.
+         *
+         * @return the source link
+         */
+        public String getSourceLink() {
+            return sourceLink;
+        }
+
+        /**
+         * Sets the source link.
+         *
+         * @param sourceLink the new source link
+         */
+        public void setSourceLink(String sourceLink) {
+            this.sourceLink = sourceLink;
+        }
+
+        /**
+         * Gets the media uuid.
+         *
+         * @return the media uuid
+         */
+        public String getMediaUuid() {
+            return mediaUuid;
+        }
+
+        /**
+         * Sets the media uuid.
+         *
+         * @param mediaUuid the new media uuid
+         */
+        public void setMediaUuid(String mediaUuid) {
+            this.mediaUuid = mediaUuid;
+        }
+
+        /**
+         * Gets the main text.
+         *
+         * @return the main text
+         */
+        public String getMainText() {
+            return mainText;
+        }
+
+        /**
+         * Sets the main text.
+         *
+         * @param mainText the new main text
+         */
+        public void setMainText(String mainText) {
+            this.mainText = mainText;
+        }
+
+        /**
+         * Gets the body link.
+         *
+         * @return the body link
+         */
+        public String getBodyLink() {
+            return bodyLink;
+        }
+
+        /**
+         * Sets the body link.
+         *
+         * @param bodyLink the new body link
+         */
+        public void setBodyLink(String bodyLink) {
+            this.bodyLink = bodyLink;
+        }
+
+
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/SimpleMsg.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/SimpleMsg.aidl
new file mode 100644
index 0000000..8f10e72
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/SimpleMsg.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+parcelable SimpleMsg;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/SimpleMsg.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/SimpleMsg.java
new file mode 100644
index 0000000..900ef1a
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/SimpleMsg.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class SimpleMsg implements Parcelable {
+    private String rowId;
+
+    private String messageId;
+
+    private int storeType;
+
+    public SimpleMsg(){
+    }
+
+    public SimpleMsg(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public String getRowId() {
+        return rowId;
+    }
+
+    public void setRowId(String rowId) {
+        this.rowId = rowId;
+    }
+
+    public String getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(String messageId) {
+        this.messageId = messageId;
+    }
+
+    public int getStoreType() {
+        return storeType;
+    }
+
+    public void setStoreType(int storeType) {
+        this.storeType = storeType;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(rowId);
+        dest.writeString(messageId);
+        dest.writeInt(storeType);
+    }
+
+    public void readFromParcel(Parcel source) {
+        rowId = source.readString();
+        messageId = source.readString();
+        storeType = source.readInt();
+    }
+
+    public static final Parcelable.Creator<SimpleMsg> CREATOR = new Parcelable.Creator<SimpleMsg>() {
+        public SimpleMsg createFromParcel(Parcel in) {
+            return new SimpleMsg(in);
+        }
+
+        @Override
+        public SimpleMsg[] newArray(int size) {
+            return new SimpleMsg[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("rowId=" + rowId);
+        list.add("messageId=" + messageId);
+        list.add("storeType=" + storeType);
+        return list.toString();
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/TopMessageData.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/TopMessageData.aidl
new file mode 100644
index 0000000..d92ee01
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/TopMessageData.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+parcelable TopMessageData;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/TopMessageData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/TopMessageData.java
new file mode 100644
index 0000000..a6c69a1
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/TopMessageData.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.provider.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+
+public class TopMessageData implements Parcelable{
+
+
+    // messages show on the top of frame
+    public static final String TABLE_TOP_MESSAGE = "topMessage";
+
+    // autoincrement id
+    public static final String KEY_ID = "_id";
+
+    // thread id
+    public static final String KEY_THREAD_ID = "_threadId";
+
+    // the time of setting message placed at the top
+    public static final String KEY_TIME = "_time";
+
+
+    private int id;
+
+    private String threadId;
+
+    private long time;
+
+    public TopMessageData(){
+    }
+
+    public TopMessageData(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getThreadId() {
+        return threadId;
+    }
+
+    public void setThreadId(String threadId) {
+        this.threadId = threadId;
+    }
+
+    public long getTime() {
+        return time;
+    }
+
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Parcelable.Creator<TopMessageData> CREATOR = new Parcelable.Creator<TopMessageData>() {
+        public TopMessageData createFromParcel(Parcel in) {
+            return new TopMessageData(in);
+        }
+
+        @Override
+        public TopMessageData[] newArray(int size) {
+            return new TopMessageData[size];
+        }
+
+    };
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(id);
+        dest.writeString(threadId);
+        dest.writeLong(time);
+    }
+
+    public void readFromParcel(Parcel source) {
+        id = source.readInt();
+        threadId = source.readString();
+        time = source.readLong();
+    }
+
+    @Override
+    public String toString() {
+        return "TopMessageData [id=" + id + ", threadId=" + threadId
+                + ", time=" + time + "]";
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/registration/IRegistrationApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/registration/IRegistrationApi.aidl
new file mode 100644
index 0000000..06026f2
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/registration/IRegistrationApi.aidl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.registration;
+
+interface IRegistrationApi {
+
+    boolean register();
+    
+    boolean unregister();
+    
+    boolean cancel();
+
+    
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/IRcsSettingApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/IRcsSettingApi.aidl
new file mode 100644
index 0000000..1c57d48
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/IRcsSettingApi.aidl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.setting;
+
+import com.suntek.mway.rcs.client.api.setting.RcsUserProfileInfo;
+import com.suntek.mway.rcs.client.api.setting.SystemInfo;
+
+interface IRcsSettingApi {
+
+    // User accept rcs auto registration provisions and press accept button to continue
+    void acceptAutoReg();
+    
+    //boolean setProfileInfo(in RcsUserProfileInfo rcsUserProfileInfo);
+    
+    RcsUserProfileInfo getRcsUserProfileInfo();
+    
+    SystemInfo getNetworkInfo();
+    
+    boolean isOnline();
+    
+    void checkOtp(String otp);
+
+    void start();
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/LoginUser.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/LoginUser.aidl
new file mode 100644
index 0000000..c6024be
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/LoginUser.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.setting;
+
+parcelable LoginUser;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/LoginUser.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/LoginUser.java
new file mode 100644
index 0000000..4c781d5
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/LoginUser.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.setting;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class LoginUser implements Parcelable {
+
+    private String loginAccout;
+    private String password;
+    private boolean isSupportVoLTE;
+
+    public LoginUser(String account,String pwd) {
+        // TODO Auto-generated constructor stub
+        this.loginAccout = account;
+        this.password = pwd;
+    }
+
+    public LoginUser(Parcel source) {
+        // TODO Auto-generated constructor stub
+        readFromParcel( source );
+    }
+
+    public String getLoginAccout() {
+        return loginAccout;
+    }
+
+    public void setLoginAccout(String loginAccout) {
+        this.loginAccout = loginAccout;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public boolean isSupportVoLTE() {
+        return isSupportVoLTE;
+    }
+
+    public void setSupportVoLTE(boolean isSupportVoLTE) {
+        this.isSupportVoLTE = isSupportVoLTE;
+    }
+
+    @Override
+    public int describeContents() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        // TODO Auto-generated method stub
+        dest.writeString(loginAccout);
+        dest.writeString(password);
+        dest.writeBooleanArray( new boolean[]{ isSupportVoLTE } );
+    }
+
+    public void readFromParcel( Parcel source )
+    {
+        loginAccout = source.readString();
+        password = source.readString();
+
+        boolean[] val = new boolean[ 1 ];
+        source.readBooleanArray( val );
+        isSupportVoLTE = val[ 0 ];
+    }
+
+    /**
+     * a fast way to get a Parcelable creator.
+     */
+    public static final Parcelable.Creator<LoginUser> CREATOR = new Parcelable.Creator<LoginUser>() {
+        public LoginUser createFromParcel(Parcel source) {
+            return new LoginUser(source);
+        }
+
+        public LoginUser[] newArray(int size) {
+            return new LoginUser[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        list.add("loginAccount=" + this.loginAccout);
+        list.add("password=" + this.password);
+        list.add("isSupportVoLTE=" + this.isSupportVoLTE);
+        return list.toString();
+    }
+
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/RcsUserProfileInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/RcsUserProfileInfo.aidl
new file mode 100644
index 0000000..de99883
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/RcsUserProfileInfo.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.setting;
+
+parcelable RcsUserProfileInfo;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/RcsUserProfileInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/RcsUserProfileInfo.java
new file mode 100644
index 0000000..9ee3d05
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/RcsUserProfileInfo.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.setting;
+
+import com.suntek.mway.rcs.client.api.constant.APIConstant;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * <p>Title: RcsUserProfileInfo class</p>
+ * <p>
+ * Description: The class <code>RcsUserProfileInfo</code> represents a information of
+ * RCS user profile, which is indicated by the field definition in this class.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class RcsUserProfileInfo implements Parcelable {
+
+    /**
+     * SIP private URI with "sip:+86" prefix.
+     */
+    private String sipPrivateUri;
+
+    /**
+     * only telephone number
+     */
+    private String userName;
+    private int imStatus;
+    private boolean isLocalUser;
+    private int terminalType;
+    private String IMSI;
+    private String MCC;
+    private String MNC;
+    private String version;
+
+    /**
+     * Create a new instance of UserProfileInfo
+     */
+    public RcsUserProfileInfo() {
+
+    }
+
+    /**
+     * Create a new instance of UserProfileInfo with another Parcelable object.
+     * @param source Parcelable source
+     */
+    public RcsUserProfileInfo(Parcel source) {
+
+        sipPrivateUri = source.readString();
+        userName = source.readString();
+        imStatus = source.readInt();
+
+        boolean[] value = new boolean[ 1 ];
+        source.readBooleanArray( value );
+        isLocalUser = value[ 0 ];
+
+        terminalType = source.readInt();
+        IMSI = source.readString();
+        MCC = source.readString();
+        MNC = source.readString();
+        version = source.readString();
+    }
+
+    /**
+     * Get SIP private uri
+     * @return SIP private uri
+     */
+    public String getSipPrivateUri() {
+        return sipPrivateUri;
+    }
+
+    /**
+     * Set SIP private uri
+     * @param sipPrivateUri SIP private uri
+     */
+    public void setSipPrivateUri(String sipPrivateUri) {
+        this.sipPrivateUri = sipPrivateUri;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public int getImStatus() {
+        return imStatus;
+    }
+
+    public void setImStatus(int imStatus) {
+        this.imStatus = imStatus;
+    }
+
+    public boolean isLocalUser() {
+        return isLocalUser;
+    }
+
+    public void setLocalUser(boolean isLocalUser) {
+        this.isLocalUser = isLocalUser;
+    }
+
+    public int getTerminalType() {
+        return terminalType;
+    }
+
+    public void setTerminalType(int terminalType) {
+        this.terminalType = terminalType;
+    }
+
+    public String getIMSI() {
+        return IMSI;
+    }
+
+    public void setIMSI(String iMSI) {
+        IMSI = iMSI;
+    }
+
+    public String getMCC() {
+        return MCC;
+    }
+
+    public void setMCC(String mCC) {
+        MCC = mCC;
+    }
+
+    public String getMNC() {
+        return MNC;
+    }
+
+    public void setMNC(String mNC) {
+        MNC = mNC;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    /**
+     * Describe the kinds of special objects contained in this Parcelable's
+     * marshalled representation
+     *
+     * @return Integer
+     */
+    @Override
+    public int describeContents() {
+        return APIConstant.PARCEL_OBJECT_TYPE;
+    }
+
+    /**
+     * Write parcelable object
+     *
+     * @param dest The Parcel in which the object should be written
+     * @param flags Additional flags about how the object should be written
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+
+        dest.writeString(sipPrivateUri);
+        dest.writeString(userName);
+        dest.writeInt(imStatus);
+
+        dest.writeBooleanArray( new boolean[] { isLocalUser } );
+
+        dest.writeInt(terminalType);
+
+        dest.writeString(IMSI);
+        dest.writeString(MCC);
+        dest.writeString(MNC);
+        dest.writeString(version);
+    }
+
+    /**
+     * a fast way to get a Parcelable creator.
+     */
+    public static final Parcelable.Creator<RcsUserProfileInfo> CREATOR = new Parcelable.Creator<RcsUserProfileInfo>() {
+        public RcsUserProfileInfo createFromParcel(Parcel source) {
+            return new RcsUserProfileInfo(source);
+        }
+
+        public RcsUserProfileInfo[] newArray(int size) {
+            return new RcsUserProfileInfo[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        return "RcsUserProfileInfo [sipPrivateUri=" + sipPrivateUri
+                + ", userName=" + userName + ", imStatus=" + imStatus
+                + ", isLocalUser=" + isLocalUser + ", terminalType="
+                + terminalType + ", IMSI=" + IMSI + ", MCC=" + MCC + ", MNC="
+                + MNC + ", version=" + version + "]";
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/SystemInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/SystemInfo.aidl
new file mode 100644
index 0000000..ba36d22
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/SystemInfo.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.setting;
+
+parcelable SystemInfo;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/SystemInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/SystemInfo.java
new file mode 100644
index 0000000..91cde20
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/SystemInfo.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.setting;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class SystemInfo implements Parcelable {
+
+    private int networkType;
+    private int networkFastType;
+    private String ssid;
+    private String apn;
+    private boolean isSimCardExist;
+    private String ipAddress;
+
+    public SystemInfo() {
+        // TODO Auto-generated constructor stub
+    }
+    public SystemInfo(Parcel source) {
+        // TODO Auto-generated constructor stub
+        networkType = source.readInt();
+        networkFastType = source.readInt();
+        ssid = source.readString();
+        apn = source.readString();
+
+        boolean[] value = new boolean[ 1 ];
+        source.readBooleanArray( value );
+        isSimCardExist = value[ 0 ];
+
+        ipAddress = source.readString();
+    }
+
+    public int getNetworkType() {
+        return networkType;
+    }
+    public void setNetworkType(int networkType) {
+        this.networkType = networkType;
+    }
+    public int getNetworkFastType() {
+        return networkFastType;
+    }
+    public void setNetworkFastType(int networkFastType) {
+        this.networkFastType = networkFastType;
+    }
+    public String getSsid() {
+        return ssid;
+    }
+    public void setSsid(String ssid) {
+        this.ssid = ssid;
+    }
+    public String getApn() {
+        return apn;
+    }
+    public void setApn(String apn) {
+        this.apn = apn;
+    }
+    public boolean isSimCardExist() {
+        return isSimCardExist;
+    }
+    public void setSimCardExist(boolean isSimCardExist) {
+        this.isSimCardExist = isSimCardExist;
+    }
+    public String getIpAddress() {
+        return ipAddress;
+    }
+    public void setIpAddress(String ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+    @Override
+    public int describeContents() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    /**
+     * a fast way to get a Parcelable creator.
+     */
+    public static final Parcelable.Creator<SystemInfo> CREATOR = new Parcelable.Creator<SystemInfo>() {
+        public SystemInfo createFromParcel(Parcel source) {
+            return new SystemInfo(source);
+        }
+
+        public SystemInfo[] newArray(int size) {
+            return new SystemInfo[size];
+        }
+    };
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        // TODO Auto-generated method stub
+        dest.writeInt(networkType);
+        dest.writeInt(networkFastType);
+        dest.writeString(ssid);
+        dest.writeString(apn);
+        dest.writeBooleanArray( new boolean[] { isSimCardExist } );
+        dest.writeString(ipAddress);
+    }
+
+    @Override
+    public String toString() {
+        return "SystemInfo [networkType=" + networkType + ", networkFastType="
+                + networkFastType + ", ssid=" + ssid + ", apn=" + apn
+                + ", isSimCardExist=" + isSimCardExist + ", ipAddress="
+                + ipAddress + "]";
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/callback/IAccountEventListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/callback/IAccountEventListener.aidl
new file mode 100644
index 0000000..bc6744e
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/setting/callback/IAccountEventListener.aidl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.setting.callback;
+
+interface IAccountEventListener
+{
+    void success( String message );
+
+    void error( int responesCode, String message );
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/specialnumber/ISpecialServiceNumApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/specialnumber/ISpecialServiceNumApi.aidl
new file mode 100644
index 0000000..4915fb4
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/specialnumber/ISpecialServiceNumApi.aidl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.specialnumber;
+
+interface ISpecialServiceNumApi
+{
+    void add(String number);
+    void remove(String number);
+    void removeAll();
+    List<String> getList();
+    void openFunction();
+    void closeFunction();
+    String delSpecialPreNum(String telephone);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/CloseFileUtils.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/CloseFileUtils.java
new file mode 100644
index 0000000..b989194
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/CloseFileUtils.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.utils;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+/**
+ * <p>Title: CloseableUtils class</p>
+ * <p>
+ * Description: The class <code>CloseFileUtils</code> is a utility that
+ * closes properly objects implementing CloseFileUtils (input stream, output stream...)
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public abstract class CloseFileUtils {
+
+    /**
+     * Closes properly objects implementing CloseFileUtils (input stream, output stream...)
+     *
+     * @param c
+     *            object to close or null
+     * @return IOException or null
+     */
+    public static IOException close(Closeable c) {
+        if (c != null) {
+            try {
+                c.close();
+            } catch (IOException e) {
+                return e;
+            }
+        }
+        return null;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/FirstInFirstOutBuffer.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/FirstInFirstOutBuffer.java
new file mode 100644
index 0000000..7a07a02
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/FirstInFirstOutBuffer.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+ 
+package com.suntek.mway.rcs.client.api.utils;
+
+import java.util.Vector;
+
+/**
+ * <p>Title: FirstInFirstOutBuffer class</p>
+ * <p>
+ * Description: The class <code>FirstInFirstOutBuffer</code> is a utility for objects read and save in synchronization.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class FirstInFirstOutBuffer {
+    /**
+     * Lock object
+     */
+    private int nbObjects = 0;
+
+    /**
+     * Buffer stack
+     */
+    private Vector<Object> stack = new Vector<Object>();
+
+    /**
+     * Add an object in the buffer
+     *
+     * @param obj Object
+     */
+    public synchronized void addObject(Object obj) {
+        stack.addElement(obj);
+        nbObjects++;
+        notifyAll();
+    }
+
+    /**
+     * Read an object in the buffer. This is a blocking method until an object is read.
+     *
+     * @return Object
+     */
+    public synchronized Object getObject() {
+        Object obj = null;
+        if (nbObjects == 0) {
+            try {
+                wait();
+            } catch (InterruptedException e) {
+                // Nothing to do
+            }
+        }
+        if (nbObjects != 0) {
+            obj = stack.elementAt(0);
+            stack.removeElementAt(0);
+            nbObjects--;
+            notifyAll();
+        }
+        return obj;
+    }
+
+    /**
+     * Read an object in the buffer.
+     *
+     * @param timeout
+     *             the milliseconds that thread wait
+     * @return Object
+     */
+    public synchronized Object getObject(int timeout) {
+        Object obj = null;
+        if (nbObjects == 0) {
+            try {
+                wait(timeout);
+            } catch (InterruptedException e) {
+                // Nothing to do
+            }
+        }
+        if (nbObjects != 0) {
+            obj = stack.elementAt(0);
+            stack.removeElementAt(0);
+            nbObjects--;
+            notifyAll();
+        }
+        return obj;
+    }
+
+    /**
+     * Notify thread
+     */
+    public void close() {
+        synchronized(this) {
+            this.notifyAll();
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/MediaUtils.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/MediaUtils.java
new file mode 100644
index 0000000..00adc84
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/MediaUtils.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.utils;
+
+import java.io.File;
+import java.util.Locale;
+
+import android.content.Context;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.text.TextUtils;
+
+import com.suntek.mway.rcs.client.api.constant.MediaConstants;
+
+/**
+ * The Class MediaUtils.
+ */
+public class MediaUtils {
+
+    /**
+     * Checks if is image file.
+     *
+     * @param fileName the file name
+     * @return true, if is image file
+     */
+    public static boolean isImageFile(String fileName){
+        if(TextUtils.isEmpty(fileName)){
+            return false;
+        }
+
+        int suffixIndex = fileName.lastIndexOf(".");
+        if(suffixIndex != -1){
+            String suffix = fileName.substring(suffixIndex + 1);
+            return isImageSuffix(suffix);
+        }else{
+            return false;
+        }
+    }
+
+    /**
+     * Checks if is audio file.
+     *
+     * @param fileName the file name
+     * @return true, if is audio file
+     */
+    public static boolean isAudioFile(String fileName){
+        if(TextUtils.isEmpty(fileName)){
+            return false;
+        }
+
+        int suffixIndex = fileName.lastIndexOf(".");
+        if(suffixIndex != -1){
+            String suffix = fileName.substring(suffixIndex + 1);
+            return isAudioSuffix(suffix);
+        }else{
+            return false;
+        }
+    }
+
+    /**
+     * Checks if is video file.
+     *
+     * @param fileName the file name
+     * @return true, if is video file
+     */
+    public static boolean isVideoFile(String fileName){
+        if(TextUtils.isEmpty(fileName)){
+            return false;
+        }
+
+        int suffixIndex = fileName.lastIndexOf(".");
+        if(suffixIndex != -1){
+            String suffix = fileName.substring(suffixIndex + 1);
+            return isVideoSuffix(suffix);
+        }else{
+            return false;
+        }
+    }
+
+    /**
+     * Checks if is image suffix.
+     *
+     * @param suffix the suffix
+     * @return true, if is image suffix
+     */
+    public static boolean isImageSuffix(String suffix){
+        if(TextUtils.isEmpty(suffix)){
+            return false;
+        }
+
+        return MediaConstants.IMAGE_SUFFIX.indexOf(suffix.toUpperCase(Locale.getDefault())) != -1;
+    }
+
+    /**
+     * Checks if is audio suffix.
+     *
+     * @param suffix the suffix
+     * @return true, if is audio suffix
+     */
+    public static boolean isAudioSuffix(String suffix){
+        if(TextUtils.isEmpty(suffix)){
+            return false;
+        }
+
+        return MediaConstants.AUDIO_SUFFIX.indexOf(suffix.toUpperCase(Locale.getDefault())) != -1;
+    }
+
+    /**
+     * Checks if is video suffix.
+     *
+     * @param suffix the suffix
+     * @return true, if is video suffix
+     */
+    public static boolean isVideoSuffix(String suffix){
+        if(TextUtils.isEmpty(suffix)){
+            return false;
+        }
+
+        return MediaConstants.VIDEO_SUFFIX.indexOf(suffix.toUpperCase(Locale.getDefault())) != -1;
+    }
+
+    /**
+     * Gets the amr file duration.
+     *
+     * @param context
+     *            the context
+     * @param file
+     *            the file
+     * @return the amr file duration
+     */
+    public static final int getAmrFileDuration(Context context, File file) {
+        MediaPlayer mp = MediaPlayer.create(context, Uri.fromFile(file));
+        int duration = mp.getDuration();
+        mp.release();
+        return duration;
+    }
+
+    /**
+     * Gets the video file duration.
+     *
+     * @param context
+     *            the context
+     * @param file
+     *            the file
+     * @return the video file duration
+     */
+    public static final int getVideoFileDuration(Context context, File file) {
+        try {
+            MediaPlayer mediaPlayer = new MediaPlayer();
+            mediaPlayer.setDataSource(file.getAbsolutePath());
+            mediaPlayer.prepare();
+            mediaPlayer.getDuration();
+            int duration = mediaPlayer.getDuration();
+            mediaPlayer.release();
+            return duration;
+        } catch (Exception e) {
+
+        }
+        return -1;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/RcsPhoneUtils.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/RcsPhoneUtils.java
new file mode 100644
index 0000000..ee653de
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/RcsPhoneUtils.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.utils;
+
+import android.telephony.PhoneNumberUtils;
+
+/**
+ * <p>Title: RcsPhoneUtils class</p>
+ * <p>
+ * Description: The class <code>RcsPhoneUtils</code> is a utility for phone number operation
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public abstract class RcsPhoneUtils {
+
+    private static String NATIOIN_CODE = "+86";
+    private static String NATION_AREA_CODE = "0";
+
+    /**
+     * Parse phone to international
+     * @param number
+     *             the phone number
+     * @return international phone
+     */
+    public static String parseNumToInternational(String number) {
+        if (number == null) {
+            return null;
+        }
+
+        number = number.trim();
+
+        String phone = PhoneNumberUtils.stripSeparators(number);
+
+        if (phone.startsWith("00" + NATIOIN_CODE.substring(1))) {
+            phone = NATIOIN_CODE + phone.substring(4);
+        } else if ((NATION_AREA_CODE != null) && (NATION_AREA_CODE.length() > 0) &&
+                phone.startsWith(NATION_AREA_CODE)) {
+            phone = NATIOIN_CODE + phone.substring(NATION_AREA_CODE.length());
+        } else if (!phone.startsWith("+")) {
+            phone = NATIOIN_CODE + phone;
+        }
+        return phone;
+    }
+
+    /**
+     * Draw out phone from URI
+     *
+     * @param uri
+     *             the URI
+     * @return international phone
+     */
+    public static String drawNumberFromUri(String uri) {
+        if (uri == null) {
+            return null;
+        }
+
+        try {
+            int index0 = uri.indexOf("<");
+            if (index0 != -1) {
+                uri = uri.substring(index0+1, uri.indexOf(">", index0));
+            }
+
+            int index1 = uri.indexOf("tel:");
+            if (index1 != -1) {
+                uri = uri.substring(index1+4);
+            }
+
+            index1 = uri.indexOf("sip:");
+            if (index1 != -1) {
+                int index2 = uri.indexOf("@", index1);
+                uri = uri.substring(index1+4, index2);
+            }
+
+            int index2 = uri.indexOf(";");
+            if (index2 != -1) {
+                uri = uri.substring(0, index2);
+            }
+
+            return parseNumToInternational(uri);
+        } catch(Exception e) {
+            return null;
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/SettingUtils.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/SettingUtils.java
new file mode 100644
index 0000000..eb31973
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/utils/SettingUtils.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.preference.PreferenceManager;
+
+/**
+ * <p>Title: SettingUtils class</p>
+ * <p>
+ * Description: The class <code>SettingUtils</code> is a utility for setting used by android.content.SharedPreferences
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public abstract class SettingUtils {
+
+    /**
+     * Get a string value from SharedPreferences.
+     * @param context android.content.Context
+     * @param name setting name
+     * @param defaultValue the default value of setting name
+     * @return return value of setting name if it exists, or return a specified default value otherwise.
+     */
+    public static String getSetting(Context context, String name,
+            String defaultValue) {
+        final SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(context);
+        String value = prefs.getString(name, defaultValue);
+        return value;
+    }
+
+    /**
+     * Set a string value into SharedPreferences
+     * @param context android.content.Context
+     * @param name setting name
+     * @param value setting value
+     * @return true if setting successfully, false otherwise
+     */
+    public static boolean setSetting(Context context, String name, String value) {
+        final SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(context);
+        Editor editor = prefs.edit();
+        editor.putString(name, value);
+        return editor.commit();
+    }
+
+    /**
+     * Get a boolean value from SharedPreferences.
+     * @param context android.content.Context
+     * @param name setting name
+     * @param defaultValue the default value of setting name
+     * @return return value of setting name if it exists, or return a specified default value otherwise.
+     */
+    public static boolean getSetting(Context context, String name,
+            boolean defaultValue) {
+        final SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(context);
+        boolean value = prefs.getBoolean(name, defaultValue);
+        return value;
+    }
+
+    /**
+     * Set a boolean value into SharedPreferences
+     * @param context android.content.Context
+     * @param name setting name
+     * @param value setting value
+     * @return true if setting successfully, false otherwise
+     */
+    public static boolean setSetting(Context context, String name, boolean value) {
+        final SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(context);
+        Editor editor = prefs.edit();
+        editor.putBoolean(name, value);
+        return editor.commit();
+    }
+
+    /**
+     * Get a integer value from SharedPreferences.
+     * @param context android.content.Context
+     * @param name setting name
+     * @param defaultValue the default value of setting name
+     * @return return value of setting name if it exists, or return a specified default value otherwise.
+     */
+    public static int getSetting(Context context, String name, int defaultValue) {
+        final SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(context);
+        int value = prefs.getInt(name, defaultValue);
+        return value;
+    }
+
+    /**
+     * Get a long value from SharedPreferences.
+     * @param context android.content.Context
+     * @param name setting name
+     * @param defaultValue the default value of setting name
+     * @return return value of setting name if it exists, or return a specified default value otherwise.
+     */
+    public static long getSetting(Context context, String name, long defaultValue) {
+        final SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(context);
+        long value = prefs.getLong(name, defaultValue);
+        return value;
+    }
+
+    /**
+     * Set a integer value into SharedPreferences
+     * @param context android.content.Context
+     * @param name setting name
+     * @param value setting value
+     * @return true if setting successfully, false otherwise
+     */
+    public static boolean setSetting(Context context, String name, int value) {
+        final SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(context);
+        Editor editor = prefs.edit();
+        editor.putInt(name, value);
+        return editor.commit();
+    }
+
+    /**
+     * Set a long value into SharedPreferences
+     * @param context android.content.Context
+     * @param name setting name
+     * @param value setting value
+     * @return true if setting successfully, false otherwise
+     */
+    public static boolean setSetting(Context context, String name, long value) {
+        final SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(context);
+        Editor editor = prefs.edit();
+        editor.putLong(name, value);
+        return editor.commit();
+    }
+
+}
diff --git a/rcs_service_api/Android.mk b/rcs_service_api/Android.mk
new file mode 100644
index 0000000..5e077e7
--- /dev/null
+++ b/rcs_service_api/Android.mk
@@ -0,0 +1,13 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := rcs_service_api
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+    rcs_service_aidl
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
\ No newline at end of file
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/ClientApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/ClientApi.java
new file mode 100644
index 0000000..1278397
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/ClientApi.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+import java.util.List;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.suntek.mway.rcs.client.api.constant.APIConstant;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public abstract class ClientApi implements ClientApiInterface {
+
+    /** check whether the service is binded or not */
+    private boolean isBinded = false;
+
+    private String serviceName = null;
+    private ServiceConnection mConnection = null;
+    protected RCSServiceListener rcsListener = null;
+    protected Context context = null;
+
+    protected boolean isNormallyClosed = false;
+    protected int reconnectionTimes = 1;
+    protected final int MAX_RECONECTION_TIMES = 10;
+
+    public ClientApi(String theService) {
+        // TODO Auto-generated constructor stub
+        serviceName = theService;
+    }
+
+    /**
+     * judge the bind state about remote service.
+     * @return true if binded, return false if unbinded.
+     */
+    public boolean isBinded() {
+        return isBinded;
+    }
+
+    public void initServiceConnect(ServiceConnection theServiceConnection) {
+        mConnection = theServiceConnection;
+    }
+
+    public void init(Context context, RCSServiceListener listener) {
+        this.rcsListener = listener;
+        this.context = context;
+        if (context.getPackageName() != null
+                && !"".equals(context.getPackageName())) {
+            LogHelper.MYLOG_PATH_SDCARD_DIR = LogHelper.MYLOG_PATH_SDCARD_DIR
+                    .replace("com.suntek.mway.rcs.service.api",
+                            context.getPackageName());
+        }
+        // TODO Auto-generated constructor stub
+        Intent intent = new Intent();
+//        intent.setAction(serviceName);
+        intent.setClassName("com.suntek.mway.rcs.app.service", serviceName);
+        isBinded = context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+        LogHelper.d("bind " + serviceName + "--> result:" + isBinded);
+    }
+
+    public void destory(Context context) {
+        try {
+            if (isBinded) {
+                LogHelper.d("destory()--> to destroy service : " + serviceName);
+                isNormallyClosed = true;
+                context.unbindService(mConnection);
+            }
+            else {
+                LogHelper.i("destory()--> service("+serviceName+") already unbinded, do not need to destroy.");
+            }
+        } catch (Exception e) {
+            LogHelper.e("unbind " + serviceName + "--> result:" + e.getMessage(),e);
+        }finally {
+            isBinded = false;
+        }
+    }
+
+
+    /**
+     * check the service is start or not.
+     * @param ctx android.content.Context
+     * @return true if the service is started , false otherwise.
+     */
+    public static boolean isMainServiceStarted(Context ctx) {
+        ActivityManager activityManager = (ActivityManager)ctx.getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningServiceInfo> serviceList = activityManager.getRunningServices(Integer.MAX_VALUE);
+         for(int i = 0; i < serviceList.size(); i++) {
+               ActivityManager.RunningServiceInfo serviceInfo = serviceList.get(i);
+               ComponentName serviceName = serviceInfo.service;
+               if (serviceName.getClassName().equals(APIConstant.MAIN_SERVICE_NAME)) {
+                     if (serviceInfo.pid != 0) {
+                          return true;
+                     } else {
+                          return false;
+                     }
+               }
+         }
+         return false;
+    }
+
+    protected void notifyServiceConnected() {
+        if (rcsListener != null) {
+            try {
+                rcsListener.onServiceConnected();
+            } catch (RemoteException e) {
+                LogHelper.e(e.getMessage(), e);
+            }
+        }
+    }
+
+    protected void notifyServiceDisconnected() {
+        if (rcsListener != null) {
+            try {
+                rcsListener.onServiceDisconnected();
+            } catch (RemoteException e) {
+                LogHelper.e(e.getMessage(), e);
+            }
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/ClientApiInterface.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/ClientApiInterface.java
new file mode 100644
index 0000000..d6638af
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/ClientApiInterface.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+import android.content.Context;
+
+public interface ClientApiInterface {
+
+    void init(Context context, RCSServiceListener listener);
+
+    void destory(Context context);
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/RCSServiceListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/RCSServiceListener.java
new file mode 100644
index 0000000..0a157ba
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/RCSServiceListener.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api;
+
+import com.suntek.mway.rcs.client.api.IRCSServiceListener;
+
+public abstract class RCSServiceListener extends IRCSServiceListener.Stub{
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/RcsAccountApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/RcsAccountApi.java
new file mode 100644
index 0000000..5762fea
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/RcsAccountApi.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.autoconfig;
+
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.autoconfig.callback.AccountEventListener;
+import com.suntek.mway.rcs.client.api.setting.IRcsSettingApi;
+import com.suntek.mway.rcs.client.api.setting.LoginUser;
+import com.suntek.mway.rcs.client.api.setting.RcsUserProfileInfo;
+import com.suntek.mway.rcs.client.api.setting.SystemInfo;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class RcsAccountApi extends ClientApi {
+    /** The service name. */
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.setting.RcsSettingApiService";
+
+    /** The api. */
+    private IRcsSettingApi myApi;
+
+    /** The service connection. */
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            myApi = IRcsSettingApi.Stub.asInterface(service);
+            notifyServiceConnected();
+            LogHelper.d("IRcsSettingApi have success connect, api="+myApi);
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("IRcsSettingApi api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call IRcsSettingApi api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public RcsAccountApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+
+    public RcsUserProfileInfo getRcsUserProfileInfo() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getRcsUserProfileInfo();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public SystemInfo getNetworkInfo() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getNetworkInfo();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void acceptAutoReg() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.acceptAutoReg();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public boolean isOnline() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.isOnline();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return false;
+    }
+
+    private void login(LoginUser loginUser,AccountEventListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+    }
+
+    private void logout(LoginUser loginUser,AccountEventListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+    }
+
+    private void startService(Context context, AccountEventListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+    }
+
+    private void stopService(Context context, AccountEventListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+    }
+
+    public void checkOtp(String otp) throws RemoteException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:checkOtp. [otp]=%s", otp));
+        try {
+            myApi.checkOtp(otp);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            throw new RemoteException();
+        }
+    }
+
+    public void start() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:start. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.start();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/callback/AccountEventListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/callback/AccountEventListener.java
new file mode 100644
index 0000000..10dbdcd
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/callback/AccountEventListener.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.autoconfig.callback;
+
+import com.suntek.mway.rcs.client.api.setting.callback.IAccountEventListener;
+
+public abstract class AccountEventListener extends IAccountEventListener.Stub{
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/blacklist/impl/BlackListApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/blacklist/impl/BlackListApi.java
new file mode 100644
index 0000000..5609775
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/blacklist/impl/BlackListApi.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.blacklist.impl;
+
+import java.util.List;
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.blacklist.IBlackListApi;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+/**
+ * <p>Title: BlackListApi class</p>
+ * <p>
+ * Description: The class <code>BlackListApi</code> offers the functions of
+ * operating the blacklist information.
+ * In order to use BlackListApi, one must to initialize the API
+ * in the method onCreate() in UI(Activity for example).<p></p>
+ * Here is the pseudo code example:<p></p>
+ * blacklistApi = new BlackListApi();<br/>
+ * blacklistApi.init(this);
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class BlackListApi extends ClientApi {
+
+    /** The service name. */
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.blacklist.BlacklistApiService";
+
+    /** The api. */
+    private static IBlackListApi myApi;
+
+    /** The service connection. */
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            myApi = IBlackListApi.Stub.asInterface(service);
+            notifyServiceConnected();
+            LogHelper.d("IBlackListApi have success connect, api="+myApi);
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("IBlackListApi api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call IBlackListApi api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    /**
+     * Instantiates a new black list api.
+     */
+    public BlackListApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    /**
+     * Adds the number to blacklist.
+     *
+     * @param number the number
+     */
+    public boolean add(String number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method add. [number]=%s", number));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return false;
+        }
+        try {
+            return myApi.add(VerificationUtil.formatNumber(number));
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return false;
+    }
+
+    /**
+     * Removes the number from blacklist.
+     *
+     * @param number the number
+     */
+    public boolean remove(String number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method remove. [number]=%s", number));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return false;
+        }
+        try {
+            return myApi.remove(VerificationUtil.formatNumber(number));
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return false;
+    }
+
+    /**
+     * Clear the blacklist.
+     */
+    public void clear() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method clear. "));
+        try {
+            myApi.clear();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    /**
+     * Check whether the number is in blacklist or not.
+     *
+     * @param number the number
+     * @return true, if successful
+     */
+    public boolean checkIsBlack(String number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method checkIsBlack. [number]=%s", number));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return false;
+        }
+        try {
+            return myApi.checkIsBlack(VerificationUtil.formatNumber(number));
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return false;//default value is non-black user
+    }
+
+    public List<String> getList() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getList();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/callback/CapabiltyListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/callback/CapabiltyListener.java
new file mode 100644
index 0000000..1869ede
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/callback/CapabiltyListener.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.capability.callback;
+
+
+import com.suntek.mway.rcs.client.api.plugin.callback.ICapabiltyListener;
+
+public abstract class CapabiltyListener extends ICapabiltyListener.Stub{
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/impl/CapabilityApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/impl/CapabilityApi.java
new file mode 100644
index 0000000..652eff5
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/impl/CapabilityApi.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.capability.impl;
+
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.capability.ICapabilityApi;
+import com.suntek.mway.rcs.client.api.capability.callback.CapabiltyListener;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class CapabilityApi extends ClientApi {
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.capability.CapabilityApiService";
+    ICapabilityApi myApi;
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("client api connect service");
+            notifyServiceConnected();
+            myApi = ICapabilityApi.Stub.asInterface(service);
+        }
+
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("client api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call client api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public CapabilityApi() {
+        // TODO Auto-generated constructor stub
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    public void findCapabilityByNumber(String number,CapabiltyListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method findCapabilityByNumber. [number]=%s", number));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.findCapabilityByNumber(VerificationUtil.formatNumber(number), listener);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/emoticon/EmoticonApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/emoticon/EmoticonApi.java
new file mode 100644
index 0000000..bcf034d
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/emoticon/EmoticonApi.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.emoticon;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.plugin.callback.IEmoticonCallbackApi;
+import com.suntek.mway.rcs.client.api.plugin.callback.IEmoticonCanSendCallback;
+import com.suntek.mway.rcs.client.api.plugin.callback.IEmoticonPackagesNetCallbackApi;
+import com.suntek.mway.rcs.client.api.plugin.callback.IEmoticonSetSuccessDownListener;
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.EmojiPackageBO;
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.EmoticonBO;
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.ResultBO;
+import com.suntek.mway.rcs.client.api.plugin.entity.emoticon.UserBO;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class EmoticonApi extends ClientApi {
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.emoticon.EmoticonApiService";
+    IEmoticonApi myApi;
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("client api connect service");
+            notifyServiceConnected();
+            myApi = IEmoticonApi.Stub.asInterface(service);
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("client api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call client api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public EmoticonApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    public EmoticonBO getEmoticon(String emoticonId) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getEmoticon. [emoticonId]=%s", emoticonId));
+        try {
+            return myApi.getEmoticon(emoticonId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public List<EmojiPackageBO> queryEmojiPackages() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:queryEmojiPackages. "));
+        try {
+            return myApi.queryEmojiPackages();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public List<EmoticonBO> queryEmoticons(String packageId) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:queryEmoticons. [packageId]=%s", packageId));
+        try {
+            return myApi.queryEmoticons(packageId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public EmoticonBO decodeEmoticon(String eid) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:decodeEmoticon. [eid]=%s", eid));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.decodeEmoticon(eid);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public byte[] decrypt2Bytes(String emoticonId, int emoFileType) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:decrypt2Bytes. [emoticonId,emoFileType]=%s,%s", emoticonId,emoFileType));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.decrypt2Bytes(emoticonId, emoFileType);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void doAcceptEmoticon(String emoticonId, IEmoticonCallbackApi callback) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:doAcceptEmoticon. [emoticonId]=%s", emoticonId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.doAcceptEmoticon(emoticonId, callback);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public boolean emojiPackageExist(String packageId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:emojiPackageExist. [packageId]=%s", packageId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.emojiPackageExist(packageId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return false;
+    }
+
+    public String encodeEmoticon(String emoticonId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:encodeEmoticon. [emoticonId]=%s", emoticonId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.encodeEmoticon(emoticonId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public UserBO getCurrentUser() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getCurrentUser. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getCurrentUser();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public boolean getCurrentUserState() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getCurrentUserState. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getCurrentUserState();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return false;
+    }
+
+    public EmojiPackageBO getEmojiPackage(String packageId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getEmojiPackage. [packageId]=%s", packageId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getEmojiPackage(packageId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public EmojiPackageBO getEmojiPackageWithDetail(String packageId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getEmojiPackageWithDetail. [packageId]=%s", packageId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getEmojiPackageWithDetail(packageId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public String getEmoticonId(String emoticonId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getEmoticonId. [emoticonId]=%s", emoticonId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getEmoticonId(emoticonId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public String getStorageRootPath() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getStorageRootPath. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getStorageRootPath();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void isCanSend(String emoticonId, String phone, IEmoticonCanSendCallback cansendCallback) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:isCanSend. [emoticonId, phone]=%s, %s", emoticonId, phone));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.isCanSend(emoticonId, phone, cansendCallback);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void queryEmojiPackagesNet(IEmoticonPackagesNetCallbackApi callback) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:queryEmojiPackagesNet. [callback]=%s", callback.toString()));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.queryEmojiPackagesNet(callback);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public List<EmojiPackageBO> queryEmojiPackagesWithDetail() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:queryEmojiPackagesWithDetail."));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.queryEmojiPackagesWithDetail();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public List<EmoticonBO> queryEmoticonName(String emoticonName) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:queryEmoticonName. [emoticonName]=%s", emoticonName));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.queryEmoticonName(emoticonName);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void setSuccessDownListener(IEmoticonSetSuccessDownListener downListener) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:setSuccessDownListener. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.setSuccessDownListener(downListener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void unreSuccessListenter() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:unreSuccessListenter. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.unreSuccessListenter();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/MemberFullException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/MemberFullException.java
new file mode 100644
index 0000000..0c99765
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/MemberFullException.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.exception;
+
+/**
+ *
+ * <p>
+ * Title:Class of Member Full Exception.
+ * </p>
+ * <p>
+ * Description:That throws when the count of group members over maximum
+ * </p>
+ * <p>
+ * Copyright:Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company:pci-suntek
+ * </p>
+ *
+ * @author YFB
+ * @version 1.0
+ *
+ */
+public class MemberFullException extends Exception {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    public MemberFullException() {
+        super();
+    }
+
+    public MemberFullException(String message) {
+        super(message);
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/OperatorException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/OperatorException.java
new file mode 100644
index 0000000..ff816f8
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/OperatorException.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.exception;
+
+/**
+ *
+ * <p>
+ * Title:Class of Operator Exception.
+ * </p>
+ * <p>
+ * Description:That throws when Operation abnormal
+ * </p>
+ * <p>
+ * Copyright:Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company:pci-suntek
+ * </p>
+ *
+ * @author YFB
+ * @version 1.0
+ *
+ */
+public class OperatorException extends Exception {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    public OperatorException() {
+        super();
+    }
+
+    public OperatorException(String message) {
+        super(message);
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/im/impl/MessageApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/im/impl/MessageApi.java
new file mode 100644
index 0000000..50821ca
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/im/impl/MessageApi.java
@@ -0,0 +1,1641 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.im.impl;
+
+import java.util.List;
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.constant.APIConstant;
+import com.suntek.mway.rcs.client.api.contacts.RCSContact;
+import com.suntek.mway.rcs.client.api.exception.OperatorException;
+import com.suntek.mway.rcs.client.api.im.IInstantMessageApi;
+import com.suntek.mway.rcs.client.api.provider.model.ChatMessage;
+import com.suntek.mway.rcs.client.api.provider.model.FavoriteMessage;
+import com.suntek.mway.rcs.client.api.provider.model.GroupChatModel;
+import com.suntek.mway.rcs.client.api.provider.model.MessageSessionModel;
+import com.suntek.mway.rcs.client.api.provider.model.SimpleMsg;
+import com.suntek.mway.rcs.client.api.provider.model.TopMessageData;
+import com.suntek.mway.rcs.client.api.util.FileDurationException;
+import com.suntek.mway.rcs.client.api.util.FileSuffixException;
+import com.suntek.mway.rcs.client.api.util.FileTransferException;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class MessageApi extends ClientApi {
+
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.im.MessageApiService";
+
+    IInstantMessageApi myApi;
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("client api connect service");
+            notifyServiceConnected();
+            myApi = IInstantMessageApi.Stub.asInterface(service);
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("client api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call client api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public MessageApi() {
+        // TODO Auto-generated constructor stub
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    public void sendTextMessage(long thread_id, String number, String text,
+            int burnFlag, int barCycle) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendTextMessage. [thread_id,number,text,burnFlag,barCycle]=%d,%s,%s,%d,%d",
+                        thread_id, number, text, burnFlag, barCycle));
+        if ("".equals(text.trim())) {
+            LogHelper.i("text value is null/Space");
+            return;
+        }
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        if (!VerificationUtil.isBurnFlagCorrect(burnFlag)) {
+            LogHelper.i("burnFlag field must be 0 or 1");
+            return;
+        }
+        if (barCycle < 0) {
+            LogHelper.i("barCycle field must be a positive int");
+            return;
+        }
+        try {
+            myApi.sendTextMessage(thread_id, VerificationUtil.formatNumber(number), text, burnFlag, barCycle);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendImageFile(long thread_id, long sms_id, String number,
+            String filePath, int burnFlag, int barCycle, int quality)
+            throws ServiceDisconnectedException, FileSuffixException, FileTransferException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendImageFile. [thread_id,sms_id,number,filePath,burnFlag,barCycle,quality]=%d,%d,%s,%s,%d,%d,%d",
+                        thread_id, sms_id, number, filePath, burnFlag,
+                        barCycle, quality));
+        VerificationUtil.isImageFile(filePath);
+
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        if (!VerificationUtil.isBurnFlagCorrect(burnFlag)) {
+            LogHelper.i("burnFlag field must be 0 or 1");
+            return;
+        }
+        if (barCycle < 0) {
+            LogHelper.i("barCycle field must be a positive int");
+            return;
+        }
+        if (quality < 0 || quality > 100) {
+            LogHelper.i("quality field value must be between 0 to 100");
+            return;
+        }
+
+        if( quality == 100 ) {
+            VerificationUtil.isFileSizeToLarge(filePath, this.getImageFtMaxSize());
+        }
+
+        try {
+            myApi.sendImageFile(thread_id, sms_id, VerificationUtil.formatNumber(number), filePath, burnFlag,
+                    barCycle, quality);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendAudioFile(long thread_id, long sms_id, String number,
+            String filePath, int recordTime, int burnFlag, int barCycle, boolean isRecord)
+            throws ServiceDisconnectedException, FileSuffixException, FileTransferException, FileDurationException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendAudioFile. [thread_id,sms_id,number,filePath,recordTime,burnFlag,barCycle,isRecord]=%d,%d,%s,%s,%d,%d,%d,%b",
+                        thread_id, sms_id, number, filePath, recordTime,
+                        burnFlag, barCycle, isRecord));
+        VerificationUtil.isAudioFile(filePath);
+        if(isRecord){
+            VerificationUtil.isAudioDurationToLong(context, filePath, this.getAudioMaxTime(), recordTime);//VerificationUtil.getAudioMaxTime(context)
+        }
+        VerificationUtil.isFileSizeToLarge(filePath, this.getVideoFtMaxSize());//VerificationUtil.getVideoFtMaxSize(context)
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        if (!VerificationUtil.isBurnFlagCorrect(burnFlag)) {
+            LogHelper.i("burnFlag field must be 0 or 1");
+            return;
+        }
+        if (barCycle < 0) {
+            LogHelper.i("barCycle field must be a positive int");
+            return;
+        }
+        try {
+            myApi.sendAudioFile(thread_id, sms_id, VerificationUtil.formatNumber(number), filePath,
+                    recordTime, burnFlag, barCycle);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendVideoFile(long thread_id, long sms_id, String number,
+            String filePath, int length, int burnFlag, int barCycle, boolean isRecord)
+            throws ServiceDisconnectedException, FileSuffixException, FileTransferException, FileDurationException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendVideoFile. [thread_id,sms_id,number,filePath,length,burnFlag,barCycle,isRecord]=%d,%d,%s,%s,%d,%d,%d,%b",
+                        thread_id, sms_id, number, filePath, length, burnFlag,
+                        barCycle, isRecord));
+        VerificationUtil.isVideoFile(filePath);
+        if(isRecord){
+            VerificationUtil.isVedioDurationToLong(context, filePath, this.getVideoMaxTime(), length);//VerificationUtil.getVideoMaxTime(context)
+        }
+        VerificationUtil.isFileSizeToLarge(filePath, this.getVideoFtMaxSize());//VerificationUtil.getVideoFtMaxSize(context)
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        if (!VerificationUtil.isBurnFlagCorrect(burnFlag)) {
+            LogHelper.i("burnFlag field must be 0 or 1");
+            return;
+        }
+        if (barCycle < 0) {
+            LogHelper.i("barCycle field must be a positive int");
+            return;
+        }
+        try {
+            myApi.sendVideoFile(thread_id, sms_id, VerificationUtil.formatNumber(number), filePath, length,
+                    burnFlag, barCycle);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendLocation(long thread_id, long sms_id, String number,
+            double lat, double lng, String text)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendLocation. [thread_id,sms_id,number,lat,lng,text]=%d,%d,%s,%f,%f,%s",
+                        thread_id, sms_id, number, lat, lng, text));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendLocation(thread_id, sms_id, VerificationUtil.formatNumber(number), lat, lng, text);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendPaidEmo(long thread_id, long sms_id, String number,
+            String emoid, String emoImgFileName)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendPaidEmo. [thread_id,sms_id,number,emoid,emoImgFileName]=%d,%d,%s,%s,%s",
+                        thread_id, sms_id, number, emoid, emoImgFileName));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendPaidEmo(thread_id, sms_id, number, emoid,
+                    emoImgFileName);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendVCard(long thread_id, long sms_id, String number,
+            RCSContact rcsContact) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendVCard. [thread_id,sms_id,number,rcsContact]=%d,%d,%s,%s",
+                        thread_id, sms_id, number, rcsContact.toString()));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendVCard(thread_id, sms_id, number, rcsContact);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendVCard(long thread_id, long sms_id, String number,
+            String vcardFilePath) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendVCard. [thread_id,sms_id,number,vcardFilePath]=%d,%d,%s,%s",
+                        thread_id, sms_id, number, vcardFilePath));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendVCardByPath(thread_id, sms_id, VerificationUtil.formatNumber(number), vcardFilePath);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendOne2ManyTextMessage(long thread_id, List<String> numbers,
+            String text, int burnFlag, int barCycle)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        if ("".equals(text.trim())) {
+            LogHelper.i("text value is null/Space");
+            return;
+        }
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendOne2ManyTextMessage. [thread_id,numbers,text,burnFlag,barCycle]=%d,%s,%s,%d,%d",
+                        thread_id, numbers.toString(), text, burnFlag, barCycle));
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        if (!VerificationUtil.isBurnFlagCorrect(burnFlag)) {
+            LogHelper.i("burnFlag field must be 0 or 1");
+            return;
+        }
+        if (barCycle < 0) {
+            LogHelper.i("barCycle field must be a positive int");
+            return;
+        }
+        try {
+            myApi.sendOne2ManyTextMessage(thread_id, VerificationUtil.formatNumbers(numbers), text, burnFlag,
+                    barCycle);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendOne2ManyImageFile(long thread_id, long sms_id,
+            List<String> numbers, String filePath, int burnFlag, int barCycle,
+            int quality) throws ServiceDisconnectedException, FileSuffixException, FileTransferException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendOne2ManyImageFile. [thread_id,sms_id,numbers,filePath,burnFlag,barCycle,quality]=%d,%d,%s,%s,%d,%d,%d",
+                        thread_id, sms_id, numbers.toString(), filePath,
+                        burnFlag, barCycle, quality));
+        VerificationUtil.isImageFile(filePath);
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        if (!VerificationUtil.isBurnFlagCorrect(burnFlag)) {
+            LogHelper.i("burnFlag field must be 0 or 1");
+            return;
+        }
+        if (barCycle < 0) {
+            LogHelper.i("barCycle field must be a positive int");
+            return;
+        }
+        if (quality < 0 || quality > 100) {
+            LogHelper.i("quality field value must be between 0 to 100");
+            return;
+        }
+
+        if( quality == 100 ) {
+            VerificationUtil.isFileSizeToLarge(filePath,
+                    VerificationUtil.getImageFtMaxSize(context));
+        }
+
+        try {
+            myApi.sendOne2ManyImageFile(thread_id, sms_id, VerificationUtil.formatNumbers(numbers), filePath,
+                    burnFlag, barCycle, quality);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendOne2ManyAudioFile(long thread_id, long sms_id,
+            List<String> numbers, String filePath, int recordTime,
+            int burnFlag, int barCycle, boolean isRecord) throws ServiceDisconnectedException, FileSuffixException, FileTransferException, FileDurationException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendOne2ManyAudioFile. [thread_id,sms_id,numbers,filePath,recordTime,burnFlag,barCycle,isRecord]=%d,%d,%s,%s,%d,%d,%d,%b",
+                        thread_id, sms_id, numbers.toString(), filePath,
+                        recordTime, burnFlag, barCycle, isRecord));
+        VerificationUtil.isAudioFile(filePath);
+        if(isRecord){
+            VerificationUtil.isAudioDurationToLong(context, filePath, VerificationUtil.getAudioMaxTime(context), recordTime);
+        }
+        VerificationUtil.isFileSizeToLarge(filePath,
+                VerificationUtil.getVideoFtMaxSize(context));
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        if (!VerificationUtil.isBurnFlagCorrect(burnFlag)) {
+            LogHelper.i("burnFlag field must be 0 or 1");
+            return;
+        }
+        if (barCycle < 0) {
+            LogHelper.i("barCycle field must be a positive int");
+            return;
+        }
+        try {
+            myApi.sendOne2ManyAudioFile(thread_id, sms_id, VerificationUtil.formatNumbers(numbers), filePath,
+                    recordTime, burnFlag, barCycle);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendOne2ManyVideoFile(long thread_id, long sms_id,
+            List<String> numbers, String filePath, int length, int burnFlag,
+            int barCycle, boolean isRecord) throws ServiceDisconnectedException, FileSuffixException, FileTransferException, FileDurationException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendOne2ManyVideoFile. [thread_id,sms_id,numbers,filePath,length,burnFlag,barCycle,isRecord]=%d,%d,%s,%s,%d,%d,%d,%b",
+                        thread_id, sms_id, numbers.toString(), filePath,
+                        length, burnFlag, barCycle, isRecord));
+        VerificationUtil.isVideoFile(filePath);
+        if(isRecord){
+            VerificationUtil.isVedioDurationToLong(context, filePath, VerificationUtil.getVideoMaxTime(context), length);
+        }
+        VerificationUtil.isFileSizeToLarge(filePath,
+                VerificationUtil.getVideoFtMaxSize(context));
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        if (!VerificationUtil.isBurnFlagCorrect(burnFlag)) {
+            LogHelper.i("burnFlag field must be 0 or 1");
+            return;
+        }
+        if (barCycle < 0) {
+            LogHelper.i("barCycle field must be a positive int");
+            return;
+        }
+        try {
+            myApi.sendOne2ManyVideoFile(thread_id, sms_id, VerificationUtil.formatNumbers(numbers), filePath,
+                    length, burnFlag, barCycle);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendOne2ManyLocation(long thread_id, long sms_id,
+            List<String> numbers, double lat, double lng, String text)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendOne2ManyLocation. [thread_id,sms_id,numbers,lat,lng,text]=%d,%d,%s,%f,%f,%s",
+                        thread_id, sms_id, numbers.toString(), lat, lng, text));
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendOne2ManyLocation(thread_id, sms_id, VerificationUtil.formatNumbers(numbers), lat, lng,
+                    text);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendGroupMessage(long thread_id, String conversationId,
+            long sms_id, String msg, String groupId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        if ("".equals(msg.trim())) {
+            LogHelper.i("msg value is null/Space");
+            return;
+        }
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendGroupMessage. [thread_id,conversationId,sms_id,msg,groupId]=%d,%s,%d,%s,%s",
+                        thread_id, conversationId, sms_id, msg, groupId));
+        try {
+            myApi.sendGroupMessage(thread_id, conversationId, sms_id, msg,
+                    groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendGroupImageFile(long thread_id, String conversationId,
+            long sms_id, String filepath, String groupId, int quality)
+            throws ServiceDisconnectedException, FileSuffixException, FileTransferException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendGroupImageFile. [thread_id,conversationId,sms_id,filepath,groupId,quality]=%d,%s,%d,%s,%s,%d",
+                        thread_id, conversationId, sms_id, filepath, groupId,
+                        quality));
+        VerificationUtil.isImageFile(filepath);
+        if (quality < 0 || quality > 100) {
+            LogHelper.i("quality field value must be between 0 to 100");
+            return;
+        }
+
+        if( quality == 100 ) {
+            VerificationUtil.isFileSizeToLarge(filepath,
+                    VerificationUtil.getImageFtMaxSize(context));
+        }
+
+        try {
+            myApi.sendGroupImageFile(thread_id, conversationId, sms_id,
+                    filepath, groupId, quality);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendGroupAudioFile(long thread_id, String conversationId,
+            long sms_id, String filepath, int recordTime, String groupId, boolean isRecord)
+            throws ServiceDisconnectedException, FileSuffixException, FileTransferException, FileDurationException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendGroupAudioFile. [thread_id,conversationId,sms_id,filepath,recordTime,groupId,isRecord]=%d,%s,%d,%s,%d,%s,%b",
+                        thread_id, conversationId, sms_id, filepath,
+                        recordTime, groupId, isRecord));
+        VerificationUtil.isAudioFile(filepath);
+        if(isRecord){
+            VerificationUtil.isAudioDurationToLong(context, filepath, VerificationUtil.getAudioMaxTime(context), recordTime);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath,
+                VerificationUtil.getVideoFtMaxSize(context));
+        try {
+            myApi.sendGroupAudioFile(thread_id, conversationId, sms_id,
+                    filepath, recordTime, groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendGroupVideoFile(long thread_id, String conversationId,
+            long sms_id, String filepath, int length, String groupId, boolean isRecord)
+            throws ServiceDisconnectedException, FileSuffixException, FileTransferException, FileDurationException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendGroupVideoFile. [thread_id,conversationId,sms_id,filepath,length,groupId,isRecord]=%d,%s,%d,%s,%d,%s,%b",
+                        thread_id, conversationId, sms_id, filepath, length,
+                        groupId, isRecord));
+        VerificationUtil.isVideoFile(filepath);
+        if(isRecord){
+            VerificationUtil.isVedioDurationToLong(context, filepath, VerificationUtil.getVideoMaxTime(context), length);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath,
+                VerificationUtil.getVideoFtMaxSize(context));
+        try {
+            myApi.sendGroupVideoFile(thread_id, conversationId, sms_id,
+                    filepath, length, groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendGroupLocation(long thread_id, String conversationId,
+            long sms_id, double lat, double lng, String text, String groupId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendGroupLocation. [thread_id,conversationId,sms_id,lat,lng,text,groupId]=%d,%s,%d,%f,%f,%s,%s",
+                        thread_id, conversationId, sms_id, lat, lng, text,
+                        groupId));
+        try {
+            myApi.sendGroupLocation(thread_id, conversationId, sms_id, lat,
+                    lng, text, groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendGroupVCard(long thread_id, String conversationId,
+            long sms_id, RCSContact rcsContact, String groupId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendGroupVCard. [thread_id,conversationId,sms_id,rcsContact,groupId]=%d,%s,%d,%s,%s",
+                        thread_id, conversationId, sms_id,
+                        rcsContact.toString(), groupId));
+        try {
+            myApi.sendGroupVCard(thread_id, conversationId, sms_id, rcsContact,
+                    groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendGroupVCard(long thread_id, String conversationId,
+            long sms_id, String vcardFilePath, String groupId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendGroupVCard. [thread_id,conversationId,sms_id,vcardFilePath,groupId]=%d,%s,%d,%s,%s",
+                        thread_id, conversationId, sms_id,
+                        vcardFilePath, groupId));
+        try {
+            myApi.sendGroupVCardByPath(thread_id, conversationId, sms_id, vcardFilePath,
+                    groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void acceptFile(ChatMessage chatMessage) throws OperatorException,
+            ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method acceptFile. [chatMessage]=%s",
+                chatMessage.toString()));
+        try {
+            myApi.acceptFile(chatMessage);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            throw new OperatorException(ex.getMessage());
+        }
+    }
+
+    public boolean interruptFile(ChatMessage chatMessage)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method interruptFile. [chatMessage]=%s",
+                chatMessage.toString()));
+        boolean flag = false;
+        try {
+            return myApi.interruptFile(chatMessage);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return flag;
+    }
+
+    public MessageSessionModel getMessageSessionByThreadId(long threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getMessageSessionByThreadId. [threadId]=%d",
+                threadId));
+        try {
+            return myApi.getMessageSessionByThreadId(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public List<MessageSessionModel> getMessageSessionList(int offset,
+            int number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getMessageSessionList. [offset,number]=%d,%d",
+                offset, number));
+        try {
+            return myApi.getMessageSessionList(offset, number);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public List<ChatMessage> getChatMessageList(long threadId, boolean less,
+            int specifiedMsgId, int count) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method getChatMessageList. [threadId,specifiedMsgId,count]=%d,%d,%d",
+                        threadId, specifiedMsgId, count));
+        try {
+            return myApi.getChatMessageList(threadId, less, specifiedMsgId, count);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public boolean removeMessageByThreadId(long threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(Locale.getDefault(),
+                        "enter method removeMessageByThreadId. [threadId]=%d",
+                        threadId));
+        try {
+            myApi.removeMessageByThreadId(threadId);
+            return true;
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return false;
+        }
+    }
+
+    public void removeOneMessage(String messageId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method removeOneMessage. [messageId]=%s", messageId));
+        try {
+            myApi.removeOneMessage(messageId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void removeAllMessage() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method removeAllMessage. "));
+        try {
+            myApi.removeAllMessage();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public List<ChatMessage> searchMessageByText(String text, int offset,
+            int number, boolean timaAsc) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.searchMessageByText(text, offset, number, timaAsc);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public ChatMessage getTheLastMessage(long threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getTheLastMessage. [threadId]=%d", threadId));
+        try {
+            return myApi.getTheLastMessage(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public String getThreadIdByNumber(List<String> numbers)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getThreadIdByNumber. [numbers]=%s",
+                numbers.toString()));
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return null;
+        }
+        try {
+            return myApi.getThreadIdByNumber(VerificationUtil.formatNumbers(numbers));
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public long getNewThreadId() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getNewThreadId. "));
+        try {
+            return myApi.getNewThreadId();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return -1;
+        }
+    }
+
+    public ChatMessage getMessageById(String rowId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getMessageById. [rowId]=%s", rowId));
+        try {
+            return myApi.getMessageById(rowId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public ChatMessage getMessageByMessageId(String messageId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(Locale.getDefault(),
+                        "enter method getMessageByMessageId. [messageId]=%s",
+                        messageId));
+        try {
+            return myApi.getMessageByMessageId(messageId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public GroupChatModel getGroupChatById(String groupId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getGroupChatById(groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public GroupChatModel getGroupChatByThreadId(long threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(Locale.getDefault(),
+                        "enter method getGroupChatByThreadId. [threadId]=%d",
+                        threadId));
+        try {
+            return myApi.getGroupChatByThreadId(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public String getFilepath(ChatMessage message)
+            throws ServiceDisconnectedException {
+
+        //LogHelper.e("error log, enter method getFilepath. [message]=" + message.toString());
+
+        //System.out.println("========enter method getFilepath. [message]=" + message);
+
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getFilepath. [message]=%s", message.toString()));
+        try {
+            return myApi.getFilepath(message);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public String getThumbFilepath(ChatMessage message)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getThumbFilepath. [message]=%s",
+                message.toString()));
+        try {
+            return myApi.getThumbFilepath(message);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    public void topMessage(long threadId) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method topMessage. [threadId]=%d", threadId));
+        try {
+            myApi.topMessage(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void cancelTopMessage(long threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method cancelTopMessage. [threadId]=%d", threadId));
+        try {
+            myApi.cancelTopMessage(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void backupAllMessage() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method backupAllMessage. "));
+        try {
+            myApi.backupAllMessage();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void restoreAllMessage() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method restoreAllMessage. "));
+        try {
+            myApi.restoreAllMessage();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void collectMessage(List<SimpleMsg> simpleMsgList)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method collectMessage. [simpleMsgList]=%s",
+                simpleMsgList.toString()));
+        try {
+            myApi.collectMessage(simpleMsgList);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public List<TopMessageData> getTopMsgsInOrder(boolean asc)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getTopMsgsInOrder. [threadId]=%b", asc));
+        try {
+            return myApi.getTopMsgsInOrder(asc);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void accuseMessage(final long thread_id, String id)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method accuseMessage. [thread_id,id]=%d,%s", thread_id,
+                id));
+        try {
+            myApi.accuseMessage(thread_id, id);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public List<ChatMessage> qryNotifyArchiveMsgList()
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getMessageOfSpecialService. "));
+        try {
+            return myApi.getMessageOfSpecialService();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public List<ChatMessage> qryNonFriendMsgList()
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getMessageOfStrangeNumber. "));
+        try {
+            return myApi.getMessageOfStrangeNumber();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public List<MessageSessionModel> qryNonFriendMsgSessionList()
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method qryNonFriendMsgSessionList. "));
+        try {
+            return myApi.qryNonFriendMsgSessionList();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public List<MessageSessionModel> qryNotifyArchiveMsgSessionList()
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method qryNotifyArchiveMsgSessionList. "));
+        try {
+            return myApi.qryNotifyArchiveMsgSessionList();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void sendGroupPaidEmo(long thread_id, String conversationId,
+            long sms_id, String emoid, String emoImgFileName, String groupId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:sendGroupPaidEmo. [thread_id,conversationId,sms_id,emoid,emoImgFileName,groupId]=%d,%s,%d,%s,%s,%s",
+                        thread_id, conversationId, sms_id, emoid,
+                        emoImgFileName, groupId));
+        try {
+            myApi.sendGroupPaidEmo(thread_id, conversationId, sms_id, emoid,
+                    emoImgFileName, groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendOne2ManyPaidEmoMessage(long thread_id, long sms_id,
+            List<String> numbers, String emoid, String emoImgFileName)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:sendOne2ManyPaidEmoMessage. [thread_id,sms_id,numbers,emoid,emoImgFileName]=%d,%d,%s,%s,%s",
+                        thread_id, sms_id, numbers.toString(), emoid,
+                        emoImgFileName));
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendOne2ManyPaidEmoMessage(thread_id, sms_id, VerificationUtil.formatNumbers(numbers), emoid,
+                    emoImgFileName);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public List<ChatMessage> getMsgListGreatOrLessThanSpecifiedForBlack(
+            long threadId, boolean less, int specifiedId, int number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:getMsgListGreatThanSpecifiedForBlack. [threadId,less,specifiedId,number]=%d,%b,%d,%d",
+                        threadId, less, specifiedId,number));
+        try {
+            return myApi.getMsgListGreatOrLessThanSpecifiedForBlack(threadId, less,
+                    specifiedId, number);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public MessageSessionModel getMessageSessionByThreadIdForBlack(
+            String threadId) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:getMessageSessionByThreadIdForBlack. [threadId]=%s",
+                        threadId));
+        try {
+            return myApi.getMessageSessionByThreadIdForBlack(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public List<MessageSessionModel> getMessageSessionListForBlack(int offset,
+            int number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:getMessageSessionListForBlack. [thread_id,number]=%d,%d",
+                        offset, number));
+        try {
+            return myApi.getMessageSessionListForBlack(offset, number);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public ChatMessage getTheLastMsgOfThreadForBlack(long threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getTheLastMsgOfThreadForBlack. [threadId]=%d",
+                threadId));
+        try {
+            return myApi.getTheLastMsgOfThreadForBlack(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void sendOne2ManyVCard(long thread_id, long sms_id,
+            List<String> numbers, RCSContact rcsContact)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:sendOne2ManyVCard. [thread_id,sms_id,numbers,rcsContact]=%d,%d,%s,%s",
+                        thread_id, sms_id, numbers.toString(),
+                        rcsContact.toString()));
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendOne2ManyVCard(thread_id, sms_id, VerificationUtil.formatNumbers(numbers), rcsContact);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendOne2ManyVCard(long thread_id, long sms_id,
+            List<String> numbers, String vcardFilePath)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:sendOne2ManyVCard. [thread_id,sms_id,numbers,vcardFilePath]=%d,%d,%s,%s",
+                        thread_id, sms_id, numbers.toString(),
+                        vcardFilePath));
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendOne2ManyVCardByPath(thread_id, sms_id, VerificationUtil.formatNumbers(numbers), vcardFilePath);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public int recoveBlackMsgByMessageId(String messageId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:recoveBlackMsgByMessageId. [messageId]=%s",
+                messageId));
+        try {
+            return myApi.recoveBlackMsgByMessageId(messageId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public int recoveBlackMsgByThreadId(long threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:recoveBlackMsgByThreadId. [threadId]=%d",
+                threadId));
+        try {
+            return myApi.recoveBlackMsgByThreadId(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public int recoveBlackMsgAll() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:recoveBlackMsgAll. "));
+        try {
+            return myApi.recoveBlackMsgAll();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public void retransmitMessageById(String id)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:retransmitMessageById. [id]=%s",
+                        id));
+        try {
+            myApi.retransmitMessageById(id);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendDisplayNotification(final String conversationId,
+            final String number, final String messageId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:sendDisplayNotification. [conversationId, number, messageId]=%s,%s,%s",
+                        conversationId, number, messageId));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendDisplayNotification(conversationId, VerificationUtil.formatNumber(number), messageId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public List<GroupChatModel> getAllGroupChat()
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getAllGroupChat. "));
+        try {
+            return myApi.getAllGroupChat();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void burnMessage(String id) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:burnMessage. [id]=%s", id));
+        try {
+            myApi.burnMessage(id);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void cancelCollectSimpleMsg(List<SimpleMsg> simpleMsgList)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:cancelCollectSimpleMsg. [simpleMsgList]=%s",
+                simpleMsgList));
+        try {
+            myApi.cancelCollectSimpleMsg(simpleMsgList);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public List<FavoriteMessage> getFavouriteMessageList()
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getFavouriteMessageList. "));
+        try {
+            return myApi.getFavouriteMessageList();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void burnMessageAtOnce(String id)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:burnMessageAtOnce. [id]=%s", id));
+        try {
+            myApi.burnMessageAtOnce(id);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public String getAccuseNumber() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getAccuseNumber. "));
+        try {
+            return myApi.getAccuseNumber();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public byte[] getImageThumbnails(String filepath)
+            throws ServiceDisconnectedException {
+
+        //LogHelper.e("error log, enter method getImageThumbnails. [filepath]=" + filepath);
+
+        //System.out.println("========enter method getImageThumbnails. [filepath]=" + filepath);
+
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getImageThumbnails. "));
+        try {
+            return myApi.getImageThumbnails(filepath);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public byte[] getVideoThumbnails(String filepath)
+            throws ServiceDisconnectedException {
+        //LogHelper.e("error log, enter method getVideoThumbnails. [filepath]=" + filepath);
+
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getVideoThumbnails. "));
+        try {
+            return myApi.getVideoThumbnails(filepath);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public int getAllUnreadCount() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getAllUnreadCount. "));
+        try {
+            return myApi.getAllUnreadCount();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public int getUnreadMsgCountByThreadId(String threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getUnreadMsgCountByThreadId. [threadId]=%s",
+                threadId));
+        try {
+            return myApi.getUnreadMsgCountByThreadId(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public void removeUnreadMessageByThreadId(String threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:removeUnreadMessageByThreadId. [threadId]=%s",
+                threadId));
+        try {
+            myApi.removeUnreadMessageByThreadId(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public int getMsgSendPolicy() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getMsgSendPolicy();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return APIConstant.MSG_SEND_POLICY_AUTO;
+    }
+
+    public void setMsgSendPolicy(int policy) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:setMsgSendPolicy. [policy]=%s",
+                policy));
+
+        switch(policy) {
+        case APIConstant.MSG_SEND_POLICY_AUTO :
+        case APIConstant.MSG_SEND_POLICY_SMS :
+        case APIConstant.MSG_SEND_POLICY_IM :
+            try {
+                myApi.setMsgSendPolicy(policy);
+            } catch (Exception ex) {
+                LogHelper.e(ex.getMessage(), ex);
+            }
+            break ;
+
+            default :
+                LogHelper.d("method:setMsgSendPolicy input param not defined, param error.");
+                break ;
+        }
+    }
+
+    public int updateMessageRead(String id) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:updateMessageRead. [id]=%s", id));
+        try {
+            return myApi.updateMessageRead(id);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public void uploadFile(ChatMessage chatMessage)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:uploadFile. [chatMessage]=%s",
+                chatMessage.toString()));
+        try {
+            myApi.uploadFile(chatMessage);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public int getPlayTime(int msgType, String data) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getPlayTime. [msgType,data]=%d,%s",
+                msgType, data));
+        try {
+            return myApi.getPlayTime(msgType, data);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public GroupChatModel getGroupChatByConversationId(String conversationId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:getGroupChatByConversationId. [conversationId]=%s",
+                        conversationId));
+        try {
+            return myApi.getGroupChatByConversationId(conversationId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void setSMSSentRemind(int policy) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:setSMSSentRemind. [policy]=%d", policy));
+        try {
+            myApi.setSMSSentRemind(policy);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public int getSMSSentRemind() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getSMSSentRemind. "));
+        try {
+            return myApi.getSMSSentRemind();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public void burnAllMsgAtOnce() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:burnAllMsgAtOnce. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.burnAllMsgAtOnce();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendComposingMsg(long threadId, String contact, String contentType, int seconds) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:sendComposingMsg. [threadId,contact,contentType,seconds]=%d,%s,%s,%d", threadId,contact,contentType,seconds));
+        VerificationUtil.ApiIsNull(myApi);
+        if (!VerificationUtil.isNumber(contact)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendComposingMsg(threadId, VerificationUtil.formatNumber(contact), contentType, seconds);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendCancelComposingMsg(long threadId, String contact, String contentType, long lastActive) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:sendCancelComposingMsg. [threadId,contact,contentType,lastActive]=%d,%s,%s,%d", threadId,contact,contentType,lastActive));
+        VerificationUtil.ApiIsNull(myApi);
+        if (!VerificationUtil.isNumber(contact)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendCancelComposingMsg(threadId, VerificationUtil.formatNumber(contact), contentType, lastActive);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendComposingMsgToGroup(long threadId, int id, String contentType, int seconds) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:sendComposingMsgToGroup. [threadId,id,contentType,seconds]=%d,%d,%s,%d", threadId,id,contentType,seconds));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.sendComposingMsgToGroup(threadId, id, contentType, seconds);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendCancelComposingMsgToGroup(long threadId, int id, String contentType, long lastActive) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:sendCancelComposingMsgToGroup. [threadId,id,contentType,lastActive]=%d,%d,%s,%d", threadId,id,contentType,lastActive));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.sendCancelComposingMsgToGroup(threadId, id, contentType, lastActive);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendVCardList(final long thread_id, final long sms_id, final String number, final List<RCSContact> contactList, final int chatType) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:sendVCardList. [thread_id, sms_id, number, contactList, chatType]=%d,%d,%s,%s,%d", thread_id, sms_id, number, contactList.toString(), chatType));
+        VerificationUtil.ApiIsNull(myApi);
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendVCardList(thread_id, sms_id, VerificationUtil.formatNumber(number), contactList, chatType);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendOne2ManyVCardList(final long thread_id, final long sms_id, final List<String> numbers, final List<RCSContact> contactList) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:sendOne2ManyVCardList. [thread_id, sms_id, numbers, contactList]=%d,%d,%s,%s", thread_id, sms_id, numbers.toString(), contactList.toString()));
+        VerificationUtil.ApiIsNull(myApi);
+        if (!VerificationUtil.isAllNumber(numbers)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.sendOne2ManyVCardList(thread_id, sms_id, VerificationUtil.formatNumbers(numbers), contactList);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void sendGroupVCardList(final long thread_id, final String conversationId, final long sms_id, final List<RCSContact> contactList, final String groupId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:sendGroupVCardList. [thread_id, conversationId, sms_id, contactList, groupId]=%d,%s,%d,%s,%s", thread_id, conversationId, sms_id, contactList.toString(), groupId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.sendGroupVCardList(thread_id, conversationId, sms_id, contactList, groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public long getImageFtMaxSize() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getImageFtMaxSize. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getImageFtMaxSize();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public long getAudioMaxTime() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getAudioMaxTime. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getAudioMaxTime();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public long getVideoMaxTime() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getVideoMaxTime. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getVideoMaxTime();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public long getVideoFtMaxSize() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getVideoFtMaxSize. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getVideoFtMaxSize();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public void removeMsgWithNotificationByThread(long threadId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:removeMsgWithNotificationByThread. [threadId]=%d", threadId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.removeMsgWithNotificationByThread(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/im/impl/PaMessageApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/im/impl/PaMessageApi.java
new file mode 100644
index 0000000..ebc9497
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/im/impl/PaMessageApi.java
@@ -0,0 +1,350 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.im.impl;
+
+import java.util.List;
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.contacts.RCSContact;
+import com.suntek.mway.rcs.client.api.im.IPaMessageApi;
+import com.suntek.mway.rcs.client.api.util.FileDurationException;
+import com.suntek.mway.rcs.client.api.util.FileSuffixException;
+import com.suntek.mway.rcs.client.api.util.FileTransferException;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class PaMessageApi extends ClientApi{
+
+private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.im.PaMessageApiService";
+
+    IPaMessageApi myApi;
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("IPaMessageApi api connect service");
+            myApi = IPaMessageApi.Stub.asInterface(service);
+            notifyServiceConnected();
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("IPaMessageApi api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call IPaMessageApi api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public PaMessageApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    /**
+     * Send a text message to the public accounts.
+     *
+     * @param thread_id             the message threadId
+     * @param sms_id             sms_id system SMS id, -1 if didn't use system SMS
+     * @param uuid             the public account uuid
+     * @param text             the message info
+     * @throws RemoteException the remote exception
+     */
+    public void sendTextMessage(long thread_id, long sms_id, String uuid, String text) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method sendTextMessage. [thread_id,sms_id,uuid,text]=%d,%d,%s,%s", thread_id,sms_id,uuid,text));
+        try{
+            myApi.sendTextMessage(thread_id, sms_id, uuid, text);
+        }catch(Exception e){
+            LogHelper.e(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Send a picture message to the public accounts.
+     *
+     * @param thread_id             the message threadId
+     * @param sms_id             sms_id system SMS id, -1 if didn't use system SMS
+     * @param uuid             the public account uuid
+     * @param filepath             path of picture file
+     * @param quality             Hint to the compressor, 0-100. 0 meaning compress for small size, 100 meaning compress for max quality.
+     * @throws FileSuffixException
+     * @throws FileTransferException
+     * @throws RemoteException the remote exception
+     */
+    public void sendImageFile(long thread_id, long sms_id, String uuid , String filepath, int quality) throws ServiceDisconnectedException, FileSuffixException, FileTransferException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method sendImageFile. [thread_id,sms_id,uuid,filepath,quality]=%d,%d,%s,%s,%d", thread_id,sms_id,uuid,filepath,quality));
+        VerificationUtil.isImageFile(filepath);
+//        VerificationUtil.isFileSizeToLarge(filepath,
+//                VerificationUtil.getImageFtMaxSize(context));
+        if (quality < 0 || quality > 100) {
+            LogHelper.i("quality field value must be between 0 to 100");
+            return;
+        }
+        if (quality == 100) {
+            VerificationUtil.isFileSizeToLarge(filepath, this.getImageFtMaxSize());
+        }
+
+        try{
+            myApi.sendImageFile(thread_id, sms_id, uuid , filepath, quality);
+        }catch(Exception e){
+            LogHelper.e(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Send a audio message to the public accounts.
+     *
+     * @param thread_id             the message threadId
+     * @param sms_id             sms_id system SMS id, -1 if didn't use system SMS
+     * @param uuid             the public account uuid
+     * @param filepath             path of audio file
+     * @param recordTime             the length that audio playing
+     * @throws FileSuffixException
+     * @throws FileTransferException
+     * @throws FileDurationException
+     * @throws RemoteException the remote exception
+     */
+    public void sendAudioFile(long thread_id, long sms_id, String uuid, String filepath, int recordTime, boolean isRecord) throws ServiceDisconnectedException, FileSuffixException, FileTransferException, FileDurationException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method sendAudioFile. [thread_id,sms_id,uuid,filepath,recordTime,isRecord]=%d,%d,%s,%s,%d,%b", thread_id,sms_id,uuid,filepath,recordTime,isRecord));
+        VerificationUtil.isAudioFile(filepath);
+        if(isRecord){
+            VerificationUtil.isAudioDurationToLong(context, filepath, this.getAudioMaxTime(), recordTime);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoFtMaxSize());
+//        VerificationUtil.isFileSizeToLarge(filepath,
+//                VerificationUtil.getVideoFtMaxSize(context));
+        try {
+            myApi.sendAudioFile(thread_id, sms_id, uuid, filepath, recordTime);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * Send a vedio message to the public accounts.
+     *
+     * @param thread_id             the message threadId
+     * @param sms_id             sms_id system SMS id, -1 if didn't use system SMS
+     * @param uuid             the public account uuid
+     * @param filepath             path of vedio file
+     * @param length             the length that video playing
+     * @throws FileSuffixException
+     * @throws FileTransferException
+     * @throws FileDurationException
+     * @throws RemoteException the remote exception
+     */
+    public void sendVideoFile(long thread_id, long sms_id, String uuid, String filepath, int length, boolean isRecord) throws ServiceDisconnectedException, FileSuffixException, FileTransferException, FileDurationException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method sendVideoFile. [thread_id,sms_id,uuid,filepath,length,isRecord]=%d,%d,%s,%s,%d,%b", thread_id,sms_id,uuid,filepath,length,isRecord));
+        VerificationUtil.isVideoFile(filepath);
+        if(isRecord){
+            VerificationUtil.isVedioDurationToLong(context, filepath, this.getVideoMaxTime(), length);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoFtMaxSize());
+//        VerificationUtil.isFileSizeToLarge(filepath,
+//                VerificationUtil.getVideoFtMaxSize(context));
+        try {
+            myApi.sendVideoFile(thread_id, sms_id, uuid, filepath, length);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * Send a location message to the public accounts.
+     *
+     * @param thread_id             the message threadId
+     * @param sms_id             sms_id system SMS id, -1 if didn't use system SMS
+     * @param uuid             the public account uuid
+     * @param lat             the longitude
+     * @param lng             the latitude
+     * @param text             the text of location
+     * @throws RemoteException the remote exception
+     */
+    public void sendLocation(long thread_id, long sms_id, String uuid, double lat, double lng, String text) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method sendLocation. [thread_id,sms_id,uuid,lat,lng,text]=%d,%d,%s,%f,%f,%s", thread_id,sms_id,uuid,lat,lng,text));
+        try {
+            myApi.sendLocation(thread_id, sms_id, uuid, lat, lng, text);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * Send a business card message.
+     *
+     * @param thread_id             the message threadId
+     * @param sms_id             sms_id system SMS id, -1 if didn't use system SMS
+     * @param uuid             the public account uuid
+     * @param rcsContact             throws ApiIsNullException {
+        VerificationUtil.ApiIsNull(myApi);@link RCSContact} Object
+     * @throws RemoteException the remote exception
+     */
+    public void sendVCard(long thread_id, long sms_id, String uuid, RCSContact rcsContact) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method sendVCard. [thread_id,sms_id,uuid,rcsContact]=%d,%d,%s,%s", thread_id,sms_id,uuid,rcsContact.toString()));
+        try {
+            myApi.sendVCard(thread_id, sms_id, uuid, rcsContact);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * Send a menu message to the public accounts.
+     *
+     * @param uuid             the public account uuid
+     * @param text             the message info
+     * @throws RemoteException the remote exception
+     */
+    public void sendMenuMessage(String uuid, String text) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.sendMenuMessage(uuid, text);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * Send a business card message.
+     *
+     * @param thread_id             the message threadId
+     * @param sms_id             sms_id system SMS id, -1 if didn't use system SMS
+     * @param uuid             the public account uuid
+     * @param vcardFilePath             throws ApiIsNullException {
+        VerificationUtil.ApiIsNull(myApi);@link RCSContact} Object
+     * @throws RemoteException the remote exception
+     */
+    public void sendVCardByPath(long thread_id, long sms_id, String uuid, String vcardFilePath) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method vcardFilePath. [thread_id,sms_id,uuid,vcardFilePath]=%d,%d,%s,%s", thread_id,sms_id,uuid,vcardFilePath));
+        try {
+            myApi.sendVCardByPath(thread_id, sms_id, uuid, vcardFilePath);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    public void deleteMessage(String messageId) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.deleteMessage(messageId);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(), e);
+        }
+    }
+
+    public void deleteMessageByThreadId(long thread_id) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.deleteMessageByThreadId(thread_id);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(), e);
+        }
+    }
+
+    public void deleteMessageByUuid(String uuid) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.deleteMessageByUuid(uuid);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(), e);
+        }
+    }
+
+    public void sendVCardList(long thread_id, long sms_id, String uuid, List<RCSContact> contactList) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:sendVCardList. [thread_id,sms_id,uuid,contactList]=%d,%d,%s,%s", thread_id,sms_id,uuid,contactList.toString()));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.sendVCardList(thread_id, sms_id, uuid, contactList);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public long getImageFtMaxSize() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getImageFtMaxSize. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getImageFtMaxSize();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public long getAudioMaxTime() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getAudioMaxTime. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getAudioMaxTime();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public long getVideoMaxTime() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getVideoMaxTime. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getVideoMaxTime();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public long getVideoFtMaxSize() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getVideoFtMaxSize. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getVideoFtMaxSize();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/impl/callback/ConferenceCallback.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/impl/callback/ConferenceCallback.java
new file mode 100644
index 0000000..db53e7e
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/impl/callback/ConferenceCallback.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.impl.callback;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IConferenceCallback;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Avatar;
+
+public abstract class ConferenceCallback extends IConferenceCallback.Stub {
+    public ConferenceCallback() {
+    }
+
+    @Override
+    public void onRefreshAvatar(Avatar avatar, int resultCode, String resultDesc)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/impl/groupchat/ConfApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/impl/groupchat/ConfApi.java
new file mode 100644
index 0000000..5b249be
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/impl/groupchat/ConfApi.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.impl.groupchat;
+
+import java.util.List;
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.exception.MemberFullException;
+import com.suntek.mway.rcs.client.api.im.IGroupManagerApi;
+import com.suntek.mway.rcs.client.api.impl.callback.ConferenceCallback;
+import com.suntek.mway.rcs.client.api.provider.model.GroupChatModel;
+import com.suntek.mway.rcs.client.api.provider.model.GroupChatUser;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+public class ConfApi extends ClientApi {
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.im.GroupManagerApiService";
+
+    IGroupManagerApi myApi;
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("client api connect service");
+            myApi = IGroupManagerApi.Stub.asInterface(service);
+            notifyServiceConnected();
+        }
+
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("client api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call client api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public ConfApi() {
+        // TODO Auto-generated constructor stub
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    public String createGroupChat(String subject,List<String> users) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method createGroupChat. [subject,users]=%s,%s", subject,users.toString()));
+        try {
+            return myApi.createGroupChat(subject, users);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+        return null;
+    }
+
+    public void agreeToJoinGroup(String conversationId ,String contributionId ,String chatUri ,
+            String subject , String numberData, long inviteTime) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method agreeToJoinGroup. [conversationId,contributionId,chatUri,subject,numberData,inviteTime]=%s,%s,%s,%s,%s,%d", conversationId,contributionId,chatUri,subject,numberData,inviteTime));
+        try {
+            myApi.agreeToJoinGroup(conversationId, contributionId, chatUri, subject, numberData, inviteTime);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void refuseToJoinGroup(String conversationId) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method refuseToJoinGroup. [conversationId]=%s", conversationId));
+        try {
+            myApi.refuseToJoinGroup(conversationId);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void updateGroupSubject(String groupId,String newSubject) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method updateGroupSubject. [groupId,newSubject]=%s,%s", groupId,newSubject));
+        try {
+            myApi.updateGroupSubject(groupId, newSubject);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void modifyGroupMemo(String groupId,String memo) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method modifyGroupMemo. [groupId,memo]=%s,%s", groupId,memo));
+        try {
+            myApi.modifyGroupMemo(groupId, memo);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void disbandGroupChat(String groupId) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method disbandGroupChat. [groupId]=%s", groupId));
+        try {
+            myApi.disbandGroupChat(groupId);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void kickedOutOfGroupChat(String groupId,String number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method kickedOutOfGroupChat. [groupId,number]=%s,%s", groupId,number));
+        try {
+            myApi.kickedOutOfGroupChat(groupId, number);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void assignGroupChairman(String groupId,String number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method assignGroupChairman. [groupId,number]=%s,%s", groupId,number));
+        try {
+            myApi.assignGroupChairman(groupId, number);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+    public void quitGroupChat(String groupId,String number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method quitGroupChat. [groupId,number]=%s,%s", groupId,number));
+        try {
+            myApi.quitGroupChat(groupId, number);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    @Deprecated
+    public void quitGroupChatEx(String groupId,String oldChairman,String newChairman) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method quitGroupChat. [groupId,oldChairman,newChairman]=%s,%s,%s", groupId,oldChairman,newChairman));
+        try {
+            myApi.quitGroupChatEx(groupId, oldChairman, newChairman);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void setMyAlias(String groupId,String alias) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method setMyAlias. [groupId,alias]=%s,%s", groupId,alias));
+        try {
+            myApi.setMyAlias(groupId, alias);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+    public String getGroupChatMemberDisplayName(String groupId,String number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getGroupChatMemberDisplayName. [groupId,number]=%s,%s", groupId,number));
+        try {
+            return myApi.getGroupChatMemberDisplayName(groupId, number);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+        return null;
+    }
+
+    public GroupChatUser getGroupChairman(String groupId) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getGroupChairman. [groupId]=%s", groupId));
+        try {
+            return myApi.getGroupChairman(groupId);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+        return null;
+    }
+    public void inviteToJoinGroupChat(String groupId, String number) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method inviteToJoinGroupChat. [groupId,number]=%s,%s", groupId,number));
+        try {
+            myApi.inviteOneMemberToGroupChat(groupId, number);
+        } catch (RemoteException ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void inviteToJoinGroupChat(String groupId, List<String> numbers) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method inviteToJoinGroupChat. [groupId,numbers]=%s,%s", groupId,numbers.toString()));
+        try {
+            myApi.inviteToJoinGroupChat(groupId, numbers);
+        } catch (RemoteException ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void queryMemberHeadPic(String groupId, String number,int pixel, ConferenceCallback confCallback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method queryMemberHeadPic. [groupId,number]=%s,%s", groupId,number));
+        try {
+            myApi.queryMemberHeadPic(groupId, number,pixel, confCallback);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void refreshMemberHeadPic(String groupId, String number,int pixel, ConferenceCallback confCallback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method refreshMemberHeadPic. [groupId,number]=%s,%s", groupId,number));
+        try {
+            myApi.refreshMemberHeadPic(groupId, number,pixel, confCallback);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+
+    }
+    public GroupChatModel  getLastGroupModel()throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getAllGroupId"));
+        try {
+            GroupChatModel gcm = myApi.getLastGroupModel();
+            return gcm;
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+        return null;
+    }
+
+    public void updateGroupPolicy(String groupId, int policy) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.updateGroupPolicy(groupId, policy);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public List<GroupChatUser> getGroupChatUsersAllowChairman(String groupId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getGroupChatUsersAllowChairman. [groupId]=%s",
+                groupId));
+        try {
+            return myApi.getGroupChatUsersAllowChairman(groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public List<GroupChatUser> getGroupChatUsersByGroupId(String groupId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getGroupChatUsersByGroupId. [groupId]=%s",
+                groupId));
+        try {
+            return myApi.getGroupChatUsersByGroupId(groupId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public GroupChatModel getGroupChatByThreadId(String threadId)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(Locale.getDefault(),
+                        "enter method:getGroupChatByThreadId. [threadId]=%s",
+                        threadId));
+        try {
+            return myApi.getGroupChatByThreadId(threadId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public GroupChatModel getGroupChatByChatUri(String chatUri)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getGroupChatByChatUri. [chatUri]=%s", chatUri));
+        try {
+            return myApi.getGroupChatByChatUri(chatUri);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public String getGroupChatDomainName() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getGroupChatDomainName. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getGroupChatDomainName();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public String getPublicAccountDomainName() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:getPublicAccountDomainName. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getPublicAccountDomainName();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void refuseAssigedAsChairman(String chatUri, long inviteTime, String conversationId, String contributionId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:refuseAssigedAsChairman. [chatUri,inviteTime,conversationId,contributionId]=%s,%d,%s,%s", chatUri,inviteTime,conversationId,contributionId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.refuseAssigedAsChairman(chatUri, inviteTime, conversationId, contributionId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void acceptAssignedAsChairman(String chatUri, long inviteTime, String conversationId, String contributionId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:acceptAssignedAsChairman. [chatUri,inviteTime,conversationId,contributionId]=%s,%d,%s,%s", chatUri,inviteTime,conversationId,contributionId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.acceptAssignedAsChairman(chatUri, inviteTime, conversationId, contributionId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/login/impl/LoginApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/login/impl/LoginApi.java
new file mode 100644
index 0000000..5b8be6e
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/login/impl/LoginApi.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.login.impl;
+
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.login.ILoginApi;
+import com.suntek.mway.rcs.client.api.setting.LoginUser;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+
+public class LoginApi extends ClientApi{
+    /** The service name. */
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.login.LoginApiService";
+    /** The api. */
+    private static ILoginApi myApi;
+
+    /** The service connection. */
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            myApi = ILoginApi.Stub.asInterface(service);
+            notifyServiceConnected();
+            LogHelper.d("ILoginApi have success connect, api="+myApi);
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("ILoginApi api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call ILoginApi api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public LoginApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    public void login(LoginUser loginUser, LoginEventListener listener)throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method login.loginUser=" + loginUser.toString()));
+        try{
+            myApi.login(loginUser, listener);
+        }catch(Exception ex){
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void logout() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method logout"));
+        try{
+            myApi.logout();
+        }catch(Exception ex){
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/login/impl/LoginEventListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/login/impl/LoginEventListener.java
new file mode 100644
index 0000000..9bd1723
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/login/impl/LoginEventListener.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.login.impl;
+import com.suntek.mway.rcs.client.api.login.ILoginEventListener;
+public abstract class LoginEventListener extends ILoginEventListener.Stub{
+    public LoginEventListener(){}
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/mcloud/McloudFileApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/mcloud/McloudFileApi.java
new file mode 100644
index 0000000..f7de0a8
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/mcloud/McloudFileApi.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.mcloud;
+
+import java.util.List;
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.FileNode;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcloudfile.TransNode;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class McloudFileApi extends ClientApi {
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.mcloud.McloudApiService";
+    IMcloudFileApi myApi;
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("client api connect service");
+            myApi = IMcloudFileApi.Stub.asInterface(service);
+            notifyServiceConnected();
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("client api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call client api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public McloudFileApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    public void downloadFileFromUrl(String remoteUrl, String fileName, TransNode.TransOper transOper) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:downloadFileFromUrl. [remoteUrl,fileName,transOper]=%s,%d", remoteUrl, fileName, transOper.ordinal()));
+        try {
+            myApi.downloadFileFromUrl(remoteUrl, fileName, transOper.ordinal());
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void getShareFileList(int beginIndex, int endIndex) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getShareFileList. [beginIndex,endIndex]=%d,%d",
+                beginIndex, endIndex));
+        try {
+            myApi.getShareFileList(beginIndex, endIndex);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void putFile(String localPath, String remotePath, TransNode.TransOper transOper) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:putFile. [localPath,remotePath,transOper]=%s,%s,%d",
+                localPath, remotePath, transOper.ordinal()));
+        try {
+            myApi.putFile(localPath, remotePath, transOper.ordinal());
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void shareFile(String fullPathInID, String shareDesc) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:shareFile. [fullPathInID,shareDesc]=%s,%s",
+                fullPathInID, shareDesc));
+        try {
+            myApi.shareFile(fullPathInID, shareDesc);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void shareFileAndSend(String fullPathInID, String shareDesc,
+            String contact, long threadId, String beforeText, String afterText)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:shareFileAndSend. [fullPathInID,shareDesc,contact,threadId,beforeText,afterText]=%s,%s,%s,%d,%s,%s",
+                        fullPathInID, shareDesc, contact, threadId, beforeText,
+                        afterText));
+        try {
+            myApi.shareFileAndSend(fullPathInID, shareDesc, contact, threadId,
+                    beforeText, afterText);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void shareFileAndSendGroup(String fullPathInID, String shareDesc,
+            long threadId, String conversationId, String groupId,
+            String beforeText, String afterText)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:shareFileAndSendGroup. [fullPathInID,shareDesc,threadId,conversationId,groupId,beforeText,afterText]=%s,%s,%d,%s,%s,%s,%s",
+                        fullPathInID, shareDesc, threadId, conversationId,
+                        groupId, beforeText, afterText));
+        try {
+            myApi.shareFileAndSendGroup(fullPathInID, shareDesc, threadId,
+                    conversationId, groupId, beforeText, afterText);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void shareFileAndSendOne2Many(String fullPathInID, String shareDesc,
+            List<String> contacts, long threadId, String beforeText,
+            String afterText) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:shareFileAndSendOne2Many. [fullPathInID,shareDesc,contacts,threadId,beforeText,afterText]=%s,%s,%s,%d,%s,%s",
+                        fullPathInID, shareDesc, contacts.toString(), threadId,
+                        beforeText, afterText));
+        try {
+            myApi.shareFileAndSendOne2Many(fullPathInID, shareDesc, contacts,
+                    threadId, beforeText, afterText);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void getRemoteFileList(String remotePath, int beginIndex, int endIndex, FileNode.Order fileOrder) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getRemoteFileList. [remotePath,beginIndex,endIndex,fileOrder]=%s,%d,%d,%d",
+                remotePath, beginIndex, endIndex, fileOrder.ordinal()));
+        try {
+            myApi.getRemoteFileList(remotePath, beginIndex, endIndex, fileOrder.ordinal());
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/mcontact/McontactApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/mcontact/McontactApi.java
new file mode 100644
index 0000000..d7324e0
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/mcontact/McontactApi.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.mcontact;
+
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.plugin.callback.IMContactSyncListener;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcontact.IntervalAction;
+import com.suntek.mway.rcs.client.api.plugin.entity.mcontact.SyncAction;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class McontactApi extends ClientApi {
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.mcontact.McontactApiService";
+    IMcontactApi myApi;
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("client api connect service");
+            myApi = IMcontactApi.Stub.asInterface(service);
+            notifyServiceConnected();
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("client api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call client api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public McontactApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    public void cancelIntervalSync() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:downloadFileFromUrl. "));
+        try {
+            myApi.cancelIntervalSync();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public boolean getEnableAutoSync() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getEnableAutoSync. "));
+        try {
+            return myApi.getEnableAutoSync();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return false;
+    }
+
+    public int getLocalContactCounts() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getLocalContactCounts. "));
+        try {
+            return myApi.getLocalContactCounts();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public boolean getOnlySyncEnableViaWifi()
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getOnlySyncEnableViaWifi. "));
+        try {
+            return myApi.getOnlySyncEnableViaWifi();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return false;
+    }
+
+    public int getRemoteContactCounts() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getRemoteContactCounts. "));
+        try {
+            return myApi.getRemoteContactCounts();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return 0;
+    }
+
+    public void setOnlySyncEnableViaWifi(boolean status)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:setOnlySyncEnableViaWifi. [status]=%b", status));
+        try {
+            myApi.setOnlySyncEnableViaWifi(status);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void doSync(SyncAction action, IMContactSyncListener listener)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:doSync. [action]=%d", action.ordinal()));
+        try {
+            myApi.doSync(action.ordinal(), listener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public SyncAction getAutoSync() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getAutoSync. "));
+        try {
+            return SyncAction.valueOf(myApi.getAutoSync());
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void setEnableAutoSync(boolean status, SyncAction syncAction)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:setEnableAutoSync. [status, syncAction]=%b,%d",
+                status, syncAction.ordinal()));
+        try {
+            myApi.setEnableAutoSync(status, syncAction.ordinal());
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public void startIntervalSync(SyncAction syncAction,
+            IntervalAction intervalAction, long time)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method:startIntervalSync. [syncAction, intervalAction, time]=%d,%d,%d",
+                        syncAction.ordinal(), intervalAction.ordinal(), time));
+        try {
+            myApi.startIntervalSync(syncAction.ordinal(),
+                    intervalAction.ordinal(), time);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public IntervalAction getIntervalSyncMode() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getIntervalSyncMode. "));
+        try {
+            return IntervalAction.valueOf(myApi.getIntervalSyncMode());
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/plugincenter/PluginCenterApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/plugincenter/PluginCenterApi.java
new file mode 100644
index 0000000..5a60e22
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/plugincenter/PluginCenterApi.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.plugincenter;
+
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.support.RcsSupportApi;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class PluginCenterApi extends ClientApi {
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.plugincenter.PluginCenterApiService";
+    IPluginCenterApi myApi;
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("client api connect service");
+            myApi = IPluginCenterApi.Stub.asInterface(service);
+            notifyServiceConnected();
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("client api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call client api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public PluginCenterApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    public void intentApk() throws ServiceDisconnectedException {
+        if (RcsSupportApi.isRcsPluginCenterInstalled(context)) {
+            VerificationUtil.ApiIsNull(myApi);
+            LogHelper.i(String.format(Locale.getDefault(),
+                    "enter method:intentApk. "));
+            try {
+                myApi.intentApk();
+            } catch (Exception ex) {
+                LogHelper.e(ex.getMessage(), ex);
+            }
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/ProfileListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/ProfileListener.java
new file mode 100644
index 0000000..a8f963c
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/ProfileListener.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.profile.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IProfileListener;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.QRCardImg;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public abstract class ProfileListener extends IProfileListener.Stub {
+
+    /**
+     * The default implementation of this interface, the method did not want to expose upward.
+     */
+    public void onQRImgGet( QRCardImg qrImgObj, int resultCode, String resultDesc ) {
+        LogHelper.d("onQRImgGet(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/QRImgListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/QRImgListener.java
new file mode 100644
index 0000000..0357f3c
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/QRImgListener.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.profile.callback;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IProfileListener;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Avatar;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Profile;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public abstract class QRImgListener extends IProfileListener.Stub {
+
+    /**
+     * The default implementation of this interface, the method did not want to expose upward.
+     */
+    public void onProfileUpdated( int resultCode, String resultDesc ) {
+        LogHelper.d("onProfileUpdated(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);
+    }
+
+    /**
+     * The default implementation of this interface, the method did not want to expose upward.
+     */
+    public void onAvatarUpdated( int resultCode, String resultDesc ) {
+        LogHelper.d("onAvatarUpdated(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);
+    }
+
+    /**
+     * The default implementation of this interface, the method did not want to expose upward.
+     */
+    public void onAvatarGet( Avatar avatar, int resultCode, String resultDesc ) {
+        LogHelper.d("onAvatarGet(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);
+    }
+
+    /**
+     * The default implementation of this interface, the method did not want to expose upward.
+     */
+    public void onProfileGet( Profile profile, int resultCode, String resultDesc ) {
+        LogHelper.d("onProfileGet(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/impl/ProfileApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/impl/ProfileApi.java
new file mode 100644
index 0000000..e8d2373
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/impl/ProfileApi.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.profile.impl;
+
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.plugin.IProfileApi;
+import com.suntek.mway.rcs.client.api.plugin.callback.IProfileListener;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Avatar;
+import com.suntek.mway.rcs.client.api.plugin.entity.profile.Profile;
+import com.suntek.mway.rcs.client.api.profile.callback.ProfileListener;
+import com.suntek.mway.rcs.client.api.profile.callback.QRImgListener;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+/**
+ * <p>Title: ProfileApi class</p>
+ * <p>
+ * Description: The class <code>ProfileApi</code> offers the functions of
+ * operating the profile information.
+ * In order to use ProfileApi, one must to initialize the API
+ * in the method onCreate() in UI(Activity for example).<p></p>
+ * Here is the pseudo code example:<p></p>
+ * profileApi = new ProfileApi();<br/>
+ * profileApi.init(this);
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * @author YE JIE MING
+ * @version 1.0
+ *
+ */
+public class ProfileApi extends ClientApi  {
+
+    /** The service name. */
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.profile.ProfileApiService";
+
+    /** The api. */
+    private static IProfileApi myApi;
+
+    /** The service connection. */
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            myApi = IProfileApi.Stub.asInterface(service);
+            notifyServiceConnected();
+            LogHelper.d("IProfileApi have success connect, api="+myApi);
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("IProfileApi api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call IProfileApi api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    /**
+     * Instantiates a new profile api.
+     */
+    public ProfileApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    /**
+     * Sets the my profile.
+     *
+     * @param profile the profile
+     * @param listener the listener
+     */
+    public void setMyProfile(Profile profile, ProfileListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method setMyProfile. [profile]=%s", profile.toString()));
+        try {
+            myApi.setMyProfile(profile, listener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    /**
+     * Sets the my head pic.
+     *
+     * @param imgObj the img obj
+     * @param listener the listener
+     */
+    public void setMyHeadPic(Avatar imgObj,ProfileListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method setMyHeadPic. [imgObj]=%s", imgObj.toString()));
+        try {
+            myApi.setMyHeadPic(imgObj, listener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    /**
+     * Gets the my profile.
+     *
+     * @param listener the listener
+     * @return the my profile
+     */
+    public void getMyProfile(ProfileListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getMyProfile. "));
+        try {
+            myApi.getMyProfile( listener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    /**
+     * Gets the my head pic.
+     *
+     * @param listener the listener
+     * @return the my head pic
+     */
+    public void getMyHeadPic(ProfileListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getMyHeadPic. "));
+        try {
+            myApi.getMyHeadPic( listener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    /**
+     * Gets the head pic by contact.
+     *
+     * @param contactId the contact id
+     * @param listener the listener
+     * @return the head pic by contact
+     */
+    public void getHeadPicByContact(long contactId,ProfileListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getHeadPicByContact. [contactId]=%d", contactId));
+        try {
+            myApi.getHeadPicByContact(contactId, listener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    /**
+     * Gets the head pic by number.
+     *
+     * @param number the number
+     * @param listener the listener
+     * @return the head pic by number
+     */
+    public void getHeadPicByNumber(String number,int pixel,ProfileListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getHeadPicByNumber. [number]=%s", number));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return;
+        }
+        try {
+            myApi.getHeadPicByNumber(VerificationUtil.formatNumber(number), pixel, listener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    /**
+     * Refresh my qr img.
+     *
+     * @param profile the profile
+     * @param includeEInfo the include e info
+     * @param listener the listener
+     */
+    public void refreshMyQRImg(Profile profile, boolean includeEInfo,QRImgListener listener) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method refreshMyQRImg. [profile,includeEInfo]=%s,%b", profile.toString(),includeEInfo));
+        try {
+            myApi.refreshMyQRImg(profile,includeEInfo, listener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    /**
+     * update the the contacts head photo at fixed time every day.
+     *
+     * @param hhmm The timing of the trigger. the time format is HH:mm in 24-hour time system
+     * @param listener a callback whose method named onAvatarGet will be called
+     * @return
+     */
+    public void updateContactsHeadPicAtFixedRateEveryDay(String hhmm,
+            IProfileListener listener) throws ServiceDisconnectedException{
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method updateContactsHeadPicAtFixedRateEveryDay. [hhmm]=%s", hhmm));
+        try {
+            myApi.updateContactsHeadPicAtFixedRateEveryDay(hhmm, listener);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public String getUpdateTimeOfContactsHeadPic() throws ServiceDisconnectedException{
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getUpdateTimeOfContactsHeadPic"));
+        try {
+            return myApi.getUpdateTimeOfContactsHeadPic();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+        return null;
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallback.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallback.java
new file mode 100644
index 0000000..9f6dfd4
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallback.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.publicaccount.callback;
+
+import java.util.List;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.plugin.callback.IPublicAccountCallbackAPI;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.MenuInfo;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.MsgContent;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccounts;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccountsDetail;
+
+public abstract class PublicAccountCallback extends IPublicAccountCallbackAPI.Stub{
+
+
+//    public void PublicAccountCallback() {
+//
+//    }
+//    @Override
+//    public void respAddSubscribe(boolean arg0) throws RemoteException {
+//        // TODO Auto-generated method stub
+//
+//    }
+
+    @Override
+    public void respAddSubscribeAccount(boolean arg0, PublicAccounts arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+//    @Override
+//    public void respCancelSubscribe(boolean arg0) throws RemoteException {
+//        // TODO Auto-generated method stub
+//
+//    }
+
+    @Override
+    public void respCancelSubscribeAccount(boolean arg0, PublicAccounts arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+//    @Override
+//    public void respComplainPublic(boolean result) throws RemoteException {
+//        // TODO Auto-generated method stub
+//        LogHelper.d("result --> "+result );
+//    }
+
+    @Override
+    public void respComplainPublicAccount(boolean result, PublicAccounts arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void respGetPreMessage(boolean arg0, List<MsgContent> arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+//    @Override
+//    public void respGetPreMessageAccount(boolean result, PublicAccounts pAccount)
+//            throws RemoteException {
+//        // TODO Auto-generated method stub
+//        LogHelper.d("result --> "+result + "PublicAccounts = " + pAccount.getPaUuid()+" , "+pAccount.getSipUri());
+//    }
+
+    @Override
+    public void respGetPublicDetail(boolean arg0, PublicAccountsDetail arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void respGetPublicList(boolean arg0, List<PublicAccounts> arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void respGetPublicMenuInfo(boolean result, List<MenuInfo> menuList)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+//    @Override
+//    public void respGetPublicMenuInfoAccount(boolean result, PublicAccounts pAccount)
+//            throws RemoteException {
+//        // TODO Auto-generated method stub
+//        LogHelper.d("result --> "+result + "PublicAccounts = " + pAccount.getPaUuid()+" , "+pAccount.getSipUri());
+//
+//    }
+
+//    @Override
+//    public void respGetPublicMenuInfoString(boolean result, String info)
+//            throws RemoteException {
+//        // TODO Auto-generated method stub
+//        LogHelper.d("result --> "+result + "info = " + info);
+//
+//    }
+
+    @Override
+    public void respGetUserSubscribePublicList(boolean result,
+            List<PublicAccounts> pubAcctList) throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void respGetPublicRecommend(boolean arg0, List<PublicAccounts> arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallbackImpl.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallbackImpl.java
new file mode 100644
index 0000000..333607a
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallbackImpl.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.publicaccount.callback;
+
+import java.util.List;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.MenuInfo;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.MsgContent;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccounts;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccountsDetail;
+
+public class PublicAccountCallbackImpl extends PublicAccountCallback {
+
+    public PublicAccountCallbackImpl() {
+        // TODO Auto-generated constructor stub
+    }
+
+//    @Override
+//    public void respAddSubscribe(boolean arg0) throws RemoteException {
+//        // TODO Auto-generated method stub
+//
+//    }
+
+    @Override
+    public void respAddSubscribeAccount(boolean arg0, PublicAccounts arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+//    @Override
+//    public void respCancelSubscribe(boolean arg0) throws RemoteException {
+//        // TODO Auto-generated method stub
+//
+//    }
+
+    @Override
+    public void respCancelSubscribeAccount(boolean arg0, PublicAccounts arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+//    @Override
+//    public void respComplainPublic(boolean arg0) throws RemoteException {
+//        // TODO Auto-generated method stub
+//
+//    }
+
+    @Override
+    public void respComplainPublicAccount(boolean arg0, PublicAccounts arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void respGetPreMessage(boolean arg0, List<MsgContent> arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+//    @Override
+//    public void respGetPreMessageAccount(boolean arg0, PublicAccounts arg1)
+//            throws RemoteException {
+//        // TODO Auto-generated method stub
+//
+//    }
+
+    @Override
+    public void respGetPublicDetail(boolean arg0, PublicAccountsDetail arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void respGetPublicList(boolean arg0, List<PublicAccounts> arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void respGetPublicMenuInfo(boolean arg0, List<MenuInfo> arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+//    @Override
+//    public void respGetPublicMenuInfoAccount(boolean arg0, PublicAccounts arg1)
+//            throws RemoteException {
+//        // TODO Auto-generated method stub
+//
+//    }
+
+//    @Override
+//    public void respGetPublicMenuInfoString(boolean arg0, String arg1)
+//            throws RemoteException {
+//        // TODO Auto-generated method stub
+//
+//    }
+
+    @Override
+    public void respGetUserSubscribePublicList(boolean arg0,
+            List<PublicAccounts> arg1) throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void respGetPublicRecommend(boolean arg0, List<PublicAccounts> arg1)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void respSetAcceptStatus(boolean result, String uuid)
+            throws RemoteException {
+        // TODO Auto-generated method stub
+
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/impl/PublicAccountApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/impl/PublicAccountApi.java
new file mode 100644
index 0000000..68ef5c5
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/impl/PublicAccountApi.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.publicaccount.impl;
+
+import java.util.List;
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.plugin.IPublicAccountAPI;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccounts;
+import com.suntek.mway.rcs.client.api.plugin.entity.pubacct.PublicAccountsDetail;
+import com.suntek.mway.rcs.client.api.publicaccount.callback.PublicAccountCallback;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class PublicAccountApi extends ClientApi {
+
+    private static String  serviceName = "com.suntek.mway.rcs.app.service.pubacct.plugin.service.PublicAccountPluginService";
+
+    IPublicAccountAPI myApi;
+    PublicAccountCallback theCallback;
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("client api connect service");
+            myApi = IPublicAccountAPI.Stub.asInterface(service);
+            notifyServiceConnected();
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("client api disconnect service...");
+                try {
+                    if (myApi != null && theCallback != null) myApi.unregisterCallback(theCallback);
+                } catch (Exception ex) {
+                    // TODO Auto-generated catch block
+                    LogHelper.e(ex.getMessage(), ex);
+                }
+                theCallback = null;
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call client api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public PublicAccountApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+
+    public void unregisterCallback(PublicAccountCallback callback)throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.unregisterCallback(callback);
+        } catch (RemoteException ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void getUserSubscribePublicList(int order,int pageSize,int pageNum,PublicAccountCallback callback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getUserSubscribePublicList. [order,pageSize,pageNum]=%d,%d,%d", order,pageSize,pageNum));
+        if (order != 0 && order != 1) {
+            LogHelper.i("order field value must be 0 or 1");
+            return;
+        }
+        try {
+            myApi.registerCallback(callback);
+            myApi.getUserSubscribePublicList(order, pageSize, pageNum);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void getPublicMenuInfo(String uuid,PublicAccountCallback callback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getPublicMenuInfo. [uuid]=%s", uuid));
+        try {
+            myApi.registerCallback(callback);
+            myApi.getPublicMenuInfo(uuid);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void getPublicDetail(String uuid,PublicAccountCallback callback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getPublicDetail. [uuid]=%s", uuid));
+        try {
+            myApi.registerCallback(callback);
+            myApi.getPublicDetail(uuid);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public void addSubscribe(String uuid,PublicAccountCallback callback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method addSubscribe. [uuid]=%s", uuid));
+        try {
+            myApi.registerCallback(callback);
+            myApi.addSubscribe(uuid);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+
+    public void cancelSubscribe(String uuid,PublicAccountCallback callback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method cancelSubscribe. [uuid]=%s", uuid));
+        try {
+            myApi.registerCallback(callback);
+            myApi.cancelSubscribe(uuid);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+    }
+
+    public boolean complainPublic(String uuid,String reason, String description, int type, String data ,PublicAccountCallback callback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method complainPublic. [uuid,reason,description,type,data]=%s,%s,%s,%d,%s", uuid,reason,description,type,data));
+        boolean flag = false;
+        try {
+            myApi.registerCallback(callback);
+            flag = myApi.complainPublic(uuid, reason, description, type, data);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+        return flag;
+    }
+
+    public boolean getPreMessage(String uuid, String timestamp, int order, int pageSize, int pageNum,
+            PublicAccountCallback callback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        boolean flag = false;
+        try {
+            myApi.registerCallback(callback);
+            flag = myApi.getPreMessage(uuid, timestamp, order, pageSize, pageNum);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+        return flag;
+    }
+
+    public boolean getPublicList(String keywords, int pageSize, int pageNum, int order,
+            PublicAccountCallback callback) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        LogHelper.i(String.format( Locale.getDefault(),"enter method getPublicList. [keywords,pageSize,pageNum,order]=%s,%d,%d,%d", keywords,pageSize,pageNum,order));
+        boolean flag = false;
+        try {
+            myApi.registerCallback(callback);
+            flag = myApi.getPublicList(keywords, pageSize, pageNum, order);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(),ex);
+        }
+        return flag;
+    }
+
+    public PublicAccountsDetail getPublicDetailCache(String uuid) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getPublicDetailCache(uuid);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+            return null;
+        }
+    }
+
+    public List<PublicAccounts> getUserSubscribePublicListCache(int order, int pageSize, int pageNum) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getUserSubscribePublicListCache(order, pageSize, pageNum);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+            return null;
+        }
+    }
+
+    public boolean getRecommendPublic(int type, int pageSize, int pageNum)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        if (pageSize <= 0 || pageNum <= 0) {
+            LogHelper.i("params is not valid");
+            return false;
+        }
+
+        boolean flag = false;
+        try {
+            flag = myApi.getRecommendPublic(type, pageSize, pageNum);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(),ex);
+        }
+        return flag;
+    }
+
+    public boolean setAcceptStatus(String uuid, int acceptStatus)
+            throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.setAcceptStatus(uuid, acceptStatus);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return isNormallyClosed;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/specialnumber/impl/SpecialServiceNumApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/specialnumber/impl/SpecialServiceNumApi.java
new file mode 100644
index 0000000..e8edc44
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/specialnumber/impl/SpecialServiceNumApi.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.specialnumber.impl;
+
+import java.util.List;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.specialnumber.ISpecialServiceNumApi;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class SpecialServiceNumApi extends ClientApi{
+
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.specialnumber.SpecialServiceNumApiService";
+
+    ISpecialServiceNumApi myApi;
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            LogHelper.d("ISpecialServiceNumApi api connect service");
+            myApi = ISpecialServiceNumApi.Stub.asInterface(service);
+            notifyServiceConnected();
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("ISpecialServiceNumApi api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call ISpecialServiceNumApi api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public SpecialServiceNumApi() {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    /**
+     * Add special number.
+     *
+     * @param number the number
+     */
+    public void add(String number)throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.add(number);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * Close function, Set status to close.
+     */
+    public void closeFunction()throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.closeFunction();
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * Delete special number prefix.
+     *
+     * @param number the number
+     * @return the string
+     */
+    public String delSpecialPreNum(String telephone)throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.delSpecialPreNum(telephone);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+            return "";
+        }
+    }
+
+    /**
+     * Gets the list of special numbers.
+     *
+     * @return the list
+     */
+    public List<String> getList()throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.getList();
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+            return null;
+        }
+    }
+
+    /**
+     * Open function, Set status to open.
+     */
+    public void openFunction()throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.openFunction();
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * Removes a special number.
+     *
+     * @param number the number
+     */
+    public void remove(String number)throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.remove(number);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * Removes all special number.
+     */
+    public void removeAll()throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            myApi.removeAll();
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(),e);
+        }
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/support/RcsSupportApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/support/RcsSupportApi.java
new file mode 100644
index 0000000..163b2e9
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/support/RcsSupportApi.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.support;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Dynamically detect the installation status of RCS components during runtime.
+ *
+ * @author lrb
+ *
+ */
+public class RcsSupportApi {
+    /**
+     * The package name of RcsService module.
+     */
+    private static final String RCS_SERVICE_PACKAGE_NAME = "com.suntek.mway.rcs.app.service";
+
+    /**
+     * The package name of RcsPlugin module.
+     */
+    private static final String RCS_PLUGIN_PACKAGE_NAME = "com.suntek.mway.rcs.app.plugin";
+
+    private static final String RCS_PLUGIN_CENTER_PACKAGE_NAME = "com.cmri.rcs.plugincenter";
+
+    /**
+     * The Profile plug-in that provided by CMCC.
+     */
+    public static final int PLUGIN_PROFILE = 0;
+
+    /**
+     * The Public Account plug-in that provided by CMCC.
+     */
+    public static final int PLUGIN_PUBLIC_ACCOUNT = 1;
+
+    /**
+     * The QR-Code plug-in that provided by CMCC.
+     */
+    public static final int PLUGIN_QR_CODE = 2;
+
+    /**
+     * The Enhance Call Screen plug-in that provided by CMCC.
+     */
+    public static final int PLUGIN_ENHANCE_CALL_SCREEN = 3;
+
+    /**
+     * The Cloud File Sharing plug-in that provided by CMCC.
+     */
+    public static final int PLUGIN_CLOUD_FILE_SHARING = 4;
+
+    /**
+     * The Emotions Store plug-in that provided by CMCC.
+     */
+    public static final int PLUGIN_EMOTIONS_STORE = 5;
+
+    /**
+     * The Plug-in Center plug-in that provided by CMCC.
+     */
+    public static final int PLUGIN_PLUGIN_CENTER = 6;
+
+    /**
+     * Check that the RcsService module is been installed.
+     *
+     * @param context
+     * @return true if RcsService module is installed.
+     */
+    public static boolean isRcsServiceInstalled(Context context) {
+        return isPackageInstalled(context, RCS_SERVICE_PACKAGE_NAME);
+    }
+
+    /**
+     * Check that the RcsService module is been installed.
+     *
+     * @param context
+     * @return true if RcsService module is installed.
+     */
+    public static boolean isRcsPluginInstalled(Context context) {
+        return isPackageInstalled(context, RCS_PLUGIN_PACKAGE_NAME);
+    }
+
+    public static boolean isRcsPluginCenterInstalled(Context context) {
+        return isPackageInstalled(context, RCS_PLUGIN_CENTER_PACKAGE_NAME);
+    }
+
+    private static boolean isPackageInstalled(Context context, String packageName) {
+        PackageManager pm = context.getPackageManager();
+        List<ApplicationInfo> installedApps = pm
+                .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
+
+        for (ApplicationInfo info : installedApps) {
+            if (packageName.equals(info.packageName)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Dynamically detect the supported plug-in.
+     *
+     * @param context
+     * @return The plug-in list that is supported.
+     */
+    public static List<Integer> getSupportedPlugins(Context context) {
+        List<Integer> supportedPluginIds = new ArrayList<Integer>();
+
+        if (isRcsPluginInstalled(context)) {
+            // TODO 增加检测插件安装的机制,动态返回可用的插件
+            supportedPluginIds.add(PLUGIN_PROFILE);
+            supportedPluginIds.add(PLUGIN_PUBLIC_ACCOUNT);
+            supportedPluginIds.add(PLUGIN_QR_CODE);
+            supportedPluginIds.add(PLUGIN_ENHANCE_CALL_SCREEN);
+            supportedPluginIds.add(PLUGIN_CLOUD_FILE_SHARING);
+            supportedPluginIds.add(PLUGIN_EMOTIONS_STORE);
+            supportedPluginIds.add(PLUGIN_PLUGIN_CENTER);
+        }
+
+        return supportedPluginIds;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileDurationException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileDurationException.java
new file mode 100644
index 0000000..8eab4e5
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileDurationException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.util;
+
+public class FileDurationException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    public FileDurationException() {
+        super();
+    }
+
+    public FileDurationException(String detailMessage, Throwable throwable) {
+        super(detailMessage, throwable);
+    }
+
+    public FileDurationException(String detailMessage) {
+        super(detailMessage);
+    }
+
+    public FileDurationException(Throwable throwable) {
+        super(throwable);
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileSuffixException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileSuffixException.java
new file mode 100644
index 0000000..c6c203a
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileSuffixException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.util;
+
+public class FileSuffixException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    public FileSuffixException() {
+        super();
+    }
+
+    public FileSuffixException(String detailMessage, Throwable throwable) {
+        super(detailMessage, throwable);
+    }
+
+    public FileSuffixException(String detailMessage) {
+        super(detailMessage);
+    }
+
+    public FileSuffixException(Throwable throwable) {
+        super(throwable);
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileTransferException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileTransferException.java
new file mode 100644
index 0000000..7d3bce0
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileTransferException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.util;
+
+public class FileTransferException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    public FileTransferException() {
+        super();
+    }
+
+    public FileTransferException(String detailMessage, Throwable throwable) {
+        super(detailMessage, throwable);
+    }
+
+    public FileTransferException(String detailMessage) {
+        super(detailMessage);
+    }
+
+    public FileTransferException(Throwable throwable) {
+        super(throwable);
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/ServiceDisconnectedException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/ServiceDisconnectedException.java
new file mode 100644
index 0000000..122f243
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/ServiceDisconnectedException.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.util;
+
+public class ServiceDisconnectedException extends Exception {
+    public ServiceDisconnectedException() {
+    }
+
+    public ServiceDisconnectedException(String message) {
+        super(message);
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/VerificationUtil.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/VerificationUtil.java
new file mode 100644
index 0000000..45b1a76
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/VerificationUtil.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.util;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.content.Context;
+
+import com.suntek.mway.rcs.client.api.constant.MediaConstants;
+import com.suntek.mway.rcs.client.api.provider.SuntekMessageData;
+import com.suntek.mway.rcs.client.api.utils.MediaUtils;
+import com.suntek.mway.rcs.client.api.utils.SettingUtils;
+
+public class VerificationUtil {
+    private static final String SIP_PREFIX = "sip:";
+    private static final String TEL_PREFIX = "tel:";
+
+    public static void ApiIsNull(Object api) throws ServiceDisconnectedException {
+        if (api == null) {
+            throw new ServiceDisconnectedException("Service unavailable, myApi is null");
+        }
+    }
+
+    public static boolean isNumber(String number) {
+        if (number == null) {
+            return false;
+        }
+        return VerificationUtil
+                .formatWithout86(VerificationUtil.getNumberFromUri(number))
+                .replaceAll(" ", "").replaceAll("-", "").matches("\\d+");
+    }
+
+    public static boolean isAllNumber(List<String> numbers) {
+        boolean sign = true;
+        for (String number : numbers) {
+            if (!isNumber(number)) {
+                sign = false;
+            }
+        }
+        return sign;
+    }
+
+    public static String formatNumber(String number) {
+        return number.replaceAll(" ", "").replaceAll("-", "");
+    }
+
+    public static List<String> formatNumbers(List<String> numbers) {
+        List<String> re = new ArrayList<String>();
+        for (String number : numbers) {
+            re.add(formatNumber(number));
+        }
+        return re;
+    }
+
+    public static boolean isBurnFlagCorrect(int burnFlag) {
+        return burnFlag == SuntekMessageData.MSG_BURN_AFTER_READ_FLAG
+                || burnFlag == SuntekMessageData.MSG_BURN_AFTER_READ_NOT;
+    }
+
+    public static void isImageFile(String filename) throws FileSuffixException {
+        if (!MediaUtils.isImageFile(filename)) {
+            throw new FileSuffixException(
+                    "File extension is incorrect, the correct extension is '"
+                            + MediaConstants.IMAGE_SUFFIX + "'");
+        }
+    }
+
+    public static void isAudioFile(String filename) throws FileSuffixException {
+        if (!MediaUtils.isAudioFile(filename)) {
+            throw new FileSuffixException(
+                    "File extension is incorrect, the correct extension is '"
+                            + MediaConstants.AUDIO_SUFFIX + "'");
+        }
+    }
+
+    public static void isVideoFile(String filename) throws FileSuffixException {
+        if (!MediaUtils.isVideoFile(filename)) {
+            throw new FileSuffixException(
+                    "File extension is incorrect, the correct extension is '"
+                            + MediaConstants.VIDEO_SUFFIX + "'");
+        }
+    }
+
+    public static void isFileSizeToLarge(String filename, long maxSize)
+            throws FileTransferException {
+        File file = new File(filename);
+        if (file.exists() && file.isFile() && file.length() > (maxSize * 1024)) {
+            throw new FileTransferException("File too large "
+                    + (file.length() / 1024)
+                    + " KB. Max size of file to be transfer is " + maxSize
+                    + " KB.");
+        }
+    }
+
+    public static void isAudioDurationToLong(Context context, String filename, long maxDuration, int recordTime)
+            throws FileDurationException {
+        File file = new File(filename);
+        if (file.exists() && file.isFile()){
+            int duration = MediaUtils.getAmrFileDuration(context, file);
+            if(duration > maxDuration * 1000 || recordTime > maxDuration){
+                throw new FileDurationException("File duration too long "
+                        + duration
+                        + " s. Max duration is " + maxDuration
+                        + " s.");
+            }
+        }
+    }
+
+    public static void isVedioDurationToLong(Context context, String filename, long maxDuration, int recordTime)
+            throws FileDurationException {
+        File file = new File(filename);
+        if (file.exists() && file.isFile()){
+            int duration = MediaUtils.getVideoFileDuration(context, file);
+            if(duration > maxDuration * 1000 || recordTime > maxDuration){
+                throw new FileDurationException("File duration too long "
+                        + duration
+                        + " s. Max duration is " + maxDuration
+                        + " s.");
+            }
+        }
+    }
+
+    public static final String DMS_FT_MAX_SIZE = "ftMaxSize";
+
+    public static long getFtMaxSize(Context context) {
+        return SettingUtils.getSetting(context, DMS_FT_MAX_SIZE,
+                MediaConstants.FT_MAX_SIZE);
+    }
+
+    public static final String DMS_IMAGE_FT_MAX_SIZE = "imageFtMaxSize";
+
+    public static long getImageFtMaxSize(Context context) {
+        return SettingUtils.getSetting(context, DMS_IMAGE_FT_MAX_SIZE,
+                MediaConstants.IMAGE_FT_MAX_SIZE);
+    }
+
+    public static final String DMS_VIDEO_FT_MAX_SIZE = "videoFtMaxSize";
+
+    public static long getVideoFtMaxSize(Context context) {
+        return SettingUtils.getSetting(context, DMS_VIDEO_FT_MAX_SIZE, MediaConstants.VIDEO_FT_MAX_SIZE);
+    }
+
+    public static final String DMS_VIDEO_MAX_TIME = "videoMaxTime";
+
+    public static long getVideoMaxTime(Context context) {
+        return SettingUtils.getSetting(context, DMS_VIDEO_MAX_TIME, MediaConstants.VIDEO_MAX_TIME);
+    }
+
+    public static final String DMS_AUDIO_MAX_TIME = "audioMaxTime";
+
+    public static long getAudioMaxTime(Context context) {
+        return SettingUtils.getSetting(context, DMS_AUDIO_MAX_TIME, MediaConstants.AUDIO_MAX_TIME);
+    }
+
+    public static String formatWithout86(String mobile) {
+        String formatStr = mobile;
+        if (formatStr != null) {
+            formatStr = formatStr.replaceAll(" ", "");
+            if (formatStr.startsWith("+86")) {
+                formatStr = formatStr.substring(3);
+            }
+            if (formatStr.startsWith("86")) {
+                formatStr = formatStr.substring(2);
+            }
+            if (formatStr.startsWith(" 86")) {
+                formatStr = formatStr.substring(3);
+            }
+        }
+        if (formatStr == null) {
+            formatStr = "";
+        }
+        return formatStr.trim();
+    }
+
+    public static String getNumberFromUri(String uriStr) {
+        if (uriStr == null) {
+            return "";
+        }
+        int index = uriStr.lastIndexOf("<");
+        if (index != -1) {
+            int index2 = uriStr.indexOf(">");
+            if (index2 != -1) {
+                uriStr = uriStr.substring(index + 1, index2);
+            } else {
+                uriStr = uriStr.substring(index + 1);
+            }
+        }
+        if (uriStr.endsWith(">")) {
+            uriStr = uriStr.substring(0, uriStr.length() - 1);
+        }
+        if (uriStr.startsWith(TEL_PREFIX)) {
+            uriStr = uriStr.substring(4);
+        } else if (uriStr.startsWith(SIP_PREFIX)) {
+            uriStr = uriStr.substring(4, uriStr.indexOf("@"));
+        }
+
+        int pos = uriStr.indexOf("@");
+        if(pos != -1){
+            uriStr = uriStr.substring(0, pos);
+        }
+        return uriStr;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/log/LogHelper.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/log/LogHelper.java
new file mode 100644
index 0000000..0baba01
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/log/LogHelper.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.util.log;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import android.os.Environment;
+import android.util.Log;
+
+/**
+ * <p>Title: LogHelper.java</p>
+ * <p>Description: The Class LogHelper.</p>
+ * <p>Copyright: Copyright (c) 2010</p>
+ * <p>Company: pci-suntek</p>
+ *
+ * @author hhao
+ * @version 1.0
+ */
+public final class LogHelper {
+
+    /** The Constant OPEN_DEBUG. */
+    public static final String OPEN_DEBUG = "_SETTING_SERVICE_OPEN_DEBUG";
+
+    /** Is debug mode. */
+    private static boolean mIsDebugMode = true;
+
+    /** Will the log write to file. */
+    private static Boolean MYLOG_WRITE_TO_FILE = true;
+
+    /** The log tag name. */
+    private static String TAG = "RCS_Service_API";
+
+    /** The Constant CLASS_METHOD_LINE_FORMAT. */
+    private static final String CLASS_METHOD_LINE_FORMAT = "%s.%s()  Line:%d  (%s)";
+
+    /** The logfile dir path in sdcard. */
+    public static String MYLOG_PATH_SDCARD_DIR = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.suntek.mway.rcs.service.api/logs";
+
+    /** The log file's name. */
+    private static String MYLOGFILEName = "rcs_service_api_log";
+
+    /** My log format style. */
+    private static SimpleDateFormat myLogSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+
+    /** The log format style. */
+    private static SimpleDateFormat logfile = new SimpleDateFormat("yyyy-MM-dd");
+
+    /** The log's level. */
+    private final static int logLevel = Log.VERBOSE;
+
+    private static boolean isSensitiveLog = false;
+
+    /**
+     * Log.
+     *
+     * @param str the str
+     * @param level the level
+     */
+    private static void log(String str, int level) {
+        log(str, level, null);
+    }
+
+    /**
+     * Log.
+     *
+     * @param str the str
+     * @param level the level
+     * @param throwable the throwable
+     */
+    private static void log(String str, int level, Throwable throwable) {
+        if (mIsDebugMode) {
+            if (logLevel <= level) {
+                //Get the method name from the stackTrace.
+                StackTraceElement[] array = Thread.currentThread().getStackTrace();
+                StackTraceElement traceElement = (array!=null && array.length > 5 ? array[5]: array[array.length-1]);
+                String logText = String.format(CLASS_METHOD_LINE_FORMAT,
+                        traceElement.getClassName(),
+                        traceElement.getMethodName(),
+                        traceElement.getLineNumber(),
+                        traceElement.getFileName());
+                // ERROR, WARN, INFO, DEBUG, VERBOSE
+                String logTag = "";
+                if (level == Log.VERBOSE) {
+                    Log.v(TAG, logText + "->" + str);
+                    logTag = "[VERBOSE]";
+                } else if (level == Log.DEBUG) {
+                    Log.d(TAG, logText + "->" + str);
+                    logTag = "[DEBUG]";
+                } else if (level == Log.INFO) {
+                    Log.i(TAG, logText + "->" + str);
+                    logTag = "[INFO ]";
+                } else if (level == Log.WARN) {
+                    Log.w(TAG, logText + "->" + str);
+                    logTag = "[WARN ]";
+                } else if (level == Log.ERROR) {
+                    if (throwable != null) {
+                        Log.e(TAG, logText + "->" + str, throwable);
+                    } else {
+                        Log.e(TAG, logText + "->" + str);
+                    }
+                    logTag = "[ERROR]";
+                }
+                if (MYLOG_WRITE_TO_FILE
+                        && android.os.Environment.getExternalStorageState()
+                                .equals(android.os.Environment.MEDIA_MOUNTED)) {
+                    if (throwable != null) {
+                        str += "\n" + Log.getStackTraceString(throwable);
+                    }
+                    writeLogtoFile(MYLOGFILEName, TAG + " " + logTag, logText
+                            + "->" + str);
+                }
+            }
+
+        }
+    }
+
+    /**
+     * Trace.
+     *
+     * @param str the str
+     */
+    public static void trace(String str) {
+        log(str, Log.DEBUG);
+    }
+
+    /**
+     * VERBOSE.
+     *
+     * @param str the str
+     */
+    public static void v(String str) {
+        log(str, Log.VERBOSE);
+    }
+
+    /**
+     * DEBUG.
+     *
+     * @param str the str
+     */
+    public static void d(String str) {
+        log(str, Log.DEBUG);
+    }
+
+    /**
+     * WARN.
+     *
+     * @param str the str
+     */
+    public static void w(String str) {
+        log(str, Log.WARN);
+    }
+
+    /**
+     * INFO.
+     *
+     * @param str the str
+     */
+    public static void i(String str) {
+        log(str, Log.INFO);
+    }
+
+    /**
+     * ERROR.
+     *
+     * @param str the str
+     */
+    public static void e(String str) {
+        log(str, Log.ERROR);
+    }
+
+    /**
+     * ERROR.
+     *
+     * @param str the str
+     * @param throwable the throwable
+     */
+    public static void e(String str, Throwable throwable) {
+        log(str, Log.ERROR, throwable);
+    }
+
+    public static String sensitive(String str) {
+        if (isSensitiveLog) {
+            return "*****";
+        } else {
+            return str;
+        }
+    }
+
+    /**
+     * Open and write the logfile
+     * @param filename the filename
+     * @param tag the tag
+     * @param text the text
+     * @return *
+     */
+    private synchronized static void writeLogtoFile(String filename,
+            String tag, String text) {
+        File filePath = new File(MYLOG_PATH_SDCARD_DIR);
+        if (!filePath.exists()) {
+            filePath.mkdirs();
+        }
+        Date nowtime = new Date();
+        String needWriteFiel = logfile.format(nowtime);
+        String needWriteMessage = myLogSdf.format(nowtime) + "    " + tag
+                + "    " + text;
+        File file = new File(MYLOG_PATH_SDCARD_DIR, filename + "_"
+                + needWriteFiel + ".log");
+        FileWriter filerWriter = null;
+        BufferedWriter bufWriter = null;
+        try {
+            //Append the content to the file.
+            filerWriter = new FileWriter(file, true);
+            bufWriter = new BufferedWriter(filerWriter);
+            bufWriter.write(needWriteMessage);
+            bufWriter.newLine();
+        } catch (Exception e) {
+            printStackTrace(e);
+        }finally {
+            try {
+                if(bufWriter!=null) bufWriter.close();
+            }catch(Exception ex) {}
+            try {
+                if(filerWriter!=null) filerWriter.close();
+            }catch(Exception ex) {}
+        }
+    }
+
+    /**
+     * Prints the stack trace.
+     *
+     * @param throwable the throwable
+     */
+    public static void printStackTrace(Throwable throwable) {
+        if (mIsDebugMode) {
+            Log.w(TAG, "", throwable);
+        }
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/voip/impl/RichScreenApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/voip/impl/RichScreenApi.java
new file mode 100644
index 0000000..c40652b
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/voip/impl/RichScreenApi.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+ 
+package com.suntek.mway.rcs.client.api.voip.impl;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import com.suntek.mway.rcs.client.api.ClientApi;
+import com.suntek.mway.rcs.client.api.RCSServiceListener;
+import com.suntek.mway.rcs.client.api.plugin.IRichScreenApi;
+import com.suntek.mway.rcs.client.api.plugin.entity.richscrn.PhoneList;
+import com.suntek.mway.rcs.client.api.plugin.entity.richscrn.ResultInfo;
+import com.suntek.mway.rcs.client.api.plugin.entity.richscrn.ResultUtil;
+import com.suntek.mway.rcs.client.api.plugin.entity.richscrn.RichScrnShowing;
+import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+
+public class RichScreenApi extends ClientApi {
+    /** The service name. */
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.richscreen.RichScreenApiService";
+
+    /** The api. */
+    private IRichScreenApi myApi;
+
+    /** The service connection. */
+    private ServiceConnection mConnection = new ServiceConnection() {
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            myApi = IRichScreenApi.Stub.asInterface(service);
+            notifyServiceConnected();
+            LogHelper.d("RichScreenApi have success connect, api="+myApi);
+        }
+
+        public void onServiceDisconnected(ComponentName className) {
+            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("IRichScreenApi api disconnect service");
+                myApi = null;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call IRichScreenApi api disconnect service :"
+                        + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    myApi = null;
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+    };
+
+    public RichScreenApi(String theService) {
+        super(serviceName);
+        super.initServiceConnect(mConnection);
+    }
+
+    @Override
+    public void init(Context context, RCSServiceListener listener) {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:init. [context]=%s", context.toString()));
+        // TODO Auto-generated constructor stub
+        super.init(context, listener);
+//
+//        // success bind service and then go to init richScreen plugin service:
+//        try {
+//            if (super.isBinded()) myApi.init(100);
+//        } catch (Exception ex) {
+//            // TODO Auto-generated catch block
+//            LogHelper.e(ex.getMessage(), ex);
+//        }
+    }
+
+    /**
+     * Gets the rich screen object.
+     *
+     * @param missdn
+     *            the missdn of peer , When a call event occurs.
+     * @param phoneEvent
+     *            the phone call event
+     * @return the rich screen object
+     */
+    public RichScrnShowing getRichScrnObj( String missdn, String phoneEvent ) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        RichScrnShowing richScrnShowingObject = null;
+        try {
+            ResultUtil resultObj = myApi.getRichScrnObj(missdn, phoneEvent);
+
+            //sdk local could't get the RichScrnShowingObject
+            if(null == resultObj || !resultObj.isResultFlag() || null == resultObj.getResultObj()) {
+                //go to download new RichScrnObj....
+                if(downloadRichScrnObj(missdn, phoneEvent)) {
+                    resultObj = myApi.getRichScrnObj(missdn, phoneEvent);
+                }
+            }
+
+            if(resultObj!=null && resultObj.isResultFlag()) {
+                LogHelper.i("success get the richScrnShowingObject about number:"+missdn+" at phone call event "+phoneEvent);
+                richScrnShowingObject = (RichScrnShowing)resultObj.getResultObj();
+            }
+            else  {
+                LogHelper.w("could not get the richScrnShowingObject about number:"+missdn+" at phone call event "+phoneEvent);
+            }
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return richScrnShowingObject;
+    }
+
+    /**
+     * Download rich screen object.
+     *
+     * @param missdn
+     *            the missdn
+     * @param phoneEvent
+     *            the phone event
+     * @return the result info
+     */
+    public boolean downloadRichScrnObj( String missdn, String phoneEvent ) {
+        boolean flag = false;
+        try {
+            ResultInfo downlodRlt = myApi.downloadRichScrnObj(missdn, phoneEvent);
+
+            if(downlodRlt != null && downlodRlt.isSuccess()) {
+                LogHelper.i("success download the richScrnShowingObject about number:"+missdn+" at phone call event "+phoneEvent);
+                flag = true;
+            }
+            else LogHelper.w("could not download the richScrnShowingObject about number:"+missdn+" at phone call event "+phoneEvent);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return flag;
+    }
+
+    /**
+     * Clear rich screen local cache.
+     *
+     * @param phoneEvent
+     *            the phone event
+     * @return the result info
+     */
+    public boolean clearRichScrnLocalCache( String phoneEvent ) throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(myApi);
+        boolean flag = false;
+        try {
+            ResultInfo result =  myApi.clearRichScrnLocalCache(phoneEvent);
+            if(result != null && result.isSuccess()) {
+                LogHelper.i("success clear the richScrnShowingObject at phone call event "+phoneEvent);
+                flag = true;
+            }
+            else LogHelper.w("could not clear the richScrnShowingObject at phone call event "+phoneEvent);
+        } catch (Exception ex) {
+            // TODO Auto-generated catch block
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return flag;
+    }
+
+    public ResultInfo collectRichScrnObj(String sourceType, String cId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:collectRichScrnObj. [sourceType,cId]=%s,%s", sourceType,cId));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.collectRichScrnObj(sourceType, cId);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public ResultInfo downloadHomeLocRules(final String phoneEvent) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:downloadHomeLocRules. [phoneEvent]=%s", phoneEvent));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.downloadHomeLocRules(phoneEvent);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public ResultInfo init(int cacheSize) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:init. [cacheSize]=%d", cacheSize));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.init(cacheSize);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public ResultInfo richScrnCMCCSSOLogin() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:richScrnCMCCSSOLogin. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.richScrnCMCCSSOLogin();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public ResultInfo richScrnChangeNetWork() throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:richScrnChangeNetWork. "));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            return myApi.richScrnChangeNetWork();
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
+    public void startSiteApk(ArrayList<String> mobile) throws ServiceDisconnectedException {
+        LogHelper.i(String.format( Locale.getDefault(),"enter method:startSiteApk. [mobile]=%s", mobile));
+        VerificationUtil.ApiIsNull(myApi);
+        try {
+            PhoneList phoneList = new PhoneList();
+            phoneList.setPhoneList(mobile);
+            myApi.startSiteApk(phoneList);
+        } catch (Exception ex) {
+            LogHelper.e(ex.getMessage(), ex);
+        }
+    }
+
+    public enum PhoneEventEnum {
+        INITIATE_A_VOICE_CALL("111 00 00000"), // Initiate a voice call
+        INCOMING_VOICE_CALL_THE_TERMINAL_STARTS_RINGING("122 00 18000"), // Incoming voice call, the terminal starts ringing
+        SWITCHED_VOICE_CALLS_CALLINGSIDE("113 00 20000"), // Switched voice calls (calling side)
+        SWITCHED_VOICE_CALLS_CALLED_SIDE("123 00 20000"), // Switched voice calls (called side)
+        VOICE_CALL_HANG_UP_CALLING_SIDE("114 00 20000"), // Voice call hang up (calling side)
+        VOICE_CALL_HANG_UP_CALLED_SIDE("124 00 20000"), // Voice call hang up (called side)
+        OUTGOING_VIDEO_CALL("211 00 00000"), // Outgoing video call
+        VIDEO_CALL_COMES_IN_THE_TERMINAL_STARTS_RINGING("222 00 00000"), // Video call comes in, the terminal starts ringing
+        VIDEO_CALL_IS_CONNECTED_CALLING_SIDE("213 00 20000"), // Video call is connected (calling side)
+        VIDEO_CALL_IS_CONNECTED_CALLED_SIDE_SELECT_THE_VIDEO_CALL(
+                "223 00 20000"), // Video call is connected (called side, select the video call)
+        VIDEO_CALL_HANG_UP_CALLING_SIDE("214 00 20000"), // Video call hang up (calling side)
+        VIDEO_CALL_HANG_UP_CALLED_SIDE("224 00 20000"), // Video call hang up (called side)
+        ADDRESS_BOOK_IS_BING_VIEWED_VIEW_ENHANCED_SCREEN("933 10 11000"), // Terminal communication record, is being viewed, the owner asked to see the enhanced screen
+        ADDRESS_BOOK_IS_BING_VIEWED_ENHANCED_OSD_SETTINGS("933 10 12000"), // Terminal communication record, is being viewed, the owner requires setting the enhanced screen
+        ADDRESS_BOOK_HAVE_BEEN_UPDATED("934 10 20000"), // Terminal communication record have been updated (such as new or revised a contact)
+        COMPLETED_RESTORE_FACTORY_SETTINGS("934 90 30000"), //Terminal has been completed to restore factory settings
+        SIM_CARD_HAS_BEEN_REPLACED("944 90 40000"), // SIM card terminal has been replaced
+        NON_SPECIFIC_EVENTS("000 00 00000"), // Non-specific events
+        ;
+        private String phoneEvent;
+
+        private PhoneEventEnum(String phoneEvent) {
+            this.phoneEvent = phoneEvent;
+        }
+
+        public String getPhoneEvent() {
+            return phoneEvent;
+        }
+    }
+
+}