diff --git a/rcs_service_aidl/Android.mk b/rcs_service_aidl/Android.mk
index 618d15d..00574ff 100644
--- a/rcs_service_aidl/Android.mk
+++ b/rcs_service_aidl/Android.mk
@@ -7,47 +7,15 @@
 # Important: Must not contain any aidl files for parcelables
 LOCAL_SRC_FILES := \
     $(call all-java-files-under, src) \
-    src/com/suntek/mway/rcs/client/aidl/autoconfig/IAutoConfigApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/blacklist/IBlackListApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/capability/ICapabilityApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/capability/IRcsCapabilityApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/emoticon/IEmoticonApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/im/IGroupManagerApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/im/IInstantMessageApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/im/IPaMessageApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/IRCSServiceListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/login/ILoginApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/login/ILoginEventListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/mcloud/IMcloudFileApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/mcontact/IMcontactApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICapabiltyListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IConferenceCallback.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonCallbackApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonCanSendCallback.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonPackagesNetCallbackApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonSetSuccessDownListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudAuthListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudConfListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudFileListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudMsgListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudOperationCtrl.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudSdkListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudShareListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudTransListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMContactSyncListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfileGetCallback.aidl \
+    src/com/suntek/mway/rcs/client/aidl/plugin/IPluginApi.aidl \
+    src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICloudOperationCtrl.aidl \
+    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IContactSyncListener.aidl \
     src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfileListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfilePutCallback.aidl \
     src/com/suntek/mway/rcs/client/aidl/plugin/callback/IPublicAccountCallbackAPI.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/IMcloudFileApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/IProfileApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/IPublicAccountAPI.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/IRichScreenApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugincenter/IPluginCenterApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/registration/IRegistrationApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/setting/callback/IAccountEventListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/setting/IRcsSettingApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/specialnumber/ISpecialServiceNumApi.aidl
+    src/com/suntek/mway/rcs/client/aidl/service/IServiceApi.aidl \
+    src/com/suntek/mway/rcs/client/aidl/service/IServiceListener.aidl \
+    src/com/suntek/mway/rcs/client/aidl/service/callback/ICapabiltyListener.aidl \
+    src/com/suntek/mway/rcs/client/aidl/service/callback/IGroupChatCallback.aidl \
 
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE := rcs_service_aidl
@@ -61,47 +29,15 @@
 # Important: Must not contain any aidl files for parcelables
 LOCAL_SRC_FILES := \
     $(call all-java-files-under, src) \
-    src/com/suntek/mway/rcs/client/aidl/autoconfig/IAutoConfigApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/blacklist/IBlackListApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/capability/ICapabilityApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/capability/IRcsCapabilityApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/emoticon/IEmoticonApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/im/IGroupManagerApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/im/IInstantMessageApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/im/IPaMessageApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/IRCSServiceListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/login/ILoginApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/login/ILoginEventListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/mcloud/IMcloudFileApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/mcontact/IMcontactApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICapabiltyListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IConferenceCallback.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonCallbackApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonCanSendCallback.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonPackagesNetCallbackApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonSetSuccessDownListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudAuthListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudConfListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudFileListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudMsgListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudOperationCtrl.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudSdkListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudShareListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudTransListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMContactSyncListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfileGetCallback.aidl \
+    src/com/suntek/mway/rcs/client/aidl/plugin/IPluginApi.aidl \
+    src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICloudOperationCtrl.aidl \
+    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IContactSyncListener.aidl \
     src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfileListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfilePutCallback.aidl \
     src/com/suntek/mway/rcs/client/aidl/plugin/callback/IPublicAccountCallbackAPI.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/IMcloudFileApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/IProfileApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/IPublicAccountAPI.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugin/IRichScreenApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/plugincenter/IPluginCenterApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/registration/IRegistrationApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/setting/callback/IAccountEventListener.aidl \
-    src/com/suntek/mway/rcs/client/aidl/setting/IRcsSettingApi.aidl \
-    src/com/suntek/mway/rcs/client/aidl/specialnumber/ISpecialServiceNumApi.aidl
+    src/com/suntek/mway/rcs/client/aidl/service/IServiceApi.aidl \
+    src/com/suntek/mway/rcs/client/aidl/service/IServiceListener.aidl \
+    src/com/suntek/mway/rcs/client/aidl/service/callback/ICapabiltyListener.aidl \
+    src/com/suntek/mway/rcs/client/aidl/service/callback/IGroupChatCallback.aidl \
 
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE := rcs_service_aidl_static
diff --git a/rcs_service_aidl/AndroidManifest.xml b/rcs_service_aidl/AndroidManifest.xml
new file mode 100644
index 0000000..e25f2ce
--- /dev/null
+++ b/rcs_service_aidl/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.suntek.mway.rcs.client.api"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk
+        android:minSdkVersion="8"
+        android:targetSdkVersion="17" />
+
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme" >
+        <activity
+            android:name="com.example.rcs_jiaahua_api.MainActivity"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterface.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterface.java
deleted file mode 100644
index 0cb6eeb..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterface.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * 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.aidl;
-
-import java.util.List;
-import java.util.Vector;
-
-import com.suntek.mway.rcs.client.aidl.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/aidl/ClientInterfaceException.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterfaceException.java
deleted file mode 100644
index 6b47900..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterfaceException.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.aidl;
-
-/**
- * <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/aidl/ClientInterfaceIntents.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterfaceIntents.java
deleted file mode 100644
index c23576f..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterfaceIntents.java
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * 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.aidl;
-
-/**
- * <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.aidl.provider.SuntekMessageData#MSG_STATE_SEND_OK}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData#MSG_STATE_SEND_REC}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData#MSG_STATE_SENDED}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData#MSG_STATE_SEND_ING}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.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.aidl.provider.SuntekMessageData#MSG_TYPE_TEXT}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData#MSG_TYPE_FILE}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData#MSG_TYPE_LOCATION}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData#MSG_TYPE_CONTACT}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.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.aidl.provider.SuntekMessageData#MSG_TYPE_TEXT}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData#MSG_TYPE_FILE}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData#MSG_TYPE_LOCATION}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData#MSG_TYPE_CONTACT}
-     * <br/>
-     * {@link com.suntek.mway.rcs.client.aidl.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/aidl/ClientInterfaceListener.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterfaceListener.java
deleted file mode 100644
index 2c4ace3..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterfaceListener.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.aidl;
-
-/**
- * <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/aidl/ClientInterfaceNotify.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterfaceNotify.java
deleted file mode 100644
index a48529c..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ClientInterfaceNotify.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * 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.aidl;
-
-/**
- * <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/aidl/CoreServiceNotAvailableException.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/CoreServiceNotAvailableException.java
deleted file mode 100644
index cb0f790..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/CoreServiceNotAvailableException.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.aidl;
-
-/**
- * <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/aidl/RCSApplication.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/RCSApplication.java
deleted file mode 100644
index c2bb6b9..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/RCSApplication.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * 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.aidl;
-
-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/aidl/ServiceInterface.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ServiceInterface.java
deleted file mode 100644
index eb7a510..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ServiceInterface.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.aidl;
-
-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/aidl/ServiceUnknownException.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ServiceUnknownException.java
deleted file mode 100644
index 693048b..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/ServiceUnknownException.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.aidl;
-
-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/aidl/autoconfig/IAutoConfigApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/autoconfig/IAutoConfigApi.aidl
deleted file mode 100644
index d16b727..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/autoconfig/IAutoConfigApi.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.aidl.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/aidl/blacklist/IBlackListApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/blacklist/IBlackListApi.aidl
deleted file mode 100644
index df2a6ff..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/blacklist/IBlackListApi.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.aidl.blacklist;
-
-interface IBlackListApi
-{
-    boolean add(String number);
-    boolean addEx(String number, String name);
-    boolean remove(String number);
-    void clear();
-    boolean checkIsBlack(String number);
-    List<String> getList();
-    void setProviderUri(String authorities, boolean bFirewall);
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/ICapabilityApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/ICapabilityApi.aidl
deleted file mode 100644
index e313487..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/ICapabilityApi.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.aidl.capability;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.ICapabiltyListener;
-import com.suntek.mway.rcs.client.aidl.capability.RCSCapabilities;
-
-interface ICapabilityApi
-{
-    void findCapabilityByNumber(String number, ICapabiltyListener listener);
-    RCSCapabilities getMyCapabilities();
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/IRcsCapabilityApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/IRcsCapabilityApi.aidl
deleted file mode 100644
index 4e8a79d..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/IRcsCapabilityApi.aidl
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.aidl.capability;
-
-import com.suntek.mway.rcs.client.aidl.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/aidl/common/RcsColumns.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/common/RcsColumns.java
new file mode 100644
index 0000000..5f2836b
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/common/RcsColumns.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2015 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.aidl.common;
+
+public class RcsColumns {
+    /**
+     * those columns add for rcs which are add in telephonyProvider sms table.
+     */
+    public class SmsRcsColumns {
+        public final static String RCS_MESSAGE_ID = "rcs_message_id";
+
+        public final static String RCS_FILENAME = "rcs_file_name";
+
+        public final static String RCS_MIME_TYPE = "rcs_mime_type";
+
+        public final static String RCS_MSG_TYPE = "rcs_msg_type";
+
+        public final static String RCS_SEND_RECEIVE = "rcs_send_receive";
+
+        public final static String RCS_MSG_STATE = "rcs_msg_state";
+
+        public final static String RCS_CHAT_TYPE = "rcs_chat_type";
+
+        public final static String RCS_THREAD_ID = "rcs_thread_id";
+
+        public final static String RCS_CONVERSATION_ID = "rcs_conversation_id";
+
+        public final static String RCS_CONTRIBUTION_ID = "rcs_contribution_id";
+
+        public final static String RCS_FILE_SELECTOR = "rcs_file_selector";
+
+        public final static String RCS_FILE_TRANSFERED = "rcs_file_transfered";
+
+        public final static String RCS_FILE_TRANSFER_ID = "rcs_file_transfer_id";
+
+        public final static String RCS_FILE_ICON = "rcs_file_icon";
+
+        public final static String RCS_BURN = "rcs_burn";
+
+        public final static String RCS_HEADER = "rcs_header";
+
+        public final static String RCS_PATH = "rcs_file_path";
+
+        public final static String RCS_IS_DOWNLOAD = "rcs_is_download";
+
+        public final static String RCS_PLAY_TIME = "rcs_play_time";
+
+        public final static String RCS_FILE_SIZE = "rcs_file_size";
+
+        public final static String RCS_THUMB_PATH = "rcs_thumb_path";
+
+        public final static String RCS_BURN_BODY = "rcs_burn_body";
+
+        public final static String RCS_NMSG_STATE = "rcs_nmsg_state";
+
+        public final static String RCS_FAVOURITE = "favourite";
+
+        public final static String RCS_MEDIA_PLAYED = "rcs_media_played";
+
+        public final static String RCS_EXT_CONTACT = "rcs_ext_contact";
+
+        public final static String RCS_FILE_RECORD = "rcs_file_record";
+
+        public final static String PHONE_ID = "phone_id";
+    }
+
+    /**
+     * those columns add for rcs which are add in telephonyProvider thread
+     * table.
+     */
+    public class ThreadColumns {
+        public final static String RCS_TOP = "rcs_top";
+
+        public final static String RCS_TOP_TIME = "rcs_top_time";
+
+        public final static String RCS_NUMBER = "rcs_number";
+
+        public final static String RCS_MSG_ID = "last_msg_id";
+
+        public final static String RCS_CHAT_TYPE = "msg_chat_type";
+
+        public final static String RCS_MSG_TYPE = "last_msg_type";
+    }
+
+    /**
+     * Those columns use to save the 1-N message status
+     */
+    public class GroupStatusColumns {
+        public final static String _ID = "_id";
+
+        public final static String MSG_ID = "msg_id";
+
+        public final static String GROUP_NUMBER = "number";
+
+        public final static String GROUP_STATUS = "status";
+
+        public final static String GROUP_DATE = "date";
+    }
+
+    /**
+     * Those columns use to query device api.
+     */
+    public class DeviceApiColumns {
+        public final static String MESSAGE_ID = "message_id";
+
+        public final static String BODY = "body";
+
+        public final static String CONTACT_NUMBER = "contact_number";
+
+        public final static String FILENAME = "file_name";
+
+        public final static String TYPE = "mime_type";
+
+        public final static String FILEICON = "file_icon";
+
+        public final static String DIRECTION = "direction";
+
+        public final static String FILE_SIZE = "file_size";
+
+        public final static String TRANSFERRED = "file_transferred";
+
+        public final static String TIMESTAMP = "time_stamp";
+
+        public final static String STATE = "message_status";
+
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/APIConstant.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/APIConstant.java
deleted file mode 100644
index 84abb1c..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/APIConstant.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * 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.aidl.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/aidl/constant/Actions.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Actions.java
new file mode 100644
index 0000000..3ccdc12
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Actions.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2015 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.aidl.constant;
+
+public class Actions {
+
+    public static final String ACTION_ERROR = Main.PACKAGE_NAME + ".ACTION_ERROR";
+
+    public static class RegisterAction {
+        // status changed broadcast
+        public final static String ACTION_REGISTER_STATUS_CHANGED = Main.PACKAGE_NAME
+                + ".ACTION_REGISTER_STATUS_CHANGED";
+
+    }
+
+    public static class DmsAction {
+
+        public static final String ACTION_DMS_OPEN_PS = Main.PACKAGE_NAME + ".ACTION_DMS_OPEN_PS";
+
+        public static final String ACTION_DMS_CONFIRM_USE_NEW_IMSI = Main.PACKAGE_NAME
+                + ".ACTION_DMS_CONFIRM_USE_NEW_IMSI";
+
+        public static final String ACTION_DMS_NEW_CONFIG = Main.PACKAGE_NAME
+                + ".ACTION_DMS_NEW_CONFIG";
+
+        public static final String ACTION_DMS_OPEN_ACCOUNT = Main.PACKAGE_NAME
+                + ".ACTION_DMS_OPEN_ACCOUNT";
+
+        public static final String ACTION_DMS_OPEN_ACCOUNT_RESULT = Main.PACKAGE_NAME
+                + ".ACTION_DMS_OPEN_ACCOUNT_RESULT";
+
+        public static final String ACTION_DMS_UPDATE_CONFIG = Main.PACKAGE_NAME
+                + ".ACTION_DMS_UPDATE_CONFIG";
+
+        public static final String ACTION_DMS_USER_STATUS_CHANGED = Main.PACKAGE_NAME
+                + ".ACTION_DMS_USER_STATUS_CHANGED";
+
+        public static final String ACTION_DMS_INPUT_SMS_VERIFY_CODE = Main.PACKAGE_NAME
+                + ".ACTION_DMS_INPUT_SMS_VERIFY_CODE";
+
+        public static final String ACTION_DMS_SHOW_DIALOG_INFO = Main.PACKAGE_NAME
+                + ".ACTION_DMS_SHOW_DIALOG_INFO";
+
+        /** The Constant ACTION_DMS_FETCH_CONFIG_FINISH. */
+        public static final String ACTION_DMS_FETCH_CONFIG_FINISH = Main.PACKAGE_NAME
+                + ".ACTION_DMS_FETCH_CONFIG_FINISH";
+
+        /** The Constant ACTION_DMS_FETCH_CONFIG_ERROR. */
+        public static final String ACTION_DMS_FETCH_CONFIG_ERROR = Main.PACKAGE_NAME
+                + ".ACTION_DMS_FETCH_CONFIG_ERROR";
+
+        public static final String ACTION_DMS_VERSION_REFRESH =
+                "com.suntek.mway.rcs.ACTION_UI_RCS_DM_VERSION_REFRESH";
+
+        /** The Constant ACTION_RCS_ENABLE_CHANGED. */
+        public static final String ACTION_RCS_ENABLE_CHANGED =
+                "com.suntek.mway.rcs.ACTION_RCS_ENABLE_CHANGED";
+    }
+
+    public static class GroupChatAction {
+        public static final String ACTION_GROUP_CHAT_MANAGE_NOTIFY = Main.PACKAGE_NAME
+                + ".ACTION_GROUP_CHAT_MANAGE_NOTIFY";
+
+        public static final String ACTION_GROUP_CHAT_MANAGE_FAILED = Main.PACKAGE_NAME
+                + ".ACTION_GROUP_CHAT_MANAGE_FAILED";
+
+        public static final String ACTION_GROUP_CHAT_INVITE = Main.PACKAGE_NAME
+                + ".ACTION_GROUP_CHAT_INVITE";
+    }
+
+    public static class MessageAction {
+
+        public static final String ACTION_MESSAGE_BACKUP = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_BACKUP";
+
+        public static final String ACTION_MESSAGE_FILE_TRANSFER_PROGRESS = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_FILE_TRANSFER_PROGRESS";
+
+        public static final String ACTION_MESSAGE_RESTORE = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_RESTORE";
+
+        public static final String ACTION_MESSAGE_SEND_FAILED = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_SEND_FAILED";
+
+        public static final String ACTION_MESSAGE_EMOTICON_DOWNLOAD_RESULT = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_EMOTICON_DOWNLOAD_RESULT";
+
+        public static final String ACTION_MESSAGE_STATUS_CHANGED = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_STATUS_CHANGED";
+
+        public static final String ACTION_O2M_DETAIL_MESSAGE_STATUS_CHANGED = Main.PACKAGE_NAME
+                + ".ACTION_O2M_DETAIL_MESSAGE_STATUS_CHANGED";
+
+        public static final String ACTION_MESSAGE_TRANSFERED_SMS = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_TRANSFERED_SMS";
+
+        public static final String ACTION_MESSAGE_SHOW_COMPOSING = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_SHOW_COMPOSING";
+
+        public static final String ACTION_MESSAGE_NOTIFY = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_NOTIFY";
+
+        public static final String ACTION_MESSAGE_GROUP_CHAT_NOTIFY = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_GROUP_CHAT_NOTIFY";
+
+        public static final String ACTION_MESSAGE_REPORT = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_REPORT";
+
+        public static final String ACTION_MESSAGE_DOWNLOAD_EMOTICON_RESULT = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_DOWNLOAD_EMOTICON_RESULT";
+
+        public static final String ACTION_MESSAGE_FIREWALL_BLOCK_RECORD = Main.PACKAGE_NAME
+                + ".ACTION_MESSAGE_FIREWALL_BLOCK_RECORD";
+    }
+
+    public static class PluginAction {
+
+        public static final String ACTION_PLUGIN_APK_UNINSTALLED = Main.PACKAGE_NAME
+                + ".ACTION_PLUGIN_APK_UNINSTALLED";
+
+        public static final String ACTION_PLUGIN_INIT_START = Main.PACKAGE_NAME
+                + ".ACTION_PLUGIN_INIT_START";
+
+        public static final String ACTION_PLUGIN_INIT_SUCCESS = Main.PACKAGE_NAME
+                + ".ACTION_PLUGIN_INIT_SUCCESS";
+
+        public static final String ACTION_PLUGIN_INIT_FAILED = Main.PACKAGE_NAME
+                + ".ACTION_PLUGIN_INIT_SUCCESS";
+
+        // profile
+        public static final String ACTION_PROFILE_UPDATE_CONTACT = Main.PACKAGE_NAME
+                + ".ACTION_PROFILE_UPDATE_CONTACT";
+
+        // cloud file
+        public static final String ACTION_MCLOUD_DOWNLOAD_FILE_FROM_URL = Main.PACKAGE_NAME
+                + ".ACTION_MCLOUD_DOWNLOAD_FILE_FROM_URL";
+
+        public static final String ACTION_MCLOUD_GET_REMOTE_FILE_LIST = Main.PACKAGE_NAME
+                + ".ACTION_MCLOUD_GET_REMOTE_FILE_LIST";
+
+        public static final String ACTION_MCLOUD_GET_SHARE_FILE_LIST = Main.PACKAGE_NAME
+                + ".ACTION_MCLOUD_GET_SHARE_FILE_LIST";
+
+        public static final String ACTION_MCLOUD_PUT_FILE = Main.PACKAGE_NAME
+                + ".ACTION_MCLOUD_PUT_FILE";
+
+        public static final String ACTION_MCLOUD_SHARE_AND_SEND_FILE = Main.PACKAGE_NAME
+                + ".ACTION_MCLOUD_SHARE_AND_SEND_FILE";
+
+        public static final String ACTION_MCLOUD_SHARE_FILE = Main.PACKAGE_NAME
+                + ".ACTION_MCLOUD_SHARE_FILE";
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/BroadcastConstants.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/BroadcastConstants.java
deleted file mode 100644
index aed6c35..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/BroadcastConstants.java
+++ /dev/null
@@ -1,836 +0,0 @@
-/*
- * 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.aidl.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 operation failed. */
-    public static final String UI_GROUP_ERROR = "com.suntek.mway.rcs.ACTION_UI_GROUP_ERROR";
-
-    /** The Constant UI_GROUP_NOT_FOUND. */
-    public static final String UI_GROUP_NOT_FOUND = "com.suntek.mway.rcs.ACTION_UI_GROUP_NOTFOUND";
-
-    /** 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";
-
-    /** Notify Native UI that message has been transfered to SMS. */
-    public static final String UI_MESSAGE_TRANSFER_SMS = "com.suntek.mway.rcs.ACTION_UI_MESSAGE_TRANSFER_SMS";
-
-    /** Notify Native UI that download paid emoction result. */
-    public static final String UI_MESSAGE_PAID_EMO_DOWNLOAD_RESULT = "com.suntek.mway.rcs.ACTION_UI_MESSAGE_PAID_EMO_DOWNLOAD_RESULTS";
-
-    /**
-     * 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";
-
-    /** Group has gone. */
-    public static final String ACTION_TYPE_GONE = "gone";
-
-    /** 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_NOT_EXISTS = "com.suntek.mway.rcs.ACTION_UI_MESSAGE_ALERT_FILE_NOT_EXISTS";
-
-    /** 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";
-
-    /** Error code of group operation. */
-    public static final String BC_VAR_ERROR_CODE = "errorCode";
-
-    /** Description of code. */
-    public static final String BC_VAR_ERROR_DESC = "errorDesc";
-
-    /**
-     * 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";
-
-    /** Description of code. */
-    public static final String BC_VAR_RESULT = "result";
-
-    /**
-     * ************************************** 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";
-
-    /** Wait other to join. */
-    public static final String BC_VAR_SEND_ERROR_GROUP_NOT_MEMBER = "group_wait_member_join";
-
-    /** 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";
-
-    /** The Constant REFER_TYPE_SUBJECT. */
-    public static final String REFER_TYPE_SUBJECT = "updateSubject";
-
-    /** The Constant REFER_TYPE_ALIAS. */
-    public static final String REFER_TYPE_ALIAS = "setAlias";
-
-    /** The Constant REFER_TYPE_TRANSFER_CHAIRMAN. */
-    public static final String REFER_TYPE_TRANSFER_CHAIRMAN = "transferChairman";
-
-    /** The Constant REFER_TYPE_KICKOUT. */
-    public static final String REFER_TYPE_KICKOUT = "kickout";
-
-    /** The Constant REFER_TYPE_QUIT. */
-    public static final String REFER_TYPE_QUIT = "quit";
-
-    /** The Constant REFER_TYPE_DISBAND. */
-    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";
-
-    /**
-     * The broadcast of group chairman transfer confirm parameter contains
-     * chaturi, subject, contributionId, conversationId.
-     */
-    public static final String UI_SHOW_GROUP_TRANSFER_CHAIRMAN_TIMEOUT = "com.suntek.mway.rcs.ACTION_UI_SHOW_GROUP_TRANSFER_CHAIRMAN_TIMEOUT";
-
-    /**
-     * ************************************** 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";
-
-    /**
-     * UI_DOWNLOADING_FILE_CHANGE broadcast passed parameter name transferId
-     * String.
-     */
-    public static final String BC_VAR_TRANSFER_ID = "transferId";
-
-    /**
-     * ************************************** 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";
-
-    /** Mcloud broadcast passed parameter name chatMessage id String. */
-    public static final String BC_VAR_MC_CHATMESSAGE_ID = "chatMessageId";
-
-    /** Mcloud broadcast passed parameter name exclude suffix id String. */
-    public static final String BC_VAR_MC_EXCLUDE_SUFFIX = "excludeSuffix";
-
-    /** 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 SUFFIX_NOT_ALLOWED. */
-    public static final String BC_V_MC_EVENTTYPE_SUFFIX_NOT_ALLOWED = "suffixNotAllowed";
-
-    /** The mcloud event type OTHER. */
-    public static final String BC_V_MC_EVENTTYPE_OTHER = "other";
-
-    /**
-     * ************************************** IMAP
-     * ******************************************************.
-     */
-    public static final String BACKUP_ALL_MESSAGE = "com.suntek.mway.rcs.BACKUP_ALL_MESSAGE";
-
-    /** The Constant RESTORE_ALL_MESSAGE. */
-    public static final String RESTORE_ALL_MESSAGE = "com.suntek.mway.rcs.RESTORE_ALL_MESSAGE";
-
-    /** The Constant RESTORE_ALL_MESSAGE_RESULT. */
-    public static final String RESTORE_ALL_MESSAGE_RESULT = "com.suntek.mway.rcs.RESTORE_ALL_MESSAGE_RESULT";
-
-    /** The Constant BACKUP_STATUS_EXCEPTION. */
-    public static final int BACKUP_STATUS_EXCEPTION = -1;
-
-    /** The Constant BACKUP_STATUS_START. */
-    public static final int BACKUP_STATUS_START = 0;
-
-    /** The Constant BACKUP_STATUS_WORKING. */
-    public static final int BACKUP_STATUS_WORKING = 1;
-
-    /** The Constant BACKUP_STATUS_FINISH. */
-    public static final int BACKUP_STATUS_FINISH = 2;
-
-    /** The Constant RESTORE_STATUS_EXCEPTION. */
-    public static final int RESTORE_STATUS_EXCEPTION = -1;
-
-    /** The Constant RESTORE_STATUS_START. */
-    public static final int RESTORE_STATUS_START = 0;
-
-    /** The Constant RESTORE_STATUS_WORKING. */
-    public static final int RESTORE_STATUS_WORKING = 1;
-
-    /** The Constant RESTORE_STATUS_FINISH. */
-    public static final int RESTORE_STATUS_FINISH = 2;
-
-    /** The Constant ACTION_DMS_OPEN_BUSS. */
-    public static final String ACTION_DMS_OPEN_BUSS = "com.suntek.mway.rcs.ACTION_DMS_OPEN_BUSS";
-
-    /** The Constant ACTION_DMS_OPEN_BUSS_RESULT. */
-    public static final String ACTION_DMS_OPEN_BUSS_RESULT = "com.suntek.mway.rcs.ACTION_DMS_OPEN_BUSS_RESULT";
-
-    /** The Constant ACTION_FETCH_CONFIG_FINISH. */
-    public static final String ACTION_FETCH_CONFIG_FINISH = "com.suntek.mway.rcs.ACTION_FETCH_CONFIG_FINISH";
-
-    /** The Constant ACTION_FETCH_CONFIG_ERROR. */
-    public static final String ACTION_FETCH_CONFIG_ERROR = "com.suntek.mway.rcs.ACTION_FETCH_CONFIG_ERROR";
-
-    /** The Constant OPER_RESULTCODE. */
-    public static final String OPER_RESULTCODE = "resultCode";
-
-    /** The Constant OPER_RESULTDESC. */
-    public static final String OPER_RESULTDESC = "resultDesc";
-
-    /** The Constant DMS_OPEN_BUSS_IMSI. */
-    public static final String DMS_OPEN_BUSS_IMSI = "imsi";
-
-    /** The Constant DMS_OPEN_BUSS_MSISDN. */
-    public static final String DMS_OPEN_BUSS_MSISDN = "number";
-
-    /** The Constant DMS_TIPS_TITLE. */
-    public static final String DMS_TIPS_TITLE = "title";
-
-    /** The Constant DMS_TIPS_MESSAGE. */
-    public static final String DMS_TIPS_MESSAGE = "message";
-
-    /** The Constant DMS_TIPS_ACCEPT_BTN. */
-    public static final String DMS_TIPS_ACCEPT_BTN = "Accept_btn";
-
-    /** The Constant DMS_TIPS_REJECT_BTN. */
-    public static final String DMS_TIPS_REJECT_BTN = "Reject_btn";
-
-    /** The Constant DMS_USER_STATUS. */
-    public static final String DMS_USER_STATUS = "status";
-
-    /** The Constant DMS_OPEN_BUSS_RESULTCODE_SUCCESS. */
-    public static final int DMS_OPEN_BUSS_RESULTCODE_SUCCESS = 0;
-
-    /** The Constant DMS_OPEN_BUSS_RESULTCODE_FAILED. */
-    public static final int DMS_OPEN_BUSS_RESULTCODE_FAILED = -1;
-
-    /** The Constant ACTION_DMS_NEW_CONFIG. */
-    public static final String ACTION_DMS_NEW_CONFIG = "com.suntek.mway.rcs.ACTION_DMS_NEW_CONFIG";
-
-    /** The Constant ACTION_DMS_UPDATE_CONFIG. */
-    public static final String ACTION_DMS_UPDATE_CONFIG = "com.suntek.mway.rcs.ACTION_DMS_UPDATE_CONFIG";
-
-    /** The Constant ACTION_SHOW_DIALOG_INFO. */
-    public static final String ACTION_SHOW_DIALOG_INFO = "com.suntek.mway.rcs.ACTION_SHOW_DIALOG_INFO";
-
-    /** The Constant ACTION_OPEN_PS. */
-    public static final String ACTION_OPEN_PS = "com.suntek.mway.rcs.ACTION_OPEN_PS";
-
-    /** The Constant ACTION_OPEN_PS_EXTRA_IS_AUTO. */
-    public static final String ACTION_OPEN_PS_EXTRA = "isAuto";
-
-    /** The Constant ACTION_OPEN_PS_EXTRA_AUTO. */
-    public static final int ACTION_OPEN_PS_EXTRA_AUTO = 0;
-
-    /** The Constant ACTION_OPEN_PS_EXTRA_PROMPT. */
-    public static final int ACTION_OPEN_PS_EXTRA_PROMPT = 1;
-
-    /** The Constant ACTION_CLOSE_WIFI_AND_OPEN_PS. */
-    public static final String ACTION_CLOSE_WIFI_AND_OPEN_PS = "com.suntek.mway.rcs.ACTION_CLOSE_WIFI_AND_OPEN_PS";
-
-    /** The Constant ACTION_DMS_USER_STATUS_CHANGED. */
-    public static final String ACTION_DMS_USER_STATUS_CHANGED = "com.suntek.mway.rcs.ACTION_DMS_USER_STATUS_CHANGED";
-
-    /** The Constant ACTION_CONFIRM_USE_NEW_IMSI. */
-    public static final String ACTION_CONFIRM_USE_NEW_IMSI = "com.suntek.mway.rcs.ACTION_CONFIRM_USE_NEW_IMSI";
-
-    /** The Constant ACTION_INPUT_SMS_VERIFY_CODE. */
-    public static final String ACTION_INPUT_SMS_VERIFY_CODE = "com.suntek.mway.rcs.ACTION_INPUT_SMS_VERIFY_CODE";
-
-    /** The Constant ACTION_RCS_ENABLE_CHANGED. */
-    public static final String ACTION_RCS_ENABLE_CHANGED = "com.suntek.mway.rcs.ACTION_RCS_ENABLE_CHANGED";
-
-    /**
-     * ************************************** PLUGIN
-     * ******************************************************.
-     */
-    /** 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 installed. */
-    public static final String PLUGIN_APK_INSTALLED = "com.suntek.mway.rcs.action.PLUGIN_APK_INSTALLED";
-
-    /** The broadcast for plug-in apk uninstalled. */
-    public static final String PLUGIN_APK_UNINSTALLED = "com.suntek.mway.rcs.action.PLUGIN_APK_UNINSTALLED";
-
-    /** The Constant PLUGIN_SERVICE_UNBIND. */
-    public static final String PLUGIN_SERVICE_UNBIND = "com.suntek.mway.rcs.action.PLUGIN_SERVICE_UNBIND";
-
-    /** The Constant PLUGIN_SERVICE_NOT_SSO_LOGIN. */
-    public static final String PLUGIN_SERVICE_NOT_SSO_LOGIN = "com.suntek.mway.rcs.action.PLUGIN_SERVICE_NOT_SSO_LOGIN";
-
-    /** The Constant BC_VAR_PLUGIN_MODULE. */
-    public static final String BC_VAR_PLUGIN_MODULE = "pluginModuleName";
-
-    /** The Constant BC_V_PLUGIN_MODULE_EMOTICON. */
-    public static final String BC_V_PLUGIN_MODULE_EMOTICON = "emoticon";
-
-    /** The Constant BC_V_PLUGIN_MODULE_MCLOUDFILE. */
-    public static final String BC_V_PLUGIN_MODULE_MCLOUDFILE = "mCloudFile";
-
-    /** The Constant BC_V_PLUGIN_MODULE_MCONTACT. */
-    public static final String BC_V_PLUGIN_MODULE_MCONTACT = "mContact";
-
-    /** The Constant BC_V_PLUGIN_MODULE_PLUGINCENTER. */
-    public static final String BC_V_PLUGIN_MODULE_PLUGINCENTER = "pluginCenter";
-
-    /** The Constant BC_V_PLUGIN_MODULE_PLUGINUPDATE. */
-    public static final String BC_V_PLUGIN_MODULE_PLUGINUPDATE = "pluginUpdate";
-
-    /** The Constant BC_V_PLUGIN_MODULE_PROFILE. */
-    public static final String BC_V_PLUGIN_MODULE_PROFILE = "profile";
-
-    /** The Constant BC_V_PLUGIN_MODULE_PUBLICACCOUNT. */
-    public static final String BC_V_PLUGIN_MODULE_PUBLICACCOUNT = "publicAccount";
-
-    /** The Constant BC_V_PLUGIN_MODULE_QRCODER. */
-    public static final String BC_V_PLUGIN_MODULE_QRCODER = "qrCoder";
-
-    /** The Constant BC_V_PLUGIN_MODULE_richScreen. */
-    public static final String BC_V_PLUGIN_MODULE_RICHSCREEN = "richScreen";
-
-    /** DM version changed. */
-    public static final String UI_DM_VERSION_REFRESH = "com.suntek.mway.rcs.ACTION_UI_RCS_DM_VERSION_REFRESH";
-
-    /** The parameter of UI_DM_VERSION_CHANGED broadcast. */
-    public static final String BC_VERSION = "version";
-
-    /** The Constant BC_ERROR_TYPE. */
-    public static final String BC_ERROR_TYPE = "errorType";
-
-    /** The Constant BC_ERROR_CODE. */
-    public static final String BC_ERROR_CODE = "errorCode";
-
-    /** The Constant BC_ERROR_PHRASE. */
-    public static final String BC_ERROR_PHRASE = "errorPhrase";
-
-    /** The Constant BC_ERROR_TYPE_TIMEOUT. */
-    public static final int BC_ERROR_TYPE_TIMEOUT = -1;
-
-    /** The Constant BC_ERROR_TYPE_UNKNOW. */
-    public static final int BC_ERROR_TYPE_UNKNOW = -2;
-
-    /** The Constant BC_ERROR_TYPE_INTERNAL. */
-    public static final int BC_ERROR_TYPE_INTERNAL = -3;
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Constants.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Constants.java
new file mode 100644
index 0000000..d45e967
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Constants.java
@@ -0,0 +1,853 @@
+/*
+ * Copyright (c) 2015 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.aidl.constant;
+
+import android.net.Uri;
+import android.provider.BaseColumns;
+
+public class Constants {
+
+    /** The Constant of im off line. */
+    public static final int CONST_IM_OFFLINE = 0;
+
+    /** The Constant of im online. */
+    public static final int CONST_IM_ONLINE = 1;
+
+    public static final int CONST_ERROR_EVENT_DOWNLOAD_FILE = 1;
+
+    public static final int CONST_ERROR_EVENT_PAUSE_DOWNLOAD_FILE = 2;
+
+    public static final int CONST_ERROR_TYPE_TIMEOUT = -1;
+
+    public static final int CONST_ERROR_TYPE_UNKNOW = -2;
+
+    public static final int CONST_ERROR_TYPE_INTERNAL = -3;
+
+    public static final int CONST_ERROR_TYPE_NOT_REGISTER = -4;
+
+    public static class RegisterConstants {
+        public static final int CONST_ONLINE = 0;
+
+        public static final int CONST_OFFLINE = 1;
+
+        public static final int CONST_SIM_NOT_EXIST = 2;
+
+        public static final int CONST_NETWORK_UNAVAILABLE = 3;
+
+        public static final int CONST_ACCOUNT_NOT_EXIST = 4;
+
+        public static final int CONST_NEED_OPEN_PS = 5;
+
+        public static final int CONST_ACCOUNT_STATUS_EXCEPTION = 6;
+
+        public static final int CONST_DMS_INVALID = 7;
+
+        public static final int CONST_SERVER_REJECTED = 8;
+
+        public static final int CONST_TYPE_TERMINAL = 1;
+
+        public static final int CONST_TYPE_SIM_CARD = 2;
+
+        public static final int CONST_TYPE_ACCOUNT = 3;
+
+        public static final int CONST_TYPE_SIP = 4;
+
+        public static final int CONST_TYPE_DMS = 5;
+
+        public static final int CONST_TYPE_SERVER = 6;
+    }
+
+    public static class MessageConstants {
+        public static final String CONST_IMAGE_SUFFIX = "JPG,JPEG,PNG,GIF,BMP";
+
+        public static final String CONST_AUDIO_SUFFIX = "MP3,M4A,AAC,AMR,3GP";
+
+        public static final String CONST_VIDEO_SUFFIX = "3GP,MP4";
+
+        public static final String CONST_VCARD_SUFFIX = "VCF";
+
+        public static final String CONST_CLOUD_FILE_EXCLUDE_SUFFIX = "EXE,BAT,APK,SH,IPA,DEB,PXL,XAP";
+
+        /** Maximum default file size. */
+        public static final long CONST_DEFAULT_FT_MAX_SIZE = 10 * 1024;
+
+        /** Maximum image file size. */
+        public static final long CONST_IMAGE_FT_MAX_SIZE = 10 * 1024;
+
+        /** Maximum video file size. */
+        public static final long CONST_VIDEO_FT_MAX_SIZE = 500 * 1024;
+
+        /** Maximum cloud file size. */
+        public static final long CONST_CLOUD_FT_MAX_SIZE = 500 * 1024;
+
+        /** Maximum video file time. */
+        public static final long CONST_VIDEO_MAX_TIME = 90;
+
+        /** Maximum audio file time. */
+        public static final long CONST_AUDIO_MAX_TIME = 180;
+
+        /** Maximum file size. */
+        public static final long CONST_FT_MAX_SIZE = 500 * 1024;
+
+        public static final String CONST_FT_THUMB = "1";
+
+        public static final int CONST_CHAT_O2O = 1;
+
+        public static final int CONST_CHAT_O2M = 2;
+
+        public static final int CONST_CHAT_GROUP = 3;
+
+        public static final int CONST_CHAT_PUBLIC_ACCOUNT = 4;
+
+        public static final int CONST_MESSAGE_SMS = -1;
+
+        public static final int CONST_MESSAGE_TEXT = 0;
+
+        public static final int CONST_MESSAGE_IMAGE = 1;
+
+        public static final int CONST_MESSAGE_AUDIO = 2;
+
+        public static final int CONST_MESSAGE_VIDEO = 3;
+
+        public static final int CONST_MESSAGE_MAP = 4;
+
+        public static final int CONST_MESSAGE_CONTACT = 5;
+
+        public static final int CONST_MESSAGE_PUBLIC_ACCOUNT_ARTICLE = 6;
+
+        public static final int CONST_MESSAGE_NOTIFICATION = 7;
+
+        public static final int CONST_MESSAGE_PAID_EMOTICON = 8;
+
+        public static final int CONST_MESSAGE_CLOUD_FILE = 9;
+
+        public static final int CONST_MESSAGE_OTHER_FILE = 10;
+
+        public static final int CONST_DIRECTION_SEND = 2;
+
+        public static final int CONST_DIRECTION_RECEIVE = 1;
+
+        public static final int CONST_STATUS_BURNED = -128;
+
+        public static final int CONST_STATUS_ALREADY_READ = -64;
+
+        public static final int CONST_STATUS_UNREAD = -32;
+
+        public static final int CONST_STATUS_SEND_RECEIVED = -1;
+
+        public static final int CONST_STATUS_SENDED = 32;
+
+        public static final int CONST_STATUS_SENDING = 64;
+
+        public static final int CONST_STATUS_SEND_FAIL = 128;
+
+        public static final int CONST_BURN_AFTER_READ_NOT = -1;
+
+        public static final int CONST_FAVORITE = 1;
+
+        public static final int CONST_FAVORITE_NOT = 0;
+
+        public static final int CONST_FILE_RECORD = 1;
+
+        public static final int CONST_FILE_RECORD_NOT = 0;
+
+        public static final int CONST_BLACK_MESSAGE = 1;
+
+        public static final int CONST_BLACK_MESSAGE_NOT = 0;
+
+        public static final int CONST_THREAD_TOP = 1;
+
+        public static final int CONST_THREAD_TOP_NOT = 0;
+
+        public static final int CONST_STORE_TYPE_SMS = 1;
+
+        public static final int CONST_STORE_TYPE_MMS = 2;
+
+        public static final int CONST_STORE_TYPE_IM = 3;
+
+        public static final int CONST_SEND_POLICY_FORWARD_SMS = 1;
+
+        public static final int CONST_SEND_POLICY_NOT_FORWARD_SMS = 2;
+    }
+
+    public static class GroupChatConstants {
+        public static final int CONST_SUCCESS = -2;
+
+        public static final int CONST_OFFLINE = -3;
+
+        public static final int CONST_INVITE_TIMEOUT = -4;
+
+        public static final int CONST_NOT_EXIST = -5;
+
+        public static final int CONST_NOT_CHAIRMAN = -6;
+
+        public static final int CONST_MEMBERS_REACHED_MAX_COUNT = -7;
+
+        public static final int CONST_NOT_ACTIVE = -8;
+
+        public static final int CONST_INTERNAL_ERROR = -998;
+
+        public static final int CONST_OTHRE_ERROR = -999;
+
+        /**
+         * Group chat notification definition
+         */
+        public static final String CONST_NOTIFY_CREATE = "create";
+
+        public static final String CONST_NOTIFY_ACCEPT = "accept";
+
+        public static final String CONST_NOTIFY_JOIN = "join";
+
+        public static final String CONST_NOTIFY_SET_SUBJECT = "setsubject";
+
+        public static final String CONST_NOTIFY_SET_CHAIRMAN = "setchairman";
+
+        public static final String CONST_NOTIFY_BOOTED = "booted";
+
+        public static final String CONST_NOTIFY_QUIT = "quit";
+
+        public static final String CONST_NOTIFY_DISBAND = "disband";
+
+        public static final String CONST_NOTIFY_GONE = "gone";
+
+        public static final String CONST_NOTIFY_SET_POLICY = "setpolicy";
+
+        /**
+         * Group chat manager broadcast parameter type definition
+         */
+        public static final int CONST_CREATE = 1;
+
+        public static final int CONST_JOIN = 2;
+
+        public static final int CONST_SET_SUBJECT = 3;
+
+        public static final int CONST_SET_REMARK = 4;
+
+        public static final int CONST_SET_ALIAS = 5;
+
+        public static final int CONST_SET_CHAIRMAN = 6;
+
+        public static final int CONST_BOOTED = 7;
+
+        public static final int CONST_QUIT = 8;
+
+        public static final int CONST_DISBAND = 9;
+
+        public static final int CONST_GONE = 10;
+
+        public static final int CONST_SET_MAX_COUNT = 11;
+
+        public static final int CONST_REACHED_MAX_COUNT = 12;
+
+        /**
+         * Group chat operation definition
+         */
+        public static final int CONST_OPERATION_CREATE = 1;
+
+        public static final int CONST_OPERATION_ACCEPT_TO_JOIN = 2;
+
+        public static final int CONST_OPERATION_REFUSE_TO_JOIN = 3;
+
+        public static final int CONST_OPERATION_INVITE = 4;
+
+        public static final int CONST_OPERATION_SET_ALIAS = 5;
+
+        public static final int CONST_OPERATION_QUIT = 6;
+
+        public static final int CONST_OPERATION_SET_SUBJECT = 7;
+
+        public static final int CONST_OPERATION_SET_CHAIRMAN = 8;
+
+        public static final int CONST_OPERATION_KICK_OUT = 9;
+
+        public static final int CONST_OPERATION_DISBAND = 10;
+
+        public static final int CONST_OPERATION_SEND_TEXT = 11;
+
+        public static final int CONST_OPERATION_SEND_INVITATION = 12;
+    }
+
+    public static class DMSConstants {
+        public static final int CONST_OPEN_ACCOUNT_FAILED = -1;
+
+        public static final int CONST_OPEN_ACCOUNT_SUCCESS = 0;
+
+        public static final int CONST_OPEN_PS_AUTO = 0;
+
+        public static final int CONST_OPEN_PS_PROMPT = 1;
+
+        public static final int CONST_BUTTON_HIDDEN = 0;
+
+        public static final int CONST_BUTTON_DISPLAY = 1;
+
+        /** The Constant DMS_USER_STATUS_OK. */
+        public static final int CONST_DMS_USER_STATUS_OK = 0;
+
+        /** The Constant DMS_USER_STATUS_TEMP_PASSIVE_DISABLED. */
+        public static final int CONST_DMS_USER_STATUS_TEMP_PASSIVE_DISABLED = 1;
+
+        /** The Constant DMS_USER_STATUS_PERMANENT_DISABLED. */
+        public static final int CONST_DMS_USER_STATUS_PERMANENT_DISABLED = 2;
+
+        /** The Constant DMS_USER_STATUS_TEMP_ACTIVE_DISABLED. */
+        public static final int CONST_DMS_USER_STATUS_TEMP_ACTIVE_DISABLED = 3;
+
+        /** The Constant DMS_USER_STATUS_DORMANT. */
+        public static final int CONST_DMS_USER_STATUS_DORMANT = 4;
+    }
+
+    public static class PluginConstants {
+        // plugin
+        public static final String CONST_PLUGIN_PACKAGE_NAME = "com.suntek.mway.rcs.app.plugin";
+
+        public static final String CONST_PLUGIN_API_AIDL = ".mway.rcs.app.plugin.service.PluginApiService";
+
+        public final static long CONST_PLUGIN_BIND_TIMEOUT = 3000;
+
+        public final static long CONST_PLUGIN_LOGIN_SSO_TIMEOUT = 3000;
+
+        public final static long CONST_PLUGIN_BINDING_INTERVAL = 5000;
+
+        public final static long CONST_PLUGIN_SSO_LOGING_INTERVAL = 5000;
+
+        public static final String CONST_PLUGIN_MODULE = "pluginModuleName";
+
+        public static final String CONST_PLUGIN_MODULE_PROFILE = "profile";
+
+        public static final String CONST_PLUGIN_MODULE_PUBLICACCOUNT = "publicAccount";
+
+        public static final String CONST_PLUGIN_MODULE_CONTACT = "contact";
+
+        public static final String CONST_PLUGIN_MODULE_CLOUDFILE = "cloudFile";
+
+        public static final String CONST_PLUGIN_MODULE_EMOTICON = "emoticon";
+
+        public static final String CONST_PLUGIN_MODULE_RICHSCREEN = "richScreen";
+
+        public static final String CONST_PLUGIN_MODULE_PLUGINCENTER = "pluginCenter";
+
+        public static final String CONST_PLUGIN_MODULE_MESSAGEBACKUP = "messagebackup";
+        // plugin center
+        public static final String CONST_PLUGIN_CENTER_PACKAGE_NAME = "com.cmri.rcs.plugincenter";
+
+        public static final String CONST_PLUGIN_CENTER_MAIN_ACTIVITY = "com.cmri.rcs.plugincenter.PluginCenterMainPage";
+
+        // profile
+        public static final int CONST_PROFILE_RLT_OK = 0;
+
+        public static final int CONST_PROFILE_RLT_FAIL = -1;
+
+        public static final int CONST_PROFILE_RLT_CODE_412 = 412;
+
+        public static final int CONST_PROFILE_HD_AVATAR_PIXEL = 640;
+
+        public static final long CONST_PROFILE_RETRY_SECONDS = 4000;
+
+        public static final String CONST_PROFILE_UPDATE_STATUS = "__PROFILE_UPDATE_STATUS__";
+
+        public static final String CONST_PROFILE_UPDATE_TIMESTAMP = "__PROFILE_UPDATE_TIMESTAMP__";
+
+        public static final String CONST_PROFILE_UPDATE_CONTACTS_FIXED_RATE = "__UPDATE_CONTACTS_FIXED_RATE__";
+
+        public static final String CONST_PROFILE_ETAG_PROFILE = "__PROFILE_ETAG__";
+
+        public static final String CONST_PROFILE_ETAG_AVATAR = "__AVATAR_ETAG__";
+
+        public static final String CONST_PROFILE_ETAG_QRCARDIMG = "__QRCARDIMG_ETAG__";
+
+        public static final String CONST_PROFILE_ETAG_QRCARDINFO = "__ETAG_QRCARDINFO__";
+
+        public static final String CONST_PROFILE_OBJ_AVATAR = "__AVATAR_OBJ__";
+
+        public static final String CONST_PROFILE_OBJ_PROFILE = "__PROFILE_OBJ__";
+
+        public static final String CONST_PROFILE_OBJ_QRCARDIMG = "__QRCARDIMG_OBJ__";
+
+        public static final String CONST_PROFILE_OBJ_QRCARDINFO = "__QRCARDINFO_OBJ__";
+
+        // cloud file
+        public static final String CONST_MCLOUD_EVENT_STARTED = "started";
+
+        public static final String CONST_MCLOUD_EVENT_SUCCESS = "success";
+
+        public static final String CONST_MCLOUD_EVENT_ERROR = "error";
+
+        public static final String CONST_MCLOUD_EVENT_PROGRESS = "progress";
+
+        public static final String CONST_MCLOUD_EVENT_FILE_TOO_LARGE = "fileToLarge";
+
+        public static final String CONST_MCLOUD_EVENT_SUFFIX_NOT_ALLOWED = "suffixNotAllowed";
+
+        public static final String CONST_MCLOUD_EVENT_OTHER = "other";
+
+        public static final String CONST_MCLOUD_SMS_FILE_NAME = "$FILE_NAME$";
+
+        public static final String CONST_MCLOUD_SMS_FILE_SIZE = "$FILE_SIZE$";
+
+        public static final String CONST_MCLOUD_SMS_SHARE_URL = "$SHARE_URL$";
+
+        // emoticon
+        public static final int CONST_EMO_STATIC_FILE = 1;
+
+        public static final int CONST_EMO_DYNAMIC_FILE = 2;
+
+        public static final int CONST_EMO_PACKAGE_FILE = 3;
+
+        public static final int CONST_EMO_DOWNLOAD_SUCCESS = 1;
+
+        public static final int CONST_EMO_DOWNLOAD_FAILURE = 0;
+
+        public static final int CONST_EMO_DOWNLOAD_LOADING = 2;
+    }
+
+    public static interface BlacklistProvider {
+
+        public static Uri CONST_BLACKLIST_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.blacklist");
+
+        public static Uri CONST_BLACKLIST_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.blacklist/id");
+
+        public static final Uri CONST_BLACKLIST_FIREWALL_CONTENT_URI = Uri
+                .parse("content://com.android.firewall/blacklistitems");
+
+        public static interface Blacklist extends BaseColumns {
+
+            /** The Constant NUMBER. */
+            public static final String NUMBER = "number";
+
+            /** The Constant NAME. */
+            public static final String NAME = "name";
+
+            /** The Constant CALL_BOLCK */
+            public static final String CALL_BOLCK = "call_block";
+
+            /** The Constant SMS_BOLCK */
+            public static final String SMS_BOLCK = "sms_block";
+
+            /** The Constant SMS_BOLCK */
+            public static final String PERSON_ID = "person_id";
+        }
+    }
+
+    public static interface CapabilityProvider {
+        public static Uri CONST_CAPABILITY_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.capability");
+
+        public static Uri CONST_CAPABILITY_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.capability/id");
+
+        public static interface Capability extends BaseColumns {
+            public static final String CONTACT = "contact";
+
+            public static final String RESPONSE_CODE = "response_code";
+
+            public static final String IMAGE_SHARING = "image_sharing";
+
+            public static final String VIDEO_SHARING = "video_sharing";
+
+            public static final String IM_SESSION = "im_session";
+
+            public static final String FILE_TRANSFER = "file_transfer";
+
+            public static final String GEOLOC_PUSH = "geoloc_push";
+
+            public static final String IP_VOICE_CALL = "ip_voice_call";
+
+            public static final String IP_VIDEO_CALL = "ip_video_call";
+
+            public static final String EXTENDSIONS = "extensions";
+
+            public static final String DATE = "date";
+        }
+    }
+
+    public static interface GroupChatMemberProvider {
+        public static Uri CONST_GROUP_CHAT_MEMBER_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.groupchat_member");
+
+        public static Uri CONST_GROUP_CHAT_MEMBER_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.groupchat_member/id");
+
+        public static interface GroupChatMember extends BaseColumns {
+            public static final String GROUP_ID = "group_id";
+
+            public static final String NUMBER = "number";
+
+            public static final String ALIAS = "alias";
+
+            public static final String ROLE = "role";
+
+            public static final String ETYPE = "etype";
+
+            public static final String ETAG = "etag";
+
+            public static final String IMG_TYPE = "img_type";
+
+            public static final String HEAD_IMG = "head_img";
+
+            public static final String DATE = "date";
+        }
+    }
+
+    public static interface GroupChatProvider {
+        public static Uri CONST_GROUP_CHAT_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.groupchat");
+
+        public static Uri CONST_GROUP_CHAT_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.groupchat/id");
+
+        public static interface GroupChat extends BaseColumns {
+            public static final String THREAD_ID = "thread_id";
+
+            public static final String SUBJECT = "subject";
+
+            public static final String CHAT_URI = "chat_uri";
+
+            public static final String STATUS = "status";
+
+            public static final String CHAIRMAN = "chairman";
+
+            public static final String DIRECTION = "direction";
+
+            public static final String MAX_COUNT = "max_count";
+
+            public static final String REMARK = "remark";
+
+            public static final String POLICY = "policy";
+
+            public static final String CONVERSATION_ID = "conversation_id";
+
+            public static final String CONTRIBUTION_ID = "contribution_id";
+
+            public static final String OWNER = "owner";
+
+            public static final String DATE = "date";
+        }
+    }
+
+    public static interface PublicAccountHisProvider {
+        public static Uri CONST_PUBLIC_ACCOUNT_HIS_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.public_account_his");
+
+        public static Uri CONST_PUBLIC_ACCOUNT_HIS_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.public_account_his/id");
+
+        public static interface PublicAccountHis extends BaseColumns {
+            /** 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_SIP_URI. */
+            public static final String ACCOUNT_SIP_URI = "sip_uri";
+        }
+    }
+
+    public static interface PublicAccountProvider {
+        public static Uri CONST_PUBLIC_ACCOUNT_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.public_account");
+
+        public static Uri CONST_PUBLIC_ACCOUNT_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.public_account/id");
+
+        public static interface PublicAccount extends BaseColumns {
+            /** 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_LOGO. */
+            public static final String ACCOUNT_LOGO = "logo";
+
+            /** The Constant ACCOUNT_RECOMMEND_LEVEL. */
+            public static final String ACCOUNT_RECOMMEND_LEVEL = "recommend_level";
+
+            /** The Constant ACCOUNT_SIP_URI. */
+            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 = "update_time";
+
+            /** The Constant ACCOUNT_MENUTYPE. */
+            public static final String ACCOUNT_MENUTYPE = "menu_type";
+
+            /** The Constant ACCOUNT_MENUTIMESTAMP. */
+            public static final String ACCOUNT_MENUTIMESTAMP = "menu_timestamp";
+
+            /** The Constant ACCOUNT_ACTIVESTATUS. */
+            public static final String ACCOUNT_ACTIVESTATUS = "active_status";
+
+            /** 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 = "qr_code";
+
+            /** The Constant ACCOUNT_LOGO_TYPE. */
+            public static final String ACCOUNT_LOGO_TYPE = "logo_type";
+
+            /** The Constant ACCOUNT_MENU_STRING. */
+            public static final String ACCOUNT_MENU_STRING = "menu_string";
+
+            /** The Constant ACCOUNT_NUMBER. */
+            public static final String ACCOUNT_NUMBER = "number";
+        }
+    }
+
+    public static interface ThreadProvider {
+        public static Uri CONST_THREAD_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.threads");
+
+        public static Uri CONST_THREAD_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.threads/id");
+
+        public static interface Thread extends BaseColumns {
+            public static final String NUMBER = "rcs_number";
+
+            public static final String MSG_ID = "rcs_msg_id";
+
+            public static final String CONTENT = "snippet";
+
+            public static final String TOTAL_COUNT = "message_count";
+
+            // public static final String UNREAD_COUNT = "unread_count";
+
+            public static final String CHAT_TYPE = "rcs_chat_type";
+
+            public static final String MSG_TYPE = "rcs_msg_type";
+
+            // public static final String DRAFT = "draft";
+
+            public static final String TOP = "top";
+
+            public static final String TOP_TIME = "top_time";
+
+            public static final String DATE = "date";
+        }
+    }
+
+    public static interface OrigMessageProvider {
+        public static Uri CONST_ORIG_MESSAGE_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.orig_message");
+
+        public static Uri CONST_ORIG_MESSAGE_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.orig_message/id");
+
+        public static interface OrigMessage extends BaseColumns {
+            public static final String MSG_ID = "msg_id";
+
+            public static final String HEADER = "header";
+
+            public static final String BODY = "body";
+        }
+    }
+
+    public static interface MessageProvider {
+        public static String CONST_MESSAGE_URI_AUTHORITIES = "com.suntek.mway.rcs.app.service.message";
+
+        public static Uri CONST_MESSAGE_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.message");
+
+        public static Uri CONST_MESSAGE_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.message/id");
+
+        static interface Message extends BaseColumns {
+            public static final String THREAD_ID = "thread_id";
+
+            public static final String NUMBER = "address";
+
+            public static final String CONTENT = "body";
+
+            public static final String TYPE = "type";
+
+            public static final String CHAT_TYPE = "rcs_chat_type";
+
+            public static final String MSG_TYPE = "rcs_msg_type";
+
+            public static final String STATUS = "rcs_status";
+
+            public static final String BURN = "rcs_burn";
+
+            public static final String CONVERSATION_ID = "rcs_conversation_id";
+
+            public static final String CONTRIBUTION_ID = "rcs_contribution_id";
+
+            public static final String MESSAGE_ID = "rcs_message_id";
+
+            public static final String FILE_NAME = "rcs_file_name";
+
+            public static final String THUMBNAIL = "rcs_thumb_path";
+
+            public static final String MIME_TYPE = "rcs_mime_type";
+
+            public static final String FILE_SIZE = "rcs_file_size";
+
+            public static final String FILE_SELECTOR = "rcs_file_selector";
+
+            public static final String TRANSFER_ID = "rcs_file_transfer_id";
+
+            public static final String FILE_ICON = "rcs_file_icon";
+
+            public static final String TRANSFERED = "rcs_file_transfered";
+
+            // public static final String BLACK = "black";
+
+            public static final String FILE_RECORD = "rcs_file_record";
+
+            public static final String DATE = "date";
+
+            public static final String FAVOURITE = "favourite";
+
+            public static final String PHONE_ID = "phone_id";
+        }
+    }
+
+    public static interface FavoriteMessageProvider {
+        public static Uri CONST_FAVOURITE_MESSAGE_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.fav_message");
+
+        public static Uri CONST_FAVOURITE_MESSAGE_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.fav_message/id");
+
+        static interface FavoriteMessage extends BaseColumns {
+
+            public static final String MSG_ID = "msg_id";
+
+            public static final String THREAD_ID = "thread_id";
+
+            public static final String NUMBER = "number";
+
+            public static final String CONTENT = "body";
+
+            public static final String DIRECTION = "direction";
+
+            public static final String CHAT_TYPE = "chat_type";
+
+            public static final String MSG_TYPE = "msg_type";
+
+            public static final String STATUS = "status";
+
+            public static final String BURN = "burn";
+
+            public static final String CONVERSATION_ID = "conversation_id";
+
+            public static final String CONTRIBUTION_ID = "contribution_id";
+
+            public static final String MESSAGE_ID = "message_id";
+
+            public static final String FILE_NAME = "filename";
+
+            public static final String THUMBNAIL = "thumbnail";
+
+            public static final String MIME_TYPE = "mimetype";
+
+            public static final String FILE_SIZE = "filesize";
+
+            public static final String FILE_SELECTOR = "file_selector";
+
+            public static final String TRANSFER_ID = "transfer_id";
+
+            public static final String FILE_ICON = "fileicon";
+
+            public static final String TRANSFERED = "transfered";
+
+            public static final String BLACK = "black";
+
+            public static final String FILE_RECORD = "file_record";
+
+            public static final String DATE = "date";
+
+            public static final String BLOCK_TYPE = "block_type";
+        }
+    }
+
+    public static interface BlockMessageProvider {
+        public static Uri CONST_BLOCK_MESSAGE_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.block_message");
+
+        public static Uri CONST_BLOCK_MESSAGE_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.block_message/id");
+
+        static interface BlockMessage extends FavoriteMessageProvider.FavoriteMessage {
+        }
+    }
+
+    public static interface MessageDetailProvider {
+        public static String CONST_MESSAGE_DETAIL_AUTHORITIES = "com.suntek.mway.rcs.app.service.message_detail";
+
+        public static Uri CONST_MESSAGE_DETAIL_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.message_detail");
+
+        public static Uri CONST_MESSAGE_DETAIL_ID_URI = Uri
+                .parse("content://com.suntek.mway.rcs.app.service.message_detail/id");
+
+        public static interface MessageDetail extends BaseColumns {
+            public static final String MSG_ID = "msg_id";
+
+            public static final String NUMBER = "number";
+
+            public static final String BODY = "body";
+
+            public static final String STATUS = "status";
+
+            public static final String DATE = "date";
+        }
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Main.java
similarity index 75%
copy from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
copy to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Main.java
index 0ad1ce0..41d01db 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Main.java
@@ -21,14 +21,15 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.im;
+package com.suntek.mway.rcs.client.aidl.constant;
 
-public class OprResponse {
+public class Main {
 
-    public static final int SUCCESS = 200;
+    public static final String PACKAGE_NAME = "com.suntek.mway.rcs.app.service";
 
-    public static final int OFFLINE = 900;
+    public static final String SERVICE_BIND_AIDL =
+            "com.suntek.mway.rcs.app.service.impl.ServiceApiBinder";
 
-    public static final int OTHRE_ERROR = 999;
-
+    public static final String PLUGIN_BIND_AIDL =
+            "com.suntek.mway.rcs.app.service.impl.plugin.PluginApiBinder";
 }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/MediaConstants.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/MediaConstants.java
deleted file mode 100644
index a8568b8..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/MediaConstants.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.aidl.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,3GP";
-
-    /** The suffixs of video. */
-    public static final String VIDEO_SUFFIX = "3GP,MP4";
-
-    /** The suffixs of video. */
-    public static final String VCARD_SUFFIX = "VCF";
-
-    /** The suffixs of video. */
-    public static final String CLOUD_FILE_EXCLUDE_SUFFIX = "EXE,BAT,APK,SH,IPA,DEB,PXL,XAP";
-
-    /** 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 cloud file size. */
-    public static final long CLOUD_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/aidl/constant/Parameter.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Parameter.java
new file mode 100644
index 0000000..1de24d7
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/Parameter.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2015 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.aidl.constant;
+
+public class Parameter {
+
+    public static final String EXTRA_ID = "id";
+
+    public static final String EXTRA_THREAD_ID = "threadId";
+
+    public static final String EXTRA_NUMBER = "number";
+
+    public static final String EXTRA_CONTENT = "content";
+
+    public static final String EXTRA_MESSAGE_TYPE = "messageType";
+
+    public static final String EXTRA_CONVERSATION_ID = "conversationId";
+
+    public static final String EXTRA_CONTRIBUTION_ID = "contributionId";
+
+    public static final String EXTRA_STATUS = "status";
+
+    public static final String EXTRA_BARCYCLE = "barCycle";
+
+    public static final String EXTRA_CODE = "code";
+
+    public static final String EXTRA_DESC = "desc";
+
+    public static final String EXTRA_RESULT = "result";
+
+    public static final String EXTRA_FILE_MAX_SIZE = "fileMaxSizeKb";
+
+    public static final String EXTRA_TRANSFER_CURRENT_SIZE = "currentSize";
+
+    public static final String EXTRA_TRANSFER_TOTAL_SIZE = "totalSize";
+
+    // Group chat
+    public static final String EXTRA_INVITE_NUMBER = "inviteNumber";
+
+    public static final String EXTRA_SUBJECT = "subject";
+
+    public static final String EXTRA_NEW_SUBJECT = "newSubject";
+
+    public static final String EXTRA_CHAT_URI = "chatUri";
+
+    public static final String EXTRA_TYPE = "type";
+
+    public static final String EXTRA_GROUP_CHAT_ID = "groupChatId";
+
+    public static final String EXTRA_REMARK = "remark";
+
+    public static final String EXTRA_ALIAS = "alias";
+
+    public static final String EXTRA_MAX_COUNT = "maxCount";
+
+    public static final String EXTRA_DATE = "date";
+
+    public static final String EXTRA_MEMBERS = "members";
+
+    // DMS extra definition
+    public static final String EXTRA_OPEN_PS_IS_AUTO = "isAuto";
+
+    public static final String EXTRA_IMSI = "imsi";
+
+    public static final String EXTRA_MSISDN = "msisdn";
+
+    public static final String EXTRA_DISPLAY_ACCEPT_BUTTON = "acceptButton";
+
+    public static final String EXTRA_DISPLAY_MESSAGE = "message";
+
+    public static final String EXTRA_DISPLAY_REJECT_BUTTON = "rejectButton";
+
+    public static final String EXTRA_DISPLAY_TITLE = "title";
+
+    public static final String EXTRA_VERSION = "version";
+
+    // plugin
+    public static final String EXTRA_PLUGIN_MODULE = "pluginModuleName";
+
+    // cloud file
+    public static final String EXTRA_MCLOUD_ENENTTYPE = "eventType";
+
+    public static final String EXTRA_MCLOUD_FILE_ID = "fullPathInID";
+
+    public static final String EXTRA_MCLOUD_PERCENT = "percent";
+
+    public static final String EXTRA_MCLOUD_PROCESS_SIZE = "processSize";
+
+    public static final String EXTRA_MCLOUD_TOTAL_SIZE = "totalSize";
+
+    public static final String EXTRA_MCLOUD_MESSAGE = "message";
+
+    public static final String EXTRA_MCLOUD_LOCALPATH = "localPath";
+
+    public static final String EXTRA_MCLOUD_SHARE_NODE = "shareNode";
+
+    public static final String EXTRA_MCLOUD_SHARE_NODE_LIST = "shareNodeList";
+
+    public static final String EXTRA_MCLOUD_REMOTE_NODE_LIST = "remoteNodeList";
+
+    public static final String EXTRA_MCLOUD_CHATMESSAGE_ID = "chatMessageId";
+
+    public static final String EXTRA_MCLOUD_EXCLUDE_SUFFIX = "excludeSuffix";
+
+    public static final String EXTRA_ERROR_EVENT = "errorEvent";
+
+    public static final String EXTRA_ERROR_TYPE = "errorType";
+
+    public static final String EXTRA_ERROR_CODE = "errorCode";
+
+    public static final String EXTRA_ERROR_PHRASE = "errorPhrase";
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/ContactGroup.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/ContactGroup.aidl
deleted file mode 100644
index c50853d..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/ContactGroup.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.contacts;
-
-parcelable ContactGroup;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/ContactGroup.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/ContactGroup.java
deleted file mode 100644
index 96f5754..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/ContactGroup.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.aidl.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/aidl/contacts/RCSContact.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/RCSContact.aidl
deleted file mode 100644
index 30576ac..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/RCSContact.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.contacts;
-
-parcelable RCSContact;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/RCSContact.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/RCSContact.java
deleted file mode 100644
index 0d48285..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/contacts/RCSContact.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * 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.aidl.contacts;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.suntek.mway.rcs.client.aidl.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/aidl/emoticon/IEmoticonApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/emoticon/IEmoticonApi.aidl
deleted file mode 100644
index 2bd34cb..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/emoticon/IEmoticonApi.aidl
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * 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.aidl.emoticon;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmojiPackageBO;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.ResultBO;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmoticonBO;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.UserBO;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IEmoticonCallbackApi;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IEmoticonCanSendCallback;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IEmoticonPackagesNetCallbackApi;
-import com.suntek.mway.rcs.client.aidl.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 );
-    
-    boolean isCanSend(String emoticonId);
-    
-    /**
-     * 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);
-
-	boolean isEmojiStoreInstall();
-	
-	void startEmojiStoreApp();
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/IGroupManagerApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/IGroupManagerApi.aidl
deleted file mode 100644
index 54e6d91..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/IGroupManagerApi.aidl
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.aidl.im;
-
-import java.util.List;
-
-import com.suntek.mway.rcs.client.aidl.provider.model.GroupChatUser;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IConferenceCallback;
-import com.suntek.mway.rcs.client.aidl.provider.model.GroupChatModel;
-
-interface IGroupManagerApi {
-
-    String createGroupChat(String subject, in List<String> users);
-
-    int agreeToJoinGroup(String conversationId, String contributionId,
-            String chatUri, String subject, String numberData, long inviteTime);
-
-    int refuseToJoinGroup(String conversationId);
-
-    int updateGroupSubject(String groupId, String newSubject);
-
-    void modifyGroupMemo(String groupId, String memo);
-
-    int disbandGroupChat(String groupId);
-
-    int kickedOutOfGroupChat(String groupId, String number);
-
-    int assignGroupChairman(String groupId, String number);
-
-    int quitGroupChat(String groupId, String number);
-    int quitGroupChatEx(String groupId, String oldChairman, String newChairman);
-    int 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);
-
-    int inviteOneMemberToGroupChat(String groupId, String number);
-
-    int 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);
-       GroupChatModel getGroupChatByChatUriIgnoreState(String chatUri);
-
-    String getGroupChatDomainName();
-
-    String getPublicAccountDomainName();
-
-    int refuseAssigedAsChairman(String chatUri, long inviteTime, String conversationId, String contributionId);
-
-    int acceptAssignedAsChairman(String chatUri, long inviteTime, String conversationId, String contributionId);
-    
-    int rejoinGroupChat(String chatUri);
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/IInstantMessageApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/IInstantMessageApi.aidl
deleted file mode 100644
index d9d4fc7..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/IInstantMessageApi.aidl
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * 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.aidl.im;
-
-import com.suntek.mway.rcs.client.aidl.contacts.RCSContact;
-import com.suntek.mway.rcs.client.aidl.provider.model.ChatMessage;
-import com.suntek.mway.rcs.client.aidl.provider.model.MessageSessionModel;
-import com.suntek.mway.rcs.client.aidl.provider.model.GroupChatModel;
-import com.suntek.mway.rcs.client.aidl.provider.model.GroupChatUser;
-import com.suntek.mway.rcs.client.aidl.provider.model.TopMessageData;
-import com.suntek.mway.rcs.client.aidl.provider.model.SimpleMsg;
-import com.suntek.mway.rcs.client.aidl.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 emoName);
-    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);
-    long sendGroupImageFileSync(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);
-    long sendGroupAudioFileSync(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);
-    long sendGroupVideoFileSync(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);
-    long sendGroupVCardByPathSync(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 removeButRemainLockMessageByThreadId(long threadId);
-    void removeOneMessage(String id);
-    void removeAllMessage();
-    void removeAllButRemainLockMessage();
-    
-    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 emoName);
-    void sendGroupPaidEmo(long thread_id, String conversationId, long sms_id, 
-            String emoid, String emoName, 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();
-    
-    int lockMessageById(String id);
-    int unlockMessageById(String id);
-    
-    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);
-    void removeButRemainLockMsgWithNotificationByThread(long threadId);
-
-    void backupMessageList(in List<SimpleMsg> simpleMsgList);
-
-	ChatMessage getMessageByTransferId(String transferId);
-	
-	void cancelBackup();
-	
-	long sendTextMessageSync(long thread_id,String number, String text,
-            int burnFlag, int barCycle);
-	
-	long sendImageFileSync(long thread_id,long sms_id,String number, String filePath,
-            int burnFlag, int barCycle,int quality);
-    
-    long sendAudioFileSync(long thread_id,long sms_id,String number, String filePath,
-            int recordTime,int burnFlag, int barCycle) ;
-    long sendVideoFileSync(long thread_id,long sms_id,String number, String filePath,
-            int length,int burnFlag, int barCycle);
-            
-    long sendOne2ManyTextMessageSync(long thread_id,in List<String> numbers, String text,
-            int burnFlag, int barCycle);  
-          
-    long sendOne2ManyImageFileSync(long thread_id,long sms_id, in List<String> numbers, String filePath,
-            int burnFlag, int barCycle,int quality);
-    
-    long sendOne2ManyAudioFileSync(long thread_id,long sms_id,in List<String> numbers, String filePath,
-            int recordTime,int burnFlag, int barCycle);
-    long sendOne2ManyVideoFileSync(long thread_id,long sms_id,in List<String> numbers, String filePath,
-            int length,int burnFlag, int barCycle);
-            
-    long sendGroupMessageSync(long thread_id, String conversationId,long sms_id,String msg,
-            String groupId);
-          
-    long sendOne2ManyVCardByPathSync(long thread_id, long sms_id, 
-            in List<String> numbers, String vcardFilePath);
-    long sendVCardByPathSync(long thread_id,long sms_id,String number, String vcardFilePath);
-    
-    
-    void forwardImageFile(long thread_id,long sms_id,String number, String id,
-            int burnFlag, int barCycle);
-    void forwardVideoFile(long thread_id,long sms_id,String number, String id,
-            int length,int burnFlag, int barCycle);
-    void forwardOne2ManyImageFile(long thread_id,long sms_id, in List<String> numbers, String id,
-            int burnFlag, int barCycle);
-    void forwardOne2ManyVideoFile(long thread_id,long sms_id,in List<String> numbers, String id,
-            int length,int burnFlag, int barCycle);
-    void forwardGroupImageFile(long thread_id, String conversationId,long sms_id,String id,
-            String groupId);
-    void forwardGroupVideoFile(long thread_id, String conversationId,long sms_id,String id,
-            int  length ,String groupId);
-        
-    void sendTextMessageAtTime(long thread_id,String number, String text,
-            int burnFlag, int barCycle, long orderTime);
-    void sendOne2ManyTextMessageAtTime(long thread_id,in List<String> numbers, String text,
-            int burnFlag, int barCycle, long orderTime);
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/IPaMessageApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/IPaMessageApi.aidl
deleted file mode 100644
index 1f53f2e..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/IPaMessageApi.aidl
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.aidl.im;
-
-import com.suntek.mway.rcs.client.aidl.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();
-    
-    
-    long sendTextMessageSync(long thread_id, long sms_id, String uuid, String text);
-        
-    long sendImageFileSync(long thread_id, long sms_id, String uuid , String filepath, int quality);
-    
-    long sendAudioFileSync(long thread_id, long sms_id, String uuid, String filepath, int recordTime);
-    
-    long sendVideoFileSync(long thread_id, long sms_id, String uuid, String filepath, int length);
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/login/ILoginApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/login/ILoginApi.aidl
deleted file mode 100644
index 0acd085..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/login/ILoginApi.aidl
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.aidl.login;
-
-import com.suntek.mway.rcs.client.aidl.login.ILoginEventListener;
-import com.suntek.mway.rcs.client.aidl.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/aidl/login/ILoginEventListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/login/ILoginEventListener.aidl
deleted file mode 100644
index 458db99..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/login/ILoginEventListener.aidl
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.aidl.login;
-
-interface ILoginEventListener {
-
-    void onLoginEventChanged(int resultCode, String resultDesc);
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/mcloud/IMcloudFileApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/mcloud/IMcloudFileApi.aidl
deleted file mode 100644
index 4dc78a6..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/mcloud/IMcloudFileApi.aidl
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.aidl.mcloud;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudOperationCtrl;
-
-interface IMcloudFileApi {
-    IMcloudOperationCtrl putFile(String localPath, String remotePath, int transOper);
-    void shareFile(String fullPathInID, String shareDesc);
-    void shareFileAndSend(String fullPathInID, String shareDesc, String contact, long threadId, String smsContentTemp);
-    void getShareFileList(int beginIndex, int endIndex);
-    IMcloudOperationCtrl downloadFileFromUrl(String remoteUrl, String fileName, int transOper, int chatMessageId);
-
-    void shareFileAndSendGroup(String fullPathInID, String shareDesc, long threadId, String conversationId, String groupId);
-    void shareFileAndSendOne2Many(String fullPathInID, String shareDesc, in List<String> contacts, long threadId, String smsContentTemp);
-
-    void getRemoteFileList(String remotePath, int beginIndex, int endIndex, int fileNodeOrder);
-	String getLocalRootPath();
-}
-
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/mcontact/IMcontactApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/mcontact/IMcontactApi.aidl
deleted file mode 100644
index d4476ca..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/mcontact/IMcontactApi.aidl
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.aidl.mcontact;
-
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/IMcloudFileApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IMcloudFileApi.aidl
deleted file mode 100644
index c2c099d..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IMcloudFileApi.aidl
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.aidl.plugin;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudOperationCtrl;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudAuthListener;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudSdkListener;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudConfListener;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudFileListener;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudMsgListener;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudShareListener;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudTransListener;
-
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/IPluginApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IPluginApi.aidl
new file mode 100644
index 0000000..fd0383d
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IPluginApi.aidl
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2015 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.aidl.plugin;
+
+//profile
+import com.suntek.mway.rcs.client.aidl.plugin.callback.IProfileListener;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Profile;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Avatar;
+
+//public account
+import com.suntek.mway.rcs.client.aidl.plugin.callback.IPublicAccountCallbackAPI;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccountsDetail;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccounts;
+
+//contact
+import com.suntek.mway.rcs.client.aidl.plugin.callback.IContactSyncListener;
+
+//cloud file
+import com.suntek.mway.rcs.client.aidl.plugin.callback.ICloudOperationCtrl;
+
+//emoticon
+import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmojiPackageBO;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmoticonBO;
+
+//rich screen
+import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.ResultInfo;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.ResultUtil;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.PhoneList;
+
+interface IPluginApi
+{
+    /*
+     * profile
+     */
+    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();
+
+    /*
+     * public account
+     */
+    void addSubscribe( String uuid );
+
+    void cancelSubscribe( String uuid );
+
+    void complainPublic( String uuid, String reason, String description, int type, String data );
+
+    void getPreMessage( String uuid, String timestamp, int order, int pageSize, int pageNum );
+
+    void getPublicDetail( String uuid );
+
+    void getPublicList( String keywords, int pageSize, int pageNum, int order );
+
+    void getPublicMenuInfo( String uuid );
+
+    void getUserSubscribePublicList();
+
+    void registerCallback( IPublicAccountCallbackAPI callback );
+
+    void unregisterCallback( IPublicAccountCallbackAPI callback );
+
+    void getRecommendPublic(int type, int pageSize, int pageNum);
+
+    void setAcceptStatus(String uuid, int acceptStatus);
+
+    /*
+     * contact
+     */
+    void doSync(int syncAction, IContactSyncListener listener);
+
+    void startIntervalSync(int syncAction, int intervalAction, long time);
+
+    void cancelIntervalSync();
+
+    int getIntervalSyncMode();
+
+    void setEnableAutoSync(boolean status,int syncAction);
+
+    boolean getEnableAutoSync();
+
+    int getAutoSync();
+
+    void setOnlySyncEnableViaWifi(boolean status);
+
+    boolean getOnlySyncEnableViaWifi();
+
+    int getLocalContactCounts();
+
+    int getRemoteContactCounts();
+
+    /*
+     * cloud file
+     */
+    ICloudOperationCtrl putFile(String localPath, String remotePath, int transOper);
+
+    ICloudOperationCtrl downloadFileFromUrl(String remoteUrl, String fileName, int transOper, long chatMessageId);
+
+    void shareFile(String fileId, String shareDesc);
+
+    void getRemoteFileList(String remotePath, int beginIndex, int endIndex, int fileNodeOrder);
+
+    void getShareFileList(int beginIndex, int endIndex);
+
+    String getLocalRootPath();
+
+    void shareFileAndSend(String fileId, String shareDesc, in List<String> contacts,
+            long threadId, String smsContentTemp, int barCycle);
+
+    void shareFileAndSendGroup(String fileId, String shareDesc, long threadId, long groupId);
+
+    /*
+     * emoticon
+     */
+    List<EmojiPackageBO> queryEmojiPackages();
+
+    List<EmojiPackageBO> queryEmojiPackagesWithDetail();
+
+    List<EmoticonBO> queryEmoticons( String packageId);
+
+    List<EmoticonBO> queryEmoticonName(String emoticonName);
+
+    EmojiPackageBO getEmojiPackage( String packageId);
+
+    EmojiPackageBO getEmojiPackageWithDetail( String packageId);
+
+    EmoticonBO getEmoticon( String emoticonId );
+
+    boolean isEmojiPackageExist( String packageId);//todo  emojiPackageExist-->isEmojiPackageExist
+
+    boolean isCanSend(String emoticonId);
+
+    byte[] decrypt2Bytes(String emoticonId, int emoFileType);
+
+    String getStorageRootPath();
+
+    boolean isEmojiStoreInstall();
+
+    void startEmojiStoreApp();
+
+    void downloadEmoticon(String emoticonId, long messageRowId);
+
+    /*
+     * rich screen
+     */
+    ResultUtil getRichScrnObj( String missdn, String phoneEvent );
+
+    ResultInfo downloadRichScrnObj(String missdn, String phoneEvent );
+
+    ResultInfo clearRichScrnLocalCache(String phoneEvent );
+
+    ResultInfo downloadHomeLocRules(String phoneEvent );
+
+    ResultInfo richScrnChangeNetWork();
+
+    ResultInfo collectRichScrnObj (String sourceType, String cId);
+
+    void startRichScreenApp(in List<String> mobileList);
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IProfileApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IProfileApi.aidl
deleted file mode 100644
index 678c56b..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IProfileApi.aidl
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.aidl.plugin;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IProfileListener;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Profile;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Avatar;
-
-interface IProfileApi
-{
-	boolean checkPluginStatus();
-
-    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/aidl/plugin/IPublicAccountAPI.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IPublicAccountAPI.aidl
deleted file mode 100644
index d410629..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IPublicAccountAPI.aidl
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * 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.aidl.plugin;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IPublicAccountCallbackAPI;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.MsgContent;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccountReqEntity;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccountsDetail;
-import com.suntek.mway.rcs.client.aidl.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
-{
-    
-    /**
-     * Check plugin status.
-     * 
-     * @return true, if successful
-     */
-    boolean checkPluginStatus();
-    
-    /**
-     * 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.
-     */
-    boolean getUserSubscribePublicList();
-
-    /**
-     * 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/aidl/plugin/IRichScreenApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IRichScreenApi.aidl
deleted file mode 100644
index e982dec..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/IRichScreenApi.aidl
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * 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.aidl.plugin;
-
-import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.ResultInfo;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.ResultUtil;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.PhoneList;
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IMcloudOperationCtrl.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICloudOperationCtrl.aidl
similarity index 92%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudOperationCtrl.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICloudOperationCtrl.aidl
index d581d8c..a262b11 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudOperationCtrl.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICloudOperationCtrl.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -22,9 +22,9 @@
  */
 package com.suntek.mway.rcs.client.aidl.plugin.callback;
 
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile.Result;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile.Result;
 
-interface IMcloudOperationCtrl
+interface ICloudOperationCtrl
 {
     void cancel();
     void exec();
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMContactSyncListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IContactSyncListener.aidl
similarity index 94%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMContactSyncListener.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IContactSyncListener.aidl
index 92ea420..62d3f67 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMContactSyncListener.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IContactSyncListener.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -22,7 +22,7 @@
  */
 package com.suntek.mway.rcs.client.aidl.plugin.callback;
 
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcontact.Auth;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.contact.Auth;
 
 /**
  * <p>
@@ -34,12 +34,12 @@
  * <p>
  * Company: pci-suntek
  * </p>
- * 
+ *
  * @author yzx
  * @version 1.0
- * 
+ *
  */
-interface IMContactSyncListener
+interface IContactSyncListener
 {
 
     void onPreExecuteAuthSession(in Auth auth);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonCallbackApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonCallbackApi.aidl
deleted file mode 100644
index 5229c94..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonCallbackApi.aidl
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmoticonBO;
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IEmoticonCanSendCallback.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonCanSendCallback.aidl
deleted file mode 100644
index a816ceb..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonCanSendCallback.aidl
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.aidl.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/aidl/plugin/callback/IEmoticonPackagesNetCallbackApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonPackagesNetCallbackApi.aidl
deleted file mode 100644
index 7d70946..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonPackagesNetCallbackApi.aidl
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IEmoticonSetSuccessDownListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonSetSuccessDownListener.aidl
deleted file mode 100644
index 9cc2b58..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IEmoticonSetSuccessDownListener.aidl
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IMcloudAuthListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudAuthListener.aidl
deleted file mode 100644
index 9003844..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudAuthListener.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudOperationCtrl;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile.Param;
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IMcloudConfListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudConfListener.aidl
deleted file mode 100644
index b252859..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudConfListener.aidl
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudOperationCtrl;
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IMcloudFileListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudFileListener.aidl
deleted file mode 100644
index ef452dd..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudFileListener.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudOperationCtrl;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile.Param;
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IMcloudMsgListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudMsgListener.aidl
deleted file mode 100644
index 9427596..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudMsgListener.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudOperationCtrl;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile.Param;
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IMcloudSdkListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudSdkListener.aidl
deleted file mode 100644
index d91ce7e..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudSdkListener.aidl
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IMcloudShareListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudShareListener.aidl
deleted file mode 100644
index 93536bd..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudShareListener.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudOperationCtrl;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile.Param;
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IMcloudTransListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudTransListener.aidl
deleted file mode 100644
index 40361e3..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IMcloudTransListener.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.aidl.plugin.callback;
-
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudOperationCtrl;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile.Param;
-import com.suntek.mway.rcs.client.aidl.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/aidl/plugin/callback/IProfileGetCallback.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfileGetCallback.aidl
deleted file mode 100644
index 0fc8e6f..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfileGetCallback.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.aidl.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/aidl/plugin/callback/IProfileListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfileListener.aidl
index 080f35f..07b1bca 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfileListener.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfileListener.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -30,14 +30,9 @@
 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/aidl/plugin/callback/IProfilePutCallback.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfilePutCallback.aidl
deleted file mode 100644
index 6f5fb55..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IProfilePutCallback.aidl
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.aidl.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/aidl/plugin/callback/IPublicAccountCallbackAPI.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IPublicAccountCallbackAPI.aidl
index 22f0f67..43cd0ca 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IPublicAccountCallbackAPI.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IPublicAccountCallbackAPI.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -34,16 +34,16 @@
  * <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
      */
@@ -51,7 +51,7 @@
 
     /**
      * response the cancel public account result
-     * 
+     *
      * @param result
      *            if cancel success
      */
@@ -69,84 +69,84 @@
      * @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
      */
     void respGetPublicMenuInfo( boolean result, in MenuInfoMode menuInfoMode );
-    
+
     /**
      * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNode.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNode.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNode.aidl
index 7fc3411..a5ec744 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNode.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNode.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable AuthNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNode.java
similarity index 96%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNode.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNode.java
index 66591b7..1ea691e 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNode.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,13 +21,13 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
-
-import java.util.Map;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Map;
+
 public class AuthNode implements Parcelable {
     private byte[] captcha;
 
@@ -56,7 +56,6 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
      * @return the int
      */
     @Override
@@ -68,7 +67,6 @@
      * 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
      */
@@ -91,7 +89,6 @@
      * 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")
@@ -109,7 +106,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<AuthNode> CREATOR = new Parcelable.Creator<AuthNode>() {
+    public static final Parcelable.Creator<AuthNode> CREATOR =
+            new Parcelable.Creator<AuthNode>() {
         @Override
         public AuthNode createFromParcel(Parcel source) {
             return new AuthNode(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNodeUpdateInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNodeUpdateInfo.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNodeUpdateInfo.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNodeUpdateInfo.aidl
index 9baf5c3..5a0b97e 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNodeUpdateInfo.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNodeUpdateInfo.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable AuthNodeUpdateInfo;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNodeUpdateInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNodeUpdateInfo.java
similarity index 95%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNodeUpdateInfo.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNodeUpdateInfo.java
index 0171a35..22d9557 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/AuthNodeUpdateInfo.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/AuthNodeUpdateInfo.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -52,7 +52,6 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
      * @return the int
      */
     @Override
@@ -64,7 +63,6 @@
      * 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
      */
@@ -84,7 +82,6 @@
      * 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) {
@@ -99,7 +96,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<AuthNodeUpdateInfo> CREATOR = new Parcelable.Creator<AuthNodeUpdateInfo>() {
+    public static final Parcelable.Creator<AuthNodeUpdateInfo> CREATOR =
+            new Parcelable.Creator<AuthNodeUpdateInfo>() {
         @Override
         public AuthNodeUpdateInfo createFromParcel(Parcel source) {
             return new AuthNodeUpdateInfo(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/CloudFileMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/CloudFileMessage.java
similarity index 95%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/CloudFileMessage.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/CloudFileMessage.java
index c9c17de..1fbacc2 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/provider/model/CloudFileMessage.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/CloudFileMessage.java
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.provider.model;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -57,7 +57,6 @@
 
     /**
      * Instantiates a new cloud file message.
-     * 
      * @param source the source
      */
     public CloudFileMessage(Parcel source) {
@@ -86,7 +85,7 @@
 
     /**
      * Read from parcel.
-     * 
+     *
      * @param source the source
      */
     public void readFromParcel(Parcel source) {
@@ -96,7 +95,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<CloudFileMessage> CREATOR = new Parcelable.Creator<CloudFileMessage>() {
+    public static final Parcelable.Creator<CloudFileMessage> CREATOR =
+            new Parcelable.Creator<CloudFileMessage>() {
         @Override
         public CloudFileMessage createFromParcel(Parcel source) {
             return new CloudFileMessage(source);
@@ -110,7 +110,6 @@
 
     /**
      * Gets the file name.
-     * 
      * @return the file name
      */
     public String getFileName() {
@@ -119,7 +118,6 @@
 
     /**
      * Sets the file name.
-     * 
      * @param fileName the new file name
      */
     public void setFileName(String fileName) {
@@ -128,7 +126,6 @@
 
     /**
      * Gets the file size.
-     * 
      * @return the file size
      */
     public long getFileSize() {
@@ -137,7 +134,6 @@
 
     /**
      * Sets the file size.
-     * 
      * @param fileSize the new file size
      */
     public void setFileSize(long fileSize) {
@@ -146,7 +142,6 @@
 
     /**
      * Gets the share url.
-     * 
      * @return the share url
      */
     public String getShareUrl() {
@@ -155,7 +150,6 @@
 
     /**
      * Sets the share url.
-     * 
      * @param shareUrl the new share url
      */
     public void setShareUrl(String shareUrl) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ConfNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ConfNode.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ConfNode.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ConfNode.aidl
index d367e3a..99fc5ef 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ConfNode.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ConfNode.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable ConfNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ConfNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ConfNode.java
similarity index 92%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ConfNode.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ConfNode.java
index b5afe67..02730ef 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ConfNode.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ConfNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,13 +21,13 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
-
-import java.util.Map;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Map;
+
 public class ConfNode implements Parcelable {
     private String version;
 
@@ -42,7 +42,6 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
      * @return the int
      */
     @Override
@@ -54,7 +53,6 @@
      * 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
      */
@@ -68,7 +66,6 @@
      * 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")
@@ -78,7 +75,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<ConfNode> CREATOR = new Parcelable.Creator<ConfNode>() {
+    public static final Parcelable.Creator<ConfNode> CREATOR =
+            new Parcelable.Creator<ConfNode>() {
         @Override
         public ConfNode createFromParcel(Parcel source) {
             return new ConfNode(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Config.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Config.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Config.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Config.aidl
index 586158e..712ffcd 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Config.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Config.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable Config;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Config.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Config.java
similarity index 99%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Config.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Config.java
index cf3e18a..c5a5d18 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Config.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Config.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 /**
  * The Class Config.
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Error.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Error.java
similarity index 96%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Error.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Error.java
index 95b3e41..696102f 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Error.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Error.java
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 public enum Error {
     Timeout,
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Event.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Event.java
similarity index 95%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Event.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Event.java
index e953a6a..bf0e918 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Event.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Event.java
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 public enum Event {
     started,
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/FileNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/FileNode.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/FileNode.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/FileNode.aidl
index 63fe2ed..7e37450 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/FileNode.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/FileNode.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable FileNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/FileNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/FileNode.java
similarity index 97%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/FileNode.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/FileNode.java
index 2e48e2b..103d439 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/FileNode.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/FileNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,13 +21,13 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
-
-import java.util.Map;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Map;
+
 public class FileNode implements Parcelable {
     private boolean isFile;
 
@@ -102,7 +102,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -114,7 +114,7 @@
      * 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
      */
@@ -174,7 +174,7 @@
      * 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")
@@ -218,7 +218,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<FileNode> CREATOR = new Parcelable.Creator<FileNode>() {
+    public static final Parcelable.Creator<FileNode> CREATOR =
+            new Parcelable.Creator<FileNode>() {
         @Override
         public FileNode createFromParcel(Parcel source) {
             return new FileNode(source);
@@ -582,7 +583,7 @@
 
         /**
          * Value of.
-         * 
+         *
          * @param ordinal the ordinal
          * @return the thumb type
          */
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/MsgNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/MsgNode.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/MsgNode.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/MsgNode.aidl
index 85fe823..7246859 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/MsgNode.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/MsgNode.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable MsgNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/MsgNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/MsgNode.java
similarity index 96%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/MsgNode.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/MsgNode.java
index 2757427..9df1933 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/MsgNode.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/MsgNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,13 +21,13 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
-
-import java.util.Map;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Map;
+
 public class MsgNode implements Parcelable {
     private String content;
 
@@ -68,7 +68,6 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
      * @return the int
      */
     @Override
@@ -80,7 +79,6 @@
      * 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
      */
@@ -116,7 +114,6 @@
      * 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")
@@ -144,7 +141,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<MsgNode> CREATOR = new Parcelable.Creator<MsgNode>() {
+    public static final Parcelable.Creator<MsgNode> CREATOR =
+            new Parcelable.Creator<MsgNode>() {
         @Override
         public MsgNode createFromParcel(Parcel source) {
             return new MsgNode(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Param.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Param.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Param.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Param.aidl
index ea52577..8950dae 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Param.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Param.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable Param;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Param.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Param.java
similarity index 92%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Param.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Param.java
index 1c7db59..d20f05b 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Param.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Param.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -42,7 +42,6 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
      * @return the int
      */
     @Override
@@ -54,7 +53,6 @@
      * 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
      */
@@ -69,7 +67,6 @@
      * 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) {
@@ -79,7 +76,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<Param> CREATOR = new Parcelable.Creator<Param>() {
+    public static final Parcelable.Creator<Param> CREATOR =
+            new Parcelable.Creator<Param>() {
         @Override
         public Param createFromParcel(Parcel source) {
             return new Param(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Result.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Result.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Result.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Result.aidl
index 8e2e2dd..85c2f8a 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Result.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Result.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable Result;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Result.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Result.java
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Result.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Result.java
index 1fd603f..4eb7447 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Result.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Result.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -46,7 +46,6 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
      * @return the int
      */
     @Override
@@ -58,7 +57,6 @@
      * 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
      */
@@ -75,7 +73,6 @@
      * 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) {
@@ -87,7 +84,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<Result> CREATOR = new Parcelable.Creator<Result>() {
+    public static final Parcelable.Creator<Result> CREATOR =
+            new Parcelable.Creator<Result>() {
         @Override
         public Result createFromParcel(Parcel source) {
             return new Result(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/SdkType.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/SdkType.java
similarity index 95%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/SdkType.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/SdkType.java
index 1d00e94..e1ad856 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/SdkType.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/SdkType.java
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 public enum SdkType {
     Static,
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ShareNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ShareNode.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ShareNode.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ShareNode.aidl
index b490703..d449b1c 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ShareNode.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ShareNode.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable ShareNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ShareNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ShareNode.java
similarity index 94%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ShareNode.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ShareNode.java
index a11daab..b0f46df 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/ShareNode.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/ShareNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,14 +21,14 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
-
-import java.util.Arrays;
-import java.util.Map;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Arrays;
+import java.util.Map;
+
 public class ShareNode implements Parcelable {
     private String url;
 
@@ -65,7 +65,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -77,7 +77,7 @@
      * 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
      */
@@ -102,7 +102,7 @@
      * 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")
@@ -122,7 +122,8 @@
                 .getClassLoader());
         file = new FileNode[] {};
         if (fileParcelableArray != null) {
-            file = Arrays.copyOf(fileParcelableArray, fileParcelableArray.length, FileNode[].class);
+            file = Arrays.copyOf(fileParcelableArray,
+                    fileParcelableArray.length, FileNode[].class);
         }
 
         Parcelable[] subSharesParcelableArray = source.readParcelableArray(this.getClass()
@@ -139,7 +140,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<ShareNode> CREATOR = new Parcelable.Creator<ShareNode>() {
+    public static final Parcelable.Creator<ShareNode> CREATOR =
+            new Parcelable.Creator<ShareNode>() {
         @Override
         public ShareNode createFromParcel(Parcel source) {
             return new ShareNode(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Status.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Status.java
similarity index 95%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Status.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Status.java
index f02bde4..f8ec769 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Status.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/Status.java
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 public enum Status {
     waitting,
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/TransNode.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/TransNode.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/TransNode.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/TransNode.aidl
index b2ea946..b391dc9 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/TransNode.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/TransNode.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 parcelable TransNode;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/TransNode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/TransNode.java
similarity index 96%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/TransNode.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/TransNode.java
index c504f2b..c376113 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/TransNode.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/cloudfile/TransNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -27,13 +27,13 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile;
-
-import java.util.Map;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.Map;
+
 public class TransNode implements Parcelable {
     private String id;
 
@@ -78,7 +78,6 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
      * @return the int
      */
     @Override
@@ -90,7 +89,6 @@
      * 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
      */
@@ -126,7 +124,6 @@
      * 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")
@@ -156,7 +153,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<TransNode> CREATOR = new Parcelable.Creator<TransNode>() {
+    public static final Parcelable.Creator<TransNode> CREATOR =
+            new Parcelable.Creator<TransNode>() {
         @Override
         public TransNode createFromParcel(Parcel source) {
             return new TransNode(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/Auth.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/Auth.aidl
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/Auth.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/Auth.aidl
index 7465ed5..06ad2ed 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/Auth.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/Auth.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcontact;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.contact;
 
 parcelable Auth;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/Auth.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/Auth.java
similarity index 94%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/Auth.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/Auth.java
index 97b3c89..37249b6 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/Auth.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/Auth.java
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcontact;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.contact;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -46,7 +46,7 @@
 
     private String version;
 
-    private String mContact_session;
+    private String contact_session;
 
     private boolean enableSync;
 
@@ -95,7 +95,7 @@
         paramParcel.writeString(this.deviceId);
         paramParcel.writeString(this.token);
         paramParcel.writeString(this.version);
-        paramParcel.writeString(this.mContact_session);
+        paramParcel.writeString(this.contact_session);
         paramParcel.writeInt(this.enableSync == true ? 1 : 0);
         paramParcel.writeInt(this.isAutoSync == true ? 1 : 0);
         paramParcel.writeString(this.syncSn);
@@ -130,7 +130,7 @@
         String str9 = paramParcel.readString();
         setVersion(str9);
         String str10 = paramParcel.readString();
-        setmContact_session(str10);
+        setContact_session(str10);
         boolean bool1 = paramParcel.readInt() > 0;
         setEnableSync(bool1);
         boolean bool2 = paramParcel.readInt() > 0;
@@ -158,7 +158,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<Auth> CREATOR = new Parcelable.Creator<Auth>() {
+    public static final Parcelable.Creator<Auth> CREATOR =
+            new Parcelable.Creator<Auth>() {
         @Override
         public Auth createFromParcel(Parcel source) {
             return new Auth(source);
@@ -242,12 +243,12 @@
         this.version = version;
     }
 
-    public String getmContact_session() {
-        return mContact_session;
+    public String getContact_session() {
+        return contact_session;
     }
 
-    public void setmContact_session(String mContact_session) {
-        this.mContact_session = mContact_session;
+    public void setContact_session(String Contact_session) {
+        this.contact_session = Contact_session;
     }
 
     public boolean isEnableSync() {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/ContactAction.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/ContactAction.java
similarity index 88%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/ContactAction.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/ContactAction.java
index 228bcb9..2775558 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/ContactAction.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/ContactAction.java
@@ -21,14 +21,18 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcontact;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.contact;
 
 public enum ContactAction {
-    CONTACT_ACTION_READ, CONTACT_ACTION_ADD, CONTACT_ACTION_DELETE, CONTACT_ACTION_UPDATE, CONTACT_ACTION_UNKNOWN;
+    CONTACT_ACTION_READ,
+    CONTACT_ACTION_ADD,
+    CONTACT_ACTION_DELETE,
+    CONTACT_ACTION_UPDATE,
+    CONTACT_ACTION_UNKNOWN;
 
     /**
      * Value of.
-     * 
+     *
      * @param ordinal the ordinal
      * @return the event
      */
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/IntervalAction.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/IntervalAction.java
similarity index 89%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/IntervalAction.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/IntervalAction.java
index 8d7a39f..ef0e5a9 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/IntervalAction.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/IntervalAction.java
@@ -21,14 +21,17 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcontact;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.contact;
 
 public enum IntervalAction {
-    INTERVAL_SYNC_ONE_DAY, INTERVAL_SYNC_ONE_WEEK, INTERVAL_SYNC_ONE_MONTH, INTERVAL_SYNC_SELF_DEFINE;
+    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
      */
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/SyncAction.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/SyncAction.java
similarity index 90%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/SyncAction.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/SyncAction.java
index 2da3d5b..ffec888 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/SyncAction.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/contact/SyncAction.java
@@ -21,14 +21,17 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.plugin.entity.mcontact;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.contact;
 
 public enum SyncAction {
-    CONTACT_DOWNLOAD, CONTACT_DOWNLOAD_APPEND, CONTACT_UPLOAD, CONTACT_UPLOAD_APPEND;
+    CONTACT_DOWNLOAD,
+    CONTACT_DOWNLOAD_APPEND,
+    CONTACT_UPLOAD,
+    CONTACT_UPLOAD_APPEND;
 
     /**
      * Value of.
-     * 
+     *
      * @param ordinal the ordinal
      * @return the event
      */
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmojiPackageBO.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmojiPackageBO.aidl
index 6727156..3184160 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmojiPackageBO.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmojiPackageBO.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmojiPackageBO.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmojiPackageBO.java
index 043b134..dad52b0 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmojiPackageBO.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmojiPackageBO.java
@@ -26,24 +26,6 @@
 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. */
@@ -87,7 +69,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -99,7 +81,7 @@
      * 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
      */
@@ -124,7 +106,7 @@
      * 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) {
@@ -144,7 +126,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<EmojiPackageBO> CREATOR = new Parcelable.Creator<EmojiPackageBO>() {
+    public static final Parcelable.Creator<EmojiPackageBO> CREATOR =
+            new Parcelable.Creator<EmojiPackageBO>() {
         @Override
         public EmojiPackageBO createFromParcel(Parcel source) {
             return new EmojiPackageBO(source);
@@ -164,7 +147,7 @@
 
     /**
      * Instantiates a new emoji package bo.
-     * 
+     *
      * @param source the source
      */
     public EmojiPackageBO(Parcel source) {
@@ -173,7 +156,7 @@
 
     /**
      * Gets the package id.
-     * 
+     *
      * @return the package id
      */
     public String getPackageId() {
@@ -182,7 +165,7 @@
 
     /**
      * Sets the package id.
-     * 
+     *
      * @param packageId the new package id
      */
     public void setPackageId(String packageId) {
@@ -191,7 +174,7 @@
 
     /**
      * Gets the package name.
-     * 
+     *
      * @return the package name
      */
     public String getPackageName() {
@@ -200,7 +183,7 @@
 
     /**
      * Sets the package name.
-     * 
+     *
      * @param packageName the new package name
      */
     public void setPackageName(String packageName) {
@@ -209,7 +192,7 @@
 
     /**
      * Gets the package icon.
-     * 
+     *
      * @return the package icon
      */
     public String getPackageIcon() {
@@ -218,7 +201,7 @@
 
     /**
      * Sets the package icon.
-     * 
+     *
      * @param packageIcon the new package icon
      */
     public void setPackageIcon(String packageIcon) {
@@ -227,7 +210,7 @@
 
     /**
      * Gets the package size.
-     * 
+     *
      * @return the package size
      */
     public String getPackageSize() {
@@ -236,7 +219,7 @@
 
     /**
      * Sets the package size.
-     * 
+     *
      * @param packageSize the new package size
      */
     public void setPackageSize(String packageSize) {
@@ -245,7 +228,7 @@
 
     /**
      * Gets the package state.
-     * 
+     *
      * @return the package state
      */
     public String getPackageState() {
@@ -254,7 +237,7 @@
 
     /**
      * Sets the package state.
-     * 
+     *
      * @param packageState the new package state
      */
     public void setPackageState(String packageState) {
@@ -263,7 +246,7 @@
 
     /**
      * Gets the package price.
-     * 
+     *
      * @return the package price
      */
     public String getPackagePrice() {
@@ -272,7 +255,7 @@
 
     /**
      * Sets the package price.
-     * 
+     *
      * @param packagePrice the new package price
      */
     public void setPackagePrice(String packagePrice) {
@@ -281,7 +264,7 @@
 
     /**
      * Gets the package use limited time.
-     * 
+     *
      * @return the package use limited time
      */
     public String getPackageUseTime() {
@@ -290,7 +273,7 @@
 
     /**
      * Sets the package use limited time.
-     * 
+     *
      * @param packageUseTime the new package use limited time
      */
     public void setPackageUseTime(String packageUseTime) {
@@ -299,7 +282,7 @@
 
     /**
      * Gets the package cp id.
-     * 
+     *
      * @return the package cp id
      */
     public String getPackageCpId() {
@@ -308,7 +291,7 @@
 
     /**
      * Sets the package cp id.
-     * 
+     *
      * @param packageCpId the new package cp id
      */
     public void setPackageCpId(String packageCpId) {
@@ -317,7 +300,7 @@
 
     /**
      * Gets the package cp name.
-     * 
+     *
      * @return the package cp name
      */
     public String getPackageCpName() {
@@ -326,7 +309,7 @@
 
     /**
      * Sets the package cp name.
-     * 
+     *
      * @param packageCpName the new package cp name
      */
     public void setPackageCpName(String packageCpName) {
@@ -335,7 +318,7 @@
 
     /**
      * Gets the package description.
-     * 
+     *
      * @return the package description
      */
     public String getPackageDesc() {
@@ -344,7 +327,7 @@
 
     /**
      * Sets the package description.
-     * 
+     *
      * @param packageDesc the new package description
      */
     public void setPackageDesc(String packageDesc) {
@@ -353,7 +336,7 @@
 
     /**
      * Gets the package zip icon.
-     * 
+     *
      * @return the package zip icon
      */
     public String getPackageZipIcon() {
@@ -362,7 +345,7 @@
 
     /**
      * Sets the package zip icon.
-     * 
+     *
      * @param packageZipIcon the new package zip icon
      */
     public void setPackageZipIcon(String packageZipIcon) {
@@ -371,7 +354,7 @@
 
     /**
      * Gets the package zip name.
-     * 
+     *
      * @return the package zip name
      */
     public String getPackageZipName() {
@@ -380,7 +363,7 @@
 
     /**
      * Sets the package zip name.
-     * 
+     *
      * @param packageZipName the new package zip name
      */
     public void setPackageZipName(String packageZipName) {
@@ -389,7 +372,7 @@
 
     /**
      * Gets the package zip path.
-     * 
+     *
      * @return the package zip path
      */
     public String getPackageZipPath() {
@@ -398,7 +381,7 @@
 
     /**
      * Sets the package zip path.
-     * 
+     *
      * @param packageZipPath the new package zip path
      */
     public void setPackageZipPath(String packageZipPath) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonBO.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonBO.aidl
index ad8a3e9..00eba0b 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonBO.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonBO.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonBO.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonBO.java
index 84091ed..34c9d62 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonBO.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonBO.java
@@ -26,24 +26,6 @@
 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;
@@ -74,7 +56,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -86,7 +68,7 @@
      * 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
      */
@@ -109,7 +91,7 @@
      * 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) {
@@ -127,7 +109,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<EmoticonBO> CREATOR = new Parcelable.Creator<EmoticonBO>() {
+    public static final Parcelable.Creator<EmoticonBO> CREATOR =
+            new Parcelable.Creator<EmoticonBO>() {
         @Override
         public EmoticonBO createFromParcel(Parcel source) {
             return new EmoticonBO(source);
@@ -147,7 +130,7 @@
 
     /**
      * Instantiates a new emoticon entity.
-     * 
+     *
      * @param source the source parcel
      */
     public EmoticonBO(Parcel source) {
@@ -156,7 +139,7 @@
 
     /**
      * Gets the emoticon id.
-     * 
+     *
      * @return the emoticon id
      */
     public String getEmoticonId() {
@@ -165,7 +148,7 @@
 
     /**
      * Sets the emoticon id.
-     * 
+     *
      * @param emoticonId the new emoticon id
      */
     public void setEmoticonId(String emoticonId) {
@@ -174,7 +157,7 @@
 
     /**
      * Gets the emoticon name.
-     * 
+     *
      * @return the emoticon name
      */
     public String getEmoticonName() {
@@ -183,7 +166,7 @@
 
     /**
      * Sets the emoticon name.
-     * 
+     *
      * @param emoticonName the new emoticon name
      */
     public void setEmoticonName(String emoticonName) {
@@ -192,7 +175,7 @@
 
     /**
      * Gets the emoticon static url.
-     * 
+     *
      * @return the emoticon static url
      */
     public String getEmoticonStatic() {
@@ -201,7 +184,7 @@
 
     /**
      * Sets the emoticon static url.
-     * 
+     *
      * @param emoticonStatic the new emoticon static url
      */
     public void setEmoticonStatic(String emoticonStatic) {
@@ -210,7 +193,7 @@
 
     /**
      * Gets the emoticon dynamic url.
-     * 
+     *
      * @return the emoticon dynamic url
      */
     public String getEmoticonDynamic() {
@@ -219,7 +202,7 @@
 
     /**
      * Sets the emoticon dynamic url.
-     * 
+     *
      * @param emoticonDynamic the new emoticon dynamic url
      */
     public void setEmoticonDynamic(String emoticonDynamic) {
@@ -228,7 +211,7 @@
 
     /**
      * Gets the package id.
-     * 
+     *
      * @return the package id
      */
     public String getPackageId() {
@@ -237,7 +220,7 @@
 
     /**
      * Sets the package id.
-     * 
+     *
      * @param packageId the new package id
      */
     public void setPackageId(String packageId) {
@@ -246,7 +229,7 @@
 
     /**
      * Gets the static emoticon bytes.
-     * 
+     *
      * @return the static emoticon bytes
      */
     public byte[] getEmoticonStaticByte() {
@@ -255,7 +238,7 @@
 
     /**
      * Sets the static emoticon bytes.
-     * 
+     *
      * @param emoticonStaticByte the new static emoticon bytes
      */
     public void setEmoticonStaticByte(byte[] emoticonStaticByte) {
@@ -264,7 +247,7 @@
 
     /**
      * Gets the dynamic emoticon bytes.
-     * 
+     *
      * @return the dynamic emoticon bytes
      */
     public byte[] getEmoticonDynamicByte() {
@@ -273,7 +256,7 @@
 
     /**
      * Sets the dynamic emoticon bytes.
-     * 
+     *
      * @param emoticonDynamicByte the new dynamic emoticon bytes
      */
     public void setEmoticonDynamicByte(byte[] emoticonDynamicByte) {
@@ -282,7 +265,7 @@
 
     /**
      * Gets the user phone number.
-     * 
+     *
      * @return the user phone number
      */
     public String getUserPhone() {
@@ -291,7 +274,7 @@
 
     /**
      * Sets the user phone number.
-     * 
+     *
      * @param userPhone the new user phone number
      */
     public void setUserPhone(String userPhone) {
@@ -300,7 +283,7 @@
 
     /**
      * Checks if is only browse.
-     * 
+     *
      * @return true, if is only browse
      */
     public boolean isOnlyBrowse() {
@@ -309,7 +292,7 @@
 
     /**
      * Sets the only browse.
-     * 
+     *
      * @param isOnlyBrowse the new only browse
      */
     public void setOnlyBrowse(boolean isOnlyBrowse) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/ResultBO.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/ResultBO.aidl
index 6b52e61..6f8a60b 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/ResultBO.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/ResultBO.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/ResultBO.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/ResultBO.java
index 38a9837..a68ea43 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/ResultBO.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/ResultBO.java
@@ -26,24 +26,6 @@
 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;
@@ -60,7 +42,8 @@
     /**
      * The parcel creator
      */
-    public static final Parcelable.Creator<ResultBO> CREATOR = new Parcelable.Creator<ResultBO>() {
+    public static final Parcelable.Creator<ResultBO> CREATOR =
+            new Parcelable.Creator<ResultBO>() {
         @Override
         public ResultBO createFromParcel(Parcel source) {
             return new ResultBO(source);
@@ -80,7 +63,7 @@
 
     /**
      * Instantiates a new result entity from parcel.
-     * 
+     *
      * @param source the parcel source.
      */
     public ResultBO(Parcel source) {
@@ -91,7 +74,7 @@
      * 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
      */
@@ -108,7 +91,7 @@
      * 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) {
@@ -129,7 +112,7 @@
 
     /**
      * Checks if is result succ
-     * 
+     *
      * @return true, if is result succ
      */
     public boolean isResultFlag() {
@@ -138,7 +121,7 @@
 
     /**
      * Sets the result flag.
-     * 
+     *
      * @param resultFlag the new result flag
      */
     public void setResultFlag(boolean resultFlag) {
@@ -147,7 +130,7 @@
 
     /**
      * Gets the result info.
-     * 
+     *
      * @return the result info
      */
     public String getResultMsg() {
@@ -156,7 +139,7 @@
 
     /**
      * Sets the result info.
-     * 
+     *
      * @param resultMsg the new result info.
      */
     public void setResultMsg(String resultMsg) {
@@ -165,7 +148,7 @@
 
     /**
      * Gets the result object.
-     * 
+     *
      * @return the result object
      */
     public Object getResultObj() {
@@ -174,7 +157,7 @@
 
     /**
      * Sets the result object.
-     * 
+     *
      * @param resultObj the new result object
      */
     public void setResultObj(Object resultObj) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/UserBO.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/UserBO.aidl
index dbe2afb..eadb7a0 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/UserBO.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/UserBO.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/UserBO.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/UserBO.java
index a69dbab..6e23632 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/UserBO.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/UserBO.java
@@ -26,23 +26,6 @@
 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;
@@ -58,7 +41,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -70,7 +53,7 @@
      * 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
      */
@@ -86,7 +69,7 @@
      * 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) {
@@ -97,7 +80,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<UserBO> CREATOR = new Parcelable.Creator<UserBO>() {
+    public static final Parcelable.Creator<UserBO> CREATOR =
+            new Parcelable.Creator<UserBO>() {
         @Override
         public UserBO createFromParcel(Parcel source) {
             return new UserBO(source);
@@ -117,7 +101,7 @@
 
     /**
      * Instantiates a new user entity from parcel.
-     * 
+     *
      * @param source the parcel source
      */
     public UserBO(Parcel source) {
@@ -126,7 +110,7 @@
 
     /**
      * Gets the user phone number.
-     * 
+     *
      * @return the user phone number
      */
     public String getUserPhone() {
@@ -135,7 +119,7 @@
 
     /**
      * Sets the user phone number.
-     * 
+     *
      * @param userPhone the new user phone number
      */
     public void setUserPhone(String userPhone) {
@@ -144,7 +128,7 @@
 
     /**
      * Gets the user nickname.
-     * 
+     *
      * @return the user nickname
      */
     public String getUserNick() {
@@ -153,7 +137,7 @@
 
     /**
      * Sets the user nickname.
-     * 
+     *
      * @param userNick the new user nickname
      */
     public void setUserNick(String userNick) {
@@ -162,7 +146,7 @@
 
     /**
      * Gets the user login time.
-     * 
+     *
      * @return the user login time
      */
     public String getUserLoginTime() {
@@ -171,7 +155,7 @@
 
     /**
      * Sets the user login time.
-     * 
+     *
      * @param userLoginTime the new user login time
      */
     public void setUserLoginTime(String userLoginTime) {
@@ -180,7 +164,7 @@
 
     /**
      * Gets the user state.
-     * 
+     *
      * @return the user state
      */
     public String getUserState() {
@@ -189,7 +173,7 @@
 
     /**
      * Sets the user state.
-     * 
+     *
      * @param userState the new user state
      */
     public void setUserState(String userState) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Avatar.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Avatar.aidl
index 2357919..0ecc9e8 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Avatar.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Avatar.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Avatar.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Avatar.java
index 7603001..ff4eba8 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Avatar.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Avatar.java
@@ -23,34 +23,22 @@
 
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
+import android.os.Parcel;
+import android.os.Parcelable;
+
 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;
 
+    public static final String PNG = "PNG";
+
+    public static final String JPG = "JPG";
+
+    public static final String GIF = "GIF";
+
     /** The avatar image type. */
     private IMAGE_TYPE avatarImgType = IMAGE_TYPE.PNG;
 
@@ -68,7 +56,7 @@
 
     /**
      * Instantiates a new avatar.
-     * 
+     *
      * @param source the source
      */
     public Avatar(Parcel source) {
@@ -77,7 +65,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -89,7 +77,7 @@
      * 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
      */
@@ -105,7 +93,7 @@
      * 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) {
@@ -116,7 +104,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<Avatar> CREATOR = new Parcelable.Creator<Avatar>() {
+    public static final Parcelable.Creator<Avatar> CREATOR =
+            new Parcelable.Creator<Avatar>() {
         @Override
         public Avatar createFromParcel(Parcel source) {
             return new Avatar(source);
@@ -130,7 +119,7 @@
 
     /**
      * Gets the avatar image type.
-     * 
+     *
      * @return the avatar image type
      */
     public IMAGE_TYPE getAvatarImgType() {
@@ -139,7 +128,7 @@
 
     /**
      * Sets the avatar image type.
-     * 
+     *
      * @param avatarImgType the new avatar image type
      */
     public void setAvatarImgType(IMAGE_TYPE avatarImgType) {
@@ -148,7 +137,7 @@
 
     /**
      * Gets the image base64 string.
-     * 
+     *
      * @return the image base64 string
      */
     public String getImgBase64Str() {
@@ -157,7 +146,7 @@
 
     /**
      * Sets the image base64 string.
-     * 
+     *
      * @param imgBase64Str the new image base64 string
      */
     public void setImgBase64Str(String imgBase64Str) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.aidl
index 3615bec..434fe5f 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.java
index a6b53f3..910cfa3 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.java
@@ -23,30 +23,13 @@
 
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
+import android.os.Parcel;
+import android.os.Parcelable;
+
 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;
@@ -63,7 +46,7 @@
 
     /**
      * Instantiates a new BaseModel.
-     * 
+     *
      * @param source the source
      */
     public BaseModel(Parcel source) {
@@ -78,7 +61,7 @@
 
     /**
      * Read from parcel.
-     * 
+     *
      * @param source the source parcel
      */
     public void readFromParcel(Parcel source) {
@@ -88,7 +71,7 @@
 
     /**
      * Gets the account.
-     * 
+     *
      * @return the account
      */
     public String getAccount() {
@@ -97,7 +80,7 @@
 
     /**
      * Sets the account.
-     * 
+     *
      * @param account the new account
      */
     public void setAccount(String account) {
@@ -106,7 +89,7 @@
 
     /**
      * Gets the etag.
-     * 
+     *
      * @return the etag
      */
     public String getEtag() {
@@ -115,7 +98,7 @@
 
     /**
      * Sets the etag.
-     * 
+     *
      * @param etag the new etag
      */
     public void setEtag(String etag) {
@@ -136,7 +119,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<BaseModel> CREATOR = new Parcelable.Creator<BaseModel>() {
+    public static final Parcelable.Creator<BaseModel> CREATOR =
+            new Parcelable.Creator<BaseModel>() {
         @Override
         public BaseModel createFromParcel(Parcel source) {
             return new BaseModel(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/OtherTels.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/OtherTels.aidl
index c0c72ba..391fa8a 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/OtherTels.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/OtherTels.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/OtherTels.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/OtherTels.java
index 8066850..17857ae 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/OtherTels.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/OtherTels.java
@@ -23,13 +23,13 @@
 
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
+import android.os.Parcel;
+import android.os.Parcelable;
+
 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;
 
@@ -49,7 +49,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -61,7 +61,7 @@
      * 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
      */
@@ -77,7 +77,7 @@
      * 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")
@@ -89,7 +89,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<OtherTels> CREATOR = new Parcelable.Creator<OtherTels>() {
+    public static final Parcelable.Creator<OtherTels> CREATOR =
+            new Parcelable.Creator<OtherTels>() {
         @Override
         public OtherTels createFromParcel(Parcel source) {
             return new OtherTels(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.aidl
index dea50e0..c1eb3b7 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.java
index 842fec5..cf73797 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.java
@@ -23,32 +23,13 @@
 
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
+import android.os.Parcel;
+import android.os.Parcelable;
+
 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. */
@@ -95,7 +76,7 @@
 
     /**
      * Instantiates a new profile.
-     * 
+     *
      * @param source the source
      */
     public Profile(Parcel source) {
@@ -104,7 +85,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -116,7 +97,7 @@
      * 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
      */
@@ -140,7 +121,7 @@
      * 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) {
@@ -161,7 +142,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<Profile> CREATOR = new Parcelable.Creator<Profile>() {
+    public static final Parcelable.Creator<Profile> CREATOR =
+            new Parcelable.Creator<Profile>() {
         @Override
         public Profile createFromParcel(Parcel source) {
             return new Profile(source);
@@ -175,7 +157,7 @@
 
     /**
      * Gets the home address.
-     * 
+     *
      * @return the home address
      */
     public String getHomeAddress() {
@@ -184,7 +166,7 @@
 
     /**
      * Sets the home address.
-     * 
+     *
      * @param homeAddress the new home address
      */
     public void setHomeAddress(String homeAddress) {
@@ -193,7 +175,7 @@
 
     /**
      * Gets the email.
-     * 
+     *
      * @return the email
      */
     public String getEmail() {
@@ -202,7 +184,7 @@
 
     /**
      * Sets the email.
-     * 
+     *
      * @param email the new email
      */
     public void setEmail(String email) {
@@ -211,7 +193,7 @@
 
     /**
      * Gets the birthday.
-     * 
+     *
      * @return the birthday
      */
     public String getBirthday() {
@@ -220,7 +202,7 @@
 
     /**
      * Sets the birthday.
-     * 
+     *
      * @param birthday the new birthday
      */
     public void setBirthday(String birthday) {
@@ -229,7 +211,7 @@
 
     /**
      * Gets the company name.
-     * 
+     *
      * @return the company name
      */
     public String getCompanyName() {
@@ -238,7 +220,7 @@
 
     /**
      * Sets the company name.
-     * 
+     *
      * @param companyName the new company name
      */
     public void setCompanyName(String companyName) {
@@ -247,7 +229,7 @@
 
     /**
      * Gets the company duty.
-     * 
+     *
      * @return the company duty
      */
     public String getCompanyDuty() {
@@ -256,7 +238,7 @@
 
     /**
      * Sets the company duty.
-     * 
+     *
      * @param companyDuty the new company duty
      */
     public void setCompanyDuty(String companyDuty) {
@@ -265,7 +247,7 @@
 
     /**
      * Gets the company tel.
-     * 
+     *
      * @return the company tel
      */
     public String getCompanyTel() {
@@ -274,7 +256,7 @@
 
     /**
      * Sets the company tel.
-     * 
+     *
      * @param companyTel the new company tel
      */
     public void setCompanyTel(String companyTel) {
@@ -283,7 +265,7 @@
 
     /**
      * Gets the company address.
-     * 
+     *
      * @return the company address
      */
     public String getCompanyAddress() {
@@ -292,7 +274,7 @@
 
     /**
      * Sets the company address.
-     * 
+     *
      * @param companyAddress the new company address
      */
     public void setCompanyAddress(String companyAddress) {
@@ -301,7 +283,7 @@
 
     /**
      * Gets the company fax.
-     * 
+     *
      * @return the company fax
      */
     public String getCompanyFax() {
@@ -310,7 +292,7 @@
 
     /**
      * Sets the company fax.
-     * 
+     *
      * @param companyFax the new company fax
      */
     public void setCompanyFax(String companyFax) {
@@ -319,7 +301,7 @@
 
     /**
      * Gets the first name.
-     * 
+     *
      * @return the first name
      */
     public String getFirstName() {
@@ -328,7 +310,7 @@
 
     /**
      * Sets the first name.
-     * 
+     *
      * @param firstName the new first name
      */
     public void setFirstName(String firstName) {
@@ -337,7 +319,7 @@
 
     /**
      * Gets the last name.
-     * 
+     *
      * @return the last name
      */
     public String getLastName() {
@@ -346,7 +328,7 @@
 
     /**
      * Combine the first name and the last name.
-     * 
+     *
      * @return displayName
      */
     public String getDisplayName() {
@@ -397,7 +379,7 @@
 
     /**
      * Sets the last name.
-     * 
+     *
      * @param lastName the new last name
      */
     public void setLastName(String lastName) {
@@ -406,7 +388,7 @@
 
     /**
      * Gets the other tels.
-     * 
+     *
      * @return the other tels
      */
     public ArrayList<TelephoneModel> getOtherTels() {
@@ -418,7 +400,7 @@
 
     /**
      * Sets the other tels.
-     * 
+     *
      * @param otherTels the new other tels
      */
     public void setOtherTels(ArrayList<TelephoneModel> otherTels) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.aidl
index cccac8a..7544512 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -22,4 +22,4 @@
  */
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
-parcelable ProfileName; 
+parcelable ProfileName;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.java
index 99af83c..fc80148 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.java
@@ -23,12 +23,12 @@
 
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class ProfileName implements Parcelable {
     private String displayName = null;
 
@@ -55,7 +55,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -67,7 +67,7 @@
      * 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
      */
@@ -87,7 +87,7 @@
      * 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) {
@@ -102,7 +102,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<ProfileName> CREATOR = new Parcelable.Creator<ProfileName>() {
+    public static final Parcelable.Creator<ProfileName> CREATOR =
+            new Parcelable.Creator<ProfileName>() {
         @Override
         public ProfileName createFromParcel(Parcel source) {
             return new ProfileName(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.aidl
index 71e2858..745f79f 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.java
index 2ab0bb1..c941469 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.java
@@ -23,12 +23,12 @@
 
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class QRCardBusinessFlag extends BaseModel implements Parcelable {
     private boolean businessFlag;
 
@@ -41,7 +41,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -53,7 +53,7 @@
      * 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
      */
@@ -69,7 +69,7 @@
      * 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) {
@@ -80,7 +80,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<QRCardBusinessFlag> CREATOR = new Parcelable.Creator<QRCardBusinessFlag>() {
+    public static final Parcelable.Creator<QRCardBusinessFlag> CREATOR =
+            new Parcelable.Creator<QRCardBusinessFlag>() {
         @Override
         public QRCardBusinessFlag createFromParcel(Parcel source) {
             return new QRCardBusinessFlag(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.aidl
index c4654e6..18d952c 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.java
index 250edc6..e1b8230 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.java
@@ -23,13 +23,13 @@
 
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
+import android.os.Parcel;
+import android.os.Parcelable;
+
 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;
 
@@ -52,7 +52,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -64,7 +64,7 @@
      * 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
      */
@@ -84,7 +84,7 @@
      * 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) {
@@ -99,7 +99,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<QRCardImg> CREATOR = new Parcelable.Creator<QRCardImg>() {
+    public static final Parcelable.Creator<QRCardImg> CREATOR =
+            new Parcelable.Creator<QRCardImg>() {
         @Override
         public QRCardImg createFromParcel(Parcel source) {
             return new QRCardImg(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.aidl
index 4142f24..ac718f1 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.java
index 08d0bec..b98afaf 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.java
@@ -23,13 +23,13 @@
 
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
+import android.os.Parcel;
+import android.os.Parcelable;
+
 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;
 
@@ -57,7 +57,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -69,7 +69,7 @@
      * 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
      */
@@ -90,7 +90,7 @@
      * 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) {
@@ -106,7 +106,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<QRCardInfo> CREATOR = new Parcelable.Creator<QRCardInfo>() {
+    public static final Parcelable.Creator<QRCardInfo> CREATOR =
+            new Parcelable.Creator<QRCardInfo>() {
         @Override
         public QRCardInfo createFromParcel(Parcel source) {
             return new QRCardInfo(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.aidl
index 434bd38..5cd8738 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.java
index bda2d67..bff4000 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.java
@@ -23,13 +23,13 @@
 
 package com.suntek.mway.rcs.client.aidl.plugin.entity.profile;
 
+import android.os.Parcel;
+import android.os.Parcelable;
+
 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;
@@ -83,7 +83,8 @@
         dest.writeString(this.telephone);
     }
 
-    public static final Parcelable.Creator<TelephoneModel> CREATOR = new Parcelable.Creator<TelephoneModel>() {
+    public static final Parcelable.Creator<TelephoneModel> CREATOR =
+            new Parcelable.Creator<TelephoneModel>() {
         @Override
         public TelephoneModel createFromParcel(Parcel source) {
             return new TelephoneModel(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaArticle.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaArticle.aidl
index 11b9105..3919bb9 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaArticle.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaArticle.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaArticle.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaArticle.java
index 72a1eac..f82b3be 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaArticle.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaArticle.java
@@ -26,23 +26,6 @@
 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. */
@@ -94,7 +77,7 @@
 
     /**
      * Instantiates a new media article.
-     * 
+     *
      * @param source the source
      */
     public MediaArticle(Parcel source) {
@@ -103,7 +86,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -115,7 +98,7 @@
      * 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
      */
@@ -141,7 +124,7 @@
      * 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) {
@@ -163,7 +146,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<MediaArticle> CREATOR = new Parcelable.Creator<MediaArticle>() {
+    public static final Parcelable.Creator<MediaArticle> CREATOR =
+            new Parcelable.Creator<MediaArticle>() {
         @Override
         public MediaArticle createFromParcel(Parcel source) {
             return new MediaArticle(source);
@@ -177,7 +161,7 @@
 
     /**
      * Gets the title.
-     * 
+     *
      * @return the title
      */
     public String getTitle() {
@@ -186,7 +170,7 @@
 
     /**
      * Sets the title.
-     * 
+     *
      * @param title the new title
      */
     public void setTitle(String title) {
@@ -195,7 +179,7 @@
 
     /**
      * Gets the author.
-     * 
+     *
      * @return the author
      */
     public String getAuthor() {
@@ -204,7 +188,7 @@
 
     /**
      * Sets the author.
-     * 
+     *
      * @param author the new author
      */
     public void setAuthor(String author) {
@@ -213,7 +197,7 @@
 
     /**
      * Gets the thumb picture link.
-     * 
+     *
      * @return the thumb picture link
      */
     public String getThumbLink() {
@@ -222,7 +206,7 @@
 
     /**
      * Sets the thumb picture link.
-     * 
+     *
      * @param thumbLink the new thumb picture link
      */
     public void setThumbLink(String thumbLink) {
@@ -231,7 +215,7 @@
 
     /**
      * Gets the original picture link.
-     * 
+     *
      * @return the original picture link
      */
     public String getOriginalLink() {
@@ -240,7 +224,7 @@
 
     /**
      * Sets the original picture link.
-     * 
+     *
      * @param originalLink the new original picture link
      */
     public void setOriginalLink(String originalLink) {
@@ -249,7 +233,7 @@
 
     /**
      * Gets the source link.
-     * 
+     *
      * @return the source link
      */
     public String getSourceLink() {
@@ -258,7 +242,7 @@
 
     /**
      * Sets the source link.
-     * 
+     *
      * @param sourceLink the new source link
      */
     public void setSourceLink(String sourceLink) {
@@ -267,7 +251,7 @@
 
     /**
      * Gets the main text.
-     * 
+     *
      * @return the main text
      */
     public String getMainText() {
@@ -276,7 +260,7 @@
 
     /**
      * Sets the main text.
-     * 
+     *
      * @param mainText the new main text
      */
     public void setMainText(String mainText) {
@@ -285,7 +269,7 @@
 
     /**
      * Gets the media uuid.
-     * 
+     *
      * @return the media uuid
      */
     public String getMediaUuid() {
@@ -294,7 +278,7 @@
 
     /**
      * Sets the media uuid.
-     * 
+     *
      * @param mediaUuid the new media uuid
      */
     public void setMediaUuid(String mediaUuid) {
@@ -303,7 +287,7 @@
 
     /**
      * Gets the middle link.
-     * 
+     *
      * @return the middle link
      */
     // public String getMiddleLink()
@@ -313,7 +297,7 @@
 
     /**
      * Sets the middle link.
-     * 
+     *
      * @param middleLink the new middle link
      */
     // public void setMiddleLink( String middleLink )
@@ -323,7 +307,7 @@
 
     /**
      * Gets the media type.
-     * 
+     *
      * @return the media type
      */
     // public String getMediaType()
@@ -333,7 +317,7 @@
 
     /**
      * Sets the media type.
-     * 
+     *
      * @param mediaType the new media type
      */
     // public void setMediaType( String mediaType )
@@ -343,7 +327,7 @@
 
     /**
      * Gets the digest.
-     * 
+     *
      * @return the digest
      */
     public String getDigest() {
@@ -352,7 +336,7 @@
 
     /**
      * Sets the digest.
-     * 
+     *
      * @param digest the new digest
      */
     public void setDigest(String digest) {
@@ -361,7 +345,7 @@
 
     /**
      * Gets the view type.
-     * 
+     *
      * @return the view type
      */
     // public String getViewType()
@@ -371,7 +355,7 @@
 
     /**
      * Sets the view type.
-     * 
+     *
      * @param viewType the new view type
      */
     // public void setViewType( String viewType )
@@ -381,7 +365,7 @@
 
     /**
      * Gets the major article.
-     * 
+     *
      * @return the major article
      */
     // public int getMajorArticle() {
@@ -390,7 +374,7 @@
 
     /**
      * Sets the major article.
-     * 
+     *
      * @param majorArticle the new major article
      */
     // public void setMajorArticle(int majorArticle) {
@@ -399,7 +383,7 @@
 
     /**
      * Gets the child articles.
-     * 
+     *
      * @return the child articles
      */
     // public List<MediaArticle> getChildArticles()
@@ -417,7 +401,7 @@
 
     /**
      * Sets the child articles.
-     * 
+     *
      * @return the string
      */
     // public void setChildArticles( List<MediaArticle> childArticles )
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaBasic.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaBasic.aidl
index 952d1c9..d3a7ddd 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaBasic.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaBasic.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaBasic.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaBasic.java
index 6a4712d..4942b17 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaBasic.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MediaBasic.java
@@ -26,23 +26,6 @@
 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;
@@ -79,7 +62,7 @@
 
     /**
      * Instantiates a new media basic.
-     * 
+     *
      * @param source the source
      */
     public MediaBasic(Parcel source) {
@@ -88,7 +71,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -100,7 +83,7 @@
      * 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
      */
@@ -121,7 +104,7 @@
      * 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) {
@@ -137,7 +120,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<MediaBasic> CREATOR = new Parcelable.Creator<MediaBasic>() {
+    public static final Parcelable.Creator<MediaBasic> CREATOR =
+            new Parcelable.Creator<MediaBasic>() {
         @Override
         public MediaBasic createFromParcel(Parcel source) {
             return new MediaBasic(source);
@@ -151,7 +135,7 @@
 
     /**
      * Gets the thumb picture link.
-     * 
+     *
      * @return the thumb picture link
      */
     public String getThumbLink() {
@@ -160,7 +144,7 @@
 
     /**
      * Sets the thumb picture link.
-     * 
+     *
      * @param thumbLink the new thumb picture link
      */
     public void setThumbLink(String thumbLink) {
@@ -169,7 +153,7 @@
 
     /**
      * Gets the original link.
-     * 
+     *
      * @return the original link
      */
     public String getOriginalLink() {
@@ -178,7 +162,7 @@
 
     /**
      * Sets the original link.
-     * 
+     *
      * @param originalLink the new original link
      */
     public void setOriginalLink(String originalLink) {
@@ -187,7 +171,7 @@
 
     /**
      * Gets the title.
-     * 
+     *
      * @return the title
      */
     public String getTitle() {
@@ -196,7 +180,7 @@
 
     /**
      * Sets the title.
-     * 
+     *
      * @param title the new title
      */
     public void setTitle(String title) {
@@ -205,7 +189,7 @@
 
     /**
      * Gets the file size.
-     * 
+     *
      * @return the file size
      */
     public String getFileSize() {
@@ -214,7 +198,7 @@
 
     /**
      * Sets the file size.
-     * 
+     *
      * @param fileSize the new file size
      */
     public void setFileSize(String fileSize) {
@@ -223,7 +207,7 @@
 
     /**
      * Gets the duration.
-     * 
+     *
      * @return the duration
      */
     public String getDuration() {
@@ -232,7 +216,7 @@
 
     /**
      * Sets the duration.
-     * 
+     *
      * @param duration the new duration
      */
     public void setDuration(String duration) {
@@ -241,7 +225,7 @@
 
     /**
      * Gets the file type.
-     * 
+     *
      * @return the file type
      */
     public String getFileType() {
@@ -250,7 +234,7 @@
 
     /**
      * Sets the file type.
-     * 
+     *
      * @param fileType the new file type
      */
     public void setFileType(String fileType) {
@@ -259,7 +243,7 @@
 
     /**
      * Gets the creates the time.
-     * 
+     *
      * @return the creates the time
      */
     public String getCreateTime() {
@@ -268,7 +252,7 @@
 
     /**
      * Sets the creates the time.
-     * 
+     *
      * @param createTime the new creates the time
      */
     public void setCreateTime(String createTime) {
@@ -277,7 +261,7 @@
 
     /**
      * Gets the media uuid.
-     * 
+     *
      * @return the media uuid
      */
     public String getMediaUuid() {
@@ -286,7 +270,7 @@
 
     /**
      * Sets the media uuid.
-     * 
+     *
      * @param mediaUuid the new media uuid
      */
     public void setMediaUuid(String mediaUuid) {
@@ -295,7 +279,7 @@
 
     /**
      * Gets the pa uuid.
-     * 
+     *
      * @return the pa uuid
      */
     public String getPaUuid() {
@@ -304,7 +288,7 @@
 
     /**
      * Sets the pa uuid.
-     * 
+     *
      * @param paUuid the new pa uuid
      */
     public void setPaUuid(String paUuid) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfo.aidl
index f7bff7e..a88a8ca 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfo.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfo.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfo.java
index 4f82b50..1738945 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfo.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfo.java
@@ -23,30 +23,12 @@
 
 package com.suntek.mway.rcs.client.aidl.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
- */
+import java.util.LinkedList;
+import java.util.List;
+
 public class MenuInfo implements Parcelable {
 
     /** The command id. */
@@ -72,7 +54,7 @@
 
     /**
      * Instantiates a new menu info.
-     * 
+     *
      * @param source the source
      */
     public MenuInfo(Parcel source) {
@@ -81,7 +63,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -93,7 +75,7 @@
      * 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
      */
@@ -110,7 +92,7 @@
      * 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) {
@@ -123,7 +105,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<MenuInfo> CREATOR = new Parcelable.Creator<MenuInfo>() {
+    public static final Parcelable.Creator<MenuInfo> CREATOR =
+            new Parcelable.Creator<MenuInfo>() {
         @Override
         public MenuInfo createFromParcel(Parcel source) {
             return new MenuInfo(source);
@@ -137,7 +120,7 @@
 
     /**
      * Gets the command id.
-     * 
+     *
      * @return the command id
      */
     public String getCommandId() {
@@ -146,7 +129,7 @@
 
     /**
      * Sets the command id.
-     * 
+     *
      * @param commandId the new command id
      */
     public void setCommandId(String commandId) {
@@ -155,7 +138,7 @@
 
     /**
      * Gets the title.
-     * 
+     *
      * @return the title
      */
     public String getTitle() {
@@ -164,7 +147,7 @@
 
     /**
      * Sets the title.
-     * 
+     *
      * @param title the new title
      */
     public void setTitle(String title) {
@@ -173,7 +156,7 @@
 
     /**
      * Gets the type.
-     * 
+     *
      * @return the type
      */
     public int getType() {
@@ -182,7 +165,7 @@
 
     /**
      * Sets the type.
-     * 
+     *
      * @param type the new type
      */
     public void setType(int type) {
@@ -191,7 +174,7 @@
 
     /**
      * Gets the priority.
-     * 
+     *
      * @return the priority
      */
     public int getPriority() {
@@ -200,7 +183,7 @@
 
     /**
      * Sets the priority.
-     * 
+     *
      * @param priority the new priority
      */
     public void setPriority(int priority) {
@@ -209,7 +192,7 @@
 
     /**
      * Gets the sub menu list.
-     * 
+     *
      * @return the sub menu list
      */
     public List<MenuInfo> getSubMenuList() {
@@ -218,7 +201,7 @@
 
     /**
      * Sets the sub menu list.
-     * 
+     *
      * @param subMenuList the new sub menu list
      */
     public void setSubMenuList(List<MenuInfo> subMenuList) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfoMode.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfoMode.java
index ef6f9e6..bf92fc7 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfoMode.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MenuInfoMode.java
@@ -52,7 +52,7 @@
 
     /**
      * Instantiates a new menu info mode.
-     * 
+     *
      * @param source the source
      */
     public MenuInfoMode(Parcel source) {
@@ -72,7 +72,7 @@
      * 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
      */
@@ -87,7 +87,7 @@
      * 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) {
@@ -98,7 +98,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<MenuInfoMode> CREATOR = new Parcelable.Creator<MenuInfoMode>() {
+    public static final Parcelable.Creator<MenuInfoMode> CREATOR =
+            new Parcelable.Creator<MenuInfoMode>() {
         @Override
         public MenuInfoMode createFromParcel(Parcel source) {
             return new MenuInfoMode(source);
@@ -112,7 +113,7 @@
 
     /**
      * Gets the pa uuid.
-     * 
+     *
      * @return the pa uuid
      */
     public String getPaUuid() {
@@ -121,7 +122,7 @@
 
     /**
      * Sets the pa uuid.
-     * 
+     *
      * @param paUuid the new pa uuid
      */
     public void setPaUuid(String paUuid) {
@@ -130,7 +131,7 @@
 
     /**
      * Gets the menutimestamp.
-     * 
+     *
      * @return the menutimestamp
      */
     public String getMenutimestamp() {
@@ -139,7 +140,7 @@
 
     /**
      * Sets the menutimestamp.
-     * 
+     *
      * @param menutimestamp the new menutimestamp
      */
     public void setMenutimestamp(String menutimestamp) {
@@ -148,7 +149,7 @@
 
     /**
      * Gets the menu info list.
-     * 
+     *
      * @return the menu info list
      */
     public List<MenuInfo> getMenuInfoList() {
@@ -157,7 +158,7 @@
 
     /**
      * Sets the menu info list.
-     * 
+     *
      * @param menuInfoList the new menu info list
      */
     public void setMenuInfoList(List<MenuInfo> menuInfoList) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MsgContent.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MsgContent.aidl
index 53974ba..c9f78fa 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MsgContent.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MsgContent.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MsgContent.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MsgContent.java
index d7f3eeb..413a55e 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MsgContent.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MsgContent.java
@@ -23,29 +23,12 @@
 
 package com.suntek.mway.rcs.client.aidl.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
- */
+import java.util.LinkedList;
+import java.util.List;
+
 public class MsgContent implements Parcelable {
     /** The media type. */
     private String mediaType;
@@ -79,7 +62,7 @@
 
     /**
      * Instantiates a new message content.
-     * 
+     *
      * @param source the source parcel stream
      */
     public MsgContent(Parcel source) {
@@ -88,7 +71,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -100,7 +83,7 @@
      * 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
      */
@@ -120,7 +103,7 @@
      * 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) {
@@ -136,7 +119,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<MsgContent> CREATOR = new Parcelable.Creator<MsgContent>() {
+    public static final Parcelable.Creator<MsgContent> CREATOR =
+            new Parcelable.Creator<MsgContent>() {
         @Override
         public MsgContent createFromParcel(Parcel source) {
             return new MsgContent(source);
@@ -150,7 +134,7 @@
 
     /**
      * Gets the media type.
-     * 
+     *
      * @return the media type
      */
     public String getMediaType() {
@@ -159,7 +143,7 @@
 
     /**
      * Sets the media type.
-     * 
+     *
      * @param mediaType the new media type
      */
     public void setMediaType(String mediaType) {
@@ -168,7 +152,7 @@
 
     /**
      * Gets the creates time.
-     * 
+     *
      * @return the creates time
      */
     public String getCreateTime() {
@@ -177,7 +161,7 @@
 
     /**
      * Sets the creates time.
-     * 
+     *
      * @param createTime the new creates time
      */
     public void setCreateTime(String createTime) {
@@ -186,7 +170,7 @@
 
     /**
      * Gets the msg_ uuid.
-     * 
+     *
      * @return the message uuid
      */
     public String getMsgUuid() {
@@ -195,7 +179,7 @@
 
     /**
      * Sets the message uuid.
-     * 
+     *
      * @param msg_Uuid the new message uuid
      */
     public void setMsgUuid(String msgUuid) {
@@ -204,7 +188,7 @@
 
     /**
      * Gets the sms digest.
-     * 
+     *
      * @return the sms digest
      */
     public String getSmsDigest() {
@@ -213,7 +197,7 @@
 
     /**
      * Sets the sms digest.
-     * 
+     *
      * @param smsDigest the new sms digest
      */
     public void setSmsDigest(String smsDigest) {
@@ -222,7 +206,7 @@
 
     /**
      * Gets the text.
-     * 
+     *
      * @return the text
      */
     public String getText() {
@@ -231,7 +215,7 @@
 
     /**
      * Sets the text.
-     * 
+     *
      * @param text the new text
      */
     public void setText(String text) {
@@ -240,7 +224,7 @@
 
     /**
      * Gets the public account uuid.
-     * 
+     *
      * @return the public account uuid
      */
     public String getPaUuid() {
@@ -249,7 +233,7 @@
 
     /**
      * Sets the public account uuid.
-     * 
+     *
      * @param paUuid the new public account uuid
      */
     public void setPaUuid(String paUuid) {
@@ -258,7 +242,7 @@
 
     /**
      * Gets the basic.
-     * 
+     *
      * @return the basic
      */
     public MediaBasic getBasic() {
@@ -267,7 +251,7 @@
 
     /**
      * Sets the basic.
-     * 
+     *
      * @param basic the new basic
      */
     public void setBasic(MediaBasic basic) {
@@ -276,7 +260,7 @@
 
     /**
      * Gets the article list.
-     * 
+     *
      * @return the article list
      */
     public List<MediaArticle> getArticleList() {
@@ -285,7 +269,7 @@
 
     /**
      * Sets the article list.
-     * 
+     *
      * @param articleList the new article list
      */
     public void setArticleList(List<MediaArticle> articleList) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountCallbackType.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountCallbackType.aidl
index a865d87..6450f41 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountCallbackType.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountCallbackType.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountReqEntity.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountReqEntity.aidl
index 20ba30a..aada81e 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountReqEntity.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountReqEntity.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountReqEntity.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountReqEntity.java
index 41b495a..222927c 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountReqEntity.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountReqEntity.java
@@ -26,24 +26,6 @@
 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;
@@ -68,7 +50,7 @@
 
     /**
      * Instantiates a new public account request entity.
-     * 
+     *
      * @param source the parcel source
      */
     public PublicAccountReqEntity(Parcel source) {
@@ -77,7 +59,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -90,7 +72,7 @@
      * 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
      */
@@ -106,7 +88,7 @@
      * 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) {
@@ -117,7 +99,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicAccountReqEntity> CREATOR = new Parcelable.Creator<PublicAccountReqEntity>() {
+    public static final Parcelable.Creator<PublicAccountReqEntity> CREATOR =
+            new Parcelable.Creator<PublicAccountReqEntity>() {
         @Override
         public PublicAccountReqEntity createFromParcel(Parcel source) {
             return new PublicAccountReqEntity(source);
@@ -131,7 +114,7 @@
 
     /**
      * Gets the public account uuid.
-     * 
+     *
      * @return the public account uuid
      */
     public String getPaUuid() {
@@ -140,7 +123,7 @@
 
     /**
      * Sets the public account uuid.
-     * 
+     *
      * @param paUuid the new public account uuid
      */
     public void setPaUuid(String paUuid) {
@@ -149,7 +132,7 @@
 
     /**
      * Gets the public account name.
-     * 
+     *
      * @return the public account name
      */
     public String getName() {
@@ -158,7 +141,7 @@
 
     /**
      * Sets the public account name.
-     * 
+     *
      * @param name the new public account name
      */
     public void setName(String name) {
@@ -167,7 +150,7 @@
 
     /**
      * Gets the recommend level.
-     * 
+     *
      * @return the recommend level
      */
     public int getRecommendLevel() {
@@ -176,7 +159,7 @@
 
     /**
      * Sets the recommend level.
-     * 
+     *
      * @param recommendLevel the new recommend level
      */
     public void setRecommendLevel(int recommendLevel) {
@@ -185,7 +168,7 @@
 
     /**
      * Gets the logo url.
-     * 
+     *
      * @return the logo url
      */
     public String getLogo() {
@@ -194,7 +177,7 @@
 
     /**
      * Sets the logo url.
-     * 
+     *
      * @param logo the new logo url
      */
     public void setLogo(String logo) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccounts.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccounts.aidl
index 637cd43..db38fa9 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccounts.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccounts.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccounts.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccounts.java
index 9637697..f1dd620 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccounts.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccounts.java
@@ -28,23 +28,6 @@
 
 import java.io.UnsupportedEncodingException;
 
-/**
- * <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, Comparable<PublicAccounts> {
     /** The logo url. */
     private String logo;
@@ -72,7 +55,7 @@
 
     /**
      * Instantiates a new public accounts.
-     * 
+     *
      * @param source the source
      */
     public PublicAccounts(Parcel source) {
@@ -81,7 +64,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -93,7 +76,7 @@
      * 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
      */
@@ -111,7 +94,7 @@
      * 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) {
@@ -124,7 +107,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicAccounts> CREATOR = new Parcelable.Creator<PublicAccounts>() {
+    public static final Parcelable.Creator<PublicAccounts> CREATOR =
+            new Parcelable.Creator<PublicAccounts>() {
         @Override
         public PublicAccounts createFromParcel(Parcel source) {
             return new PublicAccounts(source);
@@ -138,7 +122,7 @@
 
     /**
      * Gets the logo url.
-     * 
+     *
      * @return the logo url
      */
     public String getLogo() {
@@ -147,7 +131,7 @@
 
     /**
      * Sets the logo url.
-     * 
+     *
      * @param logo the new logo url
      */
     public void setLogo(String logo) {
@@ -156,7 +140,7 @@
 
     /**
      * Gets the name.
-     * 
+     *
      * @return the name
      */
     public String getName() {
@@ -165,7 +149,7 @@
 
     /**
      * Sets the name.
-     * 
+     *
      * @param name the new name
      */
     public void setName(String name) {
@@ -174,7 +158,7 @@
 
     /**
      * Gets the public account uuid.
-     * 
+     *
      * @return the public account uuid
      */
     public String getPaUuid() {
@@ -183,7 +167,7 @@
 
     /**
      * Sets the public account uuid.
-     * 
+     *
      * @param paUuid the new public account uuid
      */
     public void setPaUuid(String paUuid) {
@@ -192,7 +176,7 @@
 
     /**
      * Gets the recommend level.
-     * 
+     *
      * @return the recommend level
      */
     public int getRecommendLevel() {
@@ -201,7 +185,7 @@
 
     /**
      * Sets the recommend level.
-     * 
+     *
      * @param recommendLevel the new recommend level
      */
     public void setRecommendLevel(int recommendLevel) {
@@ -210,7 +194,7 @@
 
     /**
      * Gets the sip uri.
-     * 
+     *
      * @return the sip uri
      */
     public String getSipUri() {
@@ -219,7 +203,7 @@
 
     /**
      * Sets the sip uri.
-     * 
+     *
      * @param sipUri the new sip uri
      */
     public void setSipUri(String sipUri) {
@@ -228,7 +212,7 @@
 
     /**
      * Gets the subscribestatus.
-     * 
+     *
      * @return the subscribestatus
      */
     public int getSubscribestatus() {
@@ -237,7 +221,7 @@
 
     /**
      * Sets the subscribestatus.
-     * 
+     *
      * @param subscribestatus the new subscribestatus
      */
     public void setSubscribestatus(int subscribestatus) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountsDetail.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountsDetail.aidl
index 721b579..17e64c8 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountsDetail.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountsDetail.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountsDetail.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountsDetail.java
index 83a3cbc..7a249de 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountsDetail.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountsDetail.java
@@ -26,24 +26,6 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-/**
- * <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;
@@ -103,11 +85,17 @@
     private String logoUrl;
 
     /** The sip uri. */
-    // private String sipUri;
+    private String sipUri;
 
     /** The number. */
     private String number;
 
+    /** The logoType. */
+    private String logoType;
+
+    /** The menuString. */
+    private String menuString;
+
     /**
      * Instantiates a new public accounts detail.
      */
@@ -116,7 +104,7 @@
 
     /**
      * Instantiates a new public accounts detail.
-     * 
+     *
      * @param source the source
      */
     public PublicAccountsDetail(Parcel source) {
@@ -125,7 +113,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -137,7 +125,7 @@
      * 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
      */
@@ -162,15 +150,17 @@
         dest.writeString(field);
         dest.writeString(qrCode);
         dest.writeString(logoUrl);
-        // dest.writeString( sipUri );
+        dest.writeString(sipUri);
         dest.writeString(number);
+        dest.writeString(logoType);
+        dest.writeString(menuString);
     }
 
     /**
      * 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) {
@@ -193,12 +183,15 @@
         field = source.readString();
         qrCode = source.readString();
         logoUrl = source.readString();
-        // sipUri = source.readString();
+        sipUri = source.readString();
         number = source.readString();
+        logoType = source.readString();
+        menuString = source.readString();
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicAccountsDetail> CREATOR = new Parcelable.Creator<PublicAccountsDetail>() {
+    public static final Parcelable.Creator<PublicAccountsDetail> CREATOR =
+            new Parcelable.Creator<PublicAccountsDetail>() {
         @Override
         public PublicAccountsDetail createFromParcel(Parcel source) {
             return new PublicAccountsDetail(source);
@@ -212,7 +205,7 @@
 
     /**
      * Gets the public account uuid.
-     * 
+     *
      * @return the public account uuid
      */
     public String getPaUuid() {
@@ -221,7 +214,7 @@
 
     /**
      * Sets the public account uuid.
-     * 
+     *
      * @param paUuid the new public account uuid
      */
     public void setPaUuid(String paUuid) {
@@ -230,7 +223,7 @@
 
     /**
      * Gets the name.
-     * 
+     *
      * @return the name
      */
     public String getName() {
@@ -239,7 +232,7 @@
 
     /**
      * Sets the name.
-     * 
+     *
      * @param name the new name
      */
     public void setName(String name) {
@@ -248,7 +241,7 @@
 
     /**
      * Gets the company.
-     * 
+     *
      * @return the company
      */
     public String getCompany() {
@@ -257,7 +250,7 @@
 
     /**
      * Sets the company.
-     * 
+     *
      * @param company the new company
      */
     public void setCompany(String company) {
@@ -266,7 +259,7 @@
 
     /**
      * Gets the introduce.
-     * 
+     *
      * @return the introduce
      */
     public String getIntro() {
@@ -275,7 +268,7 @@
 
     /**
      * Sets the introduce.
-     * 
+     *
      * @param intro the new introduce
      */
     public void setIntro(String intro) {
@@ -284,7 +277,7 @@
 
     /**
      * Gets the type.
-     * 
+     *
      * @return the type
      */
     public String getType() {
@@ -293,7 +286,7 @@
 
     /**
      * Sets the type.
-     * 
+     *
      * @param type the new type
      */
     public void setType(String type) {
@@ -302,7 +295,7 @@
 
     /**
      * Gets the recommend level.
-     * 
+     *
      * @return the recommend level
      */
     public int getRecommendLevel() {
@@ -311,7 +304,7 @@
 
     /**
      * Sets the recommend level.
-     * 
+     *
      * @param recommendLevel the new recommend level
      */
     public void setRecommendLevel(int recommendLevel) {
@@ -320,7 +313,7 @@
 
     /**
      * Gets the update time.
-     * 
+     *
      * @return the update time
      */
     public String getUpdateTime() {
@@ -329,7 +322,7 @@
 
     /**
      * Sets the update time.
-     * 
+     *
      * @param updateTime the new update time
      */
     public void setUpdateTime(String updateTime) {
@@ -338,7 +331,7 @@
 
     /**
      * Gets the menu type.
-     * 
+     *
      * @return the menu type
      */
     public int getMenuType() {
@@ -347,7 +340,7 @@
 
     /**
      * Sets the menu type.
-     * 
+     *
      * @param menuType the new menu type
      */
     public void setMenuType(int menuType) {
@@ -356,7 +349,7 @@
 
     /**
      * Gets the menu timestamp.
-     * 
+     *
      * @return the menu timestamp
      */
     public String getMenuTimestamp() {
@@ -365,7 +358,7 @@
 
     /**
      * Sets the menu timestamp.
-     * 
+     *
      * @param menuTimestamp the new menu timestamp
      */
     public void setMenuTimestamp(String menuTimestamp) {
@@ -374,7 +367,7 @@
 
     /**
      * Gets the subscribe status.
-     * 
+     *
      * @return the subscribe status
      */
     public int getSubscribeStatus() {
@@ -383,7 +376,7 @@
 
     /**
      * Sets the subscribe status.
-     * 
+     *
      * @param subscribeStatus the new subscribe status
      */
     public void setSubscribeStatus(int subscribeStatus) {
@@ -392,7 +385,7 @@
 
     /**
      * Gets the acceptstatus.
-     * 
+     *
      * @return the acceptstatus
      */
     public int getAcceptstatus() {
@@ -401,7 +394,7 @@
 
     /**
      * Sets the acceptstatus.
-     * 
+     *
      * @param acceptstatus the new acceptstatus
      */
     public void setAcceptstatus(int acceptstatus) {
@@ -410,7 +403,7 @@
 
     /**
      * Gets the active status.
-     * 
+     *
      * @return the active status
      */
     public int getActiveStatus() {
@@ -419,7 +412,7 @@
 
     /**
      * Sets the active status.
-     * 
+     *
      * @param activeStatus the new active status
      */
     public void setActiveStatus(int activeStatus) {
@@ -428,7 +421,7 @@
 
     /**
      * Gets the tel.
-     * 
+     *
      * @return the tel
      */
     public String getTel() {
@@ -437,7 +430,7 @@
 
     /**
      * Sets the tel.
-     * 
+     *
      * @param tel the new tel
      */
     public void setTel(String tel) {
@@ -446,7 +439,7 @@
 
     /**
      * Gets the email.
-     * 
+     *
      * @return the email
      */
     public String getEmail() {
@@ -455,7 +448,7 @@
 
     /**
      * Sets the email.
-     * 
+     *
      * @param email the new email
      */
     public void setEmail(String email) {
@@ -464,7 +457,7 @@
 
     /**
      * Gets the zip.
-     * 
+     *
      * @return the zip
      */
     public String getZip() {
@@ -473,7 +466,7 @@
 
     /**
      * Sets the zip.
-     * 
+     *
      * @param zip the new zip
      */
     public void setZip(String zip) {
@@ -482,7 +475,7 @@
 
     /**
      * Gets the addr.
-     * 
+     *
      * @return the addr
      */
     public String getAddr() {
@@ -491,7 +484,7 @@
 
     /**
      * Sets the addr.
-     * 
+     *
      * @param addr the new addr
      */
     public void setAddr(String addr) {
@@ -500,7 +493,7 @@
 
     /**
      * Gets the field.
-     * 
+     *
      * @return the field
      */
     public String getField() {
@@ -509,7 +502,7 @@
 
     /**
      * Sets the field.
-     * 
+     *
      * @param field the new field
      */
     public void setField(String field) {
@@ -518,7 +511,7 @@
 
     /**
      * Gets the qr code.
-     * 
+     *
      * @return the qr code
      */
     public String getQrCode() {
@@ -527,7 +520,7 @@
 
     /**
      * Sets the qr code.
-     * 
+     *
      * @param qrCode the new qr code
      */
     public void setQrCode(String qrCode) {
@@ -536,7 +529,7 @@
 
     /**
      * Gets the logo url.
-     * 
+     *
      * @return the logo url
      */
     public String getLogoUrl() {
@@ -545,7 +538,7 @@
 
     /**
      * Sets the logo url.
-     * 
+     *
      * @param logoUrl the new logo url
      */
     public void setLogoUrl(String logoUrl) {
@@ -554,53 +547,72 @@
 
     /**
      * Gets the sip uri.
-     * 
+     *
      * @return the sip uri
      */
-    // public String getSipUri()
-    // {
-    // return sipUri;
-    // }
+    public String getSipUri() {
+        return sipUri;
+    }
 
     /**
      * Sets the sip uri.
-     * 
+     *
      * @param sipUri the new sip uri
      */
-    // public void setSipUri( String sipUri )
-    // {
-    // this.sipUri = sipUri;
-    // }
+    public void setSipUri(String sipUri) {
+        this.sipUri = sipUri;
+    }
+
+    /**
+     * @return the logoType
+     */
+    public String getLogoType() {
+        return logoType;
+    }
+
+    /**
+     * @param logoType the logoType to set
+     */
+    public void setLogoType(String logoType) {
+        this.logoType = logoType;
+    }
+
+    /**
+     * @return the menuString
+     */
+    public String getMenuString() {
+        return menuString;
+    }
+
+    /**
+     * @param menuString the menuString to set
+     */
+    public void setMenuString(String menuString) {
+        this.menuString = menuString;
+    }
 
     /**
      * 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(",number=")
-                .append(this.number)
-                .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=")
+        sbuffer.append("paUuid=").append(this.paUuid).append(",name=").append(this.name)
+                .append(",number=").append(this.number).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);
+                .append(this.field).append(",qrCode=").append(this.qrCode).append(",logoType=")
+                .append(this.logoType).append(",menuString=").append(this.menuString);
 
         return sbuffer.toString();
     }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicMediaMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicMediaMessage.java
similarity index 95%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicMediaMessage.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicMediaMessage.java
index c1937ec..e4f2591 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicMediaMessage.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicMediaMessage.java
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.provider.model;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -42,7 +42,7 @@
 
     /**
      * Instantiates a new public media message.
-     * 
+     *
      * @param source the source
      */
     public PublicMediaMessage(Parcel source) {
@@ -78,7 +78,7 @@
 
     /**
      * Read from parcel.
-     * 
+     *
      * @param source the source
      */
     public void readFromParcel(Parcel source) {
@@ -91,7 +91,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicMediaMessage> CREATOR = new Parcelable.Creator<PublicMediaMessage>() {
+    public static final Parcelable.Creator<PublicMediaMessage> CREATOR =
+            new Parcelable.Creator<PublicMediaMessage>() {
         @Override
         public PublicMediaMessage createFromParcel(Parcel source) {
             return new PublicMediaMessage(source);
@@ -105,7 +106,7 @@
 
     /**
      * Gets the media.
-     * 
+     *
      * @return the media
      */
     public PublicMediaContent getMedia() {
@@ -114,7 +115,7 @@
 
     /**
      * Sets the media.
-     * 
+     *
      * @param media the new media
      */
     public void setMedia(PublicMediaContent media) {
@@ -158,7 +159,7 @@
 
         /**
          * Instantiates a new public media content.
-         * 
+         *
          * @param source the source
          */
         public PublicMediaContent(Parcel source) {
@@ -192,7 +193,7 @@
 
         /**
          * Read from parcel.
-         * 
+         *
          * @param source the source
          */
         public void readFromParcel(Parcel source) {
@@ -207,7 +208,8 @@
         }
 
         /** The parcel creator. */
-        public static final Parcelable.Creator<PublicMediaContent> CREATOR = new Parcelable.Creator<PublicMediaContent>() {
+        public static final Parcelable.Creator<PublicMediaContent> CREATOR =
+                new Parcelable.Creator<PublicMediaContent>() {
             @Override
             public PublicMediaContent createFromParcel(Parcel source) {
                 return new PublicMediaContent(source);
@@ -221,7 +223,7 @@
 
         /**
          * Gets the thumb link.
-         * 
+         *
          * @return the thumb link
          */
         public String getThumbLink() {
@@ -230,7 +232,7 @@
 
         /**
          * Sets the thumb link.
-         * 
+         *
          * @param thumbLink the new thumb link
          */
         public void setThumbLink(String thumbLink) {
@@ -239,7 +241,7 @@
 
         /**
          * Gets the original link.
-         * 
+         *
          * @return the original link
          */
         public String getOriginalLink() {
@@ -248,7 +250,7 @@
 
         /**
          * Sets the original link.
-         * 
+         *
          * @param originalLink the new original link
          */
         public void setOriginalLink(String originalLink) {
@@ -257,7 +259,7 @@
 
         /**
          * Gets the title.
-         * 
+         *
          * @return the title
          */
         public String getTitle() {
@@ -266,7 +268,7 @@
 
         /**
          * Sets the title.
-         * 
+         *
          * @param title the new title
          */
         public void setTitle(String title) {
@@ -275,7 +277,7 @@
 
         /**
          * Gets the file size.
-         * 
+         *
          * @return the file size
          */
         public String getFileSize() {
@@ -284,7 +286,7 @@
 
         /**
          * Sets the file size.
-         * 
+         *
          * @param fileSize the new file size
          */
         public void setFileSize(String fileSize) {
@@ -293,7 +295,7 @@
 
         /**
          * Gets the duration.
-         * 
+         *
          * @return the duration
          */
         public String getDuration() {
@@ -302,7 +304,7 @@
 
         /**
          * Sets the duration.
-         * 
+         *
          * @param duration the new duration
          */
         public void setDuration(String duration) {
@@ -311,7 +313,7 @@
 
         /**
          * Gets the file type.
-         * 
+         *
          * @return the file type
          */
         public String getFileType() {
@@ -320,7 +322,7 @@
 
         /**
          * Sets the file type.
-         * 
+         *
          * @param fileType the new file type
          */
         public void setFileType(String fileType) {
@@ -329,21 +331,21 @@
 
         /**
          * 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() {
@@ -352,7 +354,7 @@
 
         /**
          * Sets the media uuid.
-         * 
+         *
          * @param mediaUuid the new media uuid
          */
         public void setMediaUuid(String mediaUuid) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicMessage.java
similarity index 96%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicMessage.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicMessage.java
index f81fed5..582d05e 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicMessage.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicMessage.java
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.provider.model;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -82,7 +82,7 @@
 
     /**
      * Instantiates a new public message.
-     * 
+     *
      * @param source the source
      */
     public PublicMessage(Parcel source) {
@@ -149,7 +149,7 @@
 
     /**
      * Read from parcel.
-     * 
+     *
      * @param source the source
      */
     public void readFromParcel(Parcel source) {
@@ -157,7 +157,8 @@
     }
 
     /** The Constant CREATOR. */
-    public static final Parcelable.Creator<PublicMessage> CREATOR = new Parcelable.Creator<PublicMessage>() {
+    public static final Parcelable.Creator<PublicMessage> CREATOR =
+            new Parcelable.Creator<PublicMessage>() {
         public PublicMessage createFromParcel(Parcel in) {
             return new PublicMessage(in);
         }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicTextMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicTextMessage.java
similarity index 93%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicTextMessage.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicTextMessage.java
index 3b59fd1..2a319de 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicTextMessage.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicTextMessage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.provider.model;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -42,7 +42,7 @@
 
     /**
      * Instantiates a new public text message.
-     * 
+     *
      * @param source the source
      */
     public PublicTextMessage(Parcel source) {
@@ -78,7 +78,7 @@
 
     /**
      * Read from parcel.
-     * 
+     *
      * @param source the source
      */
     public void readFromParcel(Parcel source) {
@@ -91,7 +91,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicTextMessage> CREATOR = new Parcelable.Creator<PublicTextMessage>() {
+    public static final Parcelable.Creator<PublicTextMessage> CREATOR =
+            new Parcelable.Creator<PublicTextMessage>() {
         @Override
         public PublicTextMessage createFromParcel(Parcel source) {
             return new PublicTextMessage(source);
@@ -105,7 +106,7 @@
 
     /**
      * Gets the content.
-     * 
+     *
      * @return the content
      */
     public String getContent() {
@@ -114,7 +115,7 @@
 
     /**
      * Sets the content.
-     * 
+     *
      * @param content the new content
      */
     public void setContent(String content) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicTopicMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicTopicMessage.java
similarity index 95%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicTopicMessage.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicTopicMessage.java
index 188a49b..cc5a806 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicTopicMessage.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicTopicMessage.java
@@ -21,14 +21,14 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.provider.model;
-
-import java.util.LinkedList;
-import java.util.List;
+package com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.LinkedList;
+import java.util.List;
+
 /**
  * The Class PublicTopicMessage.
  */
@@ -45,7 +45,7 @@
 
     /**
      * Instantiates a new public topic message.
-     * 
+     *
      * @param source the source
      */
     public PublicTopicMessage(Parcel source) {
@@ -81,7 +81,7 @@
 
     /**
      * Read from parcel.
-     * 
+     *
      * @param source the source
      */
     public void readFromParcel(Parcel source) {
@@ -95,7 +95,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicTopicMessage> CREATOR = new Parcelable.Creator<PublicTopicMessage>() {
+    public static final Parcelable.Creator<PublicTopicMessage> CREATOR =
+            new Parcelable.Creator<PublicTopicMessage>() {
         @Override
         public PublicTopicMessage createFromParcel(Parcel source) {
             return new PublicTopicMessage(source);
@@ -109,7 +110,7 @@
 
     /**
      * Gets the topics.
-     * 
+     *
      * @return the topics
      */
     public List<PublicTopicContent> getTopics() {
@@ -118,7 +119,7 @@
 
     /**
      * Sets the topics.
-     * 
+     *
      * @param topics the new topics
      */
     public void setTopics(List<PublicTopicContent> topics) {
@@ -162,7 +163,7 @@
 
         /**
          * Instantiates a new public topic content.
-         * 
+         *
          * @param source the source
          */
         public PublicTopicContent(Parcel source) {
@@ -196,7 +197,7 @@
 
         /**
          * Read from parcel.
-         * 
+         *
          * @param source the source
          */
         public void readFromParcel(Parcel source) {
@@ -211,7 +212,8 @@
         }
 
         /** The parcel creator. */
-        public static final Parcelable.Creator<PublicTopicContent> CREATOR = new Parcelable.Creator<PublicTopicContent>() {
+        public static final Parcelable.Creator<PublicTopicContent> CREATOR =
+                new Parcelable.Creator<PublicTopicContent>() {
             @Override
             public PublicTopicContent createFromParcel(Parcel source) {
                 return new PublicTopicContent(source);
@@ -225,7 +227,7 @@
 
         /**
          * Gets the title.
-         * 
+         *
          * @return the title
          */
         public String getTitle() {
@@ -234,7 +236,7 @@
 
         /**
          * Sets the title.
-         * 
+         *
          * @param title the new title
          */
         public void setTitle(String title) {
@@ -243,7 +245,7 @@
 
         /**
          * Gets the author.
-         * 
+         *
          * @return the author
          */
         public String getAuthor() {
@@ -252,7 +254,7 @@
 
         /**
          * Sets the author.
-         * 
+         *
          * @param author the new author
          */
         public void setAuthor(String author) {
@@ -261,7 +263,7 @@
 
         /**
          * Gets the thumb link.
-         * 
+         *
          * @return the thumb link
          */
         public String getThumbLink() {
@@ -270,7 +272,7 @@
 
         /**
          * Sets the thumb link.
-         * 
+         *
          * @param thumbLink the new thumb link
          */
         public void setThumbLink(String thumbLink) {
@@ -279,7 +281,7 @@
 
         /**
          * Gets the original link.
-         * 
+         *
          * @return the original link
          */
         public String getOriginalLink() {
@@ -288,7 +290,7 @@
 
         /**
          * Sets the original link.
-         * 
+         *
          * @param originalLink the new original link
          */
         public void setOriginalLink(String originalLink) {
@@ -297,7 +299,7 @@
 
         /**
          * Gets the source link.
-         * 
+         *
          * @return the source link
          */
         public String getSourceLink() {
@@ -306,7 +308,7 @@
 
         /**
          * Sets the source link.
-         * 
+         *
          * @param sourceLink the new source link
          */
         public void setSourceLink(String sourceLink) {
@@ -315,7 +317,7 @@
 
         /**
          * Gets the media uuid.
-         * 
+         *
          * @return the media uuid
          */
         public String getMediaUuid() {
@@ -324,7 +326,7 @@
 
         /**
          * Sets the media uuid.
-         * 
+         *
          * @param mediaUuid the new media uuid
          */
         public void setMediaUuid(String mediaUuid) {
@@ -333,7 +335,7 @@
 
         /**
          * Gets the main text.
-         * 
+         *
          * @return the main text
          */
         public String getMainText() {
@@ -342,7 +344,7 @@
 
         /**
          * Sets the main text.
-         * 
+         *
          * @param mainText the new main text
          */
         public void setMainText(String mainText) {
@@ -351,7 +353,7 @@
 
         /**
          * Gets the body link.
-         * 
+         *
          * @return the body link
          */
         public String getBodyLink() {
@@ -360,7 +362,7 @@
 
         /**
          * Sets the body link.
-         * 
+         *
          * @param bodyLink the new body link
          */
         public void setBodyLink(String bodyLink) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneEvent.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneEvent.java
index dd9b442..2b36c64 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneEvent.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneEvent.java
@@ -23,48 +23,6 @@
 
 package com.suntek.mway.rcs.client.aidl.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. */
@@ -138,7 +96,7 @@
 
     /**
      * Instantiates a new phone event.
-     * 
+     *
      * @param ctrlString the ctrl string
      */
     private PhoneEvent(String ctrlString) {
@@ -147,7 +105,7 @@
 
     /**
      * Gets the control string.
-     * 
+     *
      * @return the control string
      */
     public String getCtrlStr() {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneList.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneList.aidl
index d421ca4..a58aacd 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneList.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneList.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneList.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneList.java
index 9815fe9..e9a9c13 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneList.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/PhoneList.java
@@ -23,28 +23,11 @@
 
 package com.suntek.mway.rcs.client.aidl.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
- */
+import java.util.ArrayList;
+
 public class PhoneList implements Parcelable {
 
     /** The phone list . */
@@ -66,7 +49,7 @@
 
     /**
      * Instantiates a new phone list.
-     * 
+     *
      * @param source the source
      */
     public PhoneList(Parcel source) {
@@ -75,7 +58,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -87,7 +70,7 @@
      * 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
      */
@@ -100,7 +83,7 @@
      * 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) {
@@ -108,7 +91,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PhoneList> CREATOR = new Parcelable.Creator<PhoneList>() {
+    public static final Parcelable.Creator<PhoneList> CREATOR =
+            new Parcelable.Creator<PhoneList>() {
         @Override
         public PhoneList createFromParcel(Parcel source) {
             return new PhoneList(source);
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultInfo.aidl
index bd34e26..e4caf06 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultInfo.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultInfo.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultInfo.java
index 625229a..aea0b7d 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultInfo.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultInfo.java
@@ -26,23 +26,6 @@
 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. */
@@ -59,7 +42,7 @@
 
     /**
      * Instantiates a new result info.
-     * 
+     *
      * @param source the source
      */
     public ResultInfo(Parcel source) {
@@ -68,7 +51,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -80,7 +63,7 @@
      * 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
      */
@@ -96,7 +79,7 @@
      * 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) {
@@ -108,7 +91,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<ResultInfo> CREATOR = new Parcelable.Creator<ResultInfo>() {
+    public static final Parcelable.Creator<ResultInfo> CREATOR =
+            new Parcelable.Creator<ResultInfo>() {
         @Override
         public ResultInfo createFromParcel(Parcel source) {
             return new ResultInfo(source);
@@ -122,7 +106,7 @@
 
     /**
      * Checks if is success flag.
-     * 
+     *
      * @return true, if is success flag
      */
     public boolean isSuccess() {
@@ -131,7 +115,7 @@
 
     /**
      * Sets the success flag.
-     * 
+     *
      * @param isSuccess the new success flag
      */
     public void setSuccess(boolean isSuccess) {
@@ -140,7 +124,7 @@
 
     /**
      * Gets the result message.
-     * 
+     *
      * @return the result message
      */
     public String getResultMsg() {
@@ -149,7 +133,7 @@
 
     /**
      * Sets the result message.
-     * 
+     *
      * @param resultMsg the new result message
      */
     public void setResultMsg(String resultMsg) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultUtil.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultUtil.aidl
index 188f0a0..f05028d 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultUtil.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultUtil.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultUtil.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultUtil.java
index b9c5065..1ba5031 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultUtil.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/ResultUtil.java
@@ -26,23 +26,6 @@
 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;
@@ -57,7 +40,8 @@
     private Object resultObj;
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<ResultUtil> CREATOR = new Parcelable.Creator<ResultUtil>() {
+    public static final Parcelable.Creator<ResultUtil> CREATOR =
+            new Parcelable.Creator<ResultUtil>() {
         @Override
         public ResultUtil createFromParcel(Parcel source) {
             return new ResultUtil(source);
@@ -77,7 +61,7 @@
 
     /**
      * Instantiates a new result entity from parcel.
-     * 
+     *
      * @param source the parcel source.
      */
     public ResultUtil(Parcel source) {
@@ -88,7 +72,7 @@
      * 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
      */
@@ -105,7 +89,7 @@
      * 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) {
@@ -118,7 +102,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -128,7 +112,7 @@
 
     /**
      * Checks if is result succ.
-     * 
+     *
      * @return true, if is result succ
      */
     public boolean isResultFlag() {
@@ -137,7 +121,7 @@
 
     /**
      * Sets the result flag.
-     * 
+     *
      * @param resultFlag the new result flag
      */
     public void setResultFlag(boolean resultFlag) {
@@ -146,7 +130,7 @@
 
     /**
      * Gets the result info.
-     * 
+     *
      * @return the result info
      */
     public String getResultMsg() {
@@ -155,7 +139,7 @@
 
     /**
      * Sets the result info.
-     * 
+     *
      * @param resultMsg the new result info.
      */
     public void setResultMsg(String resultMsg) {
@@ -164,7 +148,7 @@
 
     /**
      * Gets the result object.
-     * 
+     *
      * @return the result object
      */
     public Object getResultObj() {
@@ -173,7 +157,7 @@
 
     /**
      * Sets the result object.
-     * 
+     *
      * @param resultObj the new result object
      */
     public void setResultObj(Object resultObj) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/RichScrnShowing.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/RichScrnShowing.aidl
index ff877f9..5ecaf02 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/RichScrnShowing.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/RichScrnShowing.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -22,4 +22,4 @@
  */
 package com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn;
 
-parcelable RichScrnShowing; 
+parcelable RichScrnShowing;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/RichScrnShowing.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/RichScrnShowing.java
index e76bb22..c96db53 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/RichScrnShowing.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/richscrn/RichScrnShowing.java
@@ -26,23 +26,6 @@
 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;
@@ -70,7 +53,7 @@
 
     /**
      * Instantiates a new rich scrn showing.
-     * 
+     *
      * @param source the source
      */
     public RichScrnShowing(Parcel source) {
@@ -79,7 +62,7 @@
 
     /**
      * The parcel describe contents, defaul is 0.
-     * 
+     *
      * @return the int
      */
     @Override
@@ -91,7 +74,7 @@
      * 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
      */
@@ -109,7 +92,7 @@
      * 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) {
@@ -122,7 +105,8 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<RichScrnShowing> CREATOR = new Parcelable.Creator<RichScrnShowing>() {
+    public static final Parcelable.Creator<RichScrnShowing> CREATOR =
+            new Parcelable.Creator<RichScrnShowing>() {
         @Override
         public RichScrnShowing createFromParcel(Parcel source) {
             return new RichScrnShowing(source);
@@ -136,7 +120,7 @@
 
     /**
      * Gets the missdn.
-     * 
+     *
      * @return the missdn
      */
     public String getMissdn() {
@@ -145,7 +129,7 @@
 
     /**
      * Sets the missdn.
-     * 
+     *
      * @param missdn the new missdn
      */
     public void setMissdn(String missdn) {
@@ -154,7 +138,7 @@
 
     /**
      * Gets the cid.
-     * 
+     *
      * @return the cid
      */
     public String getCid() {
@@ -163,7 +147,7 @@
 
     /**
      * Sets the cid.
-     * 
+     *
      * @param cid the new cid
      */
     public void setCid(String cid) {
@@ -172,7 +156,7 @@
 
     /**
      * Gets the greeting.
-     * 
+     *
      * @return the greeting
      */
     public String getGreeting() {
@@ -181,7 +165,7 @@
 
     /**
      * Sets the greeting.
-     * 
+     *
      * @param greeting the new greeting
      */
     public void setGreeting(String greeting) {
@@ -190,7 +174,7 @@
 
     /**
      * Gets the source type.
-     * 
+     *
      * @return the source type
      */
     public String getSourceType() {
@@ -199,7 +183,7 @@
 
     /**
      * Sets the source type.
-     * 
+     *
      * @param sourceType the new source type
      */
     public void setSourceType(String sourceType) {
@@ -208,7 +192,7 @@
 
     /**
      * Gets the missdn address.
-     * 
+     *
      * @return the missdn address
      */
     public String getMissdnAddress() {
@@ -217,7 +201,7 @@
 
     /**
      * Sets the missdn address.
-     * 
+     *
      * @param missdnAddress the new missdn address
      */
     public void setMissdnAddress(String missdnAddress) {
@@ -226,7 +210,7 @@
 
     /**
      * Gets the local source url.
-     * 
+     *
      * @return the local source url
      */
     public String getLocalSourceUrl() {
@@ -235,7 +219,7 @@
 
     /**
      * Sets the local source url.
-     * 
+     *
      * @param localSourceUrl the new local source url
      */
     public void setLocalSourceUrl(String localSourceUrl) {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugincenter/IPluginCenterApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugincenter/IPluginCenterApi.aidl
deleted file mode 100644
index 09e8588..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugincenter/IPluginCenterApi.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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.aidl.plugincenter;
-
-interface IPluginCenterApi {
-    void intentApk();
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/GroupUserData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/GroupUserData.java
deleted file mode 100644
index 6cff09f..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/GroupUserData.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.aidl.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/aidl/provider/NewAddressBookData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/NewAddressBookData.java
deleted file mode 100644
index d00ba35..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/NewAddressBookData.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * 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.aidl.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/aidl/provider/PublicAccountData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/PublicAccountData.java
deleted file mode 100644
index 8570f06..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/PublicAccountData.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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.aidl.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 TABLE_ACCOUNT. */
-    public static final String TABLE_ACCOUNT_HIS = "publicAccountHis";
-
-    /** 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";
-
-    /** The Constant ACCOUNT_LOGO_TYPE. */
-    public static final String ACCOUNT_LOGO_TYPE = "_logoType";
-
-    /** The Constant ACCOUNT_MENU_STRING. */
-    public static final String ACCOUNT_MENU_STRING = "_menuString";
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/SuntekMessageData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/SuntekMessageData.java
deleted file mode 100644
index 7df4b63..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/SuntekMessageData.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * 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.aidl.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";
-
-    /**
-     * Table name of capabilities
-     */
-    public static final String TABLE_CAPABILITIES = "capabilities";
-
-    public static final String TABLE_DIVICE_API_CHAT_GROUP = "group_chat_device_api";
-
-    public static final String TABLE_DIVICE_API_CHAT_GROUP_USER = "group_chat_user_device_api";
-
-    public static final String TABLE_DIVICE_API_MESSAGE = "message_device_api";
-
-    public static final String TABLE_DIVICE_API_FAVOR_MESSAGE = "favor_message_device_api";
-
-    /** 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);
-
-    /** The Constant CHAT_THREAD_CONTENT_URI. */
-    public static final Uri CHAT_THREAD_CONTENT_URI = Uri.parse("content://" + MESSAGE_AUTHORITY
-            + "/" + TABLE_MESSAGE_THREAD);
-
-    /** The Constant CHAT_THREAD_CONTENT_URI. */
-    public static final Uri CAPABILITIES_CONTENT_URI = Uri.parse("content://" + MESSAGE_AUTHORITY
-            + "/" + TABLE_CAPABILITIES);
-
-    /** The Constant GROUP_CHAT_DIVICE_API_CONTENT_URI. */
-    public static final Uri GROUP_CHAT_DIVICE_API_CONTENT_URI = Uri.parse("content://"
-            + MESSAGE_AUTHORITY + "/" + TABLE_DIVICE_API_CHAT_GROUP);
-
-    /** The Constant GROUP_CHAT_USER_DIVICE_API_CONTENT_URI. */
-    public static final Uri GROUP_CHAT_USER_DIVICE_API_CONTENT_URI = Uri.parse("content://"
-            + MESSAGE_AUTHORITY + "/" + TABLE_DIVICE_API_CHAT_GROUP_USER);
-
-    /** The Constant MESSAGE_DIVICE_API_CONTENT_URI. */
-    public static final Uri MESSAGE_DIVICE_API_CONTENT_URI = Uri.parse("content://"
-            + MESSAGE_AUTHORITY + "/" + TABLE_DIVICE_API_MESSAGE);
-
-    /** The Constant FAVOR_MESSAGE_DIVICE_API_CONTENT_URI. */
-    public static final Uri FAVOR_MESSAGE_DIVICE_API_CONTENT_URI = Uri.parse("content://"
-            + MESSAGE_AUTHORITY + "/" + TABLE_DIVICE_API_FAVOR_MESSAGE);
-
-    /**
-     * 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 about cloud file. */
-    public static final int MSG_TYPE_CLOUD_FILE = 12;
-
-    /** 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 message is order send.
-     */
-    public static final int MSG_STATE_ORDER_SEND = -2;
-
-    /**
-     * 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 message has been locked. */
-    public static final int MSG_LOCKED = 3;
-
-    /** 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;
-
-    /**
-     * Column name about order time expire interval second.
-     */
-    public static final int ORDER_TIME_EXPIRE_INTERVAL_SECOND = 2;
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/SuntekMessageDbSlct.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/SuntekMessageDbSlct.java
deleted file mode 100644
index 985ab8c..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/SuntekMessageDbSlct.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * 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.aidl.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.aidl.provider.model.ChatMessage;
-import com.suntek.mway.rcs.client.aidl.provider.model.ChatThread;
-import com.suntek.mway.rcs.client.aidl.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.aidl.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/aidl/provider/model/CapabilitiesColumn.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/CapabilitiesColumn.java
deleted file mode 100644
index 98c1e62..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/CapabilitiesColumn.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2015, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package com.suntek.mway.rcs.client.aidl.provider.model;
-
-/**
- * <p>
- * Title: CapabilitiesColumn class
- * </p>
- * <p>
- * Description: The class <code>CapabilitiesColumn</code> represents capability
- * information which is indicated by the field definition in this class.
- * </p>
- * <p>
- * Copyright: Copyright (c) 2014
- * </p>
- * <p>
- * Company: pci-suntek
- * </p>
- * 
- * @author YFB
- * @version 1.0
- */
-public class CapabilitiesColumn {
-
-    public static final String KEY_ID = "_id";
-
-    public static final String KEY_CONTACT = "contact";
-
-    public static final String KEY_IMAGE_SHARING = "imageSharing";
-
-    public static final String KEY_VIDEO_SHARING = "videoSharing";
-
-    public static final String KEY_IMSESSION = "imSession";
-
-    public static final String KEY_FILE_TRANSFER = "fileTransfer";
-
-    public static final String KEY_GEOLOC_PUSH = "geolocPush";
-
-    public static final String KEY_IP_VOICE_CALL = "ipVoiceCall";
-
-    public static final String KEY_IP_VIDEO_CALL = "ipVideoCall";
-
-    public static final String KEY_EXTENSIONS = "extensions";
-
-    public static final String KEY_TIME = "time";
-
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ChatMessage.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ChatMessage.aidl
deleted file mode 100644
index 5fc4323..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ChatMessage.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.provider.model;
-
-parcelable ChatMessage;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ChatMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ChatMessage.java
deleted file mode 100644
index 203787e..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ChatMessage.java
+++ /dev/null
@@ -1,935 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package com.suntek.mway.rcs.client.aidl.provider.model;
-
-import com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData;
-
-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;
-
-    /** cloud file message. */
-    private CloudFileMessage cloudFileMessage;
-
-    /**
-     * Mark message that is blacklist message.
-     */
-    private int msgBlackFlag = 0;
-
-    private int continueFlag;
-
-    private int duration;
-
-    private String filepath;
-
-    private String thumbpath;
-
-    /**
-     * 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;
-    }
-
-    /**
-     * Gets the cloud file message.
-     * 
-     * @return the cloud file message
-     */
-    public CloudFileMessage getCloudFileMessage() {
-        return cloudFileMessage;
-    }
-
-    /**
-     * Sets the cloud file message.
-     * 
-     * @param cloudFileMessage the new cloud file message
-     */
-    public void setCloudFileMessage(CloudFileMessage cloudFileMessage) {
-        this.cloudFileMessage = cloudFileMessage;
-    }
-
-    /**
-     * 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;
-    }
-
-    public int getDuration() {
-        if (duration != 0) {
-            return duration;
-        } else {
-            try {
-                switch (msgType) {
-                    case SuntekMessageData.MSG_TYPE_AUDIO:
-                        duration = Integer
-                                .parseInt(data.substring("[audio]".length()).split("-")[0]);
-                        break;
-                    case SuntekMessageData.MSG_TYPE_VIDEO:
-                        duration = Integer
-                                .parseInt(data.substring("[video]".length()).split("-")[0]);
-                        break;
-                }
-            } catch (Exception e) {
-                // TODO Auto-generated catch block
-
-            }
-        }
-        return duration;
-    }
-
-    public void setDuration(int duration) {
-        this.duration = duration;
-    }
-
-    public String getFilepath() {
-        return filepath;
-    }
-
-    public void setFilepath(String filepath) {
-        this.filepath = filepath;
-    }
-
-    public String getThumbpath() {
-        return thumbpath;
-    }
-
-    public void setThumbpath(String thumbpath) {
-        this.thumbpath = thumbpath;
-    }
-
-    /*
-     * (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);
-        dest.writeValue(cloudFileMessage);
-
-        dest.writeInt(duration);
-        dest.writeString(filepath);
-        dest.writeString(thumbpath);
-
-    }
-
-    /**
-     * 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();
-        cloudFileMessage = (CloudFileMessage)source.readValue(CloudFileMessage.class
-                .getClassLoader());
-
-        duration = source.readInt();
-        filepath = source.readString();
-        thumbpath = source.readString();
-    }
-
-    /** 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() {
-        StringBuffer buf = new StringBuffer();
-        buf.append("ChatMessage [id=").append(id).append(", contact=").append(contact)
-                .append(", messageId=").append(messageId).append(", data=").append(data)
-                .append(", time=").append(time).append(", filename=").append(filename)
-                .append(", filesize=").append(filesize).append(", mimeType=").append(mimeType)
-                .append(", msgType=").append(msgType).append(", sendReceive=").append(sendReceive)
-                .append(", isRead=").append(isRead).append(", msgState=").append(msgState)
-                .append(", chatType=").append(chatType).append(", threadId=").append(threadId)
-                .append(", conversationId=").append(conversationId).append(", contributionId=")
-                .append(contributionId).append(", fileSelector=").append(fileSelector)
-                .append(", fileTransferExt=").append(fileTransferExt).append(", fileTransferId=")
-                .append(fileTransferId).append(", fileIcon=")
-                .append(fileIcon)
-                .append(", msgBurnAfterReadFlag=")
-                .append(msgBurnAfterReadFlag)
-                .append(", barCycle=")
-                .append(barCycle
-                // + ", header=" + header + ", body=" + body
-                ).append(", publicMessage=").append(publicMessage).append("], msgBlackFlag = ")
-                .append(msgBlackFlag).append(", continueFlag = ").append(continueFlag)
-                .append(", duration=").append(duration).append(", filepath=").append(filepath)
-                .append(", thumbpath=").append(thumbpath);
-
-        return buf.toString();
-    }
-
-    public String print() {
-        return super.toString();
-    }
-
-    @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/aidl/provider/model/ChatThread.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ChatThread.java
deleted file mode 100644
index ed46455..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ChatThread.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * 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.aidl.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/aidl/provider/model/CloudFileMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/CloudFileMessage.java
deleted file mode 100644
index 4bc8e90..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/CloudFileMessage.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * 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.aidl.provider.model;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * The Class CloudFileMessage.
- */
-public class CloudFileMessage implements Parcelable {
-
-    /** The file name. */
-    private String fileName;
-
-    /** The file size. */
-    private long fileSize;
-
-    /** The share url. */
-    private String shareUrl;
-
-    /**
-     * Instantiates a new cloud file message.
-     */
-    public CloudFileMessage() {
-    }
-
-    /**
-     * Instantiates a new cloud file message.
-     */
-    public CloudFileMessage(String fileName, long fileSize, String shareUrl) {
-        this.fileName = fileName;
-        this.fileSize = fileSize;
-        this.shareUrl = shareUrl;
-    }
-
-    /**
-     * Instantiates a new cloud file message.
-     * 
-     * @param source the source
-     */
-    public CloudFileMessage(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(fileName);
-        dest.writeLong(fileSize);
-        dest.writeString(shareUrl);
-    }
-
-    /**
-     * Read from parcel.
-     * 
-     * @param source the source
-     */
-    public void readFromParcel(Parcel source) {
-        fileName = source.readString();
-        fileSize = source.readLong();
-        shareUrl = source.readString();
-    }
-
-    /** The parcel creator. */
-    public static final Parcelable.Creator<CloudFileMessage> CREATOR = new Parcelable.Creator<CloudFileMessage>() {
-        @Override
-        public CloudFileMessage createFromParcel(Parcel source) {
-            return new CloudFileMessage(source);
-        }
-
-        @Override
-        public CloudFileMessage[] newArray(int size) {
-            return new CloudFileMessage[size];
-        }
-    };
-
-    /**
-     * Gets the file name.
-     * 
-     * @return the file name
-     */
-    public String getFileName() {
-        return fileName;
-    }
-
-    /**
-     * Sets the file name.
-     * 
-     * @param fileName the new file name
-     */
-    public void setFileName(String fileName) {
-        this.fileName = fileName;
-    }
-
-    /**
-     * Gets the file size.
-     * 
-     * @return the file size
-     */
-    public long getFileSize() {
-        return fileSize;
-    }
-
-    /**
-     * Sets the file size.
-     * 
-     * @param fileSize the new file size
-     */
-    public void setFileSize(long fileSize) {
-        this.fileSize = fileSize;
-    }
-
-    /**
-     * Gets the share url.
-     * 
-     * @return the share url
-     */
-    public String getShareUrl() {
-        return shareUrl;
-    }
-
-    /**
-     * Sets the share url.
-     * 
-     * @param shareUrl the new share url
-     */
-    public void setShareUrl(String shareUrl) {
-        this.shareUrl = shareUrl;
-    }
-
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/FavoriteMessage.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/FavoriteMessage.aidl
deleted file mode 100644
index f47212f..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/FavoriteMessage.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.provider.model;
-
-parcelable FavoriteMessage;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/FavoriteMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/FavoriteMessage.java
deleted file mode 100644
index c0e9517..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/FavoriteMessage.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * 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.aidl.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/aidl/provider/model/GroupChatModel.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatModel.aidl
deleted file mode 100644
index bc1bfeb..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatModel.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.provider.model;
-
-parcelable GroupChatModel;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatModel.java
deleted file mode 100644
index 0d17a88..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatModel.java
+++ /dev/null
@@ -1,564 +0,0 @@
-/*
- * 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.aidl.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/aidl/provider/model/GroupChatUser.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatUser.aidl
deleted file mode 100644
index 301b7eb..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatUser.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.provider.model;
-
-parcelable GroupChatUser;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatUser.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatUser.java
deleted file mode 100644
index d143245..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatUser.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * 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.aidl.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 = "gpmanage";
-
-    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/aidl/provider/model/GroupNotificationConst.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupNotificationConst.java
deleted file mode 100644
index 237e1d2..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupNotificationConst.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.aidl.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";
-
-    public static final String GONE = "gone";
-
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ImdnNotification.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ImdnNotification.java
deleted file mode 100644
index 47c633c..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ImdnNotification.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.aidl.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/aidl/provider/model/MMSMessage.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MMSMessage.aidl
deleted file mode 100644
index b6c4ede..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MMSMessage.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.provider.model;
-
-parcelable MMSMessage;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MMSMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MMSMessage.java
deleted file mode 100644
index bc1418a..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MMSMessage.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.aidl.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/aidl/provider/model/MessageSessionModel.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MessageSessionModel.aidl
deleted file mode 100644
index 004b733..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MessageSessionModel.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.provider.model;
-
-parcelable MessageSessionModel;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MessageSessionModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MessageSessionModel.java
deleted file mode 100644
index 0ceacca..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/MessageSessionModel.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * 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.aidl.provider.model;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccounts;
-import com.suntek.mway.rcs.client.aidl.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/aidl/provider/model/PublicAccount.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicAccount.java
deleted file mode 100644
index 8347b16..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicAccount.java
+++ /dev/null
@@ -1,560 +0,0 @@
-/*
- * 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.aidl.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;
-
-    /** The logoType. */
-    private String logoType;
-
-    /** The menuString. */
-    private String menuString;
-
-    /**
-     * 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;
-    }
-
-    /**
-     * Gets the logo type.
-     * 
-     * @return the logo type
-     */
-    public String getLogoType() {
-        return logoType;
-    }
-
-    /**
-     * Sets the logo type.
-     * 
-     * @param logoType the new logo type
-     */
-    public void setLogoType(String logoType) {
-        this.logoType = logoType;
-    }
-
-    /**
-     * Gets the menu string.
-     * 
-     * @return the menu string
-     */
-    public String getMenuString() {
-        return menuString;
-    }
-
-    /**
-     * Sets the menu string.
-     * 
-     * @param menuString the new menu string
-     */
-    public void setMenuString(String menuString) {
-        this.menuString = menuString;
-    }
-
-    /*
-     * (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).append(",logoType=").append(this.logoType)
-                .append(",menuString=").append(this.menuString);
-
-        return sbuffer.toString();
-    }
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/TopMessageData.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/TopMessageData.aidl
deleted file mode 100644
index 5008d0c..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/TopMessageData.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.provider.model;
-
-parcelable TopMessageData;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/TopMessageData.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/TopMessageData.java
deleted file mode 100644
index afd6bb1..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/TopMessageData.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.aidl.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/aidl/registration/IRegistrationApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/registration/IRegistrationApi.aidl
deleted file mode 100644
index dc514a7..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/registration/IRegistrationApi.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.aidl.registration;
-
-interface IRegistrationApi {
-
-    boolean register();
-    
-    boolean unregister();
-    
-    boolean cancel();
-
-    
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/IServiceApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/IServiceApi.aidl
new file mode 100644
index 0000000..3519002
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/IServiceApi.aidl
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2015 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.aidl.service;
+
+import android.net.Uri;
+
+import com.suntek.mway.rcs.client.aidl.service.callback.ICapabiltyListener;
+import com.suntek.mway.rcs.client.aidl.service.callback.IGroupChatCallback;
+import com.suntek.mway.rcs.client.aidl.service.entity.GroupChat;
+import com.suntek.mway.rcs.client.aidl.service.entity.GroupChatMember;
+import com.suntek.mway.rcs.client.aidl.service.entity.SimpleMessage;
+
+interface IServiceApi {
+
+    // basicApi
+    void login(String account);
+    void logout();
+
+    void startPluginCenter();
+
+    void openAccount();
+    void rejectOpenAccount();
+    void getConfigurationWithOtp(String otpCode);
+    String getAccount();
+    boolean isOnline();
+    void startService();
+
+    // messageApi
+    void download(long id);
+    void complain(long id);
+    void backupAll();
+    void backup(in List<SimpleMessage> simpleMessageList);
+    void burnAll();
+    //void burn(long id);
+    void burn(long id, int delaySeconds);
+    void cancelBackup();
+    void cancelCollect(in List<SimpleMessage> simpleMessageList);
+    void cancelTopConversation(long threadId);
+    void collect(in List<SimpleMessage> simpleMessageList);
+    //void forward(long id, String number);
+    long forward(long id, long threadId, in List<String> numberList, int barCycle);
+    long forwardToGroupChat(long id, long threadId, long groupId);
+    long getThreadId(in List<String> numberList);
+    int getAudioMaxDuration();
+    long getImageMaxSize();
+    int getVideoMaxDuration();
+    long getVideoMaxSize();
+    int getRemindPolicy();
+    int getSendPolicy();
+    void pauseDownload(long id);
+    int recoverBlockedMessage(long blockedMessageId);
+    int recoverBlockedMessageByThreadId(long threadId);
+    int deleteAllMessage();
+    int deleteMessageByThreadId(long threadId);
+    int deleteMessage(long id);
+    void restoreAll();
+    void startComposing(long threadId, String number, String contentType, int seconds);
+    void stopComposing(long threadId, String number, String contentType, long lastActive);
+    void resend(long id);
+    long sendText(in List<String> numberList, long threadId, String text, int barCycle);
+    long sendImage(in List<String> numberList, long threadId, String filepath, int quality, boolean isRecord, int barCycle);
+    long sendAudio(in List<String> numberList, long threadId, String filepath, int duration, boolean isRecord, int barCycle);
+    long sendVideo(in List<String> numberList, long threadId, String filepath, int duration, boolean isRecord, int barCycle);
+    long sendLocation(in List<String> numberList, long threadId, double lat, double lng, String label, int barCycle);
+    long sendVcard(in List<String> numberList, long threadId, String filepath, int barCycle);
+    long sendTextToGroupChat(long groupId, long threadId, String text);
+    long sendImageToGroupChat(long groupId, long threadId, String filepath, int quality, boolean isRecord);
+    long sendAudioToGroupChat(long groupId, long threadId, String filepath, int duration, boolean isRecord);
+    long sendVideoToGroupChat(long groupId, long threadId, String filepath, int duration, boolean isRecord);
+    long sendLocationToGroupChat(long groupId, long threadId, double lat, double lng, String label);
+    long sendVcardToGroupChat(long groupId, long threadId, String filepath);
+    void setRemindPolicy(int policy);
+    void setSendPolicy(int policy);
+    int topConversation(long threadId);
+    int markMessageAsReaded(long id);
+
+    // specialServiceNumApi
+    boolean addSsn(String number);
+    boolean disableSsn();
+    boolean deleteSsnPrefix(String number);
+    List<String> getSsnList();
+    boolean enableSsn();
+    boolean deleteSsn(String number);
+    boolean deleteAllSsn();
+
+    // blacklistApi
+    boolean addBlacklist(String number, String name);
+    boolean isBlacklist(String number);
+    void clearBlacklist();
+    List<String> getBlacklist();
+    boolean deleteBlacklist(String number);
+    void setBlacklistProvider(in Uri uri);
+
+    // capabilityApi
+    void getCapability(String number, boolean fromServer, ICapabiltyListener listener);
+
+    // groupChatApi
+    List<GroupChat> getAllGroupChat();
+    GroupChat getGroupChatById(long groupChatId);
+    GroupChat getGroupChatByThreadId(long threadId);
+    GroupChatMember getMember(long groupChatId, String number);
+    List<GroupChatMember> getMembers(long groupChatId);
+    List<GroupChatMember> getMembersAllowChairman(long groupChatId);
+    void getMemberAvatarFromServer(long groupChatId, String number, int pixel, in IGroupChatCallback callback);
+    void getMemberAvatar(long groupChatId, String number, int pixel, in IGroupChatCallback callback);
+    long create(String subject, in List<String> users);
+    int acceptToJoin(long groupChatId);
+    int rejectToJoin(long groupChatId);
+    int assignChairman(long groupChatId, String number);
+    int disband(long groupChatId);
+    int invite(long groupChatId, in List<String> numberList);
+    int kickOut(long groupChatId, String number);
+    int quit(long groupChatId);
+    int setMyAlias(long groupChatId, String alias);
+    int setSubject(long groupChatId, String subject);
+    int setRemarks(long groupChatId, String remarks);
+    void setGroupChatRemindPolicy(long groupChatId, int policy);
+    int deleteGroupChat(in long[] threadIds);
+    int deleteAllGroupChat();
+
+    // send message of plugin
+    // emoticon
+    long sendEmoticon(in List<String> numberList, long threadId, String emoticonId, String emoticonName, int barCycle);
+    long sendEmoticonToGroupChat(long groupId, long threadId, String emoticonId, String emoticonName);
+    // cloud
+    long sendCloud(in List<String> numberList, long threadId, String fileName, long fileSize, String shareUrl, String smsContent, int barCycle);
+    long sendCloudToGroupChat(long groupId, long threadId, String fileName, long fileSize, String shareUrl);
+    // public account
+    long sendTextToPublicAccount(String publicAccountId, long threadId, String text);
+    long sendImageToPublicAccount(String publicAccountId, long threadId, String filepath, int quality, boolean isRecord);
+    long sendAudioToPublicAccount(String publicAccountId, long threadId, String filepath, int duration, boolean isRecord);
+    long sendVideoToPublicAccount(String publicAccountId, long threadId, String filepath, int duration, boolean isRecord);
+    long sendLocationToPublicAccount(String publicAccountId, long threadId, double lat, double lng, String label);
+    long sendVcardToPublicAccount(String publicAccountId, long threadId, String filepath);
+    long sendCommandToPublicAccount(String publicAccountId, long threadId, String text);
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/IRCSServiceListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/IServiceListener.aidl
similarity index 88%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/IRCSServiceListener.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/IServiceListener.aidl
index 5bd322f..712a65e 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/IRCSServiceListener.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/IServiceListener.aidl
@@ -1,17 +1,17 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -20,9 +20,9 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl;
+package com.suntek.mway.rcs.client.aidl.service;
 
-interface IRCSServiceListener
+interface IServiceListener
 {
     void onServiceConnected();
     void onServiceDisconnected();
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICapabiltyListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/callback/ICapabiltyListener.aidl
similarity index 90%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICapabiltyListener.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/callback/ICapabiltyListener.aidl
index 39e9a32..67a668f 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/ICapabiltyListener.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/callback/ICapabiltyListener.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,9 +20,9 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.callback;
+package com.suntek.mway.rcs.client.aidl.service.callback;
 
-import com.suntek.mway.rcs.client.aidl.capability.RCSCapabilities;
+import com.suntek.mway.rcs.client.aidl.service.entity.RCSCapabilities;
 
 interface ICapabiltyListener
 {
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IConferenceCallback.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/callback/IGroupChatCallback.aidl
similarity index 86%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IConferenceCallback.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/callback/IGroupChatCallback.aidl
index 14e9897..9d4171f 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/IConferenceCallback.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/callback/IGroupChatCallback.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,13 +20,11 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.plugin.callback;
+package com.suntek.mway.rcs.client.aidl.service.callback;
 
 import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Avatar;
 
-interface IConferenceCallback
+interface IGroupChatCallback
 {
-    
-    void onRefreshAvatar( in Avatar avatar, int resultCode, String resultDesc );
-    
+    void onUpdateAvatar(in Avatar avatar, int resultCode, String resultDesc);
 }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChat.aidl
similarity index 92%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChat.aidl
index 79f381f..f54a3b6 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChat.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.provider.model;
+package com.suntek.mway.rcs.client.aidl.service.entity;
 
-parcelable SimpleMsg;
+parcelable GroupChat;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChat.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChat.java
new file mode 100644
index 0000000..606afea
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChat.java
@@ -0,0 +1,277 @@
+/*
+ * Copyright (c) 2015 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.aidl.service.entity;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class GroupChat implements Parcelable {
+
+    public static final int STATUS_INITIATED = 1;
+
+    public static final int STATUS_INVITED = 2;
+
+    public static final int STATUS_STARTED = 3;
+
+    public static final int STATUS_QUITED = 10;
+
+    public static final int STATUS_BOOTED = 11;
+
+    public static final int STATUS_TERMINATED = 12;
+
+    public static final int STATUS_FAILED = 13;
+
+    public static final int STATUS_REJECT = 14;
+
+    /**
+     * for dual sim card
+     */
+    public static final int STATUS_PAUSE = 15;
+
+    public static final int INCOMING = 1;
+
+    public static final int OUTGOING = 2;
+
+    public static final int MESSAGE_RECEIVE_AND_REMIND = 0;
+
+    public static final int MESSAGE_NOT_REMIND = 1;
+
+    public static final int MESSAGE_NOT_RECEIVE = 2;
+
+    private long id;
+
+    private long threadId;
+
+    private String subject;
+
+    private String chatUri;
+
+    private int status;
+
+    private String chairman;
+
+    private int direction;
+
+    private int maxCount;
+
+    private String remark;
+
+    private int policy;
+
+    private long date;
+
+    private String conversationId;
+
+    private String contributionId;
+
+    private String owner;
+
+    public GroupChat() {
+    }
+
+    public GroupChat(Parcel in) {
+        readFromParcel(in);
+    }
+
+    @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(id);
+        dest.writeLong(threadId);
+        dest.writeString(subject);
+        dest.writeString(chatUri);
+        dest.writeInt(status);
+        dest.writeString(chairman);
+        dest.writeInt(direction);
+        dest.writeInt(maxCount);
+        dest.writeString(remark);
+        dest.writeInt(policy);
+        dest.writeLong(date);
+        dest.writeString(conversationId);
+        dest.writeString(contributionId);
+        dest.writeString(owner);
+    }
+
+    public void readFromParcel(Parcel source) {
+        id = source.readLong();
+        threadId = source.readLong();
+        subject = source.readString();
+        chatUri = source.readString();
+        status = source.readInt();
+        chairman = source.readString();
+        direction = source.readInt();
+        maxCount = source.readInt();
+        remark = source.readString();
+        policy = source.readInt();
+        date = source.readLong();
+        conversationId = source.readString();
+        contributionId = source.readString();
+        owner = source.readString();
+    }
+
+    public static final Parcelable.Creator<GroupChat> CREATOR =
+            new Parcelable.Creator<GroupChat>() {
+        public GroupChat createFromParcel(Parcel in) {
+            return new GroupChat(in);
+        }
+
+        @Override
+        public GroupChat[] newArray(int size) {
+            return new GroupChat[size];
+        }
+    };
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public long getThreadId() {
+        return threadId;
+    }
+
+    public void setThreadId(long threadId) {
+        this.threadId = threadId;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getChatUri() {
+        return chatUri;
+    }
+
+    public void setChatUri(String chatUri) {
+        this.chatUri = chatUri;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public String getChairman() {
+        return chairman;
+    }
+
+    public void setChairman(String chairman) {
+        this.chairman = chairman;
+    }
+
+    public int getDirection() {
+        return direction;
+    }
+
+    public void setDirection(int direction) {
+        this.direction = direction;
+    }
+
+    public int getMaxCount() {
+        return maxCount;
+    }
+
+    public void setMaxCount(int maxCount) {
+        this.maxCount = maxCount;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public int getPolicy() {
+        return policy;
+    }
+
+    public void setPolicy(int policy) {
+        this.policy = policy;
+    }
+
+    public long getDate() {
+        return date;
+    }
+
+    public void setDate(long date) {
+        this.date = date;
+    }
+
+    public String getConversationId() {
+        return conversationId;
+    }
+
+    public void setConversationId(String conversationId) {
+        this.conversationId = conversationId;
+    }
+
+    public String getContributionId() {
+        return contributionId;
+    }
+
+    public void setContributionId(String contributionId) {
+        this.contributionId = contributionId;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    @Override
+    public String toString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append("GroupChat{").append("id=").append(id).append(",threadId=").append(threadId)
+                .append(",subject=").append(subject).append(",chatUri=").append(chatUri)
+                .append(",status=").append(status).append(",chairman=").append(chairman)
+                .append(",direction=").append(direction).append(",maxCount=").append(maxCount)
+                .append(",remark=").append(remark).append(",policy=").append(policy)
+                .append(",date=").append(date).append(",conversationId=").append(conversationId)
+                .append(",contributionId=").append(contributionId)
+                .append(",owner=").append(owner).append("}");
+        return buf.toString();
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChatMember.aidl
similarity index 92%
copy from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.aidl
copy to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChatMember.aidl
index 79f381f..1f7b68b 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChatMember.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.provider.model;
+package com.suntek.mway.rcs.client.aidl.service.entity;
 
-parcelable SimpleMsg;
+parcelable GroupChatMember;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChatMember.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChatMember.java
new file mode 100644
index 0000000..3926aee
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/GroupChatMember.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 2015 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.aidl.service.entity;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class GroupChatMember implements Parcelable {
+
+    /**
+     * Chairman role
+     */
+    public static final int CHAIRMAN = 1;
+
+    /**
+     * Member role
+     */
+    public static final int MEMBER = 0;
+
+    /**
+     * Represents members allowed to become administrator
+     */
+    public static final String ALLOWED_TO_BE_CHAIRMAN = "gpmanage";
+
+    private long id;
+
+    private long groupId;
+
+    private String number;
+
+    private String alias;
+
+    private int role = -1;
+
+    private String etype;
+
+    private String etag;
+
+    private String imageType;
+
+    private String imageCode;
+
+    private long date;
+
+    public GroupChatMember() {
+    }
+
+    public GroupChatMember(Parcel source) {
+        readFromParcel(source);
+    }
+
+    @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(id);
+        dest.writeLong(groupId);
+        dest.writeString(number);
+        dest.writeString(alias);
+        dest.writeInt(role);
+        dest.writeString(etype);
+        dest.writeString(etag);
+        dest.writeString(imageType);
+        dest.writeString(imageCode);
+        dest.writeLong(date);
+    }
+
+    public void readFromParcel(Parcel source) {
+        id = source.readLong();
+        groupId = source.readLong();
+        number = source.readString();
+        alias = source.readString();
+        role = source.readInt();
+        etype = source.readString();
+        etag = source.readString();
+        imageType = source.readString();
+        imageCode = source.readString();
+        date = source.readLong();
+    }
+
+    public static final Parcelable.Creator<GroupChatMember> CREATOR =
+            new Parcelable.Creator<GroupChatMember>() {
+        public GroupChatMember createFromParcel(Parcel in) {
+            return new GroupChatMember(in);
+        }
+
+        @Override
+        public GroupChatMember[] newArray(int size) {
+            return new GroupChatMember[size];
+        }
+    };
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public long getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(long groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    public int getRole() {
+        return role;
+    }
+
+    public void setRole(int role) {
+        this.role = role;
+    }
+
+    public String getEtype() {
+        return etype;
+    }
+
+    public void setEtype(String etype) {
+        this.etype = etype;
+    }
+
+    public String getEtag() {
+        return etag;
+    }
+
+    public void setEtag(String etag) {
+        this.etag = etag;
+    }
+
+    public String getImageType() {
+        return imageType;
+    }
+
+    public void setImageType(String imageType) {
+        this.imageType = imageType;
+    }
+
+    public String getImageCode() {
+        return imageCode;
+    }
+
+    public void setImageCode(String imageCode) {
+        this.imageCode = imageCode;
+    }
+
+    public long getDate() {
+        return date;
+    }
+
+    public void setDate(long date) {
+        this.date = date;
+    }
+
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/RCSCapabilities.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/RCSCapabilities.aidl
similarity index 94%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/RCSCapabilities.aidl
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/RCSCapabilities.aidl
index b06adce..32e1152 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/RCSCapabilities.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/RCSCapabilities.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.capability;
+package com.suntek.mway.rcs.client.aidl.service.entity;
 
 parcelable RCSCapabilities;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/RCSCapabilities.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/RCSCapabilities.java
similarity index 85%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/RCSCapabilities.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/RCSCapabilities.java
index 8c8b07f..221167d 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/RCSCapabilities.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/RCSCapabilities.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,34 +21,13 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.capability;
-
-import com.suntek.mway.rcs.client.aidl.constant.APIConstant;
+package com.suntek.mway.rcs.client.aidl.service.entity;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
 import java.io.Serializable;
 
-/**
- * <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 {
 
     /** The Constant serialVersionUID. */
@@ -176,7 +155,6 @@
     /**
      * Construct a new RCSCapabilities() with another specified instance of
      * RCSCapabilities.
-     * 
      * @param source another instance of RCSCapabilities.
      */
     public RCSCapabilities(Parcel source) {
@@ -209,16 +187,14 @@
     /**
      * Describe the kinds of special objects contained in this Parcelable's
      * marshalled representation.
-     * 
      * @return Integer
      */
     public int describeContents() {
-        return APIConstant.PARCEL_OBJECT_TYPE;
+        return 0;
     }
 
     /**
      * 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
      */
@@ -252,7 +228,8 @@
     /**
      * a fast way to get a Parcelable creator.
      */
-    public static final Parcelable.Creator<RCSCapabilities> CREATOR = new Parcelable.Creator<RCSCapabilities>() {
+    public static final Parcelable.Creator<RCSCapabilities> CREATOR =
+            new Parcelable.Creator<RCSCapabilities>() {
         public RCSCapabilities createFromParcel(Parcel source) {
             return new RCSCapabilities(source);
         }
@@ -264,7 +241,6 @@
 
     /**
      * Is image sharing supported.
-     * 
      * @return Boolean
      */
     /*
@@ -273,7 +249,6 @@
      */
     /**
      * Set the image sharing support
-     * 
      * @param supported Supported
      */
     /*
@@ -282,7 +257,6 @@
      */
     /**
      * Is video sharing supported
-     * 
      * @return Boolean
      */
     /*
@@ -291,7 +265,6 @@
      */
     /**
      * Set the video sharing support
-     * 
      * @param supported Supported
      */
     /*
@@ -301,7 +274,6 @@
 
     /**
      * Is IP voice call supported
-     * 
      * @return Boolean
      */
     /*
@@ -309,7 +281,6 @@
      */
     /**
      * Is IP video call supported
-     * 
      * @return Boolean
      */
     /*
@@ -317,7 +288,6 @@
      */
     /**
      * Set the IP voice call support
-     * 
      * @param supported Supported
      */
     /*
@@ -326,7 +296,6 @@
      */
     /**
      * Set the IP video call support
-     * 
      * @param supported Supported
      */
     /*
@@ -335,7 +304,6 @@
      */
     /**
      * Is IM session supported
-     * 
      * @return Boolean
      */
     public boolean isImSessionSupported() {
@@ -344,7 +312,6 @@
 
     /**
      * Set the IM session support.
-     * 
      * @param supported Supported
      */
     public void setImSessionSupported(boolean supported) {
@@ -353,7 +320,6 @@
 
     /**
      * Is file transfer supported.
-     * 
      * @return Boolean
      */
     public boolean isFileTransferSupported() {
@@ -362,7 +328,6 @@
 
     /**
      * Set the file transfer support.
-     * 
      * @param supported Supported
      */
     public void setFileTransferSupported(boolean supported) {
@@ -371,7 +336,7 @@
 
     /**
      * Is CS video supported.
-     * 
+     *
      * @return Boolean
      */
     /*
@@ -379,7 +344,7 @@
      */
     /**
      * Set the CS video support
-     * 
+     *
      * @param supported Supported
      */
     /*
@@ -388,7 +353,7 @@
      */
     /**
      * Is presence discovery supported
-     * 
+     *
      * @return Boolean
      */
     /*
@@ -398,7 +363,7 @@
 
     /**
      * Set the presence discovery support
-     * 
+     *
      * @param supported Supported
      */
     /*
@@ -408,7 +373,7 @@
 
     /**
      * Is social presence supported
-     * 
+     *
      * @return Boolean
      */
     /*
@@ -418,7 +383,7 @@
 
     /**
      * Set the social presence support
-     * 
+     *
      * @param supported Supported
      */
     /*
@@ -428,7 +393,7 @@
 
     /**
      * Is file transfer over HTTP supported
-     * 
+     *
      * @return Boolean
      */
     /*
@@ -437,7 +402,7 @@
      */
     /**
      * Set the file transfer over HTTP support
-     * 
+     *
      * @param supported Supported
      */
     /*
@@ -446,7 +411,6 @@
      */
     /**
      * Is Geolocation Push supported
-     * 
      * @return Boolean
      */
     public boolean isGeolocationPushSupported() {
@@ -455,7 +419,6 @@
 
     /**
      * Set the Geolocation Pull support.
-     * 
      * @param supported Supported
      */
     public void setGeolocationPullSupported(boolean supported) {
@@ -464,7 +427,6 @@
 
     /**
      * Is Geolocation Pull supported.
-     * 
      * @return Boolean
      */
     public boolean isGeolocationPullSupported() {
@@ -473,7 +435,6 @@
 
     /**
      * Set the Geolocation Push support.
-     * 
      * @param supported Supported
      */
     public void setGeolocationPushSupported(boolean supported) {
@@ -482,7 +443,6 @@
 
     /**
      * Is file transfer thumbnail supported.
-     * 
      * @return Boolean
      */
     public boolean isFileTransferThumbnailSupported() {
@@ -491,7 +451,6 @@
 
     /**
      * Set the file transfer thumbnail support.
-     * 
      * @param supported Supported
      */
     public void setFileTransferThumbnailSupported(boolean supported) {
@@ -500,27 +459,22 @@
 
     /**
      * 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() {
@@ -529,7 +483,6 @@
 
     /**
      * Set the group chat S&F support.
-     * 
      * @param supported Supported
      */
     public void setGroupChatStoreForwardSupported(boolean supported) {
@@ -537,27 +490,7 @@
     }
 
     /**
-     * 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() {
@@ -566,7 +499,6 @@
 
     /**
      * Set page mode message.
-     * 
      * @param pageModeMsg the new page mode msg supported
      */
     public void setPageModeMsgSupported(boolean pageModeMsg) {
@@ -575,7 +507,6 @@
 
     /**
      * large mode message or not.
-     * 
      * @return true, if is large mode msg supported
      */
     public boolean isLargeModeMsgSupported() {
@@ -584,7 +515,6 @@
 
     /**
      * set large mode message.
-     * 
      * @param largeModeMsg the new large mode msg supported
      */
     public void setLargeModeMsgSupported(boolean largeModeMsg) {
@@ -593,7 +523,6 @@
 
     /**
      * public message or not.
-     * 
      * @return true, if is public msg supported
      */
     public boolean isPublicMsgSupported() {
@@ -602,7 +531,6 @@
 
     /**
      * set public message.
-     * 
      * @param publicMsg the new public msg supported
      */
     public void setPublicMsgSupported(boolean publicMsg) {
@@ -611,7 +539,6 @@
 
     /**
      * ve motion or not.
-     * 
      * @return true, if is vemotion supported
      */
     public boolean isVemotionSupported() {
@@ -620,7 +547,6 @@
 
     /**
      * set ve motion.
-     * 
      * @param vemotion the new vemotion supported
      */
     public void setVemotionSupported(boolean vemotion) {
@@ -629,7 +555,6 @@
 
     /**
      * Checks if is cloud file supported.
-     * 
      * @return true, if is cloud file supported
      */
     public boolean isCloudFileSupported() {
@@ -638,7 +563,6 @@
 
     /**
      * Sets the cloud file supported.
-     * 
      * @param cloudFileSupported the new cloud file supported
      */
     public void setCloudFileSupported(boolean cloudFileSupported) {
@@ -648,7 +572,6 @@
     /**
      * group management(modify group name, kick people, transfer the group) nor
      * not.
-     * 
      * @return true, if is cmcc supported
      */
     public boolean isCmccSupported() {
@@ -657,7 +580,6 @@
 
     /**
      * set group management.
-     * 
      * @param cmcc the new cmcc supported
      */
     public void setCmccSupported(boolean cmcc) {
@@ -666,7 +588,6 @@
 
     /**
      * Checks is burn after reading.
-     * 
      * @return true, if is burn after reading
      */
     public boolean isBurnAfterReading() {
@@ -675,7 +596,6 @@
 
     /**
      * Set burn after reading.
-     * 
      * @param burnAfterReading the new burn after reading
      */
     public void setBurnAfterReading(boolean burnAfterReading) {
@@ -684,7 +604,6 @@
 
     /**
      * Get the capabilities timestamp.
-     * 
      * @return Timestamp (in milliseconds)
      */
     public long getTimestamp() {
@@ -693,48 +612,10 @@
 
     /**
      * Set capabilities timestamp.
-     * 
      * @param timestamp the new 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 + ", cloudFile="
-                + cloudFileSupported + ", cmcc=" + cmccSupported + ", burnAfterReading="
-                + burnAfterReading +
-                // ", SipAutomata=" + sipAutomata +
-                ", Timestamp=" + timestamp;
-    }
 }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/SimpleMessage.aidl
similarity index 92%
copy from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.aidl
copy to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/SimpleMessage.aidl
index 79f381f..3020921 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.aidl
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/SimpleMessage.aidl
@@ -1,17 +1,17 @@
 /*
  * 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
@@ -20,6 +20,6 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
-package com.suntek.mway.rcs.client.aidl.provider.model;
+package com.suntek.mway.rcs.client.aidl.service.entity;
 
-parcelable SimpleMsg;
+parcelable SimpleMessage;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/SimpleMessage.java
similarity index 64%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.java
rename to rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/SimpleMessage.java
index e4025c8..1be3110 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/service/entity/SimpleMessage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,42 +21,38 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.provider.model;
-
-import java.util.ArrayList;
-import java.util.List;
+package com.suntek.mway.rcs.client.aidl.service.entity;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class SimpleMsg implements Parcelable {
-    private String rowId;
+import java.util.ArrayList;
+import java.util.List;
 
-    private String messageId;
+public class SimpleMessage implements Parcelable {
+    private long messageRowId;
 
     private int storeType;
 
-    public SimpleMsg() {
+    public SimpleMessage() {
     }
 
-    public SimpleMsg(Parcel in) {
+    public SimpleMessage(Parcel in) {
         readFromParcel(in);
     }
 
-    public String getRowId() {
-        return rowId;
+    /**
+     * @return the messageRowId
+     */
+    public long getMessageRowId() {
+        return messageRowId;
     }
 
-    public void setRowId(String rowId) {
-        this.rowId = rowId;
-    }
-
-    public String getMessageId() {
-        return messageId;
-    }
-
-    public void setMessageId(String messageId) {
-        this.messageId = messageId;
+    /**
+     * @param messageRowId the messageRowId to set
+     */
+    public void setMessageRowId(long messageRowId) {
+        this.messageRowId = messageRowId;
     }
 
     public int getStoreType() {
@@ -74,33 +70,31 @@
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(rowId);
-        dest.writeString(messageId);
+        dest.writeLong(messageRowId);
         dest.writeInt(storeType);
     }
 
     public void readFromParcel(Parcel source) {
-        rowId = source.readString();
-        messageId = source.readString();
+        messageRowId = source.readLong();
         storeType = source.readInt();
     }
 
-    public static final Parcelable.Creator<SimpleMsg> CREATOR = new Parcelable.Creator<SimpleMsg>() {
-        public SimpleMsg createFromParcel(Parcel in) {
-            return new SimpleMsg(in);
+    public static final Parcelable.Creator<SimpleMessage> CREATOR =
+            new Parcelable.Creator<SimpleMessage>() {
+        public SimpleMessage createFromParcel(Parcel in) {
+            return new SimpleMessage(in);
         }
 
         @Override
-        public SimpleMsg[] newArray(int size) {
-            return new SimpleMsg[size];
+        public SimpleMessage[] newArray(int size) {
+            return new SimpleMessage[size];
         }
     };
 
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
-        list.add("rowId=" + rowId);
-        list.add("messageId=" + messageId);
+        list.add("messageRowId=" + messageRowId);
         list.add("storeType=" + storeType);
         return list.toString();
     }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/IRcsSettingApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/IRcsSettingApi.aidl
deleted file mode 100644
index d8748b7..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/IRcsSettingApi.aidl
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.aidl.setting;
-
-import com.suntek.mway.rcs.client.aidl.setting.RcsUserProfileInfo;
-import com.suntek.mway.rcs.client.aidl.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/aidl/setting/LoginUser.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/LoginUser.aidl
deleted file mode 100644
index 7361b5c..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/LoginUser.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.setting;
-
-parcelable LoginUser;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/LoginUser.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/LoginUser.java
deleted file mode 100644
index beedc13..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/LoginUser.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * 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.aidl.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/aidl/setting/RcsUserProfileInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/RcsUserProfileInfo.aidl
deleted file mode 100644
index ed01470..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/RcsUserProfileInfo.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.setting;
-
-parcelable RcsUserProfileInfo;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/RcsUserProfileInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/RcsUserProfileInfo.java
deleted file mode 100644
index af40f8b..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/RcsUserProfileInfo.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * 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.aidl.setting;
-
-import com.suntek.mway.rcs.client.aidl.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/aidl/setting/SystemInfo.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/SystemInfo.aidl
deleted file mode 100644
index 5ada838..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/SystemInfo.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.aidl.setting;
-
-parcelable SystemInfo;
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/SystemInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/SystemInfo.java
deleted file mode 100644
index 7d79948..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/SystemInfo.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * 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.aidl.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/aidl/setting/callback/IAccountEventListener.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/callback/IAccountEventListener.aidl
deleted file mode 100644
index a7b25bf..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/callback/IAccountEventListener.aidl
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.aidl.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/aidl/specialnumber/ISpecialServiceNumApi.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/specialnumber/ISpecialServiceNumApi.aidl
deleted file mode 100644
index fd14220..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/specialnumber/ISpecialServiceNumApi.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.aidl.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/aidl/utils/CloseFileUtils.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/CloseFileUtils.java
deleted file mode 100644
index f7419bc..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/CloseFileUtils.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.aidl.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/aidl/utils/FirstInFirstOutBuffer.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/FirstInFirstOutBuffer.java
deleted file mode 100644
index 72bb00b..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/FirstInFirstOutBuffer.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * 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.aidl.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/aidl/utils/MediaUtils.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/MediaUtils.java
deleted file mode 100644
index 33850de..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/MediaUtils.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * 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.aidl.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.aidl.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 vcard file.
-     * 
-     * @param fileName the file name
-     * @return true, if is vcard file
-     */
-    public static boolean isVcardFile(String fileName) {
-        if (TextUtils.isEmpty(fileName)) {
-            return false;
-        }
-
-        int suffixIndex = fileName.lastIndexOf(".");
-        if (suffixIndex != -1) {
-            String suffix = fileName.substring(suffixIndex + 1);
-            return isVcardSuffix(suffix);
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Checks if is video file.
-     * 
-     * @param fileName the file name
-     * @return true, if is video file
-     */
-    public static boolean isCloudFileAllowedFile(String fileName) {
-        if (TextUtils.isEmpty(fileName)) {
-            return false;
-        }
-
-        int suffixIndex = fileName.lastIndexOf(".");
-        if (suffixIndex != -1) {
-            String suffix = fileName.substring(suffixIndex + 1);
-            return !isCloudFileExcludeSuffix(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;
-    }
-
-    /**
-     * Checks if is vcard suffix.
-     * 
-     * @param suffix the suffix
-     * @return true, if is vcard suffix
-     */
-    public static boolean isVcardSuffix(String suffix) {
-        if (TextUtils.isEmpty(suffix)) {
-            return false;
-        }
-
-        return MediaConstants.VCARD_SUFFIX.indexOf(suffix.toUpperCase(Locale.getDefault())) != -1;
-    }
-
-    /**
-     * Checks if is cloud file exclude suffix.
-     * 
-     * @param suffix the suffix
-     * @return true, if is cloud file exclude suffix
-     */
-    public static boolean isCloudFileExcludeSuffix(String suffix) {
-        if (TextUtils.isEmpty(suffix)) {
-            return false;
-        }
-
-        return MediaConstants.CLOUD_FILE_EXCLUDE_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/aidl/utils/RcsPhoneUtils.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/RcsPhoneUtils.java
deleted file mode 100644
index 7d45d6d..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/RcsPhoneUtils.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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.aidl.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/aidl/utils/SettingUtils.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/SettingUtils.java
deleted file mode 100644
index 3e74871..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/SettingUtils.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * 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.aidl.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_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
deleted file mode 100644
index 04b1042..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/pubacct/MenuInfo.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * 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/richscrn/PhoneList.aidl b/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneList.aidl
deleted file mode 100644
index 164a127..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneList.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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
deleted file mode 100644
index a2ea1a4..0000000
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/api/plugin/entity/richscrn/PhoneList.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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_api/Android.mk b/rcs_service_api/Android.mk
index f372817..05f98d3 100644
--- a/rcs_service_api/Android.mk
+++ b/rcs_service_api/Android.mk
@@ -3,9 +3,11 @@
 # Make rcs_service_api.jar
 include $(CLEAR_VARS)
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES += $(call all-java-files-under, ../rcs_ui_common/src)
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE := rcs_service_api
-LOCAL_STATIC_JAVA_LIBRARIES := rcs_service_aidl_static
+LOCAL_STATIC_JAVA_LIBRARIES := rcs_service_aidl_static com.android.vcard
+LOCAL_JAVA_LIBRARIES := telephony-common
 include $(BUILD_JAVA_LIBRARY)
 
 # MAKE_XML
diff --git a/rcs_service_api/AndroidManifest.xml b/rcs_service_api/AndroidManifest.xml
new file mode 100644
index 0000000..e2fd68f
--- /dev/null
+++ b/rcs_service_api/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.suntek.mway.rcs.client.api"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk
+        android:minSdkVersion="8"
+        android:targetSdkVersion="18" />
+
+    <application
+        android:allowBackup="true"
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme" >
+    </application>
+
+</manifest>
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
index 18e5e96..10206c6 100644
--- 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
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -23,130 +23,89 @@
 
 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.aidl.constant.APIConstant;
-import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+import com.suntek.mway.rcs.client.api.basic.BasicApi;
+import com.suntek.mway.rcs.client.api.blacklist.BlackListApi;
+import com.suntek.mway.rcs.client.api.capability.CapabilityApi;
+import com.suntek.mway.rcs.client.api.cloudfile.CloudFileApi;
+import com.suntek.mway.rcs.client.api.contact.ContactApi;
+import com.suntek.mway.rcs.client.api.emoticon.EmoticonApi;
+import com.suntek.mway.rcs.client.api.groupchat.GroupChatApi;
+import com.suntek.mway.rcs.client.api.message.MessageApi;
+import com.suntek.mway.rcs.client.api.profile.ProfileApi;
+import com.suntek.mway.rcs.client.api.publicaccount.PublicAccountApi;
+import com.suntek.mway.rcs.client.api.richscreen.RichScreenApi;
+import com.suntek.mway.rcs.client.api.specialnumber.SpecialServiceNumApi;
+import com.suntek.mway.rcs.client.api.support.SupportApi;
 
-public abstract class ClientApi implements ClientApiInterface {
+public class ClientApi {
 
-    /** 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());
+    public void init(Context context, ServiceListener serviceListener,
+            ServiceListener pluginListener) {
+        if (null != serviceListener) {
+            ServiceApi.getInstance().init(context, serviceListener);
         }
-        // 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);
+
+        if (null != pluginListener) {
+            PluginApi.getInstance().init(context, pluginListener);
+        }
     }
 
     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;
-        }
+        ServiceApi.getInstance().destory(context);
+        PluginApi.getInstance().destory(context);
     }
 
-    /**
-     * 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;
+    public BasicApi getBasicApi() {
+        return BasicApi.getInstance();
     }
 
-    protected void notifyServiceConnected() {
-        if (rcsListener != null) {
-            try {
-                rcsListener.onServiceConnected();
-            } catch (RemoteException e) {
-                LogHelper.e(e.getMessage(), e);
-            }
-        }
+    public BlackListApi getBlackListApi() {
+        return BlackListApi.getInstance();
     }
 
-    protected void notifyServiceDisconnected() {
-        if (rcsListener != null) {
-            try {
-                rcsListener.onServiceDisconnected();
-            } catch (RemoteException e) {
-                LogHelper.e(e.getMessage(), e);
-            }
-        }
+    public CapabilityApi getCapabilityApi() {
+        return CapabilityApi.getInstance();
+    }
+
+    public GroupChatApi getGroupChatApi() {
+        return GroupChatApi.getInstance();
+    }
+
+    public MessageApi getMessageApi() {
+        return MessageApi.getInstance();
+    }
+
+    public SpecialServiceNumApi getSpecialServiceNumApi() {
+        return SpecialServiceNumApi.getInstance();
+    }
+
+    public SupportApi getSupportApi() {
+        return SupportApi.getInstance();
+    }
+
+    public ProfileApi getProfileApi() {
+        return ProfileApi.getInstance();
+    }
+
+    public PublicAccountApi getPublicAccountApi() {
+        return PublicAccountApi.getInstance();
+    }
+
+    public ContactApi getContactApi() {
+        return ContactApi.getInstance();
+    }
+
+    public CloudFileApi getCloudFileApi() {
+        return CloudFileApi.getInstance();
+    }
+
+    public EmoticonApi getEmoticonApi() {
+        return EmoticonApi.getInstance();
+    }
+
+    public RichScreenApi getRichScreenApi() {
+        return RichScreenApi.getInstance();
     }
 }
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
deleted file mode 100644
index 9b6db18..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/ClientApiInterface.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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/PluginApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/PluginApi.java
new file mode 100644
index 0000000..99ab860
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/PluginApi.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2015 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.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.aidl.constant.Main;
+import com.suntek.mway.rcs.client.aidl.plugin.IPluginApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.log.LogHelper;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+
+public class PluginApi {
+
+    /** check whether the service is binded or not */
+    private boolean isBinded = false;
+
+    private String PLUGIN_BIND_AIDL = Main.PLUGIN_BIND_AIDL;
+
+    protected ServiceListener rcsListener = null;
+
+    protected Context context = null;
+
+    protected boolean isNormallyClosed = false;
+
+    protected int reconnectionTimes = 1;
+
+    protected final int MAX_RECONECTION_TIMES = 5;
+
+    private static PluginApi instance;
+
+    private static IPluginApi pluginApi;
+
+    private PluginApi() {
+    }
+
+    public synchronized static PluginApi getInstance() {
+        if (null == instance) {
+            instance = new PluginApi();
+        }
+        return instance;
+    }
+
+    public static IPluginApi getPluginApi() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(pluginApi);
+        return pluginApi;
+    }
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("plugin api disconnect service");
+                pluginApi = null;
+
+                reconnectionTimes = 1;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call serviceApi api disconnect service :" + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    pluginApi = null;
+
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            pluginApi = IPluginApi.Stub.asInterface(service);
+
+            reconnectionTimes = 1;
+            notifyServiceConnected();
+            LogHelper.d("IServiceApi have success connect");
+        }
+    };
+
+    /**
+     * judge the bind state about remote service.
+     *
+     * @return true if binded, return false if unbinded.
+     */
+    public boolean isBinded() {
+        return isBinded;
+    }
+
+    public void init(Context context, ServiceListener listener) {
+        this.rcsListener = listener;
+        this.context = context;
+        Intent intent = new Intent();
+        // intent.setAction(serviceName);
+        intent.setClassName(Main.PACKAGE_NAME, PLUGIN_BIND_AIDL);
+        isBinded = context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+        LogHelper.d("bind " + PLUGIN_BIND_AIDL + "--> result:" + isBinded);
+    }
+
+    public void destory(Context context) {
+        try {
+            if (isBinded) {
+                LogHelper.d("destory()--> to destroy service : " + PLUGIN_BIND_AIDL);
+                isNormallyClosed = true;
+                context.unbindService(mConnection);
+            } else {
+                LogHelper.i("destory()--> service(" + PLUGIN_BIND_AIDL
+                        + ") already unbinded, do not need to destroy.");
+            }
+        } catch (Exception e) {
+            LogHelper.e("unbind " + PLUGIN_BIND_AIDL + "--> result:" + e.getMessage(), e);
+        } finally {
+            isBinded = 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/ServiceApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/ServiceApi.java
new file mode 100644
index 0000000..bb164ae
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/ServiceApi.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2015 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.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.aidl.constant.Main;
+import com.suntek.mway.rcs.client.aidl.service.IServiceApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.log.LogHelper;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+
+public class ServiceApi {
+
+    /** check whether the service is binded or not */
+    private boolean isBinded = false;
+
+    private String SERVICE_BIND_AIDL = Main.SERVICE_BIND_AIDL;
+
+    protected ServiceListener rcsListener = null;
+
+    protected Context context = null;
+
+    protected boolean isNormallyClosed = false;
+
+    protected int reconnectionTimes = 1;
+
+    protected final int MAX_RECONECTION_TIMES = 5;
+
+    private static ServiceApi instance;
+
+    private static IServiceApi serviceApi;
+
+    private ServiceApi() {
+    }
+
+    public synchronized static ServiceApi getInstance() {
+        if (null == instance) {
+            instance = new ServiceApi();
+        }
+        return instance;
+    }
+
+    public Context getContext() {
+        return context;
+    }
+
+    public static IServiceApi getServiceApi() throws ServiceDisconnectedException {
+        VerificationUtil.ApiIsNull(serviceApi);
+        return serviceApi;
+    }
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+                LogHelper.d("service api disconnect service");
+                serviceApi = null;
+
+                reconnectionTimes = 1;
+                notifyServiceDisconnected();
+            } else {
+                LogHelper.d("illegal call serviceApi api disconnect service :" + reconnectionTimes);
+                init(context, rcsListener);
+                if (!isBinded()) {
+                    // app is uninstalled
+                    serviceApi = null;
+
+                    notifyServiceDisconnected();
+                }
+                reconnectionTimes++;
+            }
+        }
+
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            serviceApi = IServiceApi.Stub.asInterface(service);
+
+            reconnectionTimes = 1;
+            notifyServiceConnected();
+            LogHelper.d("IServiceApi have success connect");
+        }
+    };
+
+    /**
+     * judge the bind state about remote service.
+     *
+     * @return true if binded, return false if unbinded.
+     */
+    public boolean isBinded() {
+        return isBinded;
+    }
+
+    public void init(Context context, ServiceListener listener) {
+        this.rcsListener = listener;
+        this.context = context;
+        Intent intent = new Intent();
+        // intent.setAction(serviceName);
+        intent.setClassName(Main.PACKAGE_NAME, SERVICE_BIND_AIDL);
+        isBinded = context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+        LogHelper.d("bind " + SERVICE_BIND_AIDL + "--> result:" + isBinded);
+    }
+
+    public void destory(Context context) {
+        try {
+            if (isBinded) {
+                LogHelper.d("destory()--> to destroy service : " + SERVICE_BIND_AIDL);
+                isNormallyClosed = true;
+                context.unbindService(mConnection);
+            } else {
+                LogHelper.i("destory()--> service(" + SERVICE_BIND_AIDL
+                        + ") already unbinded, do not need to destroy.");
+            }
+        } catch (Exception e) {
+            LogHelper.e("unbind " + SERVICE_BIND_AIDL + "--> result:" + e.getMessage(), e);
+        } finally {
+            isBinded = 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/RCSServiceListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/ServiceListener.java
similarity index 85%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/RCSServiceListener.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/ServiceListener.java
index 3800d3c..9eb0348 100644
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/RCSServiceListener.java
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/ServiceListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -23,7 +23,8 @@
 
 package com.suntek.mway.rcs.client.api;
 
-import com.suntek.mway.rcs.client.aidl.IRCSServiceListener;
+import com.suntek.mway.rcs.client.aidl.service.IServiceListener;
 
-public abstract class RCSServiceListener extends IRCSServiceListener.Stub {
+public abstract class ServiceListener extends IServiceListener.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
deleted file mode 100644
index ae85384..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/RcsAccountApi.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * 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.aidl.setting.IRcsSettingApi;
-import com.suntek.mway.rcs.client.aidl.setting.LoginUser;
-import com.suntek.mway.rcs.client.aidl.setting.RcsUserProfileInfo;
-import com.suntek.mway.rcs.client.aidl.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
deleted file mode 100644
index f412b1d..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/callback/AccountEventListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.aidl.setting.callback.IAccountEventListener;
-
-public abstract class AccountEventListener extends IAccountEventListener.Stub {
-
-}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/basic/BasicApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/basic/BasicApi.java
new file mode 100644
index 0000000..a7b1165
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/basic/BasicApi.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2015 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.basic;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.ServiceApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+public class BasicApi {
+
+    private static BasicApi instance;
+
+    private BasicApi() {
+
+    }
+
+    public synchronized static BasicApi getInstance() {
+        if (instance == null) {
+            instance = new BasicApi();
+        }
+        return instance;
+    }
+
+    public void login(String account) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().login(account);
+    }
+
+    public void logout() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().logout();
+    }
+
+    public void startPluginCenter() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().startPluginCenter();
+    }
+
+    public void openAccount() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().openAccount();
+    }
+
+    public void rejectOpenAccount() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().rejectOpenAccount();
+    }
+
+    public void getConfigurationWithOtp(String otpCode) throws RemoteException,
+            ServiceDisconnectedException {
+        ServiceApi.getServiceApi().getConfigurationWithOtp(otpCode);
+    }
+
+    public String getAccount() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getAccount();
+    }
+
+    public boolean isOnline() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().isOnline();
+    }
+
+    public void startService() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().startService();
+    }
+
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/blacklist/BlackListApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/blacklist/BlackListApi.java
new file mode 100644
index 0000000..89dd714
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/blacklist/BlackListApi.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2015 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;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.ServiceApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+import java.util.List;
+
+public class BlackListApi {
+
+    private static BlackListApi instance;
+
+    private BlackListApi() {
+
+    }
+
+    public synchronized static BlackListApi getInstance() {
+        if (instance == null) {
+            instance = new BlackListApi();
+        }
+        return instance;
+    }
+
+    public boolean addBlacklist(String number, String name) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().addBlacklist(number, name);
+    }
+
+    public boolean isBlacklist(String number) throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().isBlacklist(number);
+    }
+
+    public void clearBlacklist() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().clearBlacklist();
+    }
+
+    public List<String> getBlacklist() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getBlacklist();
+    }
+
+    public boolean deleteBlacklist(String number) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().deleteBlacklist(number);
+    }
+
+}
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
deleted file mode 100644
index 874ee90..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/blacklist/impl/BlackListApi.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * 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.aidl.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;
-    }
-
-    public void setProviderUri(String authorities, boolean bFirewall)
-            throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        try {
-            myApi.setProviderUri(authorities, bFirewall);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/CapabilityApi.java
similarity index 61%
copy from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
copy to rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/CapabilityApi.java
index 0ad1ce0..9aa00da 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/CapabilityApi.java
@@ -21,14 +21,31 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.im;
+package com.suntek.mway.rcs.client.api.capability;
 
-public class OprResponse {
+import android.os.RemoteException;
 
-    public static final int SUCCESS = 200;
+import com.suntek.mway.rcs.client.api.ServiceApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
 
-    public static final int OFFLINE = 900;
+public class CapabilityApi {
 
-    public static final int OTHRE_ERROR = 999;
+    private static CapabilityApi instance;
+
+    private CapabilityApi() {
+
+    }
+
+    public synchronized static CapabilityApi getInstance() {
+        if (instance == null) {
+            instance = new CapabilityApi();
+        }
+        return instance;
+    }
+
+    public void getCapability(String number, boolean fromServer, CapabiltyListener listener) throws RemoteException,
+            ServiceDisconnectedException {
+        ServiceApi.getServiceApi().getCapability(number, fromServer, listener);
+    }
 
 }
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/CapabiltyListener.java
similarity index 90%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/callback/CapabiltyListener.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/CapabiltyListener.java
index 2033906..48e4773 100644
--- 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/CapabiltyListener.java
@@ -21,9 +21,9 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.capability.callback;
+package com.suntek.mway.rcs.client.api.capability;
 
-import com.suntek.mway.rcs.client.aidl.plugin.callback.ICapabiltyListener;
+import com.suntek.mway.rcs.client.aidl.service.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
deleted file mode 100644
index 1ac55f4..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/impl/CapabilityApi.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * 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 android.util.Log;
-
-import com.suntek.mway.rcs.client.api.ClientApi;
-import com.suntek.mway.rcs.client.aidl.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);
-
-        Log.d("_rcs_", String.format(Locale.getDefault(),
-                "enter method findCapabilityByNumber. [number]=%s", number));
-
-        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/cloudfile/CloudFileApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/cloudfile/CloudFileApi.java
new file mode 100644
index 0000000..d2c84d9
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/cloudfile/CloudFileApi.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2015 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.cloudfile;
+
+import android.os.RemoteException;
+import android.text.TextUtils;
+
+import com.suntek.mway.rcs.client.aidl.plugin.callback.ICloudOperationCtrl;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile.FileNode;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile.TransNode;
+import com.suntek.mway.rcs.client.api.PluginApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.log.LogHelper;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+public class CloudFileApi {
+
+    private static CloudFileApi instance;
+
+    private CloudFileApi() {
+
+    }
+
+    public synchronized static CloudFileApi getInstance() {
+        if (instance == null) {
+            instance = new CloudFileApi();
+        }
+        return instance;
+    }
+
+    public ICloudOperationCtrl downloadFileFromUrl(String remoteUrl, String fileName,
+            TransNode.TransOper transOper, long chatMessageId) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().downloadFileFromUrl(remoteUrl, fileName, transOper.ordinal(),
+                chatMessageId);
+    }
+
+    public String getLocalRootPath() throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getLocalRootPath();
+    }
+
+    public void getRemoteFileList(String remotePath, int beginIndex,
+            int endIndex, FileNode.Order fileOrder)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().getRemoteFileList(
+                remotePath, beginIndex, endIndex, fileOrder.ordinal());
+    }
+
+    public void getShareFileList(int beginIndex, int endIndex) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().getShareFileList(beginIndex, endIndex);
+    }
+
+    public ICloudOperationCtrl putFile(String localPath, String remotePath, TransNode.TransOper transOper)
+            throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().putFile(localPath, remotePath, transOper.ordinal());
+    }
+
+    public void shareFile(String fileId, String shareDesc) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().shareFile(fileId, shareDesc);
+    }
+
+    public void shareFileAndSend(String fileId, String shareDesc, String number,
+            long threadId, String smsContentTemp, int barCycle) throws RemoteException,
+            ServiceDisconnectedException {
+        LogHelper
+        .i(String.format(
+                Locale.getDefault(),
+                "enter method shareFileAndSend. [fileId,shareDesc,number,threadId,"
+                        + "smsContentTemp,barCycle]=%s,%s,%s,%d,%s,%d",
+                        fileId, shareDesc, number, threadId, smsContentTemp, barCycle));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+        }
+        if (TextUtils.isEmpty(fileId)) {
+            LogHelper.i("fileId is empty");
+        }
+
+        number = VerificationUtil.formatNumber(number);
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        PluginApi.getPluginApi().shareFileAndSend(fileId, shareDesc, numberList, threadId,
+                smsContentTemp, barCycle);
+    }
+
+    public void shareFileAndSend(String fileId, String shareDesc, List<String> numberList,
+            long threadId, String smsContentTemp, int barCycle) throws RemoteException,
+            ServiceDisconnectedException {
+        LogHelper
+        .i(String.format(
+                Locale.getDefault(),
+                "enter method shareFileAndSend. [fileId,shareDesc,numberList,threadId,"
+                + "smsContentTemp,barCycle]=%s,%s,%s,%d,%s,%d",
+                fileId, shareDesc, VerificationUtil.getNumberListString(numberList),
+                threadId, smsContentTemp, barCycle));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+        }
+        if (TextUtils.isEmpty(fileId)) {
+            LogHelper.i("fileId is empty");
+        }
+
+        numberList = VerificationUtil.formatNumbers(numberList);
+        PluginApi.getPluginApi().shareFileAndSend(fileId, shareDesc, numberList, threadId,
+                smsContentTemp, barCycle);
+    }
+
+    public void shareFileAndSendGroup(String fileId, String shareDesc, long threadId, long groupId)
+            throws RemoteException, ServiceDisconnectedException  {
+        LogHelper
+        .i(String.format(
+                Locale.getDefault(),
+                "enter method shareFileAndSendGroup. [fileId,shareDesc,threadId,groupId]" +
+                "=%s,%s,%d,%d",
+                fileId, shareDesc, threadId, groupId));
+        if (TextUtils.isEmpty(fileId)) {
+            LogHelper.i("fileId is empty");
+        }
+        PluginApi.getPluginApi().shareFileAndSendGroup(fileId, shareDesc, threadId, groupId);
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/contact/ContactApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/contact/ContactApi.java
new file mode 100644
index 0000000..c43cdaa
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/contact/ContactApi.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2015 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.contact;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.aidl.plugin.callback.IContactSyncListener;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.contact.IntervalAction;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.contact.SyncAction;
+import com.suntek.mway.rcs.client.api.PluginApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+public class ContactApi {
+
+    private static ContactApi instance;
+
+    private ContactApi() {
+
+    }
+
+    public synchronized static ContactApi getInstance() {
+        if (instance == null) {
+            instance = new ContactApi();
+        }
+        return instance;
+    }
+
+    public void cancelIntervalSync() throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().cancelIntervalSync();
+    }
+
+    public void doSync(SyncAction syncAction, IContactSyncListener listener) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().doSync(syncAction.ordinal(), listener);
+    }
+
+    public int getAutoSync() throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getAutoSync();
+    }
+
+    public boolean getEnableAutoSync() throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getEnableAutoSync();
+    }
+
+    public int getIntervalSyncMode() throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getIntervalSyncMode();
+    }
+
+    public int getLocalContactCounts() throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getLocalContactCounts();
+    }
+
+    public boolean getOnlySyncEnableViaWifi()
+            throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getOnlySyncEnableViaWifi();
+    }
+
+    public int getRemoteContactCounts() throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getRemoteContactCounts();
+    }
+
+    public void setEnableAutoSync(boolean status, SyncAction syncAction) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().setEnableAutoSync(status, syncAction.ordinal());
+    }
+
+    public void setOnlySyncEnableViaWifi(boolean status) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().setOnlySyncEnableViaWifi(status);
+    }
+
+    public void startIntervalSync(SyncAction syncAction, IntervalAction intervalAction, long time)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().startIntervalSync(syncAction.ordinal(), intervalAction.ordinal(), time);
+    }
+}
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
index d7acbc6..59230f3 100644
--- 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
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -23,318 +23,94 @@
 
 package com.suntek.mway.rcs.client.api.emoticon;
 
-import com.suntek.mway.rcs.client.aidl.emoticon.IEmoticonApi;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IEmoticonCallbackApi;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IEmoticonPackagesNetCallbackApi;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IEmoticonSetSuccessDownListener;
+import android.os.RemoteException;
+
 import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmojiPackageBO;
 import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmoticonBO;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.UserBO;
-import com.suntek.mway.rcs.client.api.ClientApi;
-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;
-
-import android.content.ComponentName;
-import android.content.ServiceConnection;
-import android.os.IBinder;
+import com.suntek.mway.rcs.client.api.PluginApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
 
 import java.util.List;
-import java.util.Locale;
 
-public class EmoticonApi extends ClientApi {
-    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.emoticon.EmoticonApiService";
+public class EmoticonApi {
 
-    IEmoticonApi myApi;
+    private static EmoticonApi instance;
 
-    private ServiceConnection mConnection = new ServiceConnection() {
-        public void onServiceConnected(ComponentName className, IBinder service) {
-            LogHelper.d("client api connect service");
-            notifyServiceConnected();
-            myApi = IEmoticonApi.Stub.asInterface(service);
-        }
+    private EmoticonApi() {
 
-        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);
+    public synchronized static EmoticonApi getInstance() {
+        if (instance == null) {
+            instance = new EmoticonApi();
         }
-        return null;
+        return instance;
     }
 
-    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 byte[] decrypt2Bytes(String emoticonId, int emoFileType) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().decrypt2Bytes(emoticonId, emoFileType);
     }
 
-    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 EmojiPackageBO getEmojiPackage(String packageId) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getEmojiPackage(packageId);
     }
 
-    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 EmojiPackageBO getEmojiPackageWithDetail(String packageId) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getEmojiPackageWithDetail(packageId);
     }
 
-    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 EmoticonBO getEmoticon(String emoticonId) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getEmoticon(emoticonId);
     }
 
-    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 String getStorageRootPath() throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getStorageRootPath();
     }
 
-    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 boolean isCanSend(String emoticonId) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().isCanSend(emoticonId);
     }
 
-    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 boolean isEmojiPackageExist(String packageId) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().isEmojiPackageExist(packageId);
     }
 
-    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 isEmojiStoreInstall() throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().isEmojiStoreInstall();
     }
 
-    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 List<EmojiPackageBO> queryEmojiPackages() throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().queryEmojiPackages();
     }
 
-    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 List<EmojiPackageBO> queryEmojiPackagesWithDetail() throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().queryEmojiPackagesWithDetail();
     }
 
-    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 List<EmoticonBO> queryEmoticonName(String emoticonName) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().queryEmoticonName(emoticonName);
     }
 
-    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 List<EmoticonBO> queryEmoticons(String packageId) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().queryEmoticons(packageId);
     }
 
-    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 startEmojiStoreApp() throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().startEmojiStoreApp();
     }
 
-    public boolean isCanSend(String emoticonId) throws ServiceDisconnectedException {
-        LogHelper.i(String.format(Locale.getDefault(), "enter method:isCanSend. [emoticonId]=%s",
-                emoticonId));
-        VerificationUtil.ApiIsNull(myApi);
-        try {
-            return myApi.isCanSend(emoticonId);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return false;
-    }
-
-    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);
-        }
-    }
-
-    public boolean isEmojiStoreInstall() throws ServiceDisconnectedException {
-        LogHelper.i(String.format(Locale.getDefault(), "enter method:isEmojiStoreInstall. "));
-        VerificationUtil.ApiIsNull(myApi);
-
-        boolean flag = false;
-        try {
-            flag = myApi.isEmojiStoreInstall();
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-
-        return flag;
-    }
-
-    public void startEmojiStoreApp() throws ServiceDisconnectedException {
-        LogHelper.i(String.format(Locale.getDefault(), "enter method:startEmojiStoreApp. "));
-        VerificationUtil.ApiIsNull(myApi);
-        try {
-            myApi.startEmojiStoreApp();
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
+    public void downloadEmoticon(String emoticonId, long messageRowId)
+            throws RemoteException, ServiceDisconnectedException{
+        PluginApi.getPluginApi().downloadEmoticon(emoticonId, messageRowId);
     }
 }
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/exception/FileDurationException.java
similarity index 96%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileDurationException.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/FileDurationException.java
index f6c55e1..78c992a 100644
--- 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/exception/FileDurationException.java
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.util;
+package com.suntek.mway.rcs.client.api.exception;
 
 public class FileDurationException extends Exception {
 
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/exception/FileNotExistsException.java
similarity index 76%
copy from rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileTransferException.java
copy to rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/FileNotExistsException.java
index 9b1af80..5a31c30 100644
--- 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/exception/FileNotExistsException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,25 +21,25 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.util;
+package com.suntek.mway.rcs.client.api.exception;
 
-public class FileTransferException extends Exception {
+public class FileNotExistsException extends Exception {
 
     private static final long serialVersionUID = 1L;
 
-    public FileTransferException() {
+    public FileNotExistsException() {
         super();
     }
 
-    public FileTransferException(String detailMessage, Throwable throwable) {
+    public FileNotExistsException(String detailMessage, Throwable throwable) {
         super(detailMessage, throwable);
     }
 
-    public FileTransferException(String detailMessage) {
+    public FileNotExistsException(String detailMessage) {
         super(detailMessage);
     }
 
-    public FileTransferException(Throwable throwable) {
+    public FileNotExistsException(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/exception/FileSuffixException.java
similarity index 93%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileSuffixException.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/FileSuffixException.java
index 0ebc25a..58985ae 100644
--- 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/exception/FileSuffixException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,7 +21,7 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.util;
+package com.suntek.mway.rcs.client.api.exception;
 
 public class FileSuffixException extends Exception {
 
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/exception/FileTooLargeException.java
similarity index 81%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileTransferException.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/FileTooLargeException.java
index 9b1af80..82c038f 100644
--- 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/exception/FileTooLargeException.java
@@ -21,25 +21,25 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.util;
+package com.suntek.mway.rcs.client.api.exception;
 
-public class FileTransferException extends Exception {
+public class FileTooLargeException extends Exception {
 
     private static final long serialVersionUID = 1L;
 
-    public FileTransferException() {
+    public FileTooLargeException() {
         super();
     }
 
-    public FileTransferException(String detailMessage, Throwable throwable) {
+    public FileTooLargeException(String detailMessage, Throwable throwable) {
         super(detailMessage, throwable);
     }
 
-    public FileTransferException(String detailMessage) {
+    public FileTooLargeException(String detailMessage) {
         super(detailMessage);
     }
 
-    public FileTransferException(Throwable throwable) {
+    public FileTooLargeException(Throwable throwable) {
         super(throwable);
     }
 
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
deleted file mode 100644
index f60527c..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/MemberFullException.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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
deleted file mode 100644
index aaadcdf..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/OperatorException.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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/util/ServiceDisconnectedException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/ServiceDisconnectedException.java
similarity index 87%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/util/ServiceDisconnectedException.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/exception/ServiceDisconnectedException.java
index 711dc0d..45746e7 100644
--- 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/exception/ServiceDisconnectedException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -21,9 +21,15 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.util;
+package com.suntek.mway.rcs.client.api.exception;
 
 public class ServiceDisconnectedException extends Exception {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
     public ServiceDisconnectedException() {
     }
 
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/groupchat/GroupChatApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/groupchat/GroupChatApi.java
new file mode 100644
index 0000000..fd3c5bd
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/groupchat/GroupChatApi.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2015 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.groupchat;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.aidl.service.entity.GroupChat;
+import com.suntek.mway.rcs.client.aidl.service.entity.GroupChatMember;
+import com.suntek.mway.rcs.client.api.ServiceApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+import java.util.List;
+
+public class GroupChatApi {
+
+    private static GroupChatApi instance;
+
+    private GroupChatApi() {
+
+    }
+
+    public synchronized static GroupChatApi getInstance() {
+        if (instance == null) {
+            instance = new GroupChatApi();
+        }
+        return instance;
+    }
+
+    public List<GroupChat> getAllGroupChat() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getAllGroupChat();
+    }
+
+    public GroupChat getGroupChatById(long groupChatId) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getGroupChatById(groupChatId);
+    }
+
+    public GroupChat getGroupChatByThreadId(long threadId) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getGroupChatByThreadId(threadId);
+    }
+
+    public GroupChatMember getMember(long groupChatId, String number) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getMember(groupChatId, number);
+    }
+
+    public List<GroupChatMember> getMembers(long groupChatId) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getMembers(groupChatId);
+    }
+
+    public List<GroupChatMember> getMembersAllowChairman(long groupChatId) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getMembersAllowChairman(groupChatId);
+    }
+
+    public void getMemberAvatarFromServer(long groupChatId, String number, int pixel,
+            GroupChatCallback callback) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().getMemberAvatarFromServer(groupChatId, number, pixel, callback);
+    }
+
+    public void getMemberAvatar(long groupChatId, String number, int pixel,
+            GroupChatCallback callback) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().getMemberAvatar(groupChatId, number, pixel, callback);
+    }
+
+    public int deleteGroupChat(long[] threadIds) throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().deleteGroupChat(threadIds);
+    }
+
+    public int deleteAllGroupChat() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().deleteAllGroupChat();
+    }
+
+    public long create(String subject, List<String> users) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().create(subject, users);
+    }
+
+    public int acceptToJoin(long groupChatId)
+            throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().acceptToJoin(groupChatId);
+    }
+
+    public int rejectToJoin(long groupChatId)
+            throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().rejectToJoin(groupChatId);
+    }
+
+    public int assignChairman(long groupChatId, String number) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().assignChairman(groupChatId, number);
+    }
+
+    public int disband(long groupChatId) throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().disband(groupChatId);
+    }
+
+    public int invite(long groupChatId, List<String> numberList) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().invite(groupChatId, numberList);
+    }
+
+    public int kickOut(long groupChatId, String number) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().kickOut(groupChatId, number);
+    }
+
+    public int quit(long groupChatId) throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().quit(groupChatId);
+    }
+
+    public int setMyAlias(long groupChatId, String alias) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().setMyAlias(groupChatId, alias);
+    }
+
+    public int setSubject(long groupChatId, String subject) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().setSubject(groupChatId, subject);
+    }
+
+    public int setRemarks(long groupChatId, String remarks) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().setRemarks(groupChatId, remarks);
+    }
+
+    public void setGroupChatRemindPolicy(long groupChatId, int policy) throws RemoteException,
+            ServiceDisconnectedException {
+        ServiceApi.getServiceApi().setGroupChatRemindPolicy(groupChatId, policy);
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/groupchat/GroupChatCallback.java
similarity index 84%
rename from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/groupchat/GroupChatCallback.java
index 0ad1ce0..9edcb42 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/groupchat/GroupChatCallback.java
@@ -21,14 +21,10 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.im;
+package com.suntek.mway.rcs.client.api.groupchat;
 
-public class OprResponse {
+import com.suntek.mway.rcs.client.aidl.service.callback.IGroupChatCallback;
 
-    public static final int SUCCESS = 200;
-
-    public static final int OFFLINE = 900;
-
-    public static final int OTHRE_ERROR = 999;
+public abstract class GroupChatCallback extends IGroupChatCallback.Stub {
 
 }
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
deleted file mode 100644
index da4b426..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/im/impl/MessageApi.java
+++ /dev/null
@@ -1,1944 +0,0 @@
-/*
- * 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 com.suntek.mway.rcs.client.aidl.constant.APIConstant;
-import com.suntek.mway.rcs.client.aidl.contacts.RCSContact;
-import com.suntek.mway.rcs.client.aidl.im.IInstantMessageApi;
-import com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData;
-import com.suntek.mway.rcs.client.aidl.provider.model.ChatMessage;
-import com.suntek.mway.rcs.client.aidl.provider.model.FavoriteMessage;
-import com.suntek.mway.rcs.client.aidl.provider.model.GroupChatModel;
-import com.suntek.mway.rcs.client.aidl.provider.model.MessageSessionModel;
-import com.suntek.mway.rcs.client.aidl.provider.model.SimpleMsg;
-import com.suntek.mway.rcs.client.aidl.provider.model.TopMessageData;
-import com.suntek.mway.rcs.client.api.ClientApi;
-import com.suntek.mway.rcs.client.api.exception.OperatorException;
-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.OrderTimeAboutExpireException;
-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;
-
-import android.content.ComponentName;
-import android.content.ServiceConnection;
-import android.os.IBinder;
-import android.text.TextUtils;
-
-import java.util.List;
-import java.util.Locale;
-
-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 emoName)
-            throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method sendPaidEmo. [thread_id,sms_id,number,emoid,emoName]=%d,%d,%s,%s,%s",
-                thread_id, sms_id, number, emoid, emoName));
-        if (!VerificationUtil.isNumber(number)) {
-            LogHelper.i("number field value error");
-            return;
-        }
-        try {
-            myApi.sendPaidEmo(thread_id, sms_id, number, emoid, emoName);
-        } 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, this.getImageFtMaxSize());
-        }
-
-        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, this.getAudioMaxTime(),
-                    recordTime);
-        }
-        VerificationUtil.isFileSizeToLarge(filePath, this.getVideoFtMaxSize());
-        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, this.getVideoMaxTime(),
-                    length);
-        }
-        VerificationUtil.isFileSizeToLarge(filePath, this.getVideoFtMaxSize());
-        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, this.getImageFtMaxSize());
-        }
-
-        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, this.getAudioMaxTime(),
-                    recordTime);
-        }
-        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoFtMaxSize());
-        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, this.getVideoMaxTime(),
-                    length);
-        }
-        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoFtMaxSize());
-        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 boolean removeButRemainLockMessageByThreadId(long threadId)
-            throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method removeButRemainLockMessageByThreadId. [threadId]=%d", threadId));
-        try {
-            myApi.removeButRemainLockMessageByThreadId(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 void removeAllButRemainLockMessage() throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method removeAllButRemainLockMessage. "));
-        try {
-            myApi.removeAllButRemainLockMessage();
-        } 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 emoName, String groupId) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method:sendGroupPaidEmo. [thread_id,conversationId,sms_id,emoid,emoName,groupId]=%d,%s,%d,%s,%s,%s",
-                        thread_id, conversationId, sms_id, emoid, emoName, groupId));
-        try {
-            myApi.sendGroupPaidEmo(thread_id, conversationId, sms_id, emoid, emoName, groupId);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void sendOne2ManyPaidEmoMessage(long thread_id, long sms_id, List<String> numbers,
-            String emoid, String emoName) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method:sendOne2ManyPaidEmoMessage. [thread_id,sms_id,numbers,emoid,emoName]=%d,%d,%s,%s,%s",
-                        thread_id, sms_id, numbers.toString(), emoid, emoName));
-        if (!VerificationUtil.isAllNumber(numbers)) {
-            LogHelper.i("number field value error");
-            return;
-        }
-        try {
-            myApi.sendOne2ManyPaidEmoMessage(thread_id, sms_id,
-                    VerificationUtil.formatNumbers(numbers), emoid, emoName);
-        } 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 int lockMessageById(String id) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(Locale.getDefault(), "enter method:lockMessageById. [id]=%s", id));
-        try {
-            return myApi.lockMessageById(id);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return 0;
-    }
-
-    public int unlockMessageById(String id) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(), "enter method:unlockMessageById. [id]=%s",
-                id));
-        try {
-            return myApi.unlockMessageById(id);
-        } 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);
-        }
-    }
-
-    public void removeButRemainLockMsgWithNotificationByThread(long threadId)
-            throws ServiceDisconnectedException {
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:removeButRemainLockMsgWithNotificationByThread. [threadId]=%d",
-                threadId));
-        VerificationUtil.ApiIsNull(myApi);
-        try {
-            myApi.removeButRemainLockMsgWithNotificationByThread(threadId);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void backupMessageList(List<SimpleMsg> simpleMsgList)
-            throws ServiceDisconnectedException {
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter  method:backupMessageList. [simpleMsgList]=%s", simpleMsgList.toString()));
-        VerificationUtil.ApiIsNull(myApi);
-        try {
-            myApi.backupMessageList(simpleMsgList);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public ChatMessage getMessageByTransferId(String transferId)
-            throws ServiceDisconnectedException {
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getMessageByTransferId. [transferId]=%s", transferId));
-        VerificationUtil.ApiIsNull(myApi);
-        try {
-            return myApi.getMessageByTransferId(transferId);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return null;
-    }
-
-    public void cancelBackup() throws ServiceDisconnectedException {
-        LogHelper.i("enter method:cancelBackup.");
-        VerificationUtil.ApiIsNull(myApi);
-        try {
-            myApi.cancelBackup();
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void forwardImageFile(long thread_id, long sms_id, String number, String id,
-            int burnFlag, int barCycle) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method forwardImageFile. [thread_id,sms_id,number,id,burnFlag,barCycle]=%d,%d,%s,%s,%d,%d",
-                        thread_id, sms_id, number, id, burnFlag, barCycle));
-
-        if (TextUtils.isEmpty(id)) {
-            LogHelper.i("id field value error");
-            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.forwardImageFile(thread_id, sms_id, VerificationUtil.formatNumber(number), id,
-                    burnFlag, barCycle);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void forwardVideoFile(long thread_id, long sms_id, String number, String id, int length,
-            int burnFlag, int barCycle, boolean isRecord) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method forwardVideoFile. [thread_id,sms_id,number,id,length,burnFlag,barCycle,isRecord]=%d,%d,%s,%s,%d,%d,%d,%b",
-                        thread_id, sms_id, number, id, length, burnFlag, barCycle, isRecord));
-
-        if (TextUtils.isEmpty(id)) {
-            LogHelper.i("id field value error");
-            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.forwardVideoFile(thread_id, sms_id, VerificationUtil.formatNumber(number), id,
-                    length, burnFlag, barCycle);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void forwardOne2ManyImageFile(long thread_id, long sms_id, List<String> numbers,
-            String id, int burnFlag, int barCycle) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method forwardOne2ManyImageFile. [thread_id,sms_id,numbers,id,burnFlag,barCycle]=%d,%d,%s,%s,%d,%d",
-                        thread_id, sms_id, numbers.toString(), id, burnFlag, barCycle));
-
-        if (TextUtils.isEmpty(id)) {
-            LogHelper.i("id field value error");
-            return;
-        }
-
-        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.forwardOne2ManyImageFile(thread_id, sms_id,
-                    VerificationUtil.formatNumbers(numbers), id, burnFlag, barCycle);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void forwardOne2ManyVideoFile(long thread_id, long sms_id, List<String> numbers,
-            String id, int length, int burnFlag, int barCycle, boolean isRecord)
-            throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method forwardOne2ManyVideoFile. [thread_id,sms_id,numbers,id,length,burnFlag,barCycle,isRecord]=%d,%d,%s,%s,%d,%d,%d,%b",
-                        thread_id, sms_id, numbers.toString(), id, length, burnFlag, barCycle,
-                        isRecord));
-
-        if (TextUtils.isEmpty(id)) {
-            LogHelper.i("id field value error");
-            return;
-        }
-
-        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.forwardOne2ManyVideoFile(thread_id, sms_id,
-                    VerificationUtil.formatNumbers(numbers), id, length, burnFlag, barCycle);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void forwardGroupImageFile(long thread_id, String conversationId, long sms_id,
-            String id, String groupId) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method forwardGroupImageFile. [thread_id,conversationId,sms_id,id,groupId]=%d,%s,%d,%s,%s",
-                        thread_id, conversationId, sms_id, id, groupId));
-
-        if (TextUtils.isEmpty(id)) {
-            LogHelper.i("id field value error");
-            return;
-        }
-
-        try {
-            myApi.forwardGroupImageFile(thread_id, conversationId, sms_id, id, groupId);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void forwardGroupVideoFile(long thread_id, String conversationId, long sms_id,
-            String id, int length, String groupId, boolean isRecord)
-            throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method forwardGroupVideoFile. [thread_id,conversationId,sms_id,id,length,groupId,isRecord]=%d,%s,%d,%s,%d,%s,%b",
-                        thread_id, conversationId, sms_id, id, length, groupId, isRecord));
-
-        if (TextUtils.isEmpty(id)) {
-            LogHelper.i("id field value error");
-            return;
-        }
-
-        try {
-            myApi.forwardGroupVideoFile(thread_id, conversationId, sms_id, id, length, groupId);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void sendTextMessageAtTime(long thread_id, String number, String text, int burnFlag,
-            int barCycle, long orderTime) throws ServiceDisconnectedException,
-            OrderTimeAboutExpireException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method sendTextMessage. [thread_id,number,text,burnFlag,barCycle,orderTime]=%d,%s,%s,%d,%d,%d",
-                        thread_id, number, text, burnFlag, barCycle, orderTime));
-        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;
-        }
-        if (!VerificationUtil.isOrderTimeExpired(orderTime)) {
-            LogHelper.i("order time is about to expire");
-            throw new OrderTimeAboutExpireException(
-                    String.valueOf(SuntekMessageData.ORDER_TIME_EXPIRE_INTERVAL_SECOND));
-        }
-        try {
-            myApi.sendTextMessageAtTime(thread_id, VerificationUtil.formatNumber(number), text,
-                    burnFlag, barCycle, orderTime);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void sendOne2ManyTextMessageAtTime(long thread_id, List<String> numbers, String text,
-            int burnFlag, int barCycle, long orderTime) throws ServiceDisconnectedException,
-            OrderTimeAboutExpireException {
-        VerificationUtil.ApiIsNull(myApi);
-        if ("".equals(text.trim())) {
-            LogHelper.i("text value is null/Space");
-            return;
-        }
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method sendOne2ManyTextMessageAtTime. [thread_id,numbers,text,burnFlag,barCycle, orderTime]=%d,%s,%s,%d,%d,%d",
-                        thread_id, numbers.toString(), text, burnFlag, barCycle, orderTime));
-        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 (!VerificationUtil.isOrderTimeExpired(orderTime)) {
-            LogHelper.i("order time is about to expire");
-            throw new OrderTimeAboutExpireException(
-                    String.valueOf(SuntekMessageData.ORDER_TIME_EXPIRE_INTERVAL_SECOND));
-        }
-        try {
-            myApi.sendOne2ManyTextMessageAtTime(thread_id, VerificationUtil.formatNumbers(numbers),
-                    text, burnFlag, barCycle, orderTime);
-        } 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
deleted file mode 100644
index c0c6b39..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/im/impl/PaMessageApi.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * 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.aidl.contacts.RCSContact;
-import com.suntek.mway.rcs.client.aidl.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
deleted file mode 100644
index 2f32a50..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/impl/callback/ConferenceCallback.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.aidl.plugin.callback.IConferenceCallback;
-import com.suntek.mway.rcs.client.aidl.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
deleted file mode 100644
index 34cc391..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/impl/groupchat/ConfApi.java
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- * 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.aidl.im.IGroupManagerApi;
-import com.suntek.mway.rcs.client.aidl.im.OprResponse;
-import com.suntek.mway.rcs.client.api.impl.callback.ConferenceCallback;
-import com.suntek.mway.rcs.client.aidl.provider.model.GroupChatModel;
-import com.suntek.mway.rcs.client.aidl.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 int 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 {
-            return myApi.agreeToJoinGroup(conversationId, contributionId, chatUri, subject,
-                    numberData, inviteTime);
-        } catch (Exception ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    public int refuseToJoinGroup(String conversationId) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method refuseToJoinGroup. [conversationId]=%s", conversationId));
-        try {
-            return myApi.refuseToJoinGroup(conversationId);
-        } catch (Exception ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    public int 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 {
-            return myApi.updateGroupSubject(groupId, newSubject);
-        } catch (Exception ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    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 int disbandGroupChat(String groupId) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method disbandGroupChat. [groupId]=%s", groupId));
-        try {
-            return myApi.disbandGroupChat(groupId);
-        } catch (Exception ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    public int 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 {
-            return myApi.kickedOutOfGroupChat(groupId, number);
-        } catch (Exception ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    public int 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 {
-            return myApi.assignGroupChairman(groupId, number);
-        } catch (Exception ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    public int 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 {
-            return myApi.quitGroupChat(groupId, number);
-        } catch (Exception ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    @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 int 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 {
-            return myApi.setMyAlias(groupId, alias);
-        } catch (Exception ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    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 int 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 {
-            return myApi.inviteOneMemberToGroupChat(groupId, number);
-        } catch (RemoteException ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    public int 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 {
-            return myApi.inviteToJoinGroupChat(groupId, numbers);
-        } catch (RemoteException ex) {
-            // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    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 int 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 {
-            return myApi.refuseAssigedAsChairman(chatUri, inviteTime, conversationId,
-                    contributionId);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    public int 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 {
-            return myApi.acceptAssignedAsChairman(chatUri, inviteTime, conversationId,
-                    contributionId);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return OprResponse.OTHRE_ERROR;
-    }
-
-    public int rejoinGroupChat(String chatUri) throws ServiceDisconnectedException {
-        LogHelper.i(String.format(Locale.getDefault(), "enter rejoinGroupChat. [chatUri]=%s",
-                chatUri));
-        VerificationUtil.ApiIsNull(myApi);
-        try {
-            return myApi.rejoinGroupChat(chatUri);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return 0;
-    }
-}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/log/LogHelper.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/log/LogHelper.java
new file mode 100644
index 0000000..2e8e6b4
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/log/LogHelper.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2015 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.log;
+
+import android.util.Log;
+
+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;
+
+    /** 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";
+
+    /** 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());
+                // ERROR, WARN, INFO, DEBUG, VERBOSE
+                if (level == Log.VERBOSE) {
+                    Log.v(TAG, logText + "->" + str);
+                } else if (level == Log.DEBUG) {
+                    Log.d(TAG, logText + "->" + str);
+                } else if (level == Log.INFO) {
+                    Log.i(TAG, logText + "->" + str);
+                } else if (level == Log.WARN) {
+                    Log.w(TAG, logText + "->" + str);
+                } else if (level == Log.ERROR) {
+                    if (throwable != null) {
+                        Log.e(TAG, logText + "->" + str, throwable);
+                    } else {
+                        Log.e(TAG, 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;
+        }
+    }
+
+    /**
+     * 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/login/impl/LoginApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/login/impl/LoginApi.java
deleted file mode 100644
index 756b1a9..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/login/impl/LoginApi.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.aidl.login.ILoginApi;
-import com.suntek.mway.rcs.client.aidl.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
deleted file mode 100644
index 63701f2..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/login/impl/LoginEventListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.aidl.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
deleted file mode 100644
index 537401c..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/mcloud/McloudFileApi.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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 com.suntek.mway.rcs.client.aidl.mcloud.IMcloudFileApi;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IMcloudOperationCtrl;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile.FileNode;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcloudfile.TransNode;
-import com.suntek.mway.rcs.client.api.ClientApi;
-import com.suntek.mway.rcs.client.api.util.FileSuffixException;
-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;
-
-import android.content.ComponentName;
-import android.content.ServiceConnection;
-import android.os.IBinder;
-
-import java.util.List;
-import java.util.Locale;
-
-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 IMcloudOperationCtrl downloadFileFromUrl(String remoteUrl, String fileName,
-            TransNode.TransOper transOper, int chatMessageId) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method:downloadFileFromUrl. [remoteUrl,fileName,transOper,chatMessageId]=%s,%s,%d,%d",
-                        remoteUrl, fileName, transOper.ordinal(), chatMessageId));
-        try {
-            IMcloudOperationCtrl operation = myApi.downloadFileFromUrl(remoteUrl, fileName,
-                    transOper.ordinal(), chatMessageId);
-            LogHelper.d("operation=" + operation);
-            return operation;
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-            return null;
-        }
-    }
-
-    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 IMcloudOperationCtrl putFile(String localPath, String remotePath,
-            TransNode.TransOper transOper) throws ServiceDisconnectedException, FileSuffixException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:putFile. [localPath,remotePath,transOper]=%s,%s,%d", localPath,
-                remotePath, transOper.ordinal()));
-        VerificationUtil.isCloudFile(localPath);
-        try {
-            IMcloudOperationCtrl operation = myApi.putFile(localPath, remotePath,
-                    transOper.ordinal());
-            LogHelper.d("operation=" + operation);
-            return operation;
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-            return null;
-        }
-    }
-
-    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 smsContentTemp) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method:shareFileAndSend. [fullPathInID,shareDesc,contact,threadId,smsContentTemp]=%s,%s,%s,%d,%s",
-                        fullPathInID, shareDesc, contact, threadId, smsContentTemp));
-        try {
-            myApi.shareFileAndSend(fullPathInID, shareDesc, contact, threadId, smsContentTemp);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void shareFileAndSendGroup(String fullPathInID, String shareDesc, long threadId,
-            String conversationId, String groupId) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method:shareFileAndSendGroup. [fullPathInID,shareDesc,threadId,conversationId,groupId]=%s,%s,%d,%s,%s",
-                        fullPathInID, shareDesc, threadId, conversationId, groupId));
-        try {
-            myApi.shareFileAndSendGroup(fullPathInID, shareDesc, threadId, conversationId, groupId);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-    }
-
-    public void shareFileAndSendOne2Many(String fullPathInID, String shareDesc,
-            List<String> contacts, long threadId, String smsContentTemp)
-            throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(
-                        Locale.getDefault(),
-                        "enter method:shareFileAndSendOne2Many. [fullPathInID,shareDesc,contacts,threadId,smsContentTemp]=%s,%s,%s,%d,%s",
-                        fullPathInID, shareDesc, contacts.toString(), threadId, smsContentTemp));
-        try {
-            myApi.shareFileAndSendOne2Many(fullPathInID, shareDesc, contacts, threadId,
-                    smsContentTemp);
-        } 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);
-        }
-    }
-
-    public String getLocalRootPath() throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i("enter method:getLocalRootPath");
-        try {
-            return myApi.getLocalRootPath();
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-            return "";
-        }
-    }
-}
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
deleted file mode 100644
index 0c1bc8c..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/mcontact/McontactApi.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * 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.aidl.plugin.callback.IMContactSyncListener;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.mcontact.IntervalAction;
-import com.suntek.mway.rcs.client.aidl.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;
-import com.suntek.mway.rcs.client.aidl.mcontact.IMcontactApi;
-
-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/message/MessageApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/message/MessageApi.java
new file mode 100644
index 0000000..d5f48aa
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/message/MessageApi.java
@@ -0,0 +1,1013 @@
+/*
+ * Copyright (c) 2015 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 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. NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * THE SOFTWARE.
+ */
+
+package com.suntek.mway.rcs.client.api.message;
+
+import android.os.RemoteException;
+import android.text.TextUtils;
+
+import com.suntek.mway.rcs.client.aidl.constant.Constants.MessageConstants;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile.CloudFileMessage;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicMessage;
+import com.suntek.mway.rcs.client.aidl.service.entity.SimpleMessage;
+import com.suntek.mway.rcs.client.api.ServiceApi;
+import com.suntek.mway.rcs.client.api.exception.FileDurationException;
+import com.suntek.mway.rcs.client.api.exception.FileNotExistsException;
+import com.suntek.mway.rcs.client.api.exception.FileSuffixException;
+import com.suntek.mway.rcs.client.api.exception.FileTooLargeException;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.log.LogHelper;
+import com.suntek.mway.rcs.client.api.parse.CloudFileMessageParser;
+import com.suntek.mway.rcs.client.api.parse.PublicMediaMessageParser;
+import com.suntek.mway.rcs.client.api.parse.PublicTextMessageParser;
+import com.suntek.mway.rcs.client.api.parse.PublicTopicMessageParser;
+import com.suntek.mway.rcs.client.api.util.VerificationUtil;
+import com.suntek.mway.rcs.client.api.util.XmlUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+public class MessageApi {
+
+    private static MessageApi instance;
+
+    private MessageApi() {
+
+    }
+
+    public synchronized static MessageApi getInstance() {
+        if (instance == null) {
+            instance = new MessageApi();
+        }
+        return instance;
+    }
+
+    public void download(long id) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().download(id);
+    }
+
+    public void complain(long id) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().complain(id);
+    }
+
+    public void backupAll() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().backupAll();
+    }
+
+    public void backup(List<SimpleMessage> simpleMessageList) throws RemoteException,
+            ServiceDisconnectedException {
+        ServiceApi.getServiceApi().backup(simpleMessageList);
+    }
+
+    public void burnAll() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().burnAll();
+    }
+
+    public void burn(long id) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().burn(id, 0);
+    }
+
+    public void burn(long id, int delaySeconds) throws RemoteException,
+            ServiceDisconnectedException {
+        ServiceApi.getServiceApi().burn(id, delaySeconds);
+    }
+
+    public void cancelBackup() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().cancelBackup();
+    }
+
+    public void cancelCollect(List<SimpleMessage> simpleMessageList) throws RemoteException,
+            ServiceDisconnectedException {
+        ServiceApi.getServiceApi().cancelCollect(simpleMessageList);
+    }
+
+    public void cancelTopConversation(long threadId) throws RemoteException,
+            ServiceDisconnectedException {
+        ServiceApi.getServiceApi().cancelTopConversation(threadId);
+    }
+
+    public void collect(List<SimpleMessage> simpleMessageList) throws RemoteException,
+            ServiceDisconnectedException {
+        ServiceApi.getServiceApi().collect(simpleMessageList);
+    }
+
+    public long forward(long id, long threadId, String number, int barCycle)
+            throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method forward. [id,threadId,number,barCycle]=%d,%d,%s,%d", id,
+                threadId, number, barCycle));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        number = VerificationUtil.formatNumber(number);
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().forward(id, threadId, numberList, barCycle);
+    }
+
+    public long forward(long id, long threadId, List<String> numberList, int barCycle)
+            throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method forward. [id,threadId,numberList,barCycle]=%d,%d,%s,%d", id,
+                threadId, VerificationUtil.getNumberListString(numberList), barCycle));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+
+        numberList = VerificationUtil.formatNumbers(numberList);
+        return ServiceApi.getServiceApi().forward(id, threadId, numberList, barCycle);
+    }
+
+    public long forwardToGroupChat(long id, long threadId, long groupId) throws RemoteException,
+            ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method forwardToGroupChat. [id,threadId,groupId]=%d,%d,%d", id,
+                threadId, groupId));
+        return ServiceApi.getServiceApi().forwardToGroupChat(id, threadId, groupId);
+    }
+
+    public long getThreadId(String number) throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(), "enter method getThreadId. [number]=%s",
+                number));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        number = VerificationUtil.formatNumber(number);
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().getThreadId(numberList);
+    }
+
+    public long getThreadId(List<String> numberList) throws RemoteException,
+            ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(), "enter method getThreadId. [numberList]=%s",
+                VerificationUtil.getNumberListString(numberList)));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        numberList = VerificationUtil.formatNumbers(numberList);
+        return ServiceApi.getServiceApi().getThreadId(numberList);
+    }
+
+    public long getThreadIdForPublicAccount(String publicAccountId) throws RemoteException,
+            ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getThreadId. [publicAccountId]=%s", publicAccountId));
+        publicAccountId = VerificationUtil.getNumberFromUri(publicAccountId);
+        if (!VerificationUtil.isNumber(publicAccountId)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(publicAccountId);
+        return ServiceApi.getServiceApi().getThreadId(numberList);
+    }
+
+    public int getAudioMaxDuration() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getAudioMaxDuration();
+    }
+
+    public long getImageMaxSize() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getImageMaxSize();
+    }
+
+    public int getVideoMaxDuration() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getVideoMaxDuration();
+    }
+
+    public long getVideoMaxSize() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getVideoMaxSize();
+    }
+
+    public int getRemindPolicy() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getRemindPolicy();
+    }
+
+    public int getSendPolicy() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getSendPolicy();
+    }
+
+    public void pauseDownload(long id) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().pauseDownload(id);
+    }
+
+    public int recoverBlockedMessage(long blockedMessageId) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().recoverBlockedMessage(blockedMessageId);
+    }
+
+    public int recoverBlockedMessageByThreadId(long threadId) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().recoverBlockedMessageByThreadId(threadId);
+    }
+
+    public int deleteAllMessage() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().deleteAllMessage();
+    }
+
+    public int deleteMessageByThreadId(long threadId) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().deleteMessageByThreadId(threadId);
+    }
+
+    public int deleteMessage(long id) throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().deleteMessage(id);
+    }
+
+    public void restoreAll() throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().restoreAll();
+    }
+
+    public void startComposing(long threadId, String number, String contentType, int seconds)
+            throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().startComposing(threadId, number, contentType, seconds);
+    }
+
+    public void stopComposing(long threadId, String number, String contentType, long lastActive)
+            throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().stopComposing(threadId, number, contentType, lastActive);
+    }
+
+    public void resend(long id) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().resend(id);
+    }
+
+    public long sendText(String number, long threadId, String text, int barCycle)
+            throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendText. [number,threadId,text,barCycle]=%s,%d,%s,%d", number,
+                threadId, text, barCycle));
+        if ("".equals(text.trim())) {
+            LogHelper.i("text value is null/Space");
+            return 0L;
+        }
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        number = VerificationUtil.formatNumber(number);
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().sendText(numberList, threadId, text, barCycle);
+    }
+
+    public long sendText(List<String> numberList, long threadId, String text, int barCycle)
+            throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendText. [numberList,threadId,text,barCycle]=%s,%d,%s,%d",
+                VerificationUtil.getNumberListString(numberList), threadId, text, barCycle));
+        if ("".equals(text.trim())) {
+            LogHelper.i("text value is null/Space");
+            return 0L;
+        }
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+
+        numberList = VerificationUtil.formatNumbers(numberList);
+        return ServiceApi.getServiceApi().sendText(numberList, threadId, text, barCycle);
+    }
+
+    public long sendImage(String number, long threadId, String filepath, int quality,
+            boolean isRecord, int barCycle) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendImage. [number,threadId,filepath,quality,isRecord,barCycle]="
+                        +"%s,%d,%s,%d,%b,%d",
+                        number, threadId, filepath, quality, isRecord, barCycle));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        if (quality < 0 || quality > 100) {
+            LogHelper.i("quality field value must be between 0 to 100");
+            return 0L;
+        }
+
+        VerificationUtil.isImageFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+
+        if (quality == 100) {
+            VerificationUtil.isFileSizeToLarge(filepath, this.getImageMaxSize());
+        }
+
+        number = VerificationUtil.formatNumber(number);
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().sendImage(numberList, threadId, filepath, quality,
+                isRecord, barCycle);
+    }
+
+    public long sendImage(List<String> numberList, long threadId, String filepath, int quality,
+            boolean isRecord, int barCycle) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException {
+        LogHelper.i(String.format(Locale.getDefault(),
+            "enter method sendImage. [numberList,threadId,filepath,quality,isRecord,barCycle]="
+                    + "%s,%d,%s,%d,%b,%d",
+                    VerificationUtil.getNumberListString(numberList), threadId, filepath,
+                    quality, isRecord, barCycle));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        if (quality < 0 || quality > 100) {
+            LogHelper.i("quality field value must be between 0 to 100");
+            return 0L;
+        }
+
+        VerificationUtil.isImageFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        if (quality == 100) {
+            VerificationUtil.isFileSizeToLarge(filepath, this.getImageMaxSize());
+        }
+
+        numberList = VerificationUtil.formatNumbers(numberList);
+        return ServiceApi.getServiceApi().sendImage(numberList, threadId, filepath, quality,
+                isRecord, barCycle);
+    }
+
+    public long sendAudio(String number, long threadId, String filepath, int duration,
+            boolean isRecord, int barCycle) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException,
+            FileDurationException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendAudio. [number,threadId,filepath,duration,isRecord,barCycle]="
+                        + "%s,%d,%s,%d,%b,%d",
+                        number, threadId, filepath, duration, isRecord, barCycle));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+
+        VerificationUtil.isAudioFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        if (isRecord) {
+            VerificationUtil.isAudioDurationToLong(ServiceApi.getInstance().getContext(),
+                    filepath, this.getAudioMaxDuration(), duration);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoMaxSize());
+
+        number = VerificationUtil.formatNumber(number);
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().sendAudio(numberList, threadId, filepath, duration,
+                isRecord, barCycle);
+    }
+
+    public long sendAudio(List<String> numberList, long threadId, String filepath, int duration,
+            boolean isRecord, int barCycle) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException,
+            FileDurationException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendAudio. [numberList,threadId,filepath,duration,isRecord,barCycle]"
+                        + "=%s,%d,%s,%d,%b,%d",
+                 VerificationUtil.getNumberListString(numberList), threadId, filepath,
+                        duration, isRecord, barCycle));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+
+        VerificationUtil.isAudioFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        if (isRecord) {
+            VerificationUtil.isAudioDurationToLong(ServiceApi.getInstance().getContext(),
+                    filepath, this.getAudioMaxDuration(), duration);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoMaxSize());
+
+        numberList = VerificationUtil.formatNumbers(numberList);
+        return ServiceApi.getServiceApi().sendAudio(numberList, threadId, filepath, duration,
+                isRecord, barCycle);
+    }
+
+    public long sendVideo(String number, long threadId, String filepath, int duration,
+            boolean isRecord, int barCycle) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException,
+            FileDurationException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendVideo. [number,threadId,filepath,duration,isRecord,barCycle]="
+                        + "%s,%d,%s,%d,%b,%d",
+                        number, threadId, filepath, duration, isRecord, barCycle));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+
+        VerificationUtil.isVideoFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        if (isRecord) {
+            VerificationUtil.isVideoDurationToLong(ServiceApi.getInstance().getContext(),
+                    filepath,this.getVideoMaxDuration(), duration);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoMaxSize());
+
+        number = VerificationUtil.formatNumber(number);
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().sendVideo(numberList, threadId, filepath, duration,
+                isRecord, barCycle);
+    }
+
+    public long sendVideo(List<String> numberList, long threadId, String filepath, int duration,
+            boolean isRecord, int barCycle) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException,
+            FileDurationException {
+        LogHelper.i(String.format(Locale.getDefault(),
+            "enter method sendVideo. [numberList,threadId,filepath,duration,isRecord,barCycle]"
+             + "=%s,%d,%s,%d,%b,%d",
+                  VerificationUtil.getNumberListString(numberList), threadId, filepath,
+                  duration, isRecord, barCycle));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+
+        VerificationUtil.isVideoFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        if (isRecord) {
+            VerificationUtil.isVideoDurationToLong(ServiceApi.getInstance().getContext(), filepath,
+                    this.getVideoMaxDuration(), duration);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoMaxSize());
+
+        numberList = VerificationUtil.formatNumbers(numberList);
+        return ServiceApi.getServiceApi().sendVideo(numberList, threadId, filepath, duration,
+                isRecord, barCycle);
+    }
+
+    public long sendLocation(String number, long threadId, double lat, double lng, String label,
+            int barCycle) throws RemoteException, ServiceDisconnectedException {
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendLocation. [number,threadId,lat,lng,text,barCycle]="
+                        + "%s,%d,%f,%f,%s,%d",
+                        number, threadId, lat, lng, label, barCycle));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+
+        number = VerificationUtil.formatNumber(number);
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().sendLocation(numberList, threadId, lat, lng, label,
+                barCycle);
+    }
+
+    public long sendLocation(List<String> numberList, long threadId, double lat, double lng,
+            String label, int barCycle) throws RemoteException, ServiceDisconnectedException {
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendLocation. [numberList,threadId,lat,lng,text,barCycle]="
+                        + "%s,%d,%f,%f,%s,%d",
+                        VerificationUtil.getNumberListString(numberList), threadId, lat, lng,
+                        label, barCycle));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+
+        numberList = VerificationUtil.formatNumbers(numberList);
+        return ServiceApi.getServiceApi().sendLocation(numberList, threadId, lat, lng, label,
+                barCycle);
+    }
+
+    public long sendVcard(String number, long threadId, String filepath, int barCycle)
+            throws RemoteException, ServiceDisconnectedException, FileSuffixException,
+            FileNotExistsException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendVcard. [number,threadId,filepath,barCycle]=%s,%d,%s,%d", number,
+                threadId, filepath, barCycle));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        VerificationUtil.isVcardFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+
+        number = VerificationUtil.formatNumber(number);
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().sendVcard(numberList, threadId, filepath, barCycle);
+    }
+
+    public long sendVcard(List<String> numberList, long threadId, String filepath, int barCycle)
+            throws RemoteException, ServiceDisconnectedException, FileSuffixException,
+            FileNotExistsException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendVcard. [numberList,threadId,filepath,barCycle]=%s,%d,%s,%d",
+                VerificationUtil.getNumberListString(numberList), threadId, filepath, barCycle));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        VerificationUtil.isVcardFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+
+        numberList = VerificationUtil.formatNumbers(numberList);
+        return ServiceApi.getServiceApi().sendVcard(numberList, threadId, filepath, barCycle);
+    }
+
+    public long sendTextToGroupChat(long groupId, long threadId, String text)
+            throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendTextToGroupChat. [groupId,threadId,text]=%d,%d,%s", groupId,
+                threadId, text));
+        if ("".equals(text.trim())) {
+            LogHelper.i("text value is null/Space");
+            return 0L;
+        }
+
+        return ServiceApi.getServiceApi().sendTextToGroupChat(groupId, threadId, text);
+    }
+
+    public long sendImageToGroupChat(long groupId, long threadId, String filepath, int quality,
+            boolean isRecord) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException {
+        LogHelper.i(String.format(Locale.getDefault(),
+               "enter method sendImageToGroupChat. [groupId,threadId,filepath,quality,isRecord]="
+                        + "%d,%d,%s,%d,%b",
+                        groupId, threadId, filepath, quality, isRecord));
+        if (quality < 0 || quality > 100) {
+            LogHelper.i("quality field value must be between 0 to 100");
+            return 0L;
+        }
+
+        VerificationUtil.isImageFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+
+        if (quality == 100) {
+            VerificationUtil.isFileSizeToLarge(filepath, this.getImageMaxSize());
+        }
+
+        return ServiceApi.getServiceApi().sendImageToGroupChat(groupId, threadId, filepath,
+                quality, isRecord);
+    }
+
+    public long sendAudioToGroupChat(long groupId, long threadId, String filepath, int duration,
+            boolean isRecord) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException,
+            FileDurationException {
+        LogHelper.i(String.format(Locale.getDefault(),
+             "enter method sendAudioToGroupChat. [groupId,threadId,filepath,duration,isRecord]="
+                     + "%d,%d,%s,%d,%b",
+                        groupId, threadId, filepath, duration, isRecord));
+        VerificationUtil.isAudioFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        if (isRecord) {
+            VerificationUtil.isAudioDurationToLong(ServiceApi.getInstance().getContext(),
+                    filepath, this.getAudioMaxDuration(), duration);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoMaxSize());
+
+        return ServiceApi.getServiceApi().sendAudioToGroupChat(groupId, threadId, filepath,
+                duration, isRecord);
+    }
+
+    public long sendVideoToGroupChat(long groupId, long threadId, String filepath, int duration,
+            boolean isRecord) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException,
+            FileDurationException {
+        LogHelper.i(String.format(Locale.getDefault(),
+            "enter method sendVideoToGroupChat. [groupId,threadId,filepath,duration,isRecord]="
+                    + "%d,%d,%s,%d,%b",
+                        groupId, threadId, filepath, duration, isRecord));
+        VerificationUtil.isVideoFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        if (isRecord) {
+            VerificationUtil.isVideoDurationToLong(ServiceApi.getInstance().getContext(),
+                    filepath, this.getVideoMaxDuration(), duration);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoMaxSize());
+
+        return ServiceApi.getServiceApi().sendVideoToGroupChat(groupId, threadId, filepath,
+                duration, isRecord);
+    }
+
+    public long sendLocationToGroupChat(long groupId, long threadId, double lat, double lng,
+            String label) throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+            "enter method sendLocationToGroupChat. [groupId,threadId,lat,lng,text,barCycle]="
+                    + "%d,%d,%f,%f,%s",
+                        groupId, threadId, lat, lng, label));
+        return ServiceApi.getServiceApi().sendLocationToGroupChat(groupId, threadId, lat, lng,
+                label);
+    }
+
+    public long sendVcardToGroupChat(long groupId, long threadId, String filepath)
+            throws RemoteException, ServiceDisconnectedException, FileSuffixException,
+            FileNotExistsException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendVcardToGroupChat. [groupId,threadId,filepath]=%d,%d,%s",
+                groupId, threadId, filepath));
+        VerificationUtil.isVcardFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+
+        return ServiceApi.getServiceApi().sendVcardToGroupChat(groupId, threadId, filepath);
+    }
+
+    public void setRemindPolicy(int policy) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().setRemindPolicy(policy);
+    }
+
+    public void setSendPolicy(int policy) throws RemoteException, ServiceDisconnectedException {
+        ServiceApi.getServiceApi().setSendPolicy(policy);
+    }
+
+    public int topConversation(long threadId) throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().topConversation(threadId);
+    }
+
+    public int markMessageAsReaded(long id) throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().markMessageAsReaded(id);
+    }
+
+    // emoticon
+    public long sendEmoticon(String number, long threadId, String emoticonId, String emoticonName,
+            int barCycle) throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+            "enter method sendEmoticon. [number,threadId,emoticonId,emoticonName,barCycle]="
+                    + "%s,%d,%s,%s,%d",
+                        number, threadId, emoticonId, emoticonName, barCycle));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        if (TextUtils.isEmpty(emoticonId) || TextUtils.isEmpty(emoticonName)) {
+            LogHelper.i("emoticonId or emoticonName is empty");
+            return 0L;
+        }
+
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().sendEmoticon(numberList, threadId, emoticonId,
+                emoticonName, barCycle);
+    }
+
+    public long sendEmoticon(List<String> numberList, long threadId, String emoticonId,
+            String emoticonName, int barCycle)
+                    throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+            "enter method sendEmoticon. [numberList,threadId,emoticonId,emoticonName,barCycle]="
+                    + "%s,%d,%s,%s,%d",
+                        VerificationUtil.getNumberListString(numberList), threadId, emoticonId,
+                        emoticonName, barCycle));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        if (TextUtils.isEmpty(emoticonId) || TextUtils.isEmpty(emoticonName)) {
+            LogHelper.i("emoticonId or emoticonName is empty");
+            return 0L;
+        }
+
+        return ServiceApi.getServiceApi().sendEmoticon(numberList, threadId, emoticonId,
+                emoticonName, barCycle);
+    }
+
+    public long sendEmoticonToGroupChat(long groupId, long threadId, String emoticonId,
+            String emoticonName) throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+             "enter method sendEmoticonToGroupChat. [groupId,threadId,emoticonId,emoticonName]="
+                     + "%d,%d,%s,%s",
+                        groupId, threadId, emoticonId, emoticonName));
+        if (TextUtils.isEmpty(emoticonId) || TextUtils.isEmpty(emoticonName)) {
+            LogHelper.i("emoticonId or emoticonName is empty");
+            return 0L;
+        }
+
+        return ServiceApi.getServiceApi().sendEmoticonToGroupChat(groupId, threadId, emoticonId,
+                emoticonName);
+    }
+
+    // cloud
+    public long sendCloud(String number, long threadId, String fileName, long fileSize,
+            String shareUrl, String smsContent, int barCycle) throws RemoteException,
+            ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+            "enter method sendCloud. [number,threadId,fileName,fileSize,shareUrl,smsContent,"
+                    + "barCycle]=%s,%d,%s,%d,%s,%s,%d",
+                        number, threadId, fileName, fileSize, shareUrl, smsContent, barCycle));
+        if (!VerificationUtil.isNumber(number)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        if (TextUtils.isEmpty(fileName) || TextUtils.isEmpty(shareUrl)
+                || TextUtils.isEmpty(smsContent)) {
+            LogHelper.i("fileName or shareUrl or smsContent is empty");
+            return 0L;
+        }
+
+        List<String> numberList = new ArrayList<String>();
+        numberList.add(number);
+        return ServiceApi.getServiceApi().sendCloud(numberList, threadId, fileName, fileSize,
+                shareUrl, smsContent, barCycle);
+    }
+
+    public long sendCloud(List<String> numberList, long threadId, String fileName, long fileSize,
+            String shareUrl, String smsContent, int barCycle) throws RemoteException,
+            ServiceDisconnectedException {
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendCloud. [numberList,threadId,fileName,fileSize,"
+                        + "shareUrl,smsContent,barCycle]=%s,%d,%s,%d,%s,%s,%d",
+                        VerificationUtil.getNumberListString(numberList), threadId, fileName,
+                        fileSize, shareUrl, smsContent, barCycle));
+        if (!VerificationUtil.isAllNumber(numberList)) {
+            LogHelper.i("number field value error");
+            return 0L;
+        }
+        if (barCycle < -1) {
+            LogHelper.i("barCycle field must be greater than -1");
+            return 0L;
+        }
+        if (TextUtils.isEmpty(fileName) || TextUtils.isEmpty(shareUrl)
+                || TextUtils.isEmpty(smsContent)) {
+            LogHelper.i("fileName or shareUrl or smsContent is empty");
+            return 0L;
+        }
+
+        return ServiceApi.getServiceApi().sendCloud(numberList, threadId, fileName, fileSize,
+                shareUrl, smsContent, barCycle);
+    }
+
+    public long sendCloudToGroupChat(long groupId, long threadId, String fileName, long fileSize,
+            String shareUrl) throws RemoteException, ServiceDisconnectedException {
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendCloudToGroupChat. [groupId,threadId,fileName,"
+                        + "fileSize,shareUrl]=%d,%d,%s,%d,%s",
+                        groupId, threadId, fileName, fileSize, shareUrl));
+        if (TextUtils.isEmpty(fileName) || TextUtils.isEmpty(shareUrl)) {
+            LogHelper.i("fileName or shareUrl is empty");
+            return 0L;
+        }
+        return ServiceApi.getServiceApi().sendCloudToGroupChat(groupId, threadId, fileName,
+                fileSize, shareUrl);
+    }
+
+    // public account
+    public long sendTextToPublicAccount(String publicAccountId, long threadId, String text)
+            throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendTextToPublicAccount. [publicAccountId,threadId,text]=%s,%d,%s",
+                publicAccountId, threadId, text));
+        if ("".equals(text.trim())) {
+            LogHelper.i("text value is null/Space");
+            return 0L;
+        }
+        return ServiceApi.getServiceApi().sendTextToPublicAccount(publicAccountId, threadId, text);
+    }
+
+    public long sendImageToPublicAccount(String publicAccountId, long threadId, String filepath,
+            int quality, boolean isRecord) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException {
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendImageToPublicAccount. [publicAccountId,"
+                        + "threadId,filepath,quality,isRecord]=%s,%d,%s,%d,%b",
+                        publicAccountId, threadId, filepath, quality, isRecord));
+        if (quality < 0 || quality > 100) {
+            LogHelper.i("quality field value must be between 0 to 100");
+            return 0L;
+        }
+
+        VerificationUtil.isImageFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+
+        if (quality == 100) {
+            VerificationUtil.isFileSizeToLarge(filepath, this.getImageMaxSize());
+        }
+        return ServiceApi.getServiceApi().sendImageToPublicAccount(publicAccountId, threadId,
+                filepath, quality, isRecord);
+    }
+
+    public long sendAudioToPublicAccount(String publicAccountId, long threadId, String filepath,
+            int duration, boolean isRecord) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException,
+            FileDurationException {
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendAudioToPublicAccount. [publicAccountId,threadId,"
+                        + "filepath,duration,isRecord]=%s,%d,%s,%d,%b",
+                        publicAccountId, threadId, filepath, duration, isRecord));
+
+        VerificationUtil.isAudioFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        if (isRecord) {
+            VerificationUtil.isAudioDurationToLong(ServiceApi.getInstance().getContext(), filepath,
+                    this.getAudioMaxDuration(), duration);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoMaxSize());
+        return ServiceApi.getServiceApi().sendAudioToPublicAccount(publicAccountId, threadId,
+                filepath, duration, isRecord);
+    }
+
+    public long sendVideoToPublicAccount(String publicAccountId, long threadId, String filepath,
+            int duration, boolean isRecord) throws RemoteException, ServiceDisconnectedException,
+            FileSuffixException, FileNotExistsException, FileTooLargeException,
+            FileDurationException {
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendVideoToPublicAccount. [publicAccountId,threadId,"
+                        + "filepath,duration,isRecord]=%s,%d,%s,%d,%b",
+                        publicAccountId, threadId, filepath, duration, isRecord));
+        VerificationUtil.isVideoFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        if (isRecord) {
+            VerificationUtil.isVideoDurationToLong(ServiceApi.getInstance().getContext(),
+                    filepath, this.getVideoMaxDuration(), duration);
+        }
+        VerificationUtil.isFileSizeToLarge(filepath, this.getVideoMaxSize());
+        return ServiceApi.getServiceApi().sendVideoToPublicAccount(publicAccountId, threadId,
+                filepath, duration, isRecord);
+    }
+
+    public long sendLocationToPublicAccount(String publicAccountId, long threadId, double lat,
+            double lng, String label) throws RemoteException, ServiceDisconnectedException {
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendLocationToPublicAccount. [publicAccountId,"
+                        + "threadId,lat,lng,text]=%s,%d,%f,%f,%s",
+                        publicAccountId, threadId, lat, lng, label));
+        return ServiceApi.getServiceApi().sendLocationToPublicAccount(publicAccountId, threadId,
+                lat, lng, label);
+    }
+
+    public long sendVcardToPublicAccount(String publicAccountId, long threadId, String filepath)
+            throws RemoteException, ServiceDisconnectedException, FileSuffixException,
+            FileNotExistsException {
+        LogHelper
+                .i(String.format(
+                        Locale.getDefault(),
+                        "enter method sendVcardToPublicAccount. [publicAccountId,"
+                        + "threadId,filepath,barCycle]=%s,%d,%s",
+                        publicAccountId, threadId, filepath));
+        VerificationUtil.isVcardFile(filepath);
+        VerificationUtil.isFileExists(filepath);
+        return ServiceApi.getServiceApi().sendVcardToPublicAccount(publicAccountId, threadId,
+                filepath);
+    }
+
+    public long sendCommandToPublicAccount(String publicAccountId, long threadId, String text)
+            throws RemoteException, ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method sendCommandToPublicAccount. [publicAccountId,text]=%s,%s",
+                publicAccountId, text));
+        if ("".equals(text.trim())) {
+            LogHelper.i("text value is null/Space");
+            return 0L;
+        }
+        return ServiceApi.getServiceApi().sendCommandToPublicAccount(publicAccountId, threadId,
+                text);
+    }
+
+    /**
+     * Parses the public message.
+     * @param msgType the message type
+     * @param content the message content
+     * @return the public message
+     */
+    public static PublicMessage parsePublicMessage(int msgType, String content) {
+        PublicMessage message = null;
+        switch (msgType) {
+            case MessageConstants.CONST_MESSAGE_TEXT:
+            case MessageConstants.CONST_MESSAGE_MAP:
+            case MessageConstants.CONST_MESSAGE_CONTACT:
+                PublicTextMessageParser textHandler = new PublicTextMessageParser();
+                XmlUtil.parse(content, textHandler);
+                message = textHandler.getMessage();
+                break;
+            case MessageConstants.CONST_MESSAGE_IMAGE:
+            case MessageConstants.CONST_MESSAGE_AUDIO:
+            case MessageConstants.CONST_MESSAGE_VIDEO:
+                PublicMediaMessageParser Mediahandler = new PublicMediaMessageParser();
+                XmlUtil.parse(content, Mediahandler);
+                message = Mediahandler.getMessage();
+                break;
+            case MessageConstants.CONST_MESSAGE_PUBLIC_ACCOUNT_ARTICLE:
+                PublicTopicMessageParser Topichandler = new PublicTopicMessageParser();
+                XmlUtil.parse(content, Topichandler);
+                message = Topichandler.getMessage();
+                break;
+            default:
+                break;
+        }
+
+        return message;
+    }
+
+    /**
+     * Parses the cloud file message.
+     * @param content the message content
+     * @return the cloud file message
+     */
+    public static CloudFileMessage parseCloudFileMessage(String content) {
+        CloudFileMessageParser handler = new CloudFileMessageParser();
+        XmlUtil.parse(content, handler);
+        return handler.getMessage();
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/CloudFileMessageParser.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/CloudFileMessageParser.java
new file mode 100644
index 0000000..55b168f
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/CloudFileMessageParser.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2015 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.parse;
+
+import com.suntek.mway.rcs.client.aidl.plugin.entity.cloudfile.CloudFileMessage;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * <p>
+ * Title:Cloud file message parser.
+ * </p>
+ * <p>
+ * Description:none
+ * </p>
+ * <p>
+ * Copyright:Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company:pci-suntek
+ * </p>
+ *
+ * @author yzx
+ * @version 1.0
+ */
+public class CloudFileMessageParser extends DefaultHandler {
+
+    /*
+     * <?xml version="1.0" encoding="UTF-8"?> <cloudfile
+     * xmlns="http://cloudfile.cmcc.com/types"> <filename>aa.xls</filename>
+     * <filesize>36KB</filesize> <downloadurl>http://abc.com</downloadurl>
+     * </cloudfile>
+     */
+    /** The message. */
+    private CloudFileMessage message;
+
+    /** The builder. */
+    private StringBuilder builder;
+
+    /**
+     * Instantiates a new cloud file message parser.
+     */
+    public CloudFileMessageParser() {
+        builder = new StringBuilder();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
+     */
+    @Override
+    public void characters(char[] ch, int start, int length) throws SAXException {
+        super.characters(ch, start, length);
+        builder.append(ch, start, length);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
+     * java.lang.String, java.lang.String)
+     */
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        super.endElement(uri, localName, qName);
+        String s = builder.toString();
+
+        if (localName.equals("filename")) {
+            message.setFileName(s);
+        } else if (localName.equals("filesize")) {
+            int index = s.indexOf("KB");
+            long l = 0L;
+            if (index != -1) {
+                l = Long.parseLong(s.substring(0, index));
+            }
+            message.setFileSize(l);
+        } else if (localName.equals("downloadurl")) {
+            message.setShareUrl(s);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
+     * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+     */
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes)
+            throws SAXException {
+        super.startElement(uri, localName, qName, attributes);
+        builder.setLength(0);
+
+        if (localName.equals("cloudfile")) {
+            message = new CloudFileMessage();
+        }
+    }
+
+    /**
+     * Gets the message.
+     *
+     * @return the message
+     */
+    public CloudFileMessage getMessage() {
+        return message;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/PublicMediaMessageParser.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/PublicMediaMessageParser.java
new file mode 100644
index 0000000..9b25f2a
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/PublicMediaMessageParser.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 2015 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.parse;
+
+import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicMediaMessage;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicMediaMessage.PublicMediaContent;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * <p>
+ * Title:Public media message parser.
+ * </p>
+ * <p>
+ * Description:none
+ * </p>
+ * <p>
+ * Copyright:Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company:pci-suntek
+ * </p>
+ *
+ * @author yzx
+ * @version 1.0
+ */
+public class PublicMediaMessageParser extends DefaultHandler {
+
+    /*
+     * <?xml version="1.0" encoding="UTF-8"?> <resource-lists
+     * xmlns="urn:ietf:params:xml:ns:resource-lists"
+     * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+     * xmlns:cp="urn:ietf:params:xml:ns:capacity"> <msg_content>
+     * <media_type>20</media_type>
+     * <create_time>2014-11-16T14:44:14+8:00</create_time>
+     * <activeStatus>0</activeStatus> <forwardable>0</forwardable> <pic>
+     * <filesize>48828</filesize> <filetype>jpg</filetype>
+     * <media_uuid>3290</media_uuid>
+     * <original_link>http://60.194.14.154/Public/Uploads
+     * /user/7/5/19/9/1002407519/imgs/54125d38942ecSRC.jpg</original_link>
+     * <thumb_link
+     * >http://60.194.14.154/Public/Uploads/user/7/5/19/9/1002407519/imgs
+     * /54125d38942ec.jpg</thumb_link> <title>a.jpg</title> </pic>
+     * <pa_uuid>125200024018244177@as1.pa.rcs.chinamobile.com</pa_uuid>
+     * </msg_content> </resource-lists> <?xml version="1.0" encoding="UTF-8"?>
+     * <resource-lists xmlns="urn:ietf:params:xml:ns:resource-lists"
+     * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+     * xmlns:cp="urn:ietf:params:xml:ns:capacity"> <msg_content>
+     * <media_type>40</media_type>
+     * <create_time>2014-11-16T14:32:50+8:00</create_time>
+     * <activeStatus>0</activeStatus> <forwardable>0</forwardable> <audio>
+     * <duration>2</duration> <filesize>3238</filesize> <filetype>mp3</filetype>
+     * <media_uuid>4105</media_uuid>
+     * <original_link>http://60.194.14.154/Public/Uploads
+     * /user/7/5/19/9/1002407519/audio/54630e41cb5a3SRC.amr</original_link>
+     * <thumb_link
+     * >http://60.194.14.154/Public/Uploads/user/7/5/19/9/1002407519/audio
+     * /54630e41cb5a3.mp3</thumb_link> <title>audio.amr</title> </audio>
+     * <pa_uuid>125200024018244177@as1.pa.rcs.chinamobile.com</pa_uuid>
+     * </msg_content> </resource-lists> <?xml version="1.0" encoding="UTF-8"?>
+     * <resource-lists xmlns="urn:ietf:params:xml:ns:resource-lists"
+     * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+     * xmlns:cp="urn:ietf:params:xml:ns:capacity"> <msg_content>
+     * <media_type>30</media_type>
+     * <create_time>2014-11-16T14:34:38+8:00</create_time>
+     * <activeStatus>0</activeStatus> <forwardable>0</forwardable> <video>
+     * <duration>0</duration> <filesize>0</filesize> <filetype>mp4</filetype>
+     * <media_uuid>4166</media_uuid>
+     * <original_link>http://60.194.14.154/Public/Uploads
+     * /user/7/5/19/9/1002407519/video/546844dee1b82.mp4</original_link>
+     * <thumb_link
+     * >http://60.194.14.154/Public/Uploads/user/7/5/19/9/1002407519/video
+     * /546844dee1b82.jpg</thumb_link> <title>r1412834140513169658.mp4</title>
+     * </video> <pa_uuid>125200024018244177@as1.pa.rcs.chinamobile.com</pa_uuid>
+     * </msg_content> </resource-lists>
+     */
+    /** The message. */
+    private PublicMediaMessage message;
+
+    /** The content. */
+    private PublicMediaContent content;
+
+    /** The builder. */
+    private StringBuilder builder;
+
+    /**
+     * Instantiates a new public media message parser.
+     */
+    public PublicMediaMessageParser() {
+        builder = new StringBuilder();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
+     */
+    @Override
+    public void characters(char[] ch, int start, int length) throws SAXException {
+        super.characters(ch, start, length);
+        builder.append(ch, start, length);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
+     * java.lang.String, java.lang.String)
+     */
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        super.endElement(uri, localName, qName);
+        String s = builder.toString();
+
+        if (localName.equals("create_time")) {
+            message.setCreatetime(s);
+        } else if (localName.equals("forwardable")) {
+            message.setForwardable(Integer.parseInt(s));
+        } else if (localName.equals("media_type")) {
+            message.setMsgtype(s);
+        } else if (localName.equals("activeStatus")) {
+            message.setActiveStatus(Integer.parseInt(s));
+        } else if (localName.equals("pa_uuid")) {
+            message.setPaUuid(s);
+        }
+
+        else if (localName.equals("thumb_link")) {
+            content.setThumbLink(s);
+        } else if (localName.equals("original_link")) {
+            content.setOriginalLink(s);
+        } else if (localName.equals("title")) {
+            content.setTitle(s);
+        } else if (localName.equals("filesize")) {
+            content.setFileSize(s);
+        } else if (localName.equals("duration")) {
+            content.setDuration(s);
+        } else if (localName.equals("filetype")) {
+            content.setFileType(s);
+            // } else if (localName.equals("createtime")) {
+            // content.setCreatetime(s);
+        } else if (localName.equals("media_uuid")) {
+            content.setMediaUuid(s);
+        }
+
+        else if (localName.equals("pic") ||
+                localName.equals("audio") || localName.equals("video")) {
+            message.setMedia(content);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
+     * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+     */
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes)
+            throws SAXException {
+        super.startElement(uri, localName, qName, attributes);
+        builder.setLength(0);
+
+        if (localName.equals("msg_content")) {
+            message = new PublicMediaMessage();
+        } else if (localName.equals("pic") || localName.equals("audio")
+                || localName.equals("video")) {
+            content = new PublicMediaContent();
+        }
+    }
+
+    /**
+     * Gets the message.
+     *
+     * @return the message
+     */
+    public PublicMediaMessage getMessage() {
+        return message;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/PublicTextMessageParser.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/PublicTextMessageParser.java
new file mode 100644
index 0000000..2615e11
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/PublicTextMessageParser.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2015 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.parse;
+
+import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicTextMessage;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * <p>
+ * Title:Public text message parser.
+ * </p>
+ * <p>
+ * Description:none
+ * </p>
+ * <p>
+ * Copyright:Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company:pci-suntek
+ * </p>
+ *
+ * @author yzx
+ * @version 1.0
+ */
+public class PublicTextMessageParser extends DefaultHandler {
+
+    /*
+     * <?xml version="1.0" encoding="UTF-8"?> <resource-lists
+     * xmlns="urn:ietf:params:xml:ns:resource-lists"
+     * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+     * xmlns:cp="urn:ietf:params:xml:ns:capacity"> <msg_content>
+     * <media_type>10</media_type>
+     * <create_time>2014-11-16T15:28:59+8:00</create_time>
+     * <activeStatus>0</activeStatus> <forwardable>0</forwardable>
+     * <text>content</text>
+     * <pa_uuid>125200024018244177@as1.pa.rcs.chinamobile.com</pa_uuid>
+     * </msg_content> </resource-lists>
+     */
+
+    /** The message. */
+    private PublicTextMessage message;
+
+    /** The builder. */
+    private StringBuilder builder;
+
+    /**
+     * Instantiates a new public text message parser.
+     */
+    public PublicTextMessageParser() {
+        builder = new StringBuilder();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
+     */
+    @Override
+    public void characters(char[] ch, int start, int length) throws SAXException {
+        super.characters(ch, start, length);
+        builder.append(ch, start, length);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
+     * java.lang.String, java.lang.String)
+     */
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        super.endElement(uri, localName, qName);
+        String s = builder.toString();
+
+        if (localName.equals("create_time")) {
+            message.setCreatetime(s);
+        } else if (localName.equals("forwardable")) {
+            message.setForwardable(Integer.parseInt(s));
+        } else if (localName.equals("media_type")) {
+            message.setMsgtype(s);
+        } else if (localName.equals("text")) {
+            message.setContent(s);
+        } else if (localName.equals("activeStatus")) {
+            message.setActiveStatus(Integer.parseInt(s));
+        } else if (localName.equals("pa_uuid")) {
+            message.setPaUuid(s);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
+     * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+     */
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes)
+            throws SAXException {
+        super.startElement(uri, localName, qName, attributes);
+        builder.setLength(0);
+
+        if (localName.equals("msg_content")) {
+            message = new PublicTextMessage();
+        }
+    }
+
+    /**
+     * Gets the message.
+     *
+     * @return the message
+     */
+    public PublicTextMessage getMessage() {
+        return message;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/PublicTopicMessageParser.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/PublicTopicMessageParser.java
new file mode 100644
index 0000000..8cbd435
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/parse/PublicTopicMessageParser.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2015 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.parse;
+
+import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicTopicMessage;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicTopicMessage.PublicTopicContent;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * <p>
+ * Title:Public topic message parser.
+ * </p>
+ * <p>
+ * Description:none
+ * </p>
+ * <p>
+ * Copyright:Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company:pci-suntek
+ * </p>
+ *
+ * @author yzx
+ * @version 1.0
+ */
+public class PublicTopicMessageParser extends DefaultHandler {
+
+    /*
+     * <?xml version="1.0" encoding="UTF-8"?> <resource-lists
+     * xmlns="urn:ietf:params:xml:ns:resource-lists"
+     * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+     * xmlns:cp="urn:ietf:params:xml:ns:capacity"> <msg_content>
+     * <media_type>51</media_type>
+     * <create_time>2014-11-16T14:37:18+8:00</create_time>
+     * <activeStatus>0</activeStatus> <forwardable>0</forwardable> <article>
+     * <mediaarticle> <author>1002407519</author>
+     * <main_text>single_text</main_text> <media_uuid>2411</media_uuid>
+     * <original_link
+     * >http://60.194.14.154/Public/Uploads/user/7/5/19/9/1002407519
+     * /imgs/54125a77b1dff.jpg</original_link>
+     * <source_link>http://60.194.14.154/</source_link>
+     * <thumb_link>http://60.194
+     * .14.154/Public/Uploads/user/7/5/19/9/1002407519/imgs
+     * /54125a77b1dff.jpg</thumb_link> <title>single_title</title>
+     * </mediaarticle> </article>
+     * <pa_uuid>125200024018244177@as1.pa.rcs.chinamobile.com</pa_uuid>
+     * </msg_content> </resource-lists> <?xml version="1.0" encoding="utf-8"?>
+     * <resource-lists xmlns="urn:ietf:params:xml:ns:resource-lists"
+     * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+     * xmlns:cp="urn:ietf:params:xml:ns:capacity"> <msg_content>
+     * <media_type>52</media_type>
+     * <create_time>2014-11-16T14:39:39+8:00</create_time>
+     * <activeStatus>0</activeStatus> <forwardable>0</forwardable> <article>
+     * <mediaarticle> <author>1002407519</author> <main_text/>
+     * <media_uuid>2400</media_uuid>
+     * <original_link>http://60.194.14.154/Public/Uploads
+     * /user/7/5/19/9/1002407519/imgs/54125d38942ec.jpg</original_link>
+     * <source_link>http://60.194.14.154/</source_link>
+     * <thumb_link>http://60.194
+     * .14.154/Public/Uploads/user/7/5/19/9/1002407519/imgs
+     * /54125d38942ec.jpg</thumb_link> <title>more1_title</title>
+     * </mediaarticle> <mediaarticle> <author>1002407519</author> <main_text/>
+     * <media_uuid>2400</media_uuid>
+     * <original_link>http://60.194.14.154/Public/Uploads
+     * /user/7/5/19/9/1002407519/imgs/54125cdcaec52.jpg</original_link>
+     * <source_link>http://60.194.14.154/</source_link>
+     * <thumb_link>http://60.194
+     * .14.154/Public/Uploads/user/7/5/19/9/1002407519/imgs
+     * /54125cdcaec52.jpg</thumb_link> <title>more2_title</title>
+     * </mediaarticle> </article>
+     * <pa_uuid>125200024018244177@as1.pa.rcs.chinamobile.com</pa_uuid>
+     * </msg_content> </resource-lists>
+     */
+    /** The message. */
+    private PublicTopicMessage message;
+
+    /** The contents. */
+    private List<PublicTopicContent> contents;
+
+    /** The content. */
+    private PublicTopicContent content;
+
+    /** The builder. */
+    private StringBuilder builder;
+
+    /**
+     * Instantiates a new public topic message parser.
+     */
+    public PublicTopicMessageParser() {
+        builder = new StringBuilder();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
+     */
+    @Override
+    public void characters(char[] ch, int start, int length) throws SAXException {
+        super.characters(ch, start, length);
+        builder.append(ch, start, length);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
+     * java.lang.String, java.lang.String)
+     */
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        super.endElement(uri, localName, qName);
+        String s = builder.toString();
+
+        if (localName.equals("create_time")) {
+            message.setCreatetime(s);
+        } else if (localName.equals("forwardable")) {
+            message.setForwardable(Integer.parseInt(s));
+        } else if (localName.equals("media_type")) {
+            message.setMsgtype(s);
+        } else if (localName.equals("activeStatus")) {
+            message.setActiveStatus(Integer.parseInt(s));
+        } else if (localName.equals("pa_uuid")) {
+            message.setPaUuid(s);
+        }
+
+        else if (localName.equals("title")) {
+            content.setTitle(s);
+        } else if (localName.equals("author")) {
+            content.setAuthor(s);
+        } else if (localName.equals("thumb_link")) {
+            content.setThumbLink(s);
+        } else if (localName.equals("original_link")) {
+            content.setOriginalLink(s);
+        } else if (localName.equals("source_link")) {
+            content.setSourceLink(s);
+        } else if (localName.equals("media_uuid")) {
+            content.setMediaUuid(s);
+        } else if (localName.equals("main_text")) {
+            content.setMainText(s);
+        } else if (localName.equals("body_link")) {
+            content.setBodyLink(s);
+        }
+
+        else if (localName.equals("mediaarticle")) {
+            contents.add(content);
+        } else if (localName.equals("article")) {
+            message.setTopics(contents);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
+     * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+     */
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes)
+            throws SAXException {
+        super.startElement(uri, localName, qName, attributes);
+        builder.setLength(0);
+
+        if (localName.equals("msg_content")) {
+            message = new PublicTopicMessage();
+        } else if (localName.equals("article")) {
+            contents = new ArrayList<PublicTopicContent>();
+        } else if (localName.equals("mediaarticle")) {
+            content = new PublicTopicContent();
+        }
+    }
+
+    /**
+     * Gets the message.
+     *
+     * @return the message
+     */
+    public PublicTopicMessage getMessage() {
+        return message;
+    }
+}
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
deleted file mode 100644
index 770130b..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/plugincenter/PluginCenterApi.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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;
-import com.suntek.mway.rcs.client.aidl.plugincenter.IPluginCenterApi;
-
-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/ProfileApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/ProfileApi.java
new file mode 100644
index 0000000..496b5e3
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/ProfileApi.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2015 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;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Avatar;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Profile;
+import com.suntek.mway.rcs.client.api.PluginApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+public class ProfileApi {
+
+    private static ProfileApi instance;
+
+    private ProfileApi() {
+
+    }
+
+    public synchronized static ProfileApi getInstance() {
+        if (instance == null) {
+            instance = new ProfileApi();
+        }
+        return instance;
+    }
+
+    public void getHeadPicByContact(long contactId, ProfileListener listener)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().getHeadPicByContact(contactId, listener);
+    }
+
+    public void getHeadPicByNumber(String number, int pixel, ProfileListener listener)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().getHeadPicByNumber(number, pixel, listener);
+    }
+
+    public void getMyHeadPic(ProfileListener listener) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().getMyHeadPic(listener);
+    }
+
+    public void getMyProfile(ProfileListener listener) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().getMyProfile(listener);
+    }
+
+    public String getUpdateTimeOfContactsHeadPic() throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getUpdateTimeOfContactsHeadPic();
+    }
+
+    public void refreshMyQRImg(Profile profile, boolean includeEInfo, ProfileListener listener)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().refreshMyQRImg(profile, includeEInfo, listener);
+    }
+
+    public void setMyHeadPic(Avatar avatar, ProfileListener listener) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().setMyHeadPic(avatar, listener);
+    }
+
+    public void setMyProfile(Profile profile, ProfileListener listener) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().setMyProfile(profile, listener);
+    }
+
+    public void updateContactsHeadPicAtFixedRateEveryDay(String hhmm, ProfileListener listener)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().updateContactsHeadPicAtFixedRateEveryDay(hhmm, listener);
+    }
+}
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/ProfileListener.java
similarity index 87%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/ProfileListener.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/ProfileListener.java
index 33107dc..a872347 100644
--- 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/ProfileListener.java
@@ -21,11 +21,10 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.profile.callback;
+package com.suntek.mway.rcs.client.api.profile;
 
 import com.suntek.mway.rcs.client.aidl.plugin.callback.IProfileListener;
 import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.QRCardImg;
-import com.suntek.mway.rcs.client.api.util.log.LogHelper;
 
 public abstract class ProfileListener extends IProfileListener.Stub {
 
@@ -34,7 +33,5 @@
      * 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/QRImgListener.java
similarity index 95%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/QRImgListener.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/QRImgListener.java
index 3aa7faa..70a82be 100644
--- 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/QRImgListener.java
@@ -21,12 +21,12 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.profile.callback;
+package com.suntek.mway.rcs.client.api.profile;
 
 import com.suntek.mway.rcs.client.aidl.plugin.callback.IProfileListener;
 import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Avatar;
 import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Profile;
-import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+import com.suntek.mway.rcs.client.api.log.LogHelper;
 
 public abstract class QRImgListener extends IProfileListener.Stub {
 
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
deleted file mode 100644
index c777a52..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/impl/ProfileApi.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * 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.aidl.plugin.IProfileApi;
-import com.suntek.mway.rcs.client.aidl.plugin.callback.IProfileListener;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Avatar;
-import com.suntek.mway.rcs.client.aidl.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/PublicAccountApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/PublicAccountApi.java
new file mode 100644
index 0000000..26caa68
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/PublicAccountApi.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2015 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;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.aidl.plugin.callback.IPublicAccountCallbackAPI;
+import com.suntek.mway.rcs.client.api.PluginApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+public class PublicAccountApi {
+
+    private static PublicAccountApi instance;
+
+    private PublicAccountApi() {
+
+    }
+
+    public synchronized static PublicAccountApi getInstance() {
+        if (instance == null) {
+            instance = new PublicAccountApi();
+        }
+        return instance;
+    }
+
+    public void addSubscribe(String uuid, PublicAccountCallback callback) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().addSubscribe(uuid);
+    }
+
+    public void cancelSubscribe(String uuid, PublicAccountCallback callback)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().cancelSubscribe(uuid);
+    }
+
+    public void complainPublic(String uuid, String reason, String description, int type,
+            String data, PublicAccountCallback callback) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().complainPublic(uuid, reason, description, type, data);
+    }
+
+    public void getPreMessage(String uuid, String timestamp, int order, int pageSize, int pageNum,
+            PublicAccountCallback callback) throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().getPreMessage(uuid, timestamp, order, pageSize, pageNum);
+    }
+
+    public void getPublicDetail(String uuid, PublicAccountCallback callback)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().getPublicDetail(uuid);
+    }
+
+    public void getPublicList(String keywords, int pageSize, int pageNum, int order,
+            PublicAccountCallback callback) throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().getPublicList(keywords, pageSize, pageNum, order);
+    }
+
+    public void getPublicMenuInfo(String uuid, PublicAccountCallback callback)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().getPublicMenuInfo(uuid);
+    }
+
+    public void getRecommendPublic(int type, int pageSize, int pageNum,
+            PublicAccountCallback callback) throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().getRecommendPublic(type, pageSize, pageNum);
+    }
+
+    public void getUserSubscribePublicList(PublicAccountCallback callback) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().getUserSubscribePublicList();
+    }
+
+    public void setAcceptStatus(String uuid, int acceptStatus, PublicAccountCallback callback)
+            throws RemoteException, ServiceDisconnectedException {
+        PluginApi.getPluginApi().registerCallback(callback);
+        PluginApi.getPluginApi().setAcceptStatus(uuid, acceptStatus);
+    }
+
+    public void unregisterCallback(IPublicAccountCallbackAPI callback) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().unregisterCallback(callback);
+    }
+}
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/PublicAccountCallback.java
similarity index 96%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallback.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/PublicAccountCallback.java
index 111a901..d11a647 100644
--- 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/PublicAccountCallback.java
@@ -21,7 +21,9 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.publicaccount.callback;
+package com.suntek.mway.rcs.client.api.publicaccount;
+
+import android.os.RemoteException;
 
 import com.suntek.mway.rcs.client.aidl.plugin.callback.IPublicAccountCallbackAPI;
 import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.MenuInfoMode;
@@ -29,8 +31,6 @@
 import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccounts;
 import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccountsDetail;
 
-import android.os.RemoteException;
-
 import java.util.List;
 
 public abstract class PublicAccountCallback extends IPublicAccountCallbackAPI.Stub {
@@ -92,13 +92,15 @@
     // }
 
     @Override
-    public void respGetPublicDetail(boolean arg0, PublicAccountsDetail arg1) throws RemoteException {
+    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 {
+    public void respGetPublicList(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
deleted file mode 100644
index 377be1b..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallbackImpl.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * 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 com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.MenuInfoMode;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.MsgContent;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccounts;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccountsDetail;
-
-import android.os.RemoteException;
-
-import java.util.List;
-
-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, MenuInfoMode menuInfoMode)
-            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
deleted file mode 100644
index 188e1b0..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/impl/PublicAccountApi.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * 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.aidl.plugin.IPublicAccountAPI;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct.PublicAccounts;
-import com.suntek.mway.rcs.client.aidl.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(PublicAccountCallback callback)
-            throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(Locale.getDefault(), "enter method getUserSubscribePublicList. "));
-        /*
-         * if (order != 0 && order != 1) {
-         * LogHelper.i("order field value must be 0 or 1"); return; }
-         */
-        try {
-            myApi.registerCallback(callback);
-            myApi.getUserSubscribePublicList();
-        } 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,
-            PublicAccountCallback callback) throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        if (pageSize <= 0 || pageNum <= 0) {
-            LogHelper.i("params is not valid");
-            return false;
-        }
-
-        boolean flag = false;
-        try {
-            myApi.registerCallback(callback);
-            flag = myApi.getRecommendPublic(type, pageSize, pageNum);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return flag;
-    }
-
-    public boolean setAcceptStatus(String uuid, int acceptStatus, PublicAccountCallback callback)
-            throws ServiceDisconnectedException {
-        VerificationUtil.ApiIsNull(myApi);
-        boolean flag = false;
-        try {
-            myApi.registerCallback(callback);
-            flag = myApi.setAcceptStatus(uuid, acceptStatus);
-        } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(), ex);
-        }
-        return flag;
-    }
-}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/richscreen/RichScreenApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/richscreen/RichScreenApi.java
new file mode 100644
index 0000000..f805f4d
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/richscreen/RichScreenApi.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2015 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.richscreen;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.ResultInfo;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.ResultUtil;
+import com.suntek.mway.rcs.client.api.PluginApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+import java.util.List;
+
+public class RichScreenApi {
+
+    private static RichScreenApi instance;
+
+    private RichScreenApi() {
+
+    }
+
+    public synchronized static RichScreenApi getInstance() {
+        if (instance == null) {
+            instance = new RichScreenApi();
+        }
+        return instance;
+    }
+
+    public ResultInfo clearRichScrnLocalCache(String phoneEvent) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().clearRichScrnLocalCache(phoneEvent);
+    }
+
+    public ResultInfo collectRichScrnObj(String sourceType, String cId) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().collectRichScrnObj(sourceType, cId);
+    }
+
+    public ResultInfo downloadHomeLocRules(String phoneEvent) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().downloadHomeLocRules(phoneEvent);
+    }
+
+    public ResultInfo downloadRichScrnObj(String missdn, String phoneEvent) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().downloadRichScrnObj(missdn, phoneEvent);
+    }
+
+    public ResultUtil getRichScrnObj(String missdn, String phoneEvent) throws RemoteException,
+            ServiceDisconnectedException {
+        return PluginApi.getPluginApi().getRichScrnObj(missdn, phoneEvent);
+    }
+
+    public ResultInfo richScrnChangeNetWork()
+            throws RemoteException, ServiceDisconnectedException {
+        return PluginApi.getPluginApi().richScrnChangeNetWork();
+    }
+
+    public void startRichScreenApp(List<String> mobileList) throws RemoteException,
+            ServiceDisconnectedException {
+        PluginApi.getPluginApi().startRichScreenApp(mobileList);
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/specialnumber/SpecialServiceNumApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/specialnumber/SpecialServiceNumApi.java
new file mode 100644
index 0000000..b3e3848
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/specialnumber/SpecialServiceNumApi.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2015 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;
+
+import android.os.RemoteException;
+
+import com.suntek.mway.rcs.client.api.ServiceApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+import java.util.List;
+
+public class SpecialServiceNumApi {
+
+    private static SpecialServiceNumApi instance;
+
+    private SpecialServiceNumApi() {
+
+    }
+
+    public synchronized static SpecialServiceNumApi getInstance() {
+        if (instance == null) {
+            instance = new SpecialServiceNumApi();
+        }
+        return instance;
+    }
+
+    public boolean addSsn(String number) throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().addSsn(number);
+    }
+
+    public boolean disableSsn() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().disableSsn();
+    }
+
+    public boolean deleteSsnPrefix(String number) throws RemoteException,
+            ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().deleteSsnPrefix(number);
+    }
+
+    public List<String> getSsnList() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().getSsnList();
+    }
+
+    public boolean enableSsn() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().enableSsn();
+    }
+
+    public boolean deleteSsn(String number) throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().deleteSsn(number);
+    }
+
+    public boolean deleteAllSsn() throws RemoteException, ServiceDisconnectedException {
+        return ServiceApi.getServiceApi().deleteAllSsn();
+    }
+}
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
deleted file mode 100644
index c3313bf..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/specialnumber/impl/SpecialServiceNumApi.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * 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.aidl.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/SupportApi.java
similarity index 61%
rename from rcs_service_api/src/com/suntek/mway/rcs/client/api/support/RcsSupportApi.java
rename to rcs_service_api/src/com/suntek/mway/rcs/client/api/support/SupportApi.java
index 7d2345e..cf424de 100644
--- 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/SupportApi.java
@@ -23,43 +23,28 @@
 
 package com.suntek.mway.rcs.client.api.support;
 
-import com.suntek.mway.rcs.client.aidl.constant.BroadcastConstants;
-import com.suntek.mway.rcs.client.aidl.setting.RcsUserProfileInfo;
-import com.suntek.mway.rcs.client.api.RCSServiceListener;
-import com.suntek.mway.rcs.client.api.autoconfig.RcsAccountApi;
-import com.suntek.mway.rcs.client.api.util.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.aidl.constant.Constants.PluginConstants;
+import com.suntek.mway.rcs.client.aidl.constant.Main;
+import com.suntek.mway.rcs.client.api.log.LogHelper;
 
-import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.util.Log;
 
-import java.util.ArrayList;
+import java.lang.reflect.Method;
 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";
-
+public class SupportApi {
     /**
      * The Profile plug-in that provided by CMCC.
      */
@@ -107,31 +92,53 @@
 
     private static final String PROPERTY_NAME_DM_VERSION = "persist.sys.rcs.dm.version";
 
-    /**
-     * 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);
+    private static SupportApi instance;
+
+    private SupportApi() {
+
+    }
+
+    public synchronized static SupportApi getInstance() {
+        if (instance == null) {
+            instance = new SupportApi();
+        }
+        return instance;
     }
 
     /**
      * 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 boolean isServiceInstalled(Context context) {
+        return isPackageInstalled(context, Main.PACKAGE_NAME);
     }
 
-    public static boolean isRcsPluginCenterInstalled(Context context) {
-        return isPackageInstalled(context, RCS_PLUGIN_CENTER_PACKAGE_NAME);
+    /**
+     * Check that the RcsService module is been installed.
+     *
+     * @param context
+     * @return true if RcsService module is installed.
+     */
+    public boolean isPluginInstalled(Context context) {
+        return isPackageInstalled(context, PluginConstants.CONST_PLUGIN_PACKAGE_NAME);
     }
 
-    private static boolean isPackageInstalled(Context context, String packageName) {
+    public boolean isPluginCenterInstalled(Context context) {
+        return isPackageInstalled(context, PluginConstants.CONST_PLUGIN_CENTER_PACKAGE_NAME);
+    }
+
+    public void startPluginCenterApp(Context context) throws RemoteException {
+        Intent intent = new Intent();
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.setAction(Intent.ACTION_VIEW);
+        intent.setComponent(new ComponentName(PluginConstants.CONST_PLUGIN_CENTER_PACKAGE_NAME,
+                PluginConstants.CONST_PLUGIN_CENTER_MAIN_ACTIVITY));
+        context.startActivity(intent);
+    }
+
+    private boolean isPackageInstalled(Context context, String packageName) {
         PackageManager pm = context.getPackageManager();
         List<ApplicationInfo> installedApps = pm
                 .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
@@ -145,40 +152,11 @@
         return false;
     }
 
-    private RcsAccountApi mAccountApi;
-
-    private Context mContext;
-
     private boolean mIsRcsServiceInstalled;
 
-    /**
-     * 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>();
+    public void initApi(Context context) {
+        mIsRcsServiceInstalled = isServiceInstalled(context);
 
-        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;
-    }
-
-    public void init(Context context) {
-        mContext = context;
-        mIsRcsServiceInstalled = isRcsServiceInstalled(context);
-
-        mAccountApi = new RcsAccountApi();
         if (mIsRcsServiceInstalled) {
             init();
         }
@@ -190,33 +168,18 @@
             public void run() {
                 long t0, t1;
                 t0 = System.currentTimeMillis();
-                initRcsAccountApi();
                 t1 = System.currentTimeMillis();
                 Log.d(TAG, "initRcsAccountApi cost " + (t1 - t0) + " ms");
             }
         }.start();
     }
 
-    private void initRcsAccountApi() {
-        mAccountApi.init(mContext, new RCSServiceListener() {
-            @Override
-            public void onServiceDisconnected() throws RemoteException {
-                Log.d(TAG, "RcsAccountApi disconnected");
-            }
-
-            @Override
-            public void onServiceConnected() throws RemoteException {
-                Log.d(TAG, "RcsAccountApi connected");
-            }
-        });
-    }
-
     /**
      * Return whether the RCS is support. In general, use this method to define
      * whether the RCS related UI entrance should display. The result might not
      * accurate when it is still initializing. This is a compromise for
      * performance.
-     * 
+     *
      * @param context
      * @return Whether RCS is supported.
      */
@@ -224,20 +187,62 @@
         return isRcsEnabled() && mIsRcsServiceInstalled && isSimAvailableForRcs();
     }
 
-    /**
-     * Return whether the RCS is online. The result might not accurate when it
-     * is still initializing. This is a compromise for performance.
-     * 
-     * @param context
-     * @return Whether RCS is supported.
-     */
-    public boolean isOnline() {
+    public boolean isRcsSupported(int slotId){
+        LogHelper.d("slotId:" + slotId);
+        boolean result = false;
+
         try {
-            return mAccountApi.isOnline();
-        } catch (ServiceDisconnectedException e) {
-            Log.w(TAG, "Failed invoking isOnline(). " + e.getMessage());
-            return false;
+            // get default slot id
+            int ddsSlotid = getDefaultDataSlotId();
+
+            if (ddsSlotid == slotId) {
+                result = isRcsSupported();
+            }
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(), e);
         }
+
+        return result;
+    }
+
+    public int getDefaultDataSlotId() {
+        int slotId = -1;
+        try {
+            // get default sub id
+            Object dataSubId = getDefaultDataSubId();
+
+            // get slot id by sub id
+            Class<?> subscriptionMgrClass = Class
+                    .forName("android.telephony.SubscriptionManager");
+            if (dataSubId instanceof Long) {
+                Method getSlotIdMethod = subscriptionMgrClass.getMethod("getSlotId", long.class);
+                slotId = (Integer)getSlotIdMethod.invoke(subscriptionMgrClass, (Long)dataSubId);
+            } else if (dataSubId instanceof Integer) {
+                Method getSlotIdMethod = subscriptionMgrClass.getMethod("getSlotId", int.class);
+                slotId = (Integer)getSlotIdMethod.invoke(subscriptionMgrClass, (Integer)dataSubId);
+            }
+
+            LogHelper.d("slotId:" + slotId);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(), e);
+        }
+
+        return slotId;
+    }
+
+    private Object getDefaultDataSubId() {
+        Object dataSubId = null;
+        try {
+            Class<?> subscriptionMgrClass = Class.forName("android.telephony.SubscriptionManager");
+            Method getDefaultDataSubIdMethod = subscriptionMgrClass
+                    .getMethod("getDefaultDataSubId");
+            dataSubId = getDefaultDataSubIdMethod.invoke(subscriptionMgrClass);
+            LogHelper.d("dataSubId:" + dataSubId);
+        } catch (Exception e) {
+            LogHelper.e(e.getMessage(), e);
+        }
+
+        return dataSubId;
     }
 
     private boolean isSimAvailableForRcs() {
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/OrderTimeAboutExpireException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/OrderTimeAboutExpireException.java
deleted file mode 100644
index cc1e83e..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/OrderTimeAboutExpireException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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 OrderTimeAboutExpireException extends Exception {
-
-    private static final long serialVersionUID = 1L;
-
-    public OrderTimeAboutExpireException() {
-        super();
-    }
-
-    public OrderTimeAboutExpireException(String detailMessage, Throwable throwable) {
-        super(detailMessage, throwable);
-    }
-
-    public OrderTimeAboutExpireException(String detailMessage) {
-        super(detailMessage);
-    }
-
-    public OrderTimeAboutExpireException(Throwable throwable) {
-        super(throwable);
-    }
-
-}
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
index 8b94bc7..43cf740 100644
--- 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
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * Copyright (c) 2015 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
@@ -23,20 +23,27 @@
 
 package com.suntek.mway.rcs.client.api.util;
 
+import android.content.Context;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.text.TextUtils;
+
+import com.suntek.mway.rcs.client.aidl.constant.Constants.MessageConstants;
+import com.suntek.mway.rcs.client.api.exception.FileDurationException;
+import com.suntek.mway.rcs.client.api.exception.FileNotExistsException;
+import com.suntek.mway.rcs.client.api.exception.FileSuffixException;
+import com.suntek.mway.rcs.client.api.exception.FileTooLargeException;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.log.LogHelper;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-
-import android.content.Context;
-
-import com.suntek.mway.rcs.client.aidl.constant.MediaConstants;
-import com.suntek.mway.rcs.client.aidl.provider.SuntekMessageData;
-import com.suntek.mway.rcs.client.aidl.utils.MediaUtils;
-import com.suntek.mway.rcs.client.aidl.utils.SettingUtils;
-import com.suntek.mway.rcs.client.api.util.log.LogHelper;
+import java.util.Locale;
 
 public class VerificationUtil {
+
     private static final String SIP_PREFIX = "sip:";
 
     private static final String TEL_PREFIX = "tel:";
@@ -51,11 +58,14 @@
         if (number == null) {
             return false;
         }
-        return VerificationUtil.formatWithout86(VerificationUtil.getNumberFromUri(number))
-                .replaceAll(" ", "").replaceAll("-", "").matches("\\d+");
+        return formatWith86(number).matches("[+86]\\d+");
     }
 
     public static boolean isAllNumber(List<String> numbers) {
+        if (null == numbers || numbers.size() == 0) {
+            return false;
+        }
+
         boolean sign = true;
         for (String number : numbers) {
             if (!isNumber(number)) {
@@ -66,120 +76,19 @@
     }
 
     public static String formatNumber(String number) {
-        return number.replaceAll(" ", "").replaceAll("-", "");
+        return VerificationUtil.formatWith86(VerificationUtil.getNumberFromUri(number))
+                .replaceAll(" ", "").replaceAll("-", "");
     }
 
     public static List<String> formatNumbers(List<String> numbers) {
         List<String> re = new ArrayList<String>();
         for (String number : numbers) {
-            re.add(VerificationUtil.formatWithout86(VerificationUtil.getNumberFromUri(number))
-                    .replaceAll(" ", "").replaceAll("-", ""));
+            re.add(formatNumber(number));
         }
         Collections.sort(re);
         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 isCloudFile(String filename) throws FileSuffixException {
-        if (!MediaUtils.isCloudFileAllowedFile(filename)) {
-            throw new FileSuffixException(
-                    "File extension is incorrect, the incorrect extension is '"
-                            + MediaConstants.CLOUD_FILE_EXCLUDE_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 + 1) * 1000 || recordTime > maxDuration) {
-                LogHelper.i("throw FileDurationException, duration=" + duration);
-                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 + 1) * 1000 || recordTime > maxDuration) {
-                LogHelper.i("throw FileDurationException, duration=" + duration);
-                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) {
@@ -200,6 +109,11 @@
         return formatStr.trim();
     }
 
+    public static String formatWith86(String number) {
+        number = formatWithout86(number);
+        return "+86" + number;
+    }
+
     public static String getNumberFromUri(String uriStr) {
         if (uriStr == null) {
             return "";
@@ -229,8 +143,282 @@
         return uriStr;
     }
 
-    public static boolean isOrderTimeExpired(long orderTime) {
-        return orderTime > System.currentTimeMillis()
-                + SuntekMessageData.ORDER_TIME_EXPIRE_INTERVAL_SECOND * 1000;
+    public static String getNumberListString(List<String> numberList) {
+        if (null == numberList || numberList.size() == 0) {
+            return "";
+        }
+
+        StringBuffer sbBuffer = new StringBuffer();
+        for (String number : numberList) {
+            sbBuffer.append(number).append(",");
+        }
+        sbBuffer.deleteCharAt(sbBuffer.length() - 1);
+        return sbBuffer.toString();
+    }
+
+    public static void isFileExists(String filePath) throws FileNotExistsException {
+        if (!TextUtils.isEmpty(filePath)) {
+            if (new File(filePath).exists()) {
+                return;
+            }
+        }
+
+        throw new FileNotExistsException();
+    }
+
+    public static void isImageFile(String fileName) throws FileSuffixException {
+        boolean flag = false;
+        int suffixIndex = fileName.lastIndexOf(".");
+        if (suffixIndex != -1) {
+            String suffix = fileName.substring(suffixIndex + 1);
+            flag = isImageSuffix(suffix);
+        } else {
+            flag = false;
+        }
+
+        if (!flag) {
+            throw new FileSuffixException("File extension is incorrect, the correct extension is '"
+                    + MessageConstants.CONST_IMAGE_SUFFIX + "'");
+        }
+    }
+
+    public static void isAudioFile(String fileName) throws FileSuffixException {
+        boolean flag = false;
+        if (TextUtils.isEmpty(fileName)) {
+            flag = false;
+        }
+
+        int suffixIndex = fileName.lastIndexOf(".");
+        if (suffixIndex != -1) {
+            String suffix = fileName.substring(suffixIndex + 1);
+            flag = isAudioSuffix(suffix);
+        } else {
+            flag = false;
+        }
+
+        if (!flag) {
+            throw new FileSuffixException("File extension is incorrect, the correct extension is '"
+                    + MessageConstants.CONST_AUDIO_SUFFIX + "'");
+        }
+    }
+
+    public static void isVideoFile(String fileName) throws FileSuffixException {
+        boolean flag = false;
+        if (TextUtils.isEmpty(fileName)) {
+            flag = false;
+        }
+
+        int suffixIndex = fileName.lastIndexOf(".");
+        if (suffixIndex != -1) {
+            String suffix = fileName.substring(suffixIndex + 1);
+            flag = isVideoSuffix(suffix);
+        } else {
+            flag = false;
+        }
+
+        if (!flag) {
+            throw new FileSuffixException("File extension is incorrect, the correct extension is '"
+                    + MessageConstants.CONST_VIDEO_SUFFIX + "'");
+        }
+    }
+
+    public static void isCloudFile(String filename) throws FileSuffixException {
+        if (!isCloudFileAllowedFile(filename)) {
+            throw new FileSuffixException(
+                    "File extension is incorrect, the incorrect extension is '"
+                            + MessageConstants.CONST_CLOUD_FILE_EXCLUDE_SUFFIX + "'");
+        }
+    }
+
+    public static void isFileSizeToLarge(String filename, long maxSize)
+            throws FileTooLargeException {
+        File file = new File(filename);
+        if (file.exists() && file.isFile() && file.length() > (maxSize * 1024)) {
+            throw new FileTooLargeException("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 = getAmrFileDuration(context, file);
+            if (duration >= (maxDuration + 1) * 1000 || recordTime > maxDuration * 1000) {
+                LogHelper.i("throw FileDurationException, duration=" + duration);
+                throw new FileDurationException("File duration too long " + duration
+                        + " s. Max duration is " + maxDuration + " s.");
+            }
+        }
+    }
+
+    public static void isVideoDurationToLong(Context context, String filename, long maxDuration,
+            int recordTime) throws FileDurationException {
+        File file = new File(filename);
+        if (file.exists() && file.isFile()) {
+            int duration = getVideoFileDuration(context, file);
+            if (duration >= (maxDuration + 1) * 1000 || recordTime > maxDuration * 1000) {
+                LogHelper.i("throw FileDurationException, duration=" + duration);
+                throw new FileDurationException("File duration too long " + duration
+                        + " s. Max duration is " + maxDuration + " s.");
+            }
+        }
+    }
+
+    /**
+     * Checks if is vcard file.
+     *
+     * @param fileName the file name
+     * @return true, if is vcard file
+     */
+    public static void isVcardFile(String fileName) throws FileSuffixException {
+        boolean flag = false;
+        if (TextUtils.isEmpty(fileName)) {
+            flag = false;
+        }
+
+        int suffixIndex = fileName.lastIndexOf(".");
+        if (suffixIndex != -1) {
+            String suffix = fileName.substring(suffixIndex + 1);
+            flag = isVcardSuffix(suffix);
+        } else {
+            flag = false;
+        }
+
+        if (!flag) {
+            throw new FileSuffixException("File extension is incorrect, the correct extension is '"
+                    + MessageConstants.CONST_VCARD_SUFFIX + "'");
+        }
+    }
+
+    /**
+     * Checks if is video file.
+     *
+     * @param fileName the file name
+     * @return true, if is video file
+     */
+    public static boolean isCloudFileAllowedFile(String fileName) {
+        if (TextUtils.isEmpty(fileName)) {
+            return false;
+        }
+
+        int suffixIndex = fileName.lastIndexOf(".");
+        if (suffixIndex != -1) {
+            String suffix = fileName.substring(suffixIndex + 1);
+            return !isCloudFileExcludeSuffix(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 MessageConstants.CONST_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 MessageConstants.CONST_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 MessageConstants.CONST_VIDEO_SUFFIX.indexOf(
+                suffix.toUpperCase(Locale.getDefault())) != -1;
+    }
+
+    /**
+     * Checks if is vcard suffix.
+     *
+     * @param suffix the suffix
+     * @return true, if is vcard suffix
+     */
+    public static boolean isVcardSuffix(String suffix) {
+        if (TextUtils.isEmpty(suffix)) {
+            return false;
+        }
+
+        return MessageConstants.CONST_VCARD_SUFFIX.indexOf(
+                suffix.toUpperCase(Locale.getDefault())) != -1;
+    }
+
+    /**
+     * Checks if is cloud file exclude suffix.
+     *
+     * @param suffix the suffix
+     * @return true, if is cloud file exclude suffix
+     */
+    public static boolean isCloudFileExcludeSuffix(String suffix) {
+        if (TextUtils.isEmpty(suffix)) {
+            return false;
+        }
+
+        return MessageConstants.CONST_CLOUD_FILE_EXCLUDE_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_api/src/com/suntek/mway/rcs/client/api/util/XmlUtil.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/XmlUtil.java
new file mode 100644
index 0000000..ed65848
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/XmlUtil.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2015 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.StringReader;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * The Class XmlUtil.
+ */
+public class XmlUtil {
+
+    /**
+     * Parses the.
+     *
+     * @param text the text
+     * @param handler the handler
+     * @return the default handler
+     */
+    public static DefaultHandler parse(String text, DefaultHandler handler) {
+        try {
+            SAXParserFactory spf = SAXParserFactory.newInstance();
+            SAXParser sp = spf.newSAXParser();
+            XMLReader xr = sp.getXMLReader();
+            xr.setContentHandler(handler);
+            InputSource inputSource = new InputSource(new StringReader(text));
+            xr.parse(inputSource);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return handler;
+    }
+
+}
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
deleted file mode 100644
index b0795bb..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/log/LogHelper.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * 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
deleted file mode 100644
index a251fad..0000000
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/voip/impl/RichScreenApi.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * 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.aidl.plugin.IRichScreenApi;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.PhoneList;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.ResultInfo;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.richscrn.ResultUtil;
-import com.suntek.mway.rcs.client.aidl.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;
-        }
-    }
-
-}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/PropertyNode.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/PropertyNode.java
new file mode 100644
index 0000000..d12341a
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/PropertyNode.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.suntek.rcs.ui.common;
+
+import android.content.ContentValues;
+
+import com.android.vcard.VCardEntry;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ * The class representing one property (e.g. "N;ENCODING=UTF-8:family:given:middle:prefix:suffix").
+ * </p>
+ * <p>
+ * Previously used in main vCard handling code but now exists only for testing.
+ * </p>
+ * <p>
+ * Especially useful for testing parser code (VCardParser), since all properties can be
+ * checked via this class unlike {@link VCardEntry}, which only emits the result of
+ * interpretation of the content of each vCard. We cannot know whether vCard parser or
+ * {@link VCardEntry} is wrong without this class.
+ * </p>
+ */
+public class PropertyNode implements Serializable{
+    public String propName;
+    public String propValue;
+    public List<String> propValue_vector;
+
+    /** Store value as byte[],after decode.
+     * Used when propValue is encoded by something like BASE64, QUOTED-PRINTABLE, etc.
+     */
+    public byte[] propValue_bytes;
+
+    /**
+     * param store: key=paramType, value=paramValue
+     * Note that currently PropertyNode class does not support multiple param-values
+     * defined in vCard 3.0 (See also RFC 2426). multiple-values are stored as
+     * one String value like "A,B", not ["A", "B"]...
+     * TODO: fix this.
+     */
+    public ContentValues paramMap;
+
+    /** Only for TYPE=??? param store. */
+    public Set<String> paramMap_TYPE;
+
+    /** Store group values. Used only in VCard. */
+    public Set<String> propGroupSet;
+
+    public PropertyNode() {
+        propName = "";
+        propValue = "";
+        propValue_vector = new ArrayList<String>();
+        paramMap = new ContentValues();
+        paramMap_TYPE = new HashSet<String>();
+        propGroupSet = new HashSet<String>();
+    }
+
+    public PropertyNode(String propName, String propValue, List<String> propValue_vector,
+            byte[] propValue_bytes, ContentValues paramMap, Set<String> paramMap_TYPE,
+            Set<String> propGroupSet) {
+        if (propName != null) {
+            this.propName = propName;
+        } else {
+            this.propName = "";
+        }
+        if (propValue != null) {
+            this.propValue = propValue;
+        } else {
+            this.propValue = "";
+        }
+        if (propValue_vector != null) {
+            this.propValue_vector = propValue_vector;
+        } else {
+            this.propValue_vector = new ArrayList<String>();
+        }
+        this.propValue_bytes = propValue_bytes;
+        if (paramMap != null) {
+            this.paramMap = paramMap;
+        } else {
+            this.paramMap = new ContentValues();
+        }
+        if (paramMap_TYPE != null) {
+            this.paramMap_TYPE = paramMap_TYPE;
+        } else {
+            this.paramMap_TYPE = new HashSet<String>();
+        }
+        if (propGroupSet != null) {
+            this.propGroupSet = propGroupSet;
+        } else {
+            this.propGroupSet = new HashSet<String>();
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        // vCard may contain more than one same line in one entry, while HashSet or any other
+        // library which utilize hashCode() does not honor that, so intentionally throw an
+        // Exception.
+        throw new UnsupportedOperationException(
+                "PropertyNode does not provide hashCode() implementation intentionally.");
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof PropertyNode)) {
+            return false;
+        }
+
+        PropertyNode node = (PropertyNode)obj;
+
+        if (propName == null || !propName.equals(node.propName)) {
+            return false;
+        } else if (!paramMap_TYPE.equals(node.paramMap_TYPE)) {
+            return false;
+        } else if (!paramMap_TYPE.equals(node.paramMap_TYPE)) {
+            return false;
+        } else if (!propGroupSet.equals(node.propGroupSet)) {
+            return false;
+        }
+
+        if (propValue_bytes != null && Arrays.equals(propValue_bytes, node.propValue_bytes)) {
+            return true;
+        } else {
+            if (!propValue.equals(node.propValue)) {
+                return false;
+            }
+
+            // The value in propValue_vector is not decoded even if it should be
+            // decoded by BASE64 or QUOTED-PRINTABLE. When the size of propValue_vector
+            // is 1, the encoded value is stored in propValue, so we do not have to
+            // check it.
+            return (propValue_vector.equals(node.propValue_vector) ||
+                    propValue_vector.size() == 1 ||
+                    node.propValue_vector.size() == 1);
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("propName: ");
+        builder.append(propName);
+        builder.append(", paramMap: ");
+        builder.append(paramMap.toString());
+        builder.append(", paramMap_TYPE: [");
+        boolean first = true;
+        for (String elem : paramMap_TYPE) {
+            if (first) {
+                first = false;
+            } else {
+                builder.append(", ");
+            }
+            builder.append('"');
+            builder.append(elem);
+            builder.append('"');
+        }
+        builder.append("]");
+        if (!propGroupSet.isEmpty()) {
+            builder.append(", propGroupSet: [");
+            first = true;
+            for (String elem : propGroupSet) {
+                if (first) {
+                    first = false;
+                } else {
+                    builder.append(", ");
+                }
+                builder.append('"');
+                builder.append(elem);
+                builder.append('"');
+            }
+            builder.append("]");
+        }
+        if (propValue_vector != null && propValue_vector.size() > 1) {
+            builder.append(", propValue_vector size: ");
+            builder.append(propValue_vector.size());
+        }
+        if (propValue_bytes != null) {
+            builder.append(", propValue_bytes size: ");
+            builder.append(propValue_bytes.length);
+        }
+        builder.append(", propValue: \"");
+        builder.append(propValue);
+        builder.append("\"");
+        return builder.toString();
+    }
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsEmojiGifView.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsEmojiGifView.java
new file mode 100644
index 0000000..ef3a2c7
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsEmojiGifView.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Movie;
+import android.os.Build;
+import android.os.SystemClock;
+import android.view.View;
+import android.widget.ImageView;
+
+import java.io.ByteArrayInputStream;
+
+public class RcsEmojiGifView extends ImageView {
+
+    private Movie mGifMovie;
+
+    private long mMovieStart;
+
+    private int mCurrentMovieTime = 0;
+
+    private float mMovieLeft;
+
+    private float mMovieTop;
+
+    private float mMovieScale;
+
+    private int mMovieWidth;
+
+    private int mMovieHeight;
+
+    private boolean mIsVisible = true;
+
+    public RcsEmojiGifView(Context context) {
+        super(context, null, 0);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+        }
+    }
+
+    public void setMonieByteData(byte[] data) {
+        ByteArrayInputStream is = new ByteArrayInputStream(data);
+        this.mGifMovie = Movie.decodeStream(is);
+        requestLayout();
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        if (mGifMovie != null) {
+            int movieWidth = mGifMovie.width();
+            int movieHeight = mGifMovie.height();
+            float scaleH = 1f;
+            int measureModeWidth = MeasureSpec.getMode(widthMeasureSpec);
+            if (measureModeWidth != MeasureSpec.UNSPECIFIED) {
+                int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);
+                if (movieWidth > maximumWidth)
+                    scaleH = (float)movieWidth / (float)maximumWidth;
+            }
+            float scaleW = 1f;
+            int measureModeHeight = MeasureSpec.getMode(heightMeasureSpec);
+            if (measureModeHeight != MeasureSpec.UNSPECIFIED) {
+                int maximumHeight = MeasureSpec.getSize(heightMeasureSpec);
+                if (movieHeight > maximumHeight)
+                    scaleW = (float)movieHeight / (float)maximumHeight;
+            }
+            mMovieScale = 1f / Math.max(scaleH, scaleW);
+            mMovieWidth = (int)(movieWidth * mMovieScale);
+            mMovieHeight = (int)(movieHeight * mMovieScale);
+            setMeasuredDimension(mMovieWidth, mMovieHeight);
+        } else {
+            setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
+        }
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        super.onLayout(changed, l, t, r, b);
+        mMovieLeft = (getWidth() - mMovieWidth) / 2f;
+        mMovieTop = (getHeight() - mMovieHeight) / 2f;
+        mIsVisible = getVisibility() == View.VISIBLE;
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        if (mGifMovie != null) {
+            updateMovieTime();
+            drawMovieFraming(canvas);
+            disableMovieView();
+        }
+    }
+
+    @Override
+    public void onScreenStateChanged(int screenState) {
+        super.onScreenStateChanged(screenState);
+        mIsVisible = screenState == SCREEN_STATE_ON;
+        disableMovieView();
+    }
+
+    @Override
+    protected void onVisibilityChanged(View changedView, int visibility) {
+        super.onVisibilityChanged(changedView, visibility);
+        mIsVisible = visibility == View.VISIBLE;
+        disableMovieView();
+    }
+
+    @Override
+    protected void onWindowVisibilityChanged(int visibility) {
+        super.onWindowVisibilityChanged(visibility);
+        mIsVisible = visibility == View.VISIBLE;
+        disableMovieView();
+    }
+
+    private void disableMovieView() {
+        if (mIsVisible) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+                postInvalidateOnAnimation();
+            else
+                invalidate();
+        }
+    }
+
+    private void updateMovieTime() {
+        long now = SystemClock.uptimeMillis();
+        if (mMovieStart == 0)
+            mMovieStart = now;
+        int dur = mGifMovie.duration();
+        if (dur == 0)
+            dur = 1000;
+        mCurrentMovieTime = (int)((now - mMovieStart) % dur);
+    }
+
+    private void drawMovieFraming(Canvas canvas) {
+        mGifMovie.setTime(mCurrentMovieTime);
+        canvas.save(Canvas.MATRIX_SAVE_FLAG);
+        canvas.scale(mMovieScale, mMovieScale);
+        mGifMovie.draw(canvas, mMovieLeft / mMovieScale, mMovieTop / mMovieScale);
+        canvas.restore();
+    }
+
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsEmojiInitialize.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsEmojiInitialize.java
new file mode 100644
index 0000000..a20e50b
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsEmojiInitialize.java
@@ -0,0 +1,501 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Color;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.text.TextUtils;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnLongClickListener;
+import android.view.ViewGroup;
+import android.view.ViewStub;
+import android.widget.BaseAdapter;
+import android.widget.GridView;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.ImageView.ScaleType;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmojiPackageBO;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmoticonBO;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmoticonConstant;
+import com.suntek.mway.rcs.client.api.emoticon.EmoticonApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+import com.suntek.rcs.ui.common.utils.RcsUtils;
+
+public class RcsEmojiInitialize {
+
+    private Context mContext;
+
+    private ViewStub mViewStub;
+
+    private View mEmojiView = null;
+
+    private GridView mEmojiGridView;
+
+    private GirdViewAdapter mGirdViewAdapter;
+
+    private LinearLayout mLinearLayout;
+
+    private ImageButton mDeleteBtn;
+
+    private ImageButton mAddBtn;
+
+    private String mSelectPackageId = "";
+
+    private String mDefaultPackageId = "-1";
+
+    private ArrayList<EmojiPackageBO> mEmojiPackages = new ArrayList<EmojiPackageBO>();
+
+    private ViewOnClickListener mViewOnClickListener;
+
+    private LinearLayout.LayoutParams mLayoutParams;
+
+    private ArrayList<View> packageListButton = new ArrayList<View>();
+
+    private EmojiResources mEmojiResources;
+
+    public interface ViewOnClickListener {
+
+        public void viewOpenOrCloseListener(boolean isOpen);
+
+        public void emojiSelectListener(EmoticonBO emojiObject);
+
+        public void faceTextSelectListener(String faceText);
+
+        public void onEmojiDeleteListener();
+
+        public void addEmojiPackageListener();
+    }
+
+    public View getEmojiView() {
+        return mEmojiView;
+    }
+
+    public RcsEmojiInitialize(Context context, ViewStub viewStub,
+            ViewOnClickListener viewOnClickListener, EmojiResources emojiResources) {
+        this.mContext = context;
+        this.mViewStub = viewStub;
+        this.mViewOnClickListener = viewOnClickListener;
+        mLayoutParams = new LinearLayout.LayoutParams(RcsUtils.dip2px(mContext, 45),
+                LinearLayout.LayoutParams.MATCH_PARENT);
+        mLayoutParams.leftMargin = RcsUtils.dip2px(mContext, 1);
+        mSelectPackageId = mDefaultPackageId;
+        mEmojiResources = emojiResources;
+    }
+
+    public void closeOrOpenView() {
+        if (mEmojiView == null) {
+            RcsUtils.closeKB((Activity)mContext);
+            initEmojiView();
+            mViewOnClickListener.viewOpenOrCloseListener(true);
+            return;
+        }
+        if (mEmojiView != null && mEmojiView.getVisibility() == View.GONE) {
+            RcsUtils.closeKB((Activity)mContext);
+            new Handler().postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    mEmojiView.setVisibility(View.VISIBLE);
+                    mViewOnClickListener.viewOpenOrCloseListener(true);
+                }
+            }, 200);
+        } else {
+            mEmojiView.setVisibility(View.GONE);
+            RcsUtils.openKB(mContext);
+            mViewOnClickListener.viewOpenOrCloseListener(false);
+        }
+    }
+
+    public void closeViewAndKB() {
+        mEmojiView.setVisibility(View.GONE);
+        mViewOnClickListener.viewOpenOrCloseListener(false);
+    }
+
+    public void refreshData(){
+        new LoadSessionTask().execute();
+    }
+
+    private void initEmojiView() {
+        mEmojiView = mViewStub.inflate();
+        mEmojiGridView = (GridView)mEmojiView.findViewById(mEmojiResources.mEmojiGridViewResId);
+        mLinearLayout = (LinearLayout)mEmojiView
+                .findViewById(mEmojiResources.mContentLinearLayoutResId);
+        mDeleteBtn = (ImageButton)mEmojiView.findViewById(mEmojiResources.mDeleteEmojiBtnResId);
+        mDeleteBtn.setVisibility(View.GONE);
+        mDeleteBtn.setOnClickListener(mClickListener);
+        mAddBtn = (ImageButton)mEmojiView.findViewById(mEmojiResources.mAddEmojiBtnResId);
+        mAddBtn.setOnClickListener(mClickListener);
+        mGirdViewAdapter = new GirdViewAdapter(mContext, mViewOnClickListener);
+        mEmojiGridView.setAdapter(mGirdViewAdapter);
+        new LoadSessionTask().execute();
+    }
+
+    class LoadSessionTask extends AsyncTask<Void, Void, List<EmojiPackageBO>> {
+
+        @Override
+        protected List<EmojiPackageBO> doInBackground(Void... params) {
+            List<EmojiPackageBO> packageList = new ArrayList<EmojiPackageBO>();
+            List<EmojiPackageBO> list = getStorePackageList();
+            if (list != null) {
+                packageList.addAll(list);
+            }
+            return packageList;
+        }
+
+        @Override
+        protected void onPostExecute(List<EmojiPackageBO> result) {
+            super.onPostExecute(result);
+            if(mEmojiPackages.size() > 0
+                    && mEmojiPackages.size() == result.size()){
+                return;
+            }
+            mEmojiPackages.clear();
+            mEmojiPackages.addAll(result);
+            initPackageView(result);
+            setImageButtonCheck(mSelectPackageId);
+            mGirdViewAdapter.setEmojiData(mSelectPackageId);
+        }
+
+        private ArrayList<EmojiPackageBO> getStorePackageList() {
+            ArrayList<EmojiPackageBO> storelist = new ArrayList<EmojiPackageBO>();
+            try {
+                List<EmojiPackageBO> list = EmoticonApi.getInstance().queryEmojiPackages();
+                if (list != null && list.size() > 0) {
+                    storelist.addAll(list);
+                }
+            } catch (ServiceDisconnectedException e) {
+                e.printStackTrace();
+            } catch (RemoteException e) {
+                e.printStackTrace();
+            }
+            return storelist;
+        }
+    }
+
+    private void initPackageView(List<EmojiPackageBO> packageList) {
+        mLinearLayout.removeAllViews();
+        packageListButton.clear();
+        TextView textView = createTextView();
+        mLinearLayout.addView(textView);
+        packageListButton.add(textView);
+        for (int i = 0; i < packageList.size(); i++) {
+            EmojiPackageBO emojiPackageBO = packageList.get(i);
+            ImageButton imageButton = createImageView(emojiPackageBO);
+            mLinearLayout.addView(imageButton);
+            packageListButton.add(imageButton);
+        }
+    }
+
+    private TextView createTextView() {
+        TextView textView = new TextView(mContext);
+        textView.setLayoutParams(mLayoutParams);
+        textView.setPadding(2, 2, 2, 2);
+        textView.setTag(mDefaultPackageId);
+        textView.setTextSize(25);
+        String text = new String(new int[] {
+            0x1f601
+        }, 0, 1);
+        textView.setGravity(Gravity.CENTER);
+        textView.setText(text);
+        textView.setOnClickListener(mImageOnClickListener);
+        return textView;
+    }
+
+    private ImageButton createImageView(EmojiPackageBO emojiPackageBO) {
+        ImageButton imageButton = new ImageButton(mContext);
+        imageButton.setLayoutParams(mLayoutParams);
+        imageButton.setScaleType(ScaleType.CENTER_INSIDE);
+        imageButton.setPadding(2, 2, 2, 2);
+        RcsEmojiStoreUtil.getInstance().loadImageAsynById(imageButton,
+                emojiPackageBO.getPackageId(), RcsEmojiStoreUtil.EMO_PACKAGE_FILE);
+        imageButton.setTag(emojiPackageBO.getPackageId());
+        imageButton.setOnClickListener(mImageOnClickListener);
+        return imageButton;
+    }
+
+    private OnClickListener mImageOnClickListener = new OnClickListener() {
+        @Override
+        public void onClick(View view) {
+            String packageId = (String)view.getTag();
+            if (TextUtils.isEmpty(packageId))
+                return;
+            if (mSelectPackageId.equals(packageId))
+                return;
+            mSelectPackageId = packageId;
+            setImageButtonCheck(mSelectPackageId);
+            mGirdViewAdapter.setEmojiData(mSelectPackageId);
+        }
+    };
+
+    private void setImageButtonCheck(String checkId) {
+        if (checkId.equals(mDefaultPackageId)) {
+            mDeleteBtn.setVisibility(View.VISIBLE);
+            mEmojiGridView.setNumColumns(7);
+            mGirdViewAdapter.setItemHeight(RcsUtils.dip2px(mContext, 45));
+        } else {
+            mDeleteBtn.setVisibility(View.GONE);
+            mEmojiGridView.setNumColumns(4);
+            mGirdViewAdapter.setItemHeight(RcsUtils.dip2px(mContext, 80));
+        }
+        for (View view : packageListButton) {
+            String packageId = (String)view.getTag();
+            if (!packageId.equals(checkId))
+                view.setBackgroundColor(Color.GRAY);
+            else
+                view.setBackgroundColor(Color.WHITE);
+        }
+    }
+
+    private OnClickListener mClickListener = new OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (v == mDeleteBtn) {
+                mViewOnClickListener.onEmojiDeleteListener();
+            } else if (v == mAddBtn) {
+                mViewOnClickListener.addEmojiPackageListener();
+            }
+        }
+    };
+
+    public class GirdViewAdapter extends BaseAdapter {
+
+        private ArrayList<EmoticonBO> mEmojiObjects = new ArrayList<EmoticonBO>();
+
+        private Context mContext;
+
+        private int mItemHeight;
+
+        private String mPackageId = "";
+
+        private ViewOnClickListener mViewOnClickListener;
+
+        public GirdViewAdapter(Context context, ViewOnClickListener viewOnClickListener) {
+            this.mContext = context;
+            this.mViewOnClickListener = viewOnClickListener;
+        }
+
+        private void setItemHeight(int height) {
+            this.mItemHeight = height;
+        }
+
+        public void setEmojiData(String packageId) {
+            this.mPackageId = packageId;
+            if (mPackageId.equals(mDefaultPackageId)) {
+                this.mEmojiObjects.clear();
+                this.notifyDataSetChanged();
+                return;
+            }
+            try {
+                List<EmoticonBO> list = EmoticonApi.getInstance().queryEmoticons(packageId);
+                if (list != null && list.size() > 0) {
+                    this.mEmojiObjects.clear();
+                    this.mEmojiObjects.addAll(list);
+                    this.notifyDataSetChanged();
+                }
+            } catch (ServiceDisconnectedException e) {
+                e.printStackTrace();
+            } catch (RemoteException e) {
+                e.printStackTrace();
+            }
+        }
+
+        @Override
+        public int getCount() {
+            if (mPackageId.equals(mDefaultPackageId)) {
+                return mFaceTexts.length;
+            }
+            return mEmojiObjects.size();
+        }
+
+        @Override
+        public Object getItem(int position) {
+            if (mPackageId.equals(mDefaultPackageId)) {
+                return mFaceTexts[position];
+            }
+            return mEmojiObjects.get(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            ViewHolder holder;
+            if (convertView == null) {
+                convertView = LayoutInflater.from(mContext).inflate(
+                        mEmojiResources.mEmojiGridViewItemResId, null);
+                holder = new ViewHolder(convertView);
+                convertView.setTag(holder);
+            } else {
+                holder = (ViewHolder)convertView.getTag();
+            }
+            holder.setItemHeight(mItemHeight);
+            if (mPackageId.equals(mDefaultPackageId)) {
+                int faceInt = (Integer)getItem(position);
+                holder.title.setVisibility(View.GONE);
+                holder.icon.setVisibility(View.GONE);
+                holder.textFace.setVisibility(View.VISIBLE);
+                String faceText = new String(new int[] {
+                        faceInt }, 0, 1);
+                holder.textFace.setText(faceText);
+                holder.mItemView.setTag(faceText);
+                holder.mItemView.setOnClickListener(mClickListener);
+            } else {
+                holder.textFace.setVisibility(View.GONE);
+                holder.icon.setVisibility(View.VISIBLE);
+                holder.title.setVisibility(View.VISIBLE);
+                EmoticonBO bean = (EmoticonBO)getItem(position);
+                holder.title.setText(bean.getEmoticonName());
+                RcsEmojiStoreUtil.getInstance().loadImageAsynById(holder.icon,
+                            bean.getEmoticonId(), RcsEmojiStoreUtil.EMO_STATIC_FILE);
+                holder.mItemView.setTag(bean);
+                holder.mItemView.setOnClickListener(mClickListener);
+                holder.mItemView.setOnLongClickListener(onLongClickListener);
+            }
+            return convertView;
+        }
+
+        private OnLongClickListener onLongClickListener = new OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View arg0) {
+                try {
+                    EmoticonBO bean = (EmoticonBO)arg0.getTag();
+                    byte[] data = EmoticonApi.getInstance().decrypt2Bytes(
+                            bean.getEmoticonId(), EmoticonConstant.EMO_DYNAMIC_FILE);
+                    RcsUtils.openPopupWindow(mContext, arg0, data,
+                            mEmojiResources.mEmojiPopupBgResId);
+                } catch (ServiceDisconnectedException e) {
+                    e.printStackTrace();
+                } catch (RemoteException e) {
+                    e.printStackTrace();
+                }
+                return false;
+            }
+        };
+
+        private OnClickListener mClickListener = new OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (mPackageId.equals(mDefaultPackageId)) {
+                    String faceText = (String)view.getTag();
+                    mViewOnClickListener.faceTextSelectListener(faceText);
+                } else {
+                    EmoticonBO bean = (EmoticonBO)view.getTag();
+                    mViewOnClickListener.emojiSelectListener(bean);
+                }
+            }
+        };
+
+        private final int[] mFaceTexts = new int[] {
+                0x1f600, 0x1f601, 0x1f602, 0x1f603, 0x1f604, 0x1f605, 0x1f606, 0x1f607, 0x1f608,
+                0x1f609, 0x1f60A, 0x1f60B, 0x1f60C, 0x1f60D, 0x1f60E, 0x1f60F, 0x1f610, 0x1f611,
+                0x1f612, 0x1f613, 0x1f614, 0x1f615, 0x1f616, 0x1f617, 0x1f618, 0x1f619, 0x1f61A,
+                0x1f61B, 0x1f61C, 0x1f61D, 0x1f61F, 0x1f620, 0x1f621, 0x1f622, 0x1f623, 0x1f624,
+                0x1f625, 0x1f626, 0x1f627, 0x1f628, 0x1f629, 0x1f62A, 0x1f62B, 0x1f62C, 0x1f62D,
+                0x1f62F, 0x1f630, 0x1f631, 0x1f632, 0x1f633, 0x1f634, 0x1f635, 0x1f636, 0x1f637,
+                0x1f638, 0x1f639, 0x1f63A, 0x1f63B, 0x1f63C, 0x1f63D, 0x1f63F, 0x1f640, 0x1f645,
+                0x1f646, 0x1f647, 0x1f648, 0x1f649, 0x1f64A, 0x1f64B, 0x1f64C, 0x1f64D, 0x1f64F
+        };
+
+        private class ViewHolder {
+            RelativeLayout mItemView;
+
+            TextView title;
+
+            TextView textFace;
+
+            ImageView icon;
+
+            public void setItemHeight(int height) {
+                RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams)this.mItemView
+                        .getLayoutParams();
+                param.height = height;
+            }
+
+            public ViewHolder(View convertView) {
+                this.title = (TextView)convertView.findViewById(mEmojiResources.mTitleResId);
+                this.icon = (ImageView)convertView.findViewById(mEmojiResources.mIconResId);
+                this.textFace = (TextView)convertView.findViewById(mEmojiResources.mTextFaceResId);
+                this.mItemView = (RelativeLayout)convertView.findViewById(mEmojiResources.mItemResId);
+                this.mItemView.setBackgroundResource(mEmojiResources.mEmojiButtonBgResId);
+            }
+        }
+    }
+
+    public static class EmojiResources {
+        private int mTitleResId; // R.id.title
+        private int mIconResId; // R.id.icon
+        private int mTextFaceResId; // R.id.text_face
+        private int mItemResId; // R.id.item
+        private int mEmojiButtonBgResId; // R.drawable.rcs_emoji_button_bg
+        private int mEmojiGridViewItemResId; // R.layout.rcs_emoji_grid_view_item
+        private int mDeleteEmojiBtnResId; // R.id.delete_emoji_btn
+        private int mAddEmojiBtnResId; // R.id.add_emoji_btn
+        private int mEmojiGridViewResId; // R.id.emoji_grid_view
+        private int mContentLinearLayoutResId; // R.id.content_linear_layout
+        private int mEmojiPopupBgResId; // R.drawable.rcs_emoji_popup_bg
+
+        private EmojiResources(int titleResId, int iconResId, int textFaceResId, int itemResId,
+                int emojiButtonBgResId, int emojiGridViewItemResId, int deleteEmojiBtnResId,
+                int addEmojiBtnResId, int emojiGridViewResId, int contentLinearLayoutResId,
+                int emojiPopupBgResId) {
+            this.mTitleResId = titleResId;
+            this.mIconResId = iconResId;
+            this.mTextFaceResId = textFaceResId;
+            this.mItemResId = itemResId;
+            this.mEmojiButtonBgResId = emojiButtonBgResId;
+            this.mEmojiGridViewItemResId = emojiGridViewItemResId;
+            this.mDeleteEmojiBtnResId = deleteEmojiBtnResId;
+            this.mAddEmojiBtnResId = addEmojiBtnResId;
+            this.mEmojiGridViewResId = emojiGridViewResId;
+            this.mContentLinearLayoutResId = contentLinearLayoutResId;
+            this.mEmojiPopupBgResId = emojiPopupBgResId;
+        }
+
+        public static EmojiResources create(int titleResId, int iconResId, int textFaceResId,
+                int itemResId, int emojiButtonBgResId, int emojiGridViewItemResId,
+                int deleteEmojiBtnResId, int addEmojiBtnResId, int emojiGridViewResId,
+                int contentLinearLayoutResId, int emojiPopupBgResId) {
+            return new EmojiResources(titleResId, iconResId, textFaceResId, itemResId,
+                    emojiButtonBgResId, emojiGridViewItemResId, deleteEmojiBtnResId,
+                    addEmojiBtnResId, emojiGridViewResId, contentLinearLayoutResId,
+                    emojiPopupBgResId);
+        }
+    }
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsEmojiStoreUtil.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsEmojiStoreUtil.java
new file mode 100644
index 0000000..4b49c99
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsEmojiStoreUtil.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common;
+
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Handler;
+import android.os.Message;
+import android.os.RemoteException;
+import android.text.TextUtils;
+import android.widget.ImageView;
+
+import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.EmoticonConstant;
+import com.suntek.mway.rcs.client.api.emoticon.EmoticonApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+public class RcsEmojiStoreUtil {
+
+    public static final int EMO_STATIC_FILE = EmoticonConstant.EMO_STATIC_FILE;
+
+    public static final int EMO_DYNAMIC_FILE = EmoticonConstant.EMO_DYNAMIC_FILE;
+
+    public static final int EMO_PACKAGE_FILE = EmoticonConstant.EMO_PACKAGE_FILE;
+
+    private Map<String, SoftReference<Bitmap>> mCaches;
+
+    private LinkedBlockingQueue<LoaderImageTask> mTaskQueue;
+
+    private boolean mIsRuning = false;
+
+    private static RcsEmojiStoreUtil mInstance;
+
+    public static RcsEmojiStoreUtil getInstance() {
+        if (mInstance == null) {
+            mInstance = new RcsEmojiStoreUtil();
+        }
+        return mInstance;
+    }
+
+    private RcsEmojiStoreUtil() {
+        mCaches = new HashMap<String, SoftReference<Bitmap>>();
+        mTaskQueue = new LinkedBlockingQueue<RcsEmojiStoreUtil.LoaderImageTask>();
+        mIsRuning = true;
+        new Thread(runnable).start();
+    }
+
+    public void loadImageAsynById(ImageView imageView, String imageId,
+            int loaderType) {
+        if(imageView == null){
+            return;
+        }
+        imageView.setTag(imageId);
+        if (mCaches.containsKey(imageId)) {
+            SoftReference<Bitmap> rf = mCaches.get(imageId);
+            Bitmap bitmap = rf.get();
+            if (bitmap == null) {
+                mCaches.remove(imageId);
+            } else {
+                imageView.setImageBitmap(bitmap);
+                return;
+            }
+        }
+        mTaskQueue.add(new LoaderImageTask(imageId, imageView, loaderType));
+    }
+
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            LoaderImageTask task = (LoaderImageTask) msg.obj;
+            String imageId = (String) task.imageView.getTag();
+            if(!TextUtils.isEmpty(imageId) && imageId.equals(task.imageId)){
+                if (task.bitmap != null) {
+                    task.imageView.setImageBitmap(task.bitmap);
+                }
+            }
+        }
+    };
+
+    private Runnable runnable = new Runnable() {
+        @Override
+        public void run() {
+            while (mIsRuning) {
+                try {
+                    LoaderImageTask task = mTaskQueue.take();
+                    String imageId = (String) task.imageView.getTag();
+                    if(!TextUtils.isEmpty(imageId) && imageId.equals(task.imageId)){
+                        task.bitmap = getbitmap(task.loaderType, task.imageId);
+                        if (mHandler != null) {
+                            Message msg = mHandler.obtainMessage();
+                            msg.obj = task;
+                            mHandler.sendMessage(msg);
+                        }
+                    }
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    };
+
+    private Bitmap getbitmap(int loaderType, String emoticonId) {
+        byte[] imageByte = null;
+        Bitmap bitmap = null;
+        try {
+            if (loaderType == EMO_STATIC_FILE) {
+                imageByte = EmoticonApi.getInstance().decrypt2Bytes(
+                        emoticonId, EMO_STATIC_FILE);
+            } else if (loaderType == EMO_PACKAGE_FILE) {
+                imageByte = EmoticonApi.getInstance().decrypt2Bytes(
+                        emoticonId, EMO_PACKAGE_FILE);
+            }
+        } catch (ServiceDisconnectedException e) {
+            e.printStackTrace();
+        } catch (RemoteException e) {
+            e.printStackTrace();
+        }
+        if (imageByte != null) {
+            bitmap = BitmapFactory.decodeByteArray(imageByte, 0,
+                    imageByte.length);
+        }
+        if (bitmap != null) {
+            mCaches.put(emoticonId, new SoftReference<Bitmap>(bitmap));
+        }
+        return bitmap;
+    }
+
+    public class LoaderImageTask {
+        String imageId;
+
+        ImageView imageView;
+
+        Bitmap bitmap;
+
+        int loaderType;
+
+        public LoaderImageTask(String imageId, ImageView imageView,
+                int loaderType) {
+            this.imageId = imageId;
+            this.imageView = imageView;
+            this.loaderType = loaderType;
+        }
+    }
+
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsLog.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsLog.java
new file mode 100644
index 0000000..9e690b9
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/RcsLog.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common;
+
+import android.os.SystemProperties;
+import android.util.Log;
+
+/**
+ * Log utilities class for RCS. Default log level is
+ * {@link com.suntek.rcs.ui.common.RcsLog#DEFAULT_LOG_LEVEL}.
+ */
+public class RcsLog {
+    private static final int LOG_LEVEL_NONE = 0;
+
+    private static final int LOG_LEVEL_VERBOSE = 1;
+
+    private static final int LOG_LEVEL_DEBUG = 2;
+
+    private static final int LOG_LEVEL_INFO = 3;
+
+    private static final int LOG_LEVEL_WARNNING = 4;
+
+    private static final int LOG_LEVEL_ERROR = 5;
+
+    private static final int DEFAULT_LOG_LEVEL = LOG_LEVEL_VERBOSE;
+
+    private static final String LOG_LEVEL_PROPERTIES = "persist.sys.rcs.log.level";
+
+    private static String sTag = "RCS_UI";
+
+    public static void v(String msg) {
+        int logLevel = getLogLevel();
+        if (logLevel > 0 && logLevel <= LOG_LEVEL_VERBOSE) {
+            Log.v(sTag, msg);
+        }
+    }
+
+    public static void d(String msg) {
+        int logLevel = getLogLevel();
+        if (logLevel > 0 && logLevel <= LOG_LEVEL_DEBUG) {
+            Log.d(sTag, msg);
+        }
+    }
+
+    public static void i(String msg) {
+        int logLevel = getLogLevel();
+        if (logLevel > 0 && logLevel <= LOG_LEVEL_INFO) {
+            Log.i(sTag, msg);
+        }
+    }
+
+    public static void w(String msg) {
+        int logLevel = getLogLevel();
+        if (logLevel > 0 && logLevel <= LOG_LEVEL_WARNNING) {
+            Log.w(sTag, msg);
+        }
+    }
+
+    public static void w(Throwable tr) {
+        int logLevel = getLogLevel();
+        if (logLevel > 0 && logLevel <= LOG_LEVEL_WARNNING) {
+            Log.w(sTag, tr);
+        }
+    }
+
+    public static void w(String msg, Throwable tr) {
+        int logLevel = getLogLevel();
+        if (logLevel > 0 && logLevel <= LOG_LEVEL_WARNNING) {
+            Log.w(sTag, msg, tr);
+        }
+    }
+
+    public static void e(String msg) {
+        int logLevel = getLogLevel();
+        if (logLevel > 0 && logLevel <= LOG_LEVEL_ERROR) {
+            Log.e(sTag, msg);
+        }
+    }
+
+    public static void e(Throwable tr) {
+        int logLevel = getLogLevel();
+        if (logLevel > 0 && logLevel <= LOG_LEVEL_ERROR) {
+            Log.e(sTag, "", tr);
+        }
+    }
+
+    public static void e(String msg, Throwable tr) {
+        int logLevel = getLogLevel();
+        if (logLevel > 0 && logLevel <= LOG_LEVEL_ERROR) {
+            Log.e(sTag, msg, tr);
+        }
+    }
+
+    private static int getLogLevel() {
+        return SystemProperties.getInt(LOG_LEVEL_PROPERTIES, DEFAULT_LOG_LEVEL);
+    }
+
+    public static void setTag(String tag) {
+        sTag = tag;
+    }
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/VNode.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/VNode.java
new file mode 100644
index 0000000..14e4e0d
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/VNode.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.suntek.rcs.ui.common;
+
+import java.util.ArrayList;
+
+/**
+ * Previously used in main vCard handling code but now exists only for testing.
+ *
+ * TODO: remove this and relevant classes. Given we can have appropriate test cases for
+ * VCardEntry and VCardProperty, we won't need redundancy here.
+ */
+public class VNode {
+    public ArrayList<PropertyNode> propList = new ArrayList<PropertyNode>();
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/VNodeBuilder.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/VNodeBuilder.java
new file mode 100644
index 0000000..1bc7be0
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/VNodeBuilder.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.suntek.rcs.ui.common;
+
+import android.content.ContentValues;
+import android.util.Base64;
+import android.util.Log;
+
+import com.android.vcard.VCardConfig;
+import com.android.vcard.VCardInterpreter;
+import com.android.vcard.VCardProperty;
+import com.android.vcard.VCardUtils;
+import com.suntek.rcs.ui.common.VNode;
+import com.suntek.rcs.ui.common.PropertyNode;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * The class storing the parse result to custom datastruct:
+ * {@link VNode}, and {@link PropertyNode}.
+ * Maybe several vcard instance, so use vNodeList to store.
+ * </p>
+ * <p>
+ * This is called VNode, not VCardNode, since it was used for expressing vCalendar (iCal).
+ * </p>
+ */
+public class VNodeBuilder implements VCardInterpreter {
+    private static String LOG_TAG = "VNodeBuilder";
+
+    private List<VNode> mVNodeList = new ArrayList<VNode>();
+    private VNode mCurrentVNode;
+
+    /**
+     * The charset using which VParser parses the text.
+     */
+    private String mSourceCharset;
+
+    /**
+     * The charset with which byte array is encoded to String.
+     */
+    private String mTargetCharset;
+
+    private boolean mStrictLineBreakParsing;
+
+    public VNodeBuilder() {
+        this(VCardConfig.DEFAULT_IMPORT_CHARSET, false);
+    }
+
+    public VNodeBuilder(String targetCharset, boolean strictLineBreakParsing) {
+        mSourceCharset = VCardConfig.DEFAULT_INTERMEDIATE_CHARSET;
+        if (targetCharset != null) {
+            mTargetCharset = targetCharset;
+        } else {
+            mTargetCharset = VCardConfig.DEFAULT_IMPORT_CHARSET;
+        }
+        mStrictLineBreakParsing = strictLineBreakParsing;
+    }
+
+    @Override
+    public void onVCardStarted() {
+    }
+
+    @Override
+    public void onVCardEnded() {
+    }
+
+    @Override
+    public void onEntryStarted() {
+        mCurrentVNode = new VNode();
+        mVNodeList.add(mCurrentVNode);
+    }
+
+    @Override
+    public void onEntryEnded() {
+        int lastIndex = mVNodeList.size() - 1;
+        mCurrentVNode = lastIndex >= 0 ? mVNodeList.get(lastIndex) : null;
+    }
+
+    @Override
+    public void onPropertyCreated(VCardProperty property) {
+        // TODO: remove PropertyNode.
+        PropertyNode propNode = new PropertyNode();
+        propNode.propName = property.getName();
+        List<String> groupList = property.getGroupList();
+        if (groupList != null) {
+            propNode.propGroupSet.addAll(groupList);
+        }
+        Map<String, Collection<String>> propertyParameterMap = property.getParameterMap();
+        for (String paramType : propertyParameterMap.keySet()) {
+            Collection<String> paramValueList = propertyParameterMap.get(paramType);
+            if (paramType.equalsIgnoreCase("TYPE")) {
+                propNode.paramMap_TYPE.addAll(paramValueList);
+            } else {
+                for (String paramValue : paramValueList) {
+                    propNode.paramMap.put(paramType, paramValue);
+                }
+            }
+        }
+
+        // TODO: just redundant
+
+        if (property.getRawValue() == null) {
+            propNode.propValue_bytes = null;
+            propNode.propValue_vector.clear();
+            propNode.propValue_vector.add("");
+            propNode.propValue = "";
+            return;
+        }
+
+        final List<String> values = property.getValueList();
+        if (values == null || values.size() == 0) {
+            propNode.propValue_vector.clear();
+            propNode.propValue_vector.add("");
+            propNode.propValue = "";
+        } else {
+            propNode.propValue_vector.addAll(values);
+            propNode.propValue = listToString(propNode.propValue_vector);
+        }
+        propNode.propValue_bytes = property.getByteValue();
+
+        mCurrentVNode.propList.add(propNode);
+        System.out.println("........"+propNode.toString());
+    }
+
+    private String listToString(List<String> list){
+        int size = list.size();
+        if (size > 1) {
+            StringBuilder typeListB = new StringBuilder();
+            for (String type : list) {
+                typeListB.append(type).append(";");
+            }
+            int len = typeListB.length();
+            if (len > 0 && typeListB.charAt(len - 1) == ';') {
+                return typeListB.substring(0, len - 1);
+            }
+            return typeListB.toString();
+        } else if (size == 1) {
+            return list.get(0);
+        } else {
+            return "";
+        }
+    }
+
+    public String getResult(){
+        throw new RuntimeException("Not supported");
+    }
+
+    public List<VNode> getVNodeList() {
+        return mVNodeList;
+    }
+
+    public VNode getCurrentVNode() {
+        return mCurrentVNode;
+    }
+}
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileSuffixException.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GeoLocation.java
similarity index 66%
copy from rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileSuffixException.java
copy to rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GeoLocation.java
index 0ebc25a..f3ee48e 100644
--- a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileSuffixException.java
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GeoLocation.java
@@ -21,26 +21,41 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.api.util;
+package com.suntek.rcs.ui.common.mms;
 
-public class FileSuffixException extends Exception {
+public class GeoLocation {
+    private double lat;
+    private double lng;
+    private String lable;
 
-    private static final long serialVersionUID = 1L;
-
-    public FileSuffixException() {
-        super();
+    public double getLat() {
+        return lat;
     }
 
-    public FileSuffixException(String detailMessage, Throwable throwable) {
-        super(detailMessage, throwable);
+    public void setLat(double lat) {
+        this.lat = lat;
     }
 
-    public FileSuffixException(String detailMessage) {
-        super(detailMessage);
+    public double getLng() {
+        return lng;
     }
 
-    public FileSuffixException(Throwable throwable) {
-        super(throwable);
+    public void setLng(double lng) {
+        this.lng = lng;
     }
 
+    public String getLabel() {
+        return lable;
+    }
+
+    public void setLabel(String lable) {
+        this.lable = lable;
+    }
+
+    @Override
+    public String toString() {
+        return "GeoLocation [lat=" + lat + ", lng=" + lng + ", lable=" + lable + "]";
+    }
+
+
 }
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GeoLocationParser.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GeoLocationParser.java
new file mode 100644
index 0000000..e980571
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GeoLocationParser.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.mms;
+
+import java.io.InputStream;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import com.suntek.rcs.ui.common.mms.GeoLocation;
+
+public class GeoLocationParser extends DefaultHandler {
+
+    /** The accumulator. */
+    private StringBuffer accumulator;
+
+    /** The geo location. */
+    private GeoLocation geoLocation = new GeoLocation();
+
+    /**
+     * Instantiates a new geo location parser.
+     *
+     * @param input
+     *            the input
+     * @throws Exception
+     *             the exception
+     */
+    public GeoLocationParser(InputStream input) throws Exception {
+        SAXParserFactory factory = SAXParserFactory.newInstance();
+        SAXParser parser = factory.newSAXParser();
+        parser.parse(input, this);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
+     */
+    @Override
+    public void characters(char buffer[], int start, int length) {
+        accumulator.append(buffer, start, length);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.xml.sax.helpers.DefaultHandler#endDocument()
+     */
+    @Override
+    public void endDocument() throws SAXException {
+        super.endDocument();
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
+     * java.lang.String, java.lang.String)
+     */
+    @Override
+    public void endElement(String uri, String localName, String qName)
+            throws SAXException {
+        super.endElement(uri, localName, qName);
+
+        String value = accumulator.toString();
+
+        if (localName.equals("pos")) {
+            String geoLocs[] = value.split(" ");
+            double lat = 0;
+            double lng = 0;
+            if (geoLocs.length >= 2) {
+                try {
+                    lat = Double.parseDouble(geoLocs[0]);
+                    lng = Double.parseDouble(geoLocs[1]);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            geoLocation.setLng(lng);
+            geoLocation.setLat(lat);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.xml.sax.helpers.DefaultHandler#startDocument()
+     */
+    @Override
+    public void startDocument() throws SAXException {
+        super.startDocument();
+        accumulator = new StringBuffer();
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
+     * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+     */
+    @Override
+    public void startElement(String uri, String localName, String qName,
+            Attributes attributes) throws SAXException {
+        accumulator.setLength(0);
+        if (localName.equals("rcspushlocation")) {
+            String label = attributes.getValue("label");
+            geoLocation.setLabel(label);
+        }
+
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.xml.sax.helpers.DefaultHandler#warning(org.xml.sax.SAXParseException)
+     */
+    public void warning(SAXParseException exception) {
+        // do nothing.
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
+     */
+    public void error(SAXParseException exception) {
+        // do nothing.
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException
+     * )
+     */
+    public void fatalError(SAXParseException exception) throws SAXException {
+        throw exception;
+    }
+
+    /**
+     * Gets the geo location.
+     *
+     * @return the geo location
+     */
+    public GeoLocation getGeoLocation() {
+        return geoLocation;
+    }
+
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GroupChatManagerReceiver.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GroupChatManagerReceiver.java
new file mode 100644
index 0000000..3772f70
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GroupChatManagerReceiver.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.mms;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.suntek.mway.rcs.client.aidl.constant.Actions;
+import com.suntek.mway.rcs.client.aidl.constant.Constants.GroupChatConstants;
+import com.suntek.mway.rcs.client.aidl.constant.Parameter;
+
+
+public class GroupChatManagerReceiver extends BroadcastReceiver {
+
+    private GroupChatNotifyCallback mCallback;
+
+    public GroupChatManagerReceiver(GroupChatNotifyCallback callback) {
+        this.mCallback = callback;
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (Actions.GroupChatAction.ACTION_GROUP_CHAT_MANAGE_NOTIFY.equals(intent.getAction())) {
+            Bundle extras = intent.getExtras();
+            int actionType = intent.getIntExtra(Parameter.EXTRA_TYPE, 0);
+            if (GroupChatConstants.CONST_CREATE == actionType) {
+                if (mCallback != null) {
+                    mCallback.onGroupChatCreate(extras);
+                }
+            } else if (GroupChatConstants.CONST_SET_ALIAS == actionType) {
+                if (mCallback != null) {
+                    mCallback.onMemberAliasChange(extras);
+                }
+            } else if (GroupChatConstants.CONST_DISBAND == actionType) {
+                if (mCallback != null) {
+                    mCallback.onDisband(extras);
+                }
+            } else if (GroupChatConstants.CONST_QUIT == actionType) {
+                if (mCallback != null) {
+                    mCallback.onDeparted(extras);
+                }
+            } else if (GroupChatConstants.CONST_SET_SUBJECT == actionType) {
+                if (mCallback != null) {
+                    mCallback.onUpdateSubject(extras);
+                }
+            } else if (GroupChatConstants.CONST_SET_REMARK == actionType) {
+                if (mCallback != null) {
+                    mCallback.onUpdateRemark(extras);
+                }
+            } else if (GroupChatConstants.CONST_GONE == actionType) {
+                if (mCallback != null) {
+                    mCallback.onCreateNotActive(extras);
+                }
+            } else if (GroupChatConstants.CONST_BOOTED == actionType) {
+                if (mCallback != null) {
+                    mCallback.onBootMe(extras);
+                }
+            } else if (GroupChatConstants.CONST_GONE == actionType) {
+                if (mCallback != null) {
+                    mCallback.onGroupGone(extras);
+                }
+            }
+        }
+    }
+
+    public interface GroupChatNotifyCallback {
+        void onGroupChatCreate(Bundle extras);
+
+        void onMemberAliasChange(Bundle extras);
+
+        void onDisband(Bundle extras);
+
+        void onDeparted(Bundle extras);
+
+        void onUpdateSubject(Bundle extras);
+
+        void onUpdateRemark(Bundle extras);
+
+        void onCreateNotActive(Bundle extras);
+
+        void onBootMe(Bundle extras);
+
+        void onGroupGone(Bundle extras);
+    }
+
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GroupMemberPhotoCache.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GroupMemberPhotoCache.java
new file mode 100644
index 0000000..c128f3b
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/GroupMemberPhotoCache.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.mms;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Message;
+import android.os.RemoteException;
+import android.text.TextUtils;
+import android.util.Base64;
+import android.widget.ImageView;
+
+import com.suntek.mway.rcs.client.aidl.constant.Parameter;
+import com.suntek.mway.rcs.client.aidl.plugin.entity.profile.Avatar;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+import com.suntek.mway.rcs.client.api.groupchat.GroupChatCallback;
+import com.suntek.mway.rcs.client.api.groupchat.GroupChatApi;
+
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class GroupMemberPhotoCache {
+    private final static int IMAGE_PIXEL = 120;
+    private HashMap<String, SoftReference<Bitmap>> mImageCache;
+    private LinkedBlockingQueue<LoaderImageTask> mTaskQueue;
+    private boolean mIsRuning = false;
+    private static GroupMemberPhotoCache sInstance = new GroupMemberPhotoCache();
+    private static Drawable mDefaultContectImage = null;
+
+    private GroupMemberPhotoCache() {
+        mImageCache = new HashMap<String, SoftReference<Bitmap>>();
+        mTaskQueue = new LinkedBlockingQueue<LoaderImageTask>();
+        mIsRuning = true;
+        new Thread(runnable).start();
+    }
+
+    public void loadGroupMemberPhoto(long rcsGroupId, String addr,
+            final ImageView mAvatar,final Drawable defaultContactImage) {
+        if (mDefaultContectImage == null) {
+            mDefaultContectImage = defaultContactImage;
+        }
+        if(mAvatar == null){
+            return;
+        }
+        mAvatar.setTag(addr);
+        if (mImageCache.containsKey(addr)) {
+            SoftReference<Bitmap> rf = mImageCache.get(addr);
+            Bitmap bitmap = rf.get();
+            if (bitmap == null) {
+                mImageCache.remove(addr);
+            } else {
+                mAvatar.setImageBitmap(bitmap);
+                return;
+            }
+        }
+        mTaskQueue.add(new LoaderImageTask(addr, mAvatar, rcsGroupId));
+    }
+
+    public static GroupMemberPhotoCache getInstance() {
+        if (sInstance == null) {
+            sInstance = new GroupMemberPhotoCache();
+        }
+        return sInstance;
+    }
+
+    public class LoaderImageTask {
+        String number;
+
+        ImageView imageView;
+
+        Bitmap bitmap;
+
+        long mGroupId;
+
+        public LoaderImageTask(String number, ImageView imageView, long groupId) {
+            this.number = number;
+            this.imageView = imageView;
+            this.mGroupId = groupId;
+        }
+    }
+
+    private Bitmap getbitmap(String number, long groupId) {
+        Bitmap bitmap = null;
+        try {
+            GroupChatApi.getInstance().getMemberAvatar(groupId, number, IMAGE_PIXEL,
+                    new GroupChatCallback() {
+
+                        @Override
+                        public void onUpdateAvatar(Avatar avatar, int resultCode,
+                                String resultDesc) throws RemoteException {
+                            if (avatar != null) {
+                                String str = avatar.getImgBase64Str();
+                                if (str != null) {
+                                    byte[] imageByte = Base64.decode(str, Base64.DEFAULT);
+                                    Bitmap bitmap = BitmapFactory.decodeByteArray(imageByte, 0,
+                                            imageByte.length);
+                                }
+                            }
+                        }
+                    });
+        } catch (ServiceDisconnectedException e) {
+            e.printStackTrace();
+        } catch (RemoteException e) {
+            e.printStackTrace();
+        }
+        if (bitmap != null) {
+            mImageCache.put(number, new SoftReference<Bitmap>(bitmap));
+        }
+        return bitmap;
+    }
+
+    private Runnable runnable = new Runnable() {
+        @Override
+        public void run() {
+            while (mIsRuning) {
+                try {
+                    LoaderImageTask task = mTaskQueue.take();
+                    String imageId = (String) task.imageView.getTag();
+                    if (!TextUtils.isEmpty(imageId) && imageId.equals(task.number)) {
+                        task.bitmap = getbitmap(task.number, task.mGroupId);
+                        if (mHandler != null) {
+                            Message msg = mHandler.obtainMessage();
+                            msg.obj = task;
+                            mHandler.sendMessage(msg);
+                        }
+                    }
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    };
+
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            LoaderImageTask task = (LoaderImageTask) msg.obj;
+            String number = (String) task.imageView.getTag();
+            if (!TextUtils.isEmpty(number) && number.equals(task.number)) {
+                if (task.bitmap != null) {
+                    task.imageView.setImageBitmap(task.bitmap);
+                }
+            }
+        }
+    };
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/ImageUtils.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/ImageUtils.java
new file mode 100644
index 0000000..89b941b
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/ImageUtils.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.mms;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+
+public class ImageUtils {
+    private static int IMAGE_MAX_WIDTH = 480;
+    private static int IMAGE_MAX_HEIGHT = 960;
+
+    public static Bitmap getBitmap(String imagePath){
+        BitmapFactory.Options option = new BitmapFactory.Options();
+        option.inSampleSize = getImageScale(imagePath);
+        return BitmapFactory.decodeFile(imagePath, option);
+    }
+
+    /**
+     * scale image to fixed height and weight
+     *
+     * @param imagePath
+     * @return
+     */
+    public static int getImageScale(String imagePath) {
+        BitmapFactory.Options option = new BitmapFactory.Options();
+        option.inJustDecodeBounds = true;
+        BitmapFactory.decodeFile(imagePath, option);
+
+        int scale = 1;
+        while (option.outWidth / scale >= IMAGE_MAX_WIDTH
+                || option.outHeight / scale >= IMAGE_MAX_HEIGHT) {
+            scale *= 2;
+        }
+        return scale;
+    }
+
+    public static Drawable getRoundCornerDrawable(Resources resources, int resId){
+        Bitmap bitmapRes = BitmapFactory.decodeResource(resources, resId);
+        Bitmap bitmap = createBitmapRoundCorner(bitmapRes, bitmapRes.getWidth() / 2);
+        BitmapDrawable bd = new BitmapDrawable(bitmap);
+        return bd;
+    }
+
+    private static Bitmap createBitmapRoundCorner(Bitmap bitmap, int roundCornerPixels) {
+        if (bitmap == null)
+            return Bitmap.createBitmap(10, 10, Config.ARGB_8888);
+        Bitmap output = Bitmap
+                .createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
+        Canvas canvas = new Canvas(output);
+        final int color = 0xff424242;
+        final Paint paint = new Paint();
+        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
+        final RectF rectF = new RectF(rect);
+        final float roundPx = roundCornerPixels;
+        paint.setAntiAlias(true);
+        canvas.drawARGB(0, 0, 0, 0);
+        paint.setColor(color);
+        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
+        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
+        canvas.drawBitmap(bitmap, rect, rect, paint);
+        return output;
+    }
+
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/RcsContactsUtils.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/RcsContactsUtils.java
new file mode 100644
index 0000000..d684592
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/RcsContactsUtils.java
@@ -0,0 +1,342 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.mms;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.text.TextUtils;
+
+import com.suntek.mway.rcs.client.aidl.service.entity.GroupChatMember;
+import com.suntek.mway.rcs.client.api.groupchat.GroupChatApi;
+import com.suntek.mway.rcs.client.api.exception.ServiceDisconnectedException;
+
+public class RcsContactsUtils {
+    public static final String NOTIFY_CONTACT_PHOTO_CHANGE =
+            "com.suntek.mway.rcs.NOTIFY_CONTACT_PHOTO_CHANGE";
+    public static final String LOCAL_PHOTO_SETTED = "local_photo_setted";
+    public static final String MIMETYPE_RCS = "vnd.android.cursor.item/rcs";
+    public static final String PHONE_PRE_CODE = "+86";
+
+    public static String getMyRcsRawContactId(Context context){
+        String rawContactId = null;
+        Uri uri = Uri.parse("content://com.android.contacts/profile/data/");
+        Cursor cursor = context.getContentResolver().query(
+                uri,
+                new String[] {"raw_contact_id"}, null,null, null);
+        if(cursor != null){
+            if(cursor.moveToNext()){
+                rawContactId = cursor.getString(0);
+                cursor.close();
+                cursor = null;
+            }
+        }
+       return rawContactId;
+    }
+
+    public static String getRawContactId(Context context,String contactId) {
+        String rawContactId = null;
+        Cursor cursor = context.getContentResolver()
+                .query(RawContacts.CONTENT_URI,
+                        new String[] { RawContacts._ID },
+                        RawContacts.CONTACT_ID + "=?",
+                        new String[] { contactId }, null);
+        if (null != cursor) {
+            if (cursor.moveToNext())
+                rawContactId = cursor.getString(0);
+            cursor.close();
+            cursor = null;
+        }
+        return rawContactId;
+    }
+
+    public static String getGroupChatMemberDisplayName(Context context, long groupId,
+            String number) {
+        List<GroupChatMember> list = null;
+        try {
+            list = GroupChatApi.getInstance().getMembers(groupId);
+            if (list == null || list.size() == 0) {
+                return number;
+            }
+        } catch (ServiceDisconnectedException e) {
+            e.printStackTrace();
+        } catch (RemoteException e){
+            e.printStackTrace();
+        }
+
+        for (GroupChatMember groupChatMember : list) {
+            if (groupChatMember.getNumber().equals(number)) {
+                if (!TextUtils.isEmpty(groupChatMember.getAlias())) {
+                    return groupChatMember.getAlias();
+                } else {
+                    return getContactNameFromPhoneBook(context, number);
+                }
+            }
+        }
+        return number;
+    }
+
+    public static String getContactNameFromPhoneBook(Context context, String phoneNum) {
+        String contactName = phoneNum;
+        String numberW86;
+        if (!phoneNum.startsWith(PHONE_PRE_CODE)) {
+            numberW86 = PHONE_PRE_CODE + phoneNum;
+        } else {
+            numberW86 = phoneNum;
+            phoneNum = phoneNum.substring(3);
+        }
+        String formatNumber = getAndroidFormatNumber(phoneNum);
+
+        ContentResolver cr = context.getContentResolver();
+        Cursor pCur = cr.query(
+                ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {
+                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
+                },
+                ContactsContract.CommonDataKinds.Phone.NUMBER + " = ? OR "
+                        + ContactsContract.CommonDataKinds.Phone.NUMBER + " = ? OR "
+                        + ContactsContract.CommonDataKinds.Phone.NUMBER + " = ? ",
+                new String[] {
+                        phoneNum, numberW86, formatNumber
+                }, null);
+        try {
+            if (pCur != null && pCur.moveToFirst()) {
+                contactName = pCur.getString(pCur
+                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
+            }
+        } finally {
+            if (pCur != null) {
+                pCur.close();
+            }
+        }
+        return contactName;
+    }
+
+    public static String getAndroidFormatNumber(String number) {
+        if (TextUtils.isEmpty(number)) {
+            return number;
+        }
+
+        number = number.replaceAll(" ", "");
+
+        if (number.startsWith(PHONE_PRE_CODE)) {
+            number = number.substring(3);
+        }
+
+        if (number.length() != 11) {
+            return number;
+        }
+
+        StringBuilder builder = new StringBuilder();
+        // builder.append("+86 ");
+        builder.append(number.substring(0, 3));
+        builder.append(" ");
+        builder.append(number.substring(3, 7));
+        builder.append(" ");
+        builder.append(number.substring(7));
+        return builder.toString();
+    }
+
+    private static class UpdatePhotosTask extends AsyncTask<Void, Void, Void> {
+
+        private Context mContext;
+        private String mNumber;
+
+        private Handler mHandler = new Handler();
+
+        UpdatePhotosTask(Context context, String number) {
+            mContext = context;
+            mNumber = number;
+        }
+
+        @Override
+        protected Void doInBackground(Void... params) {
+            long aContactId =getContactIdByNumber(mContext, mNumber);
+            ContentResolver resolver= mContext.getContentResolver();
+            Cursor c = resolver.query(RawContacts.CONTENT_URI, new String[] {
+                    RawContacts._ID
+            }, RawContacts.CONTACT_ID + "=" + String.valueOf(aContactId), null, null);
+            final ArrayList<Long> rawContactIdList = new ArrayList<Long>();
+            if(c != null){
+                try {
+                    if (c.moveToFirst()) {
+                        // boolean hasTryToGet = false;
+                        do {
+                            long rawContactId = c.getLong(0);
+                            if (!hasLocalSetted(resolver, rawContactId)) {
+                                rawContactIdList.add(rawContactId);
+                            }
+                        } while (c.moveToNext());
+                    }
+                } finally {
+                    if(c != null)
+                        c.close();
+                }
+            }
+//            if (rawContactIdList.size() > 0) {
+//                try {
+//                    ProfileApi.getInstance().getHeadPicByContact(aContactId,
+//                            new ProfileListener() {
+//
+//                                @Override
+//                                public void onAvatarGet(final Avatar photo,
+//                                        final int resultCode, final String resultDesc)
+//                                        throws RemoteException {
+//                                    mHandler.post(new Runnable() {
+//                                        @Override
+//                                        public void run() {
+//                                            if (resultCode == 0) {
+//                                                if (photo != null) {
+//                                                    byte[] contactPhoto = Base64.decode(
+//                                                            photo.getImgBase64Str(),
+//                                                            android.util.Base64.DEFAULT);
+//                                                    for (long rawContactId : rawContactIdList) {
+//                                                        final Uri outputUri = Uri.withAppendedPath(
+//                                                                ContentUris
+//                                                                        .withAppendedId(
+//                                                                                RawContacts.CONTENT_URI,
+//                                                                                rawContactId),
+//                                                                RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
+//                                                        setContactPhoto(mContext,
+//                                                                contactPhoto, outputUri);
+//                                                    }
+//                                                    //notify mms list
+//                                                    mContext.sendBroadcast(new Intent(NOTIFY_CONTACT_PHOTO_CHANGE));
+//                                                }
+//                                            } else {
+//                                            }
+//                                        }
+//                                    });
+//                                }
+//
+//                                @Override
+//                                public void onAvatarUpdated(int arg0, String arg1)
+//                                        throws RemoteException {
+//                                }
+//
+//                                @Override
+//                                public void onProfileGet(Profile arg0, int arg1, String arg2)
+//                                        throws RemoteException {
+//                                }
+//
+//                                @Override
+//                                public void onProfileUpdated(int arg0, String arg1)
+//                                        throws RemoteException {
+//                                }
+//
+//                                @Override
+//                                public void onQRImgDecode(QRCardInfo imgObj, int resultCode,
+//                                        String arg2) throws RemoteException {
+//                                }
+//                            });
+//                } catch (ServiceDisconnectedException e) {
+//                    e.printStackTrace();
+//                }
+//            }
+            return null;
+        }
+
+    }
+
+    public static void updateContactPhotosByNumber(Context context,String number) {
+        new UpdatePhotosTask(context,number).execute();
+    }
+
+    public static void setContactPhoto(Context context, byte[] input,
+            Uri outputUri) {
+        FileOutputStream outputStream = null;
+
+        try {
+            outputStream = context.getContentResolver().openAssetFileDescriptor(outputUri, "rw")
+                    .createOutputStream();
+            outputStream.write(input);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try{
+                outputStream.close();
+            }catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public static boolean hasLocalSetted(ContentResolver resolver, long rawContactId) {
+        Cursor c = resolver.query(ContactsContract.RawContacts.CONTENT_URI, new String[] {
+                LOCAL_PHOTO_SETTED
+        }, RawContacts._ID + " = ? ", new String[] {
+                String.valueOf(rawContactId)
+        }, null);
+        long localSetted = 0;
+        try {
+            if (c != null && c.moveToFirst()) {
+                localSetted = c.getLong(0);
+            }
+        } finally {
+            c.close();
+        }
+        return (localSetted == 1) ? true : false;
+    }
+
+    public static long getContactIdByNumber(Context context, String number) {
+        if (TextUtils.isEmpty(number)) {
+            return -1;
+        }
+        String numberW86 = number;
+        if (!number.startsWith("+86")) {
+            numberW86 = "+86" + number;
+        } else {
+            numberW86 = number.substring(3);
+        }
+        Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI, new String[] {
+                Phone.CONTACT_ID
+        }, Phone.NUMBER + "=? OR " + Phone.NUMBER + "=?", new String[] {
+                number, numberW86
+        }, null);
+        if (cursor != null) {
+            try{
+                if (cursor.moveToFirst()) {
+                    return cursor.getInt(0);
+                }
+            } finally {
+                cursor.close();
+            }
+        }
+        return -1;
+    }
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/RcsEditTextInputFilter.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/RcsEditTextInputFilter.java
new file mode 100644
index 0000000..970e2e2
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/RcsEditTextInputFilter.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.mms;
+
+import android.text.InputFilter;
+import android.text.Spanned;
+
+public class RcsEditTextInputFilter implements InputFilter {
+    private int unicodeLength = 0;
+
+    public RcsEditTextInputFilter(int length) {
+        this.unicodeLength = length;
+    }
+
+    @Override
+    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
+            int dend) {
+        if (source == null) {
+            return "";
+        }
+        CharSequence result = null;
+        int sourceCount = getWordCount(source.toString());
+        int destCount = getWordCount(dest.toString());
+        int keepCount = unicodeLength - destCount;
+        int count = destCount + sourceCount;
+        if (keepCount <= 0) {
+            result= "";
+        } else if (count <= unicodeLength) {
+            result = source;
+        } else {
+            char[] sourceString = source.toString().toCharArray();
+            int sourceStringLenght = sourceString.length;
+            int charCount = keepCount;
+            keepCount = 0;
+            for (int i = 0; i < sourceStringLenght; i++) {
+                if (getWordCount(sourceString[i]) == 3) {
+                    charCount = charCount - 3;
+                } else {
+                    charCount--;
+                }
+                if (charCount <= 0) {
+                    break;
+                }
+                keepCount++;
+            }
+            result = source.subSequence(start, start + keepCount);
+        }
+        return result;
+
+    }
+
+    public int getWordCount(CharSequence s) {
+        int length = 0;
+        for (int i = 0; i < s.length(); i++) {
+            int ascii = Character.codePointAt(s, i);
+            if (isAsciiCode(ascii))
+                length++;
+            else
+                length += 3;
+        }
+        return length;
+
+    }
+
+    private int getWordCount(char ascii) {
+        if (ascii >= 0 && ascii <= 255)
+            return 1;
+        else
+            return 3;
+    }
+
+    private boolean isAsciiCode(int ascii) {
+        return ascii >= 0 && ascii < 0x80;
+    }
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/RcsFileTransferCache.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/RcsFileTransferCache.java
new file mode 100644
index 0000000..d0463d9
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/mms/RcsFileTransferCache.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.mms;
+import java.util.HashMap;
+import java.util.Iterator;
+
+
+public class RcsFileTransferCache {
+
+    private static RcsFileTransferCache sInstance;
+
+    private static HashMap<Long, Long> mFileTrasnfer;
+
+    private RcsFileTransferCache() {
+        mFileTrasnfer = new HashMap<Long, Long>();
+    }
+
+    public static RcsFileTransferCache getInstance() {
+        if (sInstance == null) {
+            sInstance = new RcsFileTransferCache();
+        }
+        return sInstance;
+    }
+
+    public void addFileTransferPercent(Long key, Long value) {
+        mFileTrasnfer.put(key, value);
+    }
+
+    public void removeFileTransferPercent(Long key) {
+        mFileTrasnfer.remove(key);
+    }
+
+    public Long getFileTransferPercent(Long key) {
+            return mFileTrasnfer.get(key);
+    }
+
+    public Iterator<Long> getFileTransferPercentKeys() {
+         return mFileTrasnfer.keySet().iterator();
+    }
+
+    public boolean hasFileTransferPercent(Long key) {
+        return mFileTrasnfer.containsKey(key);
+    }
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/provider/RcsMessageProviderConstants.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/provider/RcsMessageProviderConstants.java
new file mode 100644
index 0000000..275b577
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/provider/RcsMessageProviderConstants.java
@@ -0,0 +1,302 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.provider;
+
+import android.content.UriMatcher;
+import android.provider.BaseColumns;
+import android.provider.Telephony.CanonicalAddressesColumns;
+import android.provider.Telephony.Mms;
+import android.provider.Telephony.MmsSms;
+import android.provider.Telephony.MmsSms.PendingMessages;
+import android.provider.Telephony.Sms;
+import android.provider.Telephony.Sms.Conversations;
+import android.provider.Telephony.Threads;
+import android.provider.Telephony.ThreadsColumns;
+import android.telephony.SubscriptionManager;
+
+import com.suntek.mway.rcs.client.aidl.common.RcsColumns;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class RcsMessageProviderConstants {
+
+    public static final String TABLE_GROUP_STATUS = "group_status";
+    public static final boolean isRcs = true;
+
+    // These are the columns that appear in both the MMS ("pdu") and
+    // SMS ("sms") message tables.
+    private static final String[] MMS_SMS_COLUMNS =
+            { BaseColumns._ID, Mms.DATE, Mms.DATE_SENT, Mms.READ, Mms.THREAD_ID, Mms.LOCKED,
+                     Mms.SUBSCRIPTION_ID, Mms.PHONE_ID};
+
+    // These are the columns that appear only in the MMS message
+    // table.
+    private static final String[] MMS_ONLY_COLUMNS = {
+        Mms.CONTENT_CLASS, Mms.CONTENT_LOCATION, Mms.CONTENT_TYPE,
+        Mms.DELIVERY_REPORT, Mms.EXPIRY, Mms.MESSAGE_CLASS, Mms.MESSAGE_ID,
+        Mms.MESSAGE_SIZE, Mms.MESSAGE_TYPE, Mms.MESSAGE_BOX, Mms.PRIORITY,
+        Mms.READ_STATUS, Mms.RESPONSE_STATUS, Mms.RESPONSE_TEXT,
+        Mms.RETRIEVE_STATUS, Mms.RETRIEVE_TEXT_CHARSET, Mms.REPORT_ALLOWED,
+        Mms.READ_REPORT, Mms.STATUS, Mms.SUBJECT, Mms.SUBJECT_CHARSET,
+        Mms.TRANSACTION_ID, Mms.MMS_VERSION, Mms.TEXT_ONLY };
+    // These are the columns that appear only in the SMS message
+    // table.
+    public static final String[] RCS_SMS_ONLY_COLUMNS = {
+        "address", "body", "person", "reply_path_present",
+        "service_center", "status", "subject", "type", "error_code", "priority",
+        RcsColumns.SmsRcsColumns.RCS_FILENAME, RcsColumns.SmsRcsColumns.RCS_THUMB_PATH,
+        RcsColumns.SmsRcsColumns.RCS_MIME_TYPE, RcsColumns.SmsRcsColumns.RCS_MSG_TYPE,
+        RcsColumns.SmsRcsColumns.RCS_CHAT_TYPE, RcsColumns.SmsRcsColumns.RCS_FAVOURITE,
+        RcsColumns.SmsRcsColumns.RCS_MSG_STATE, RcsColumns.SmsRcsColumns.RCS_BURN,
+        RcsColumns.SmsRcsColumns.RCS_IS_DOWNLOAD, RcsColumns.SmsRcsColumns.RCS_FILE_SIZE,
+        RcsColumns.SmsRcsColumns.RCS_BURN_BODY, RcsColumns.SmsRcsColumns.RCS_MESSAGE_ID,
+        RcsColumns.SmsRcsColumns.RCS_MEDIA_PLAYED,RcsColumns.SmsRcsColumns.RCS_EXT_CONTACT,
+        RcsColumns.SmsRcsColumns.RCS_FILE_RECORD
+};
+
+    // These are all the columns that appear in the MMS and SMS
+    // message tables.
+    private static final String[] UNION_COLUMNS =
+            new String[MMS_SMS_COLUMNS.length
+                       + MMS_ONLY_COLUMNS.length
+                       + RCS_SMS_ONLY_COLUMNS.length];
+
+    private static final String[] ID_PROJECTION = { BaseColumns._ID };
+
+    private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+    private static final String[] SEARCH_STRING = new String[1];
+
+    // search on sms and thread table according  rcs_file_transfer_id and rcs_chat_type.
+
+    public static final String[] DEVICE_API_DEFAULT_PROJECT = {
+        "CHATMESSAGE_MESSAGE_ID",
+        "CHATMESSAGE_CHAT_ID",
+        "CHATMESSAGE_CONTACT_NUMBER",
+        "CHATMESSAGE_BODY",
+        "CHATMESSAGE_TIMESTAMP",
+        "CHATMESSAGE_MIME_TYPE",
+        "CHATMESSAGE_MESSAGE_STATUS",
+        "CHATMESSAGE_DIRECTION",
+        "CHATMESSAGE_TYPE",
+        "CHATMESSAGE_FLAG"
+    };
+
+    public static final String DEVICE_API_TABLE = "SELECT " +
+            "sms._id as CHATMESSAGE_MESSAGE_ID," +
+            "sms.date as CHATMESSAGE_TIMESTAMP," +
+            "sms.rcs_mime_type as CHATMESSAGE_MIME_TYPE," +
+            "sms.rcs_chat_type as CHATMESSAGE_FLAG," +
+            "sms.rcs_file_name as file_name," +
+            "sms.rcs_file_size as file_size," +
+            "sms.rcs_file_transfered as file_transferred," +
+            "sms.rcs_file_icon as file_icon," +
+            "sms.thread_id as CHATMESSAGE_CHAT_ID," +
+            "(CASE WHEN sms.type = 1 then -5 ELSE -6 END) as CHATMESSAGE_DIRECTION," +
+            "(CASE WHEN  rcs_file_transfer_id IS not NULL THEN 4 " +
+            "WHEN sms.rcs_message_id is not null then 3 ELSE 1 END) as CHATMESSAGE_TYPE," +
+            "(CASE sms.type = 1  WHEN sms.read = 0 THEN 1 WHEN sms.read = 1 then 2 " +
+            "ELSE (CASE sms.rcs_message_id is null WHEN sms.status = 32 THEN 3 " +
+            " WHEN sms.status = 0 THEN 4 WHEN sms.status = 64 THEN 5 " +
+            "ELSE (CASE when sms.rcs_msg_state = 64 THEN 3 WHEN sms.rcs_msg_state = 32 THEN 4 " +
+            "WHEN sms.rcs_msg_state = 128 THEN 5 ELSE 6 END)END)END)" +
+            " as CHATMESSAGE_MESSAGE_STATUS," +
+            "(CASE WHEN rcs_file_transfer_id IS not NULL THEN rcs_file_transfer_id " +
+            "ELSE (CASE WHEN rcs_message_id is not null THEN body ELSE NULL END) END)" +
+            " as CHATMESSAGE_BODY,(CASE WHEN (sms.rcs_chat_type = 0 OR sms.rcs_chat_type = 1) " +
+            "THEN threads.rcs_number " +
+            "ELSE (CASE WHEN sms.rcs_chat_type = 2 THEN sms.address " +
+            "ELSE rcs_ext_contact END ) END) as CHATMESSAGE_CONTACT_NUMBER " +
+            "from sms inner join threads on sms.thread_id = threads._id";
+
+
+    private static final String RCS_SMS_PROJECTION =
+            "rcs_file_path,"
+            + "rcs_thumb_path,"
+            + "rcs_msg_type, "
+            + "rcs_burn,"
+            + "rcs_is_download,"
+            + "rcs_msg_state,"
+            + "rcs_mime_type,"
+            + "favourite,"
+            + "rcs_file_size,"
+            + "rcs_message_id,"
+            + "rcs_chat_type,";
+
+    private static final String RCS_OTHER_PROJECTION =
+             "NULL AS rcs_file_path,"
+            + "NULL AS rcs_thumb_path,"
+            + "NULL AS rcs_msg_type,"
+            + "NULL AS rcs_burn,"
+            + "NULL AS rcs_is_download,"
+            + "NULL AS rcs_msg_state, "
+            + "NULL AS rcs_mime_type, "
+            + "NULL AS favourite,"
+            + "NULL AS rcs_file_size,"
+            + "NULL AS rcs_message_id,"
+            + "NULL AS rcs_chat_type,";
+
+    private static final String SMS_PROJECTION = "'sms' AS transport_type, _id, thread_id,"
+            + "address, body, phone_id,"
+            + RCS_SMS_PROJECTION
+            + "date, date_sent, read, type,"
+            + "status, locked, NULL AS error_code,"
+            + "NULL AS sub, NULL AS sub_cs, date, date_sent, read,"
+            + "NULL as m_type,"
+            + "NULL AS msg_box,"
+            + "NULL AS d_rpt, NULL AS rr, NULL AS err_type,"
+            + "locked, NULL AS st, NULL AS text_only,"
+            + "phone_id, NULL AS recipient_ids";
+
+    private static final String MMS_PROJECTION = "'mms' AS transport_type, pdu._id, thread_id,"
+            + "addr.address AS address, part.text as body, phone_id,"
+            + RCS_OTHER_PROJECTION
+            + "pdu.date * 1000 AS date, date_sent, read, NULL AS type,"
+            + "NULL AS status, locked, NULL AS error_code,"
+            + "sub, sub_cs, date, date_sent, read,"
+            + "m_type,"
+            + "pdu.msg_box AS msg_box,"
+            + "d_rpt, rr, NULL AS err_type,"
+            + "locked, NULL AS st, NULL AS text_only,"
+            + "phone_id, NULL AS recipient_ids";
+
+    private static final String MMS_PROJECTION_FOR_SUBJECT_SEARCH =
+            "'mms' AS transport_type, pdu._id, thread_id,"
+            + "addr.address AS address, pdu.sub as body, phone_id,"
+            + RCS_OTHER_PROJECTION
+            + "pdu.date * 1000 AS date, date_sent, read, NULL AS type,"
+            + "NULL AS status, locked, NULL AS error_code,"
+            + "sub, sub_cs, date, date_sent, read,"
+            + "m_type,"
+            + "pdu.msg_box AS msg_box,"
+            + "d_rpt, rr, NULL AS err_type,"
+            + "locked, NULL AS st, NULL AS text_only,"
+            + "phone_id, NULL AS recipient_ids";
+
+    private static final String MMS_PROJECTION_FOR_NUMBER_SEARCH =
+            "'mms' AS transport_type, pdu._id, thread_id,"
+            + "addr.address AS address, NULL AS body, phone_id,"
+            + RCS_OTHER_PROJECTION
+            + "pdu.date * 1000 AS date, date_sent, read, NULL AS type,"
+            + "NULL AS status, locked, NULL AS error_code,"
+            + "sub, sub_cs, date, date_sent, read,"
+            + "m_type,"
+            + "pdu.msg_box AS msg_box,"
+            + "d_rpt, rr, NULL AS err_type,"
+            + "locked, NULL AS st, NULL AS text_only,"
+            + "phone_id, NULL AS recipient_ids";
+
+    public static final String SMS_UPDATE_THREAD_RCS_MESSAGE_INFO_ON_NEW =
+            "BEGIN " +
+            "  UPDATE threads SET " + RcsColumns.ThreadColumns.RCS_CHAT_TYPE + " = " +
+            "    (CASE WHEN " + RcsColumns.ThreadColumns.RCS_CHAT_TYPE + " != -1 " +
+            "    THEN " + RcsColumns.ThreadColumns.RCS_CHAT_TYPE +" WHEN " +
+                 RcsColumns.ThreadColumns.RCS_CHAT_TYPE + "= -1 AND new." +
+                 RcsColumns.SmsRcsColumns.RCS_CHAT_TYPE + "!= -1 THEN new." +
+                 RcsColumns.SmsRcsColumns.RCS_CHAT_TYPE + " ELSE "+
+                 RcsColumns.ThreadColumns.RCS_CHAT_TYPE +
+                 " END)," +
+                 RcsColumns.ThreadColumns.RCS_NUMBER + " = " +
+            "    (CASE WHEN new."+ RcsColumns.SmsRcsColumns.RCS_CHAT_TYPE + "= 1" +
+            "    or new."+ RcsColumns.SmsRcsColumns.RCS_CHAT_TYPE +" = 2" +
+            "    or new." + RcsColumns.SmsRcsColumns.RCS_CHAT_TYPE +"= 4 " +
+            "    THEN new.address ELSE " + RcsColumns.ThreadColumns.RCS_NUMBER +
+            "    END) " +
+            "    WHERE threads._id = new." + Sms.THREAD_ID +
+            "    AND new." + RcsColumns.SmsRcsColumns.RCS_MSG_TYPE +" != -1; " +
+            "  UPDATE threads SET " + RcsColumns.ThreadColumns.RCS_MSG_ID + " = " +
+            "    new." + Sms._ID + "," +
+                 RcsColumns.ThreadColumns.RCS_MSG_TYPE +
+            "    = new."+ RcsColumns.SmsRcsColumns.RCS_MSG_TYPE +
+            "    WHERE threads . _id = new . thread_id;" +
+            " END;";
+
+    public final static String[] RCS_ICC_COLUMNS = new String[] {
+        // N.B.: These columns must appear in the same order as the
+        // calls to add appear in convertIccToSms.
+        "service_center_address",       // getServiceCenterAddress
+        "address",                      // getDisplayOriginatingAddress
+        "message_class",                // getMessageClass
+        "body",                         // getDisplayMessageBody
+        "date",                         // getTimestampMillis
+        "status",                       // getStatusOnIcc
+        "index_on_icc",                 // getIndexOnIcc
+        "is_status_report",             // isStatusReportMessage
+        "transport_type",               // Always "sms".
+        "type",                         // Always MESSAGE_TYPE_ALL.
+        "locked",                       // Always 0 (false).
+        "error_code",                   // Always 0
+        "_id",
+        "phone_id",
+        //RCS column
+        RcsColumns.SmsRcsColumns.RCS_FILENAME,
+        RcsColumns.SmsRcsColumns.RCS_THUMB_PATH,
+        RcsColumns.SmsRcsColumns.RCS_MSG_TYPE,
+        RcsColumns.SmsRcsColumns.RCS_BURN,
+        RcsColumns.SmsRcsColumns.RCS_MSG_STATE,
+        RcsColumns.SmsRcsColumns.RCS_IS_DOWNLOAD,
+        RcsColumns.SmsRcsColumns.RCS_MIME_TYPE,
+        RcsColumns.SmsRcsColumns.RCS_FAVOURITE,
+        RcsColumns.SmsRcsColumns.RCS_FILE_SIZE,
+        RcsColumns.SmsRcsColumns.RCS_MESSAGE_ID,
+        RcsColumns.SmsRcsColumns.RCS_CHAT_TYPE
+    };
+
+    // Those Strings are copied form TelephonyProvider,
+    // should update when TelephonyProvider update.
+    public static final String SMS_UPDATE_THREAD_READ_BODY =
+            "  UPDATE threads SET read = " +
+            "    CASE (SELECT COUNT(*)" +
+            "          FROM sms" +
+            "          WHERE " + Sms.READ + " = 0" +
+            "            AND " + Sms.THREAD_ID + " = threads._id)" +
+            "      WHEN 0 THEN 1" +
+            "      ELSE 0" +
+            "    END" +
+            "  WHERE threads._id = new." + Sms.THREAD_ID + "; ";
+
+    public static final String UPDATE_THREAD_COUNT_ON_NEW =
+            "  UPDATE threads SET message_count = " +
+            "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
+            "      ON threads._id = " + Sms.THREAD_ID +
+            "      WHERE " + Sms.THREAD_ID + " = new.thread_id" +
+            "        AND sms." + Sms.TYPE + " != 3) + " +
+            "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
+            "      ON threads._id = " + Mms.THREAD_ID +
+            "      WHERE " + Mms.THREAD_ID + " = new.thread_id" +
+            "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
+            "        AND " + Mms.MESSAGE_BOX + " != 3) " +
+            "  WHERE threads._id = new.thread_id; ";
+
+    public static final String SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE =
+            "BEGIN" +
+            "  UPDATE threads SET" +
+            "    date = (strftime('%s','now') * 1000), " +
+            "    snippet = new." + Sms.BODY + ", " +
+            "    snippet_cs = 0" +
+            "  WHERE threads._id = new." + Sms.THREAD_ID + "; " +
+            UPDATE_THREAD_COUNT_ON_NEW +
+            SMS_UPDATE_THREAD_READ_BODY +
+            "END;";
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/provider/RcsMessageProviderUtils.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/provider/RcsMessageProviderUtils.java
new file mode 100644
index 0000000..578f9cb
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/provider/RcsMessageProviderUtils.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.provider;
+
+import android.database.sqlite.SQLiteDatabase;
+import android.provider.Telephony;
+import android.provider.Telephony.Mms;
+import android.provider.Telephony.MmsSms;
+import android.provider.Telephony.MmsSms.PendingMessages;
+import android.provider.Telephony.Sms;
+import android.provider.Telephony.Sms.Conversations;
+import android.provider.Telephony.Threads;
+import android.provider.Telephony.ThreadsColumns;
+import android.telephony.SubscriptionManager;
+
+import com.suntek.mway.rcs.client.aidl.common.RcsColumns;
+
+public class RcsMessageProviderUtils {
+
+    // add rcs rebuild columns.
+    public static void upgradeDatabaseToVersion65(SQLiteDatabase db) {
+        // backup the old table
+        db.execSQL("ALTER TABLE threads RENAME TO threads_old;");
+        // create new table
+        createRcsThreadsTable(db);
+        // insert old data to new table
+        db.execSQL("INSERT INTO threads (" +
+                Threads._ID + "," +
+                Threads.DATE + "," +
+                Threads.MESSAGE_COUNT + "," +
+                Threads.RECIPIENT_IDS + "," +
+                Threads.SNIPPET + "," +
+                Threads.SNIPPET_CHARSET + "," +
+                Threads.READ + "," +
+                Threads.ARCHIVED + "," +
+                Threads.TYPE + "," +
+                Threads.ERROR + "," +
+                Threads.HAS_ATTACHMENT + "," +
+                RcsColumns.ThreadColumns.RCS_TOP + "," +  // rename from top;
+                RcsColumns.ThreadColumns.RCS_TOP_TIME +  // rename from top time.
+                ")" +
+                "SELECT " +
+                Threads._ID + "," +
+                Threads.DATE + "," +
+                Threads.MESSAGE_COUNT + "," +
+                Threads.RECIPIENT_IDS + "," +
+                Threads.SNIPPET + "," +
+                Threads.SNIPPET_CHARSET + "," +
+                Threads.READ + "," +
+                Threads.ARCHIVED + "," +
+                Threads.TYPE + "," +
+                Threads.ERROR + "," +
+                Threads.HAS_ATTACHMENT + "," +
+                 "top," +
+                "top_time " +
+                " FROM threads_old;");
+        db.execSQL("update threads set " + RcsColumns.ThreadColumns.RCS_CHAT_TYPE +
+                " = 1;");
+        db.execSQL("DROP TABLE threads_old;");
+
+        // backup old table data
+        db.execSQL("ALTER TABLE sms RENAME TO sms_old;");
+        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_insert;");
+        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_date_subject_on_update;");
+        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_read_on_update;");
+        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_update_sms;");
+        db.execSQL("DROP TRIGGER IF EXISTS sms_words_update;");
+        db.execSQL("DROP TRIGGER IF EXISTS sms_words_delete;");
+        // create new table and trigger.
+        createRcsSmsTable(db);
+        createSmsTrigger65(db);
+        db.execSQL("INSERT INTO sms (" +
+                "_id," +
+                "thread_id," +
+                "address," +
+                "person," +
+                "date," +
+                "date_sent," +
+                "protocol," +
+                "read," +
+                "status," +
+                "type," +
+                "reply_path_present," +
+                "subject," +
+                "body," +
+                "service_center," +
+                "locked," +
+                "sub_id, " +
+                "phone_id, " +
+                "error_code," +
+                "creator," +
+                "seen," +
+                "priority," +
+                "favourite," +
+                "rcs_message_id," +
+                "rcs_file_name," +
+                "rcs_mime_type," +
+                "rcs_msg_type," +
+                "rcs_msg_state," +
+                "rcs_chat_type," +
+                "rcs_conversation_id," +
+                "rcs_contribution_id," +
+                "rcs_file_selector," +
+                "rcs_file_transfered," +
+                "rcs_file_transfer_id, " +
+                "rcs_file_icon," +
+                "rcs_burn," +
+                "rcs_header," +
+                "rcs_file_path," +
+                "rcs_is_download," +
+                "rcs_file_size," +
+                "rcs_thumb_path," +
+                "rcs_burn_body " +
+                ")" +
+                // select old data to create new table.
+                "SELECT " +
+                "_id," +
+                "thread_id," +
+                "address," +
+                "person," +
+                "date," +
+                "date_sent," +
+                "protocol," +
+                "read," +
+                "status," +
+                "type," +
+                "reply_path_present," +
+                "subject," +
+                "body," +
+                "service_center," +
+                "locked," +
+                "sub_id, " +
+                "phone_id, " +
+                "error_code," +
+                "creator," +
+                "seen," +
+                "priority," +
+                "favourite," +
+                "rcs_message_id," +
+                "rcs_filename," +
+                "rcs_mime_type," +
+                "rcs_msg_type," +
+                "rcs_msg_state," +
+                "rcs_chat_type," +
+                "rcs_conversation_id," +
+                "rcs_contribution_id," +
+                "rcs_file_selector," +
+                "rcs_file_transfer_ext," +
+                "rcs_file_transfer_id," +
+                "rcs_file_icon," +
+                "rcs_is_burn," +
+                "rcs_header," +
+                "rcs_path," +
+                "rcs_is_download," +
+                "rcs_file_size," +
+                "rcs_thumb_path," +
+                "rcs_burn_body " +
+                " FROM sms_old;"
+                );
+        db.execSQL("DROP TABLE sms_old;");
+        db.execSQL("update sms set " + RcsColumns.SmsRcsColumns.RCS_CHAT_TYPE +
+                " = 1;");
+        createRcsOneToManyMesageStatusTable(db);
+        createRcsThreadUpdateTriggers(db);
+    }
+    /**
+     * create a table to save rcs 1-N message status.
+     */
+    public static void createRcsOneToManyMesageStatusTable(SQLiteDatabase db) {
+         db.execSQL("CREATE TABLE group_status (" +
+                 RcsColumns.GroupStatusColumns._ID + " INTEGER PRIMARY KEY,"+
+                 RcsColumns.GroupStatusColumns.MSG_ID + " INTEGER DEFAULT -1,"+
+                 RcsColumns.GroupStatusColumns.GROUP_DATE + " INTEGER DEFAULT 0,"+
+                 RcsColumns.GroupStatusColumns.GROUP_NUMBER + " TEXT,"+
+                 RcsColumns.GroupStatusColumns.GROUP_STATUS + " INTEGER DEFAULT 0 "+
+                 ");");
+    }
+
+    public static void createRcsThreadUpdateTriggers(SQLiteDatabase db) {
+        db.execSQL("CREATE TRIGGER sms_update_thread_rcs_message_info_on_insert" +
+                " AFTER INSERT ON sms "
+                + RcsMessageProviderConstants.SMS_UPDATE_THREAD_RCS_MESSAGE_INFO_ON_NEW);
+    }
+
+    public static void createRcsThreadsTable(SQLiteDatabase db) {
+        db.execSQL("CREATE TABLE threads (" +
+                Threads._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+                Threads.DATE + " INTEGER DEFAULT 0," +
+                Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," +
+                Threads.RECIPIENT_IDS + " TEXT," +
+                Threads.SNIPPET + " TEXT," +
+                Threads.SNIPPET_CHARSET + " INTEGER DEFAULT 0," +
+                Threads.READ + " INTEGER DEFAULT 1," +
+                Threads.ARCHIVED + " INTEGER DEFAULT 0," +
+                Threads.TYPE + " INTEGER DEFAULT 0," +
+                Threads.ERROR + " INTEGER DEFAULT 0," +
+                Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0," +
+                RcsColumns.ThreadColumns.RCS_TOP + " INTEGER DEFAULT 0," +
+                RcsColumns.ThreadColumns.RCS_TOP_TIME + " INTEGER DEFAULT 0," +
+                RcsColumns.ThreadColumns.RCS_NUMBER + " TEXT," +
+                RcsColumns.ThreadColumns.RCS_MSG_ID + " INTEGER  DEFAULT -1," +
+                RcsColumns.ThreadColumns.RCS_MSG_TYPE + " INTEGER  DEFAULT -1," +
+                RcsColumns.ThreadColumns.RCS_CHAT_TYPE + " INTEGER  DEFAULT -1"+
+                ");");
+    }
+
+    public static void createRcsSmsTable(SQLiteDatabase db) {
+        db.execSQL("CREATE TABLE sms (" +
+                "_id INTEGER PRIMARY KEY," +
+                "thread_id INTEGER," +
+                "address TEXT," +
+                "person INTEGER," +
+                "date INTEGER," +
+                "date_sent INTEGER DEFAULT 0," +
+                "protocol INTEGER," +
+                "read INTEGER DEFAULT 0," +
+                "status INTEGER DEFAULT -1," + // a TP-Status value
+                                               // or -1 if it
+                                               // status hasn't
+                                               // been received
+                "type INTEGER," +
+                "reply_path_present INTEGER," +
+                "subject TEXT," +
+                "body TEXT," +
+                "service_center TEXT," +
+                "locked INTEGER DEFAULT 0," +
+                "sub_id INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
+                "phone_id INTEGER DEFAULT -1, " +
+                "error_code INTEGER DEFAULT 0," +
+                "creator TEXT," +
+                "seen INTEGER DEFAULT 0," +
+                "priority INTEGER DEFAULT -1," +
+                "favourite INTEGER DEFAULT 0,"+
+                "rcs_message_id TEXT," +
+                "rcs_file_name TEXT," +
+                "rcs_mime_type TEXT," +
+                "rcs_msg_type INTEGER DEFAULT -1," +
+                "rcs_msg_state INTEGER," +
+                "rcs_chat_type INTEGER DEFAULT -1," +
+                "rcs_conversation_id TEXT," +
+                "rcs_contribution_id TEXT," +
+                "rcs_file_selector TEXT," +
+                "rcs_file_transfered TEXT," +
+                "rcs_file_transfer_id TEXT," +
+                "rcs_file_icon TEXT," +
+                "rcs_burn INTEGER  DEFAULT -1," +
+                "rcs_header TEXT," +
+                "rcs_file_path TEXT," +
+                "rcs_is_download INTEGER DEFAULT 0," +
+                "rcs_file_size INTEGER DEFAULT 0," +
+                "rcs_thumb_path TEXT," +
+                "rcs_burn_body TEXT," +
+                "rcs_media_played INTEGER DEFAULT 0," +
+                "rcs_ext_contact TEXT," +
+                "rcs_file_record INTEGER " +
+                ");");
+    }
+
+    public static void createSmsTrigger65(SQLiteDatabase db) {
+        // Updates threads table whenever a message is added to sms.
+        db.execSQL("CREATE TRIGGER sms_update_thread_on_insert AFTER INSERT ON sms " +
+                RcsMessageProviderConstants.SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);
+
+        // Updates threads table whenever a message in sms is updated.
+        db.execSQL("CREATE TRIGGER sms_update_thread_date_subject_on_update AFTER" +
+                   "  UPDATE OF " + Sms.DATE + ", " + Sms.BODY + ", " + Sms.TYPE +
+                   "  ON sms " +
+                   RcsMessageProviderConstants.SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);
+
+        // Updates threads table whenever a message in sms is updated.
+        db.execSQL("CREATE TRIGGER sms_update_thread_read_on_update AFTER" +
+                   "  UPDATE OF " + Sms.READ +
+                   "  ON sms " +
+                   "BEGIN " +
+                   RcsMessageProviderConstants.SMS_UPDATE_THREAD_READ_BODY +
+                   "END;");
+        // Update the error flag of threads after a text message was
+        // failed to send/receive.
+        db.execSQL("CREATE TRIGGER update_threads_error_on_update_sms " +
+                   "  AFTER UPDATE OF type ON sms" +
+                   "  WHEN (OLD.type != 5 AND NEW.type = 5)" +
+                   "    OR (OLD.type = 5 AND NEW.type != 5) " +
+                   "BEGIN " +
+                   "  UPDATE threads SET error = " +
+                   "    CASE" +
+                   "      WHEN NEW.type = 5 THEN error + 1" +
+                   "      ELSE error - 1" +
+                   "    END " +
+                   "  WHERE _id = NEW.thread_id; " +
+                   "END;");
+        // monitor the sms table
+        // NOTE don't handle inserts using a trigger because it has an unwanted
+        // side effect:  the value returned for the last row ends up being the
+        // id of one of the trigger insert not the original row insert.
+        // Handle inserts manually in the provider.
+        db.execSQL("CREATE TRIGGER sms_words_update AFTER UPDATE ON sms BEGIN UPDATE words " +
+                " SET index_text = NEW.body WHERE (source_id=NEW._id AND table_to_use=1); " +
+                " END;");
+        db.execSQL("CREATE TRIGGER sms_words_delete AFTER DELETE ON sms BEGIN DELETE FROM " +
+                "  words WHERE source_id = OLD._id AND table_to_use = 1; END;");
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/FileImageGetter.java
similarity index 67%
copy from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
copy to rcs_ui_common/src/com/suntek/rcs/ui/common/utils/FileImageGetter.java
index 0ad1ce0..91935f9 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/FileImageGetter.java
@@ -1,7 +1,6 @@
 /*
  * Copyright (c) 2015 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
@@ -21,14 +20,25 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.im;
+package com.suntek.rcs.ui.common.utils;
 
-public class OprResponse {
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 
-    public static final int SUCCESS = 200;
+public class FileImageGetter extends ImageGetter {
 
-    public static final int OFFLINE = 900;
+    public FileImageGetter(ImageTask imageTask, ImageLoaderListener listener) {
+        super(imageTask, listener);
+    }
 
-    public static final int OTHRE_ERROR = 999;
+    @Override
+    public void loadImage(String path) {
+        imageTask.setLoading(true);
+        // load image from local file
+        Bitmap bitmap = BitmapFactory.decodeFile(path);
+        listener.onLoaded(path, bitmap, imageTask.getImageView());
+
+        imageTask.setLoading(false);
+    }
 
 }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageGetter.java
similarity index 63%
copy from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
copy to rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageGetter.java
index 0ad1ce0..a634822 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageGetter.java
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2015 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
@@ -21,14 +21,28 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.im;
+package com.suntek.rcs.ui.common.utils;
 
-public class OprResponse {
+public abstract class ImageGetter implements Runnable {
+    protected ImageTask imageTask;
+    protected ImageLoaderListener listener;
 
-    public static final int SUCCESS = 200;
+    public ImageGetter(ImageTask imageTask, ImageLoaderListener listener) {
+        super();
+        this.imageTask = imageTask;
+        this.listener = listener;
+    }
 
-    public static final int OFFLINE = 900;
+    @Override
+    public void run() {
+        // if onStartLoad() return true,then start load bitmap,
+        // else this task may cancel if return false.
+        if (this.listener.onStartLoad()) {
+            loadImage(imageTask.getUrl());
+        }
+        this.listener.onEndLoad();
+    }
 
-    public static final int OTHRE_ERROR = 999;
+    public abstract void loadImage(String path);
 
 }
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageLoader.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageLoader.java
new file mode 100644
index 0000000..966e1a9
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageLoader.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.utils;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.os.Handler;
+import android.text.TextUtils;
+import android.util.LruCache;
+import android.widget.ImageView;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class ImageLoader {
+    private static final int MIN_MEMORY = 10 * 1024 * 1024;// at least 10m
+    private static LruCache<String, Bitmap> bitmapCache;
+    private ExecutorService executor;
+    private HashMap<String, Future> futureMap;
+    private Context context;
+    private Handler handler;
+
+    static {
+        int maxMemory = (int) Runtime.getRuntime().maxMemory();
+        int mCacheSize = maxMemory / 8;
+        bitmapCache = new LruCache<String, Bitmap>(Math.max(mCacheSize, MIN_MEMORY)) {
+            @Override
+            protected int sizeOf(String key, Bitmap value) {
+                return value.getRowBytes() * value.getHeight();
+            }
+        };
+    }
+
+    public ImageLoader(Context context) {
+        executor = Executors.newSingleThreadExecutor();
+        futureMap = new HashMap<String, Future>();
+        this.context = context;
+        this.handler = new Handler();
+    }
+
+    public void load(ImageView imageView, String path, int default_id, final int fail_id) {
+        if (imageView == null) {
+            return;
+        }
+
+        if (TextUtils.isEmpty(path) || path.equals("null")) {
+            imageView.setImageResource(default_id);
+            return;
+        } else {
+        }
+
+        // check if the image already download if it is from net
+        ImageGetter imageGetter;
+        boolean isNetImage = false;
+        if (path.startsWith("http://") || path.startsWith("https://")) {
+            String realPath = getLocalFilePath(path);
+            if (realPath.equals(path)) {
+                // image not download yet
+                isNetImage = true;
+            } else {
+                path = realPath;
+            }
+        }
+        final String uri = path;
+
+        Bitmap bitmap = bitmapCache.get(path);
+        if (bitmap != null) {
+            imageView.setImageBitmap(bitmap);
+            return;
+        }
+
+        final ImageTask imageTask = new ImageTask(uri, imageView, default_id, fail_id);
+        ImageLoaderListener listener = new ImageLoaderListener() {
+
+            @Override
+            public void onLoaded(String url, final Bitmap bitmap, final ImageView imageView) {
+                if (bitmap == null) {
+                    imageView.setImageResource(fail_id);
+                    return;
+                }
+                if (imageView.getTag() != null && !imageTask.isCanceled()) {
+                    if (String.valueOf(imageView.getTag()).equals(url)) {
+                        handler.post(new Runnable() {
+
+                            @Override
+                            public void run() {
+                                imageView.setImageBitmap(bitmap);
+                            }
+                        });
+                    }
+                }
+
+                bitmapCache.put(uri, bitmap);
+                // save bitmap to sdcard
+                NetImageUtil.saveBitmap(context, uri, bitmap);
+            }
+
+            @Override
+            public boolean onStartLoad() {
+                return !imageTask.isCanceled();
+            }
+
+            @Override
+            public void onEndLoad() {
+                futureMap.remove(uri);
+            }
+        };
+
+        if (isNetImage) {
+            imageGetter = new NetImageGetter(imageTask, listener);
+        } else {
+            imageGetter = new FileImageGetter(imageTask, listener);
+        }
+
+        imageView.setTag(uri);
+        imageView.setImageResource(default_id);
+        Future future = executor.submit(imageGetter);
+        futureMap.put(uri, future);
+    }
+
+    public void cancel(String path) {
+        if (TextUtils.isEmpty(path)) {
+            return;
+        }
+        path = getLocalFilePath(path);
+        Future future = futureMap.get(path);
+        if (future != null) {
+            future.cancel(true);
+            futureMap.remove(path);
+        }
+    }
+
+    private String getLocalFilePath(String path) {
+        String filePath = NetImageUtil.getImgDownloadPath(context)
+                + NetImageUtil.getImgNameByUrl(path);
+        if (new File(filePath).exists()) {
+            path = filePath;
+        }
+        return path;
+    }
+
+    public void destroy() {
+        executor.shutdown();
+        bitmapCache.evictAll();
+        futureMap.clear();
+        context = null;
+    }
+}
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageLoaderListener.java
similarity index 81%
copy from rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
copy to rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageLoaderListener.java
index 0ad1ce0..4f62e17 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageLoaderListener.java
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2015 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
@@ -21,14 +21,15 @@
  * IN THE SOFTWARE.
  */
 
-package com.suntek.mway.rcs.client.aidl.im;
+package com.suntek.rcs.ui.common.utils;
 
-public class OprResponse {
+import android.graphics.Bitmap;
+import android.widget.ImageView;
 
-    public static final int SUCCESS = 200;
+public interface ImageLoaderListener {
+    boolean onStartLoad();
 
-    public static final int OFFLINE = 900;
+    void onLoaded(String url, Bitmap bitmap, ImageView imageView);
 
-    public static final int OTHRE_ERROR = 999;
-
+    void onEndLoad();
 }
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageTask.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageTask.java
new file mode 100644
index 0000000..ae51485
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/ImageTask.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.utils;
+
+import android.widget.ImageView;
+
+public class ImageTask {
+    private String url;
+    private ImageView imageView;
+    private int emptyImgID = -1;
+    private int errorImgID = -1;
+    private boolean canceled;
+    private boolean loading;
+
+    public ImageTask(String url, ImageView imageView) {
+        this(url, imageView, -1, -1);
+    }
+
+    public ImageTask(String url, ImageView imageView, int emptyImgID, int errorImgID) {
+        super();
+        this.url = url;
+        this.imageView = imageView;
+        this.emptyImgID = emptyImgID;
+        this.errorImgID = errorImgID;
+        this.canceled = false;
+        this.loading = false;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public ImageView getImageView() {
+        return imageView;
+    }
+
+    public void setImageView(ImageView imageView) {
+        this.imageView = imageView;
+    }
+
+    public int getEmptyImgID() {
+        return emptyImgID;
+    }
+
+    public void setEmptyImgID(int emptyImgID) {
+        this.emptyImgID = emptyImgID;
+    }
+
+    public int getErrorImgID() {
+        return errorImgID;
+    }
+
+    public void setErrorImgID(int errorImgID) {
+        this.errorImgID = errorImgID;
+    }
+
+    public boolean isCanceled() {
+        return canceled;
+    }
+
+    public void setCanceled(boolean canceled) {
+        this.canceled = canceled;
+    }
+
+    public boolean isLoading() {
+        return loading;
+    }
+
+    public void setLoading(boolean loading) {
+        this.loading = loading;
+    }
+
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/NetImageGetter.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/NetImageGetter.java
new file mode 100644
index 0000000..b92cdbf
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/NetImageGetter.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.utils;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class NetImageGetter extends ImageGetter {
+
+    public NetImageGetter(ImageTask imageTask, ImageLoaderListener listener) {
+        super(imageTask, listener);
+    }
+
+    @Override
+    public void loadImage(String path) {
+        imageTask.setLoading(true);
+        Bitmap bitmap = getHttpBitmap(path);
+        listener.onLoaded(path, bitmap, imageTask.getImageView());
+
+        imageTask.setLoading(false);
+    }
+
+    public Bitmap getHttpBitmap(String path) {
+        Bitmap bitmap = null;
+        HttpURLConnection connection = null;
+        InputStream is = null;
+        try {
+            URL url = new URL(path);
+            connection = (HttpURLConnection) url.openConnection();
+            connection.setConnectTimeout(5 * 1000);
+            connection.setDoInput(true);
+            connection.connect();
+            is = connection.getInputStream();
+            bitmap = BitmapFactory.decodeStream(is);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                is.close();
+                connection.disconnect();
+            } catch (IOException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+        return bitmap;
+    }
+
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/NetImageUtil.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/NetImageUtil.java
new file mode 100644
index 0000000..c593dce
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/NetImageUtil.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.utils;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.os.Environment;
+import android.text.TextUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class NetImageUtil {
+    public static String getImgDownloadPath(Context context) {
+        return Environment.getExternalStorageState()
+                + "/Android/data/"
+                + context.getPackageName()
+                + "/img/";
+    }
+
+    public static String getImgNameByUrl(String url) {
+        if (TextUtils.isEmpty(url)) {
+            return null;
+        }
+        return url.substring(url.lastIndexOf("/"));
+    }
+
+    public static void saveBitmap(Context context, String url, Bitmap bitmap) {
+        String folderPath = getImgDownloadPath(context);
+        File folder = new File(folderPath);
+        if (!folder.exists()) {
+            folder.mkdir();
+        }
+        String filePath = folderPath + getImgNameByUrl(url);
+        try {
+            File file = new File(filePath);
+            file.createNewFile();
+            FileOutputStream fos = new FileOutputStream(file);
+            bitmap.compress(CompressFormat.JPEG, 100, fos);
+            fos.flush();
+            fos.close();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/RcsUtils.java b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/RcsUtils.java
new file mode 100644
index 0000000..bf36dce
--- /dev/null
+++ b/rcs_ui_common/src/com/suntek/rcs/ui/common/utils/RcsUtils.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2015 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.rcs.ui.common.utils;
+
+import com.suntek.rcs.ui.common.RcsEmojiGifView;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.RelativeLayout;
+
+public class RcsUtils {
+    public static int dip2px(Context context, float dipValue) {
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (int)(dipValue * scale + 0.5f);
+    }
+
+    @SuppressWarnings("static-access")
+    public static void closeKB(Activity activity) {
+        if (activity.getCurrentFocus() != null) {
+            ((InputMethodManager)activity.getSystemService(activity.INPUT_METHOD_SERVICE))
+                    .hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(),
+                            InputMethodManager.HIDE_NOT_ALWAYS);
+        }
+    }
+
+    public static void openKB(Context context) {
+        InputMethodManager inputMethodManager = (InputMethodManager)context
+                .getSystemService(Context.INPUT_METHOD_SERVICE);
+        inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
+    }
+
+    public static void openPopupWindow(Context context, View view, byte[] data,
+            int emojiPopupBgResId) {
+        LinearLayout.LayoutParams mGifParam = new LinearLayout.LayoutParams(
+                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
+        if(bitmap == null){
+            return;
+        }
+        int windowWidth = bitmap.getWidth() + RcsUtils.dip2px(context, 40);
+        int windowHeight = bitmap.getHeight() + RcsUtils.dip2px(context, 40);
+        ColorDrawable transparent = new ColorDrawable(Color.TRANSPARENT);
+        RelativeLayout relativeLayout = new RelativeLayout(context);
+        relativeLayout
+                .setLayoutParams(new LinearLayout.LayoutParams(windowWidth, windowHeight));
+        relativeLayout.setBackgroundResource(emojiPopupBgResId);
+        relativeLayout.setGravity(Gravity.CENTER);
+        RcsEmojiGifView emojiGifView = new RcsEmojiGifView(context);
+        emojiGifView.setLayoutParams(mGifParam);
+        emojiGifView.setBackground(transparent);
+        emojiGifView.setMonieByteData(data);
+        relativeLayout.addView(emojiGifView);
+        PopupWindow popupWindow = new PopupWindow(view, windowWidth, windowHeight);
+        popupWindow.setBackgroundDrawable(transparent);
+        popupWindow.setFocusable(true);
+        popupWindow.setOutsideTouchable(true);
+        popupWindow.setContentView(relativeLayout);
+        popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
+        popupWindow.update();
+    }
+}
