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
index dc1139f..0cb6eeb 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -32,11 +33,14 @@
 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>.
+ * 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
@@ -44,9 +48,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public abstract class ClientInterface {
     /**
@@ -62,6 +66,7 @@
 
     /**
      * add a {@link ClientInterfaceListener}
+     * 
      * @param listener a implementation of ClientInterfaceListener
      */
     public void addInterfaceEventListener(ClientInterfaceListener listener) {
@@ -70,7 +75,7 @@
 
     /**
      * remove a {@link ClientInterfaceListener}
-     *
+     * 
      * @param listener a implementation of ClientInterfaceListener
      */
     public void removeInterfaceEventListener(ClientInterfaceListener listener) {
@@ -85,20 +90,22 @@
     }
 
     /**
-     * when the local connect to service, then notify all of its {@link ClientInterfaceListener}
+     * when the local connect to service, then notify all of its
+     * {@link ClientInterfaceListener}
      */
     public void notifyEventInterfaceConnected() {
-        for(int i=0; i < listeners.size(); i++) {
+        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}
+     * when disconnect between local and service, then notify all of its
+     * {@link ClientInterfaceListener}
      */
     public void notifyEventInterfaceDisconnected() {
-        for(int i=0; i < listeners.size(); i++) {
+        for (int i = 0; i < listeners.size(); i++) {
             ClientInterfaceListener listener = (ClientInterfaceListener)listeners.elementAt(i);
             listener.handleInterfaceDisconnected();
         }
@@ -106,33 +113,36 @@
 
     /**
      * 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;
+        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
+     * subclass must override this method for connect operation
      */
     protected abstract void connectInterface();
 
     /**
-     * subclass must override this method  for disconnect operation
+     * 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
index 04a061b..6b47900 100644
--- 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
@@ -20,14 +20,17 @@
  * 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.
+ * 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
@@ -35,15 +38,16 @@
  * <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) {
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
index b262fe4..c23576f 100644
--- 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
@@ -20,13 +20,17 @@
  * 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.
+ * 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
@@ -34,28 +38,38 @@
  * <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:
+     * 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>
+     * <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>
+     * <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>
+     * <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>
+     * <td>message</td>
+     * <td>String</td>
+     * <td>the message related to register failure</td>
      * </tr>
      * </table>
      */
@@ -97,119 +111,181 @@
     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:
+     * 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>
+     * <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>
+     * <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>
+     * <td>sessionId</td>
+     * <td>long</td>
+     * <td>session id</td>
      * </tr>
      * <tr>
-     *     <td>contact</td><td>String</td><td>phone number</td>
+     * <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:
+     * 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>
+     * <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>
+     * <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>
+     * <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:
+     * 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>
+     * <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>
+     * <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>
+     * <td>contact</td>
+     * <td>String</td>
+     * <td>phone number</td>
      * </tr>
      * <tr>
-     *     <td>message</td><td>String</td><td>message content</td>
+     * <td>message</td>
+     * <td>String</td>
+     * <td>message content</td>
      * </tr>
      * <tr>
-     *     <td>receivedAt</td><td>Date</td><td>received date</td>
+     * <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:
+     * 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>
+     * <th>name</th>
+     * <th>type</th>
+     * <th>description</th>
      * </tr>
      * <tr>
-     *     <td>messageId</td><td>String</td><td>message id</td>
+     * <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>
+     * <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>
+     * <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>
+     * <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:
+     * 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>
+     * <th>name</th>
+     * <th>type</th>
+     * <th>description</th>
      * </tr>
      * <tr>
-     *     <td>contact</td><td>String</td><td>phone number</td>
+     * <td>contact</td>
+     * <td>String</td>
+     * <td>phone number</td>
      * </tr>
      * <tr>
-     *     <td>sessionId</td><td>long</td><td>session id</td>
+     * <td>sessionId</td>
+     * <td>long</td>
+     * <td>session id</td>
      * </tr>
      * <tr>
-     *     <td>filename</td><td>String</td><td>file name</td>
+     * <td>filename</td>
+     * <td>String</td>
+     * <td>file name</td>
      * </tr>
      * <tr>
-     *     <td>fileSize</td><td>long</td><td>bytes of file</td>
+     * <td>fileSize</td>
+     * <td>long</td>
+     * <td>bytes of file</td>
      * </tr>
      * <tr>
-     *     <td>fileType</td><td>String</td><td>file type</td>
+     * <td>fileType</td>
+     * <td>String</td>
+     * <td>file type</td>
      * </tr>
      * </table>
      */
@@ -218,30 +294,39 @@
     /**
      * the broadcast message of incoming geographical location.
      */
-    //public final static String ACTION_INCOMING_LOCATION = "com.suntek.mway.rcs.message.ACTION_INCOMING_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";
+    // 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:
+     * 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>
+     * <th>name</th>
+     * <th>type</th>
+     * <th>description</th>
      * </tr>
      * <tr>
-     *     <td>contact</td><td>String</td><td>phone number</td>
+     * <td>contact</td>
+     * <td>String</td>
+     * <td>phone number</td>
      * </tr>
      * <tr>
-     *     <td>subject</td><td>String</td><td>chat topic</td>
+     * <td>subject</td>
+     * <td>String</td>
+     * <td>chat topic</td>
      * </tr>
      * <tr>
-     *     <td>sessionId</td><td>long</td><td>session id</td>
+     * <td>sessionId</td>
+     * <td>long</td>
+     * <td>session id</td>
      * </tr>
      * </table>
      */
@@ -249,59 +334,86 @@
 
     /**
      * 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:
+     * 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>
+     * <th>name</th>
+     * <th>type</th>
+     * <th>description</th>
      * </tr>
      * <tr>
-     *     <td>contact</td><td>String</td><td>chat room uri</td>
+     * <td>contact</td>
+     * <td>String</td>
+     * <td>chat room uri</td>
      * </tr>
      * <tr>
-     *     <td>subject</td><td>String</td><td>chat topic</td>
+     * <td>subject</td>
+     * <td>String</td>
+     * <td>chat topic</td>
      * </tr>
      * <tr>
-     *     <td>sessionId</td><td>long</td><td>session id</td>
+     * <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:
+     * 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>
+     * <th>name</th>
+     * <th>type</th>
+     * <th>description</th>
      * </tr>
      * <tr>
-     *     <td>sessionId</td><td>long</td><td>session id of group chat</td>
+     * <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>
+     * <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>
+     * <td>contact</td>
+     * <td>String</td>
+     * <td>phone number</td>
      * </tr>
      * <tr>
-     *     <td>message</td><td>String</td><td>message content</td>
+     * <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:
+     * 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>
+     * <td>contact</td>
+     * <td>String</td>
+     * <td>phone number</td>
      * </tr>
      * </table>
      */
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
index ba00d52..2c4ace3 100644
--- 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
@@ -20,13 +20,16 @@
  * 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.
+ * 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
@@ -34,9 +37,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public interface ClientInterfaceListener {
     /**
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
index c608222..a48529c 100644
--- 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
@@ -20,10 +20,13 @@
  * 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>
+ * 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.
@@ -34,9 +37,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class ClientInterfaceNotify {
     /**
@@ -46,12 +49,13 @@
 
     /**
      * 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){
+        if (instance == null) {
+            synchronized (ClientInterfaceNotify.class) {
+                if (instance == null) {
                     instance = new ClientInterfaceNotify();
                 }
             }
@@ -62,27 +66,29 @@
     /**
      * private constructor to avoid new a instance from outer environment.
      */
-    private ClientInterfaceNotify() {}
+    private ClientInterfaceNotify() {
+    }
 
     /**
-     * This is a blocking method.
-     * When invoked, the caller will be blocked until the local is connected to the service.
+     * 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) {
+            synchronized (this) {
                 wait();
             }
-        } catch(java.lang.InterruptedException e) {
+        } catch (java.lang.InterruptedException e) {
 
         }
     }
 
     /**
-     * when invoked, wakes up the caller which invoked the method <code>waitConnected()</code> before.
+     * when invoked, wakes up the caller which invoked the method
+     * <code>waitConnected()</code> before.
      */
     public void notifyConnected() {
-        synchronized(this) {
+        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
index d8bbbfe..cb0f790 100644
--- 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
@@ -20,14 +20,17 @@
  * 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.
+ * 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
@@ -35,18 +38,23 @@
  * <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;
+     * 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} .
+     * Constructs a new exception with the pre-defined constant message
+     * {@code CORE_SERVICE_NOT_AVAILABLE} .
+     * 
      * @param message the detail message.
      */
     public CoreServiceNotAvailableException() {
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
index 7cde74f..c2bb6b9 100644
--- 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
@@ -20,28 +20,28 @@
  * 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},
+ * 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
+ * {@link com.suntek.mway.rcs.client.api.voip.VoIpApi} ) provided by RCS
  * according to business needs.
  * </p>
  * <p>
@@ -50,9 +50,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class RCSApplication extends Application {
 
@@ -74,28 +74,32 @@
     }
 
     /**
-     * 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.
+     * 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
+     * returns subclass of android.content.Context, here is the instance of
+     * RCSApplication
+     * 
      * @return the instance of RCSApplication
      */
     public static Context getContext() {
-        if(ctx == null) {
+        if (ctx == null) {
             ctx = RCSApplication.rcsApp;
         }
         return ctx;
     }
 
     /**
-     * override the method to initialize various API provided by RCS
-     * according to business needs.
+     * override the method to initialize various API provided by RCS according
+     * to business needs.
      */
     @Override
     public void onCreate() {
@@ -104,5 +108,4 @@
         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
index 9bb6560..eb7a510 100644
--- 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
@@ -20,16 +20,19 @@
  * 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.
+ * 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
@@ -37,9 +40,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class ServiceInterface {
 
@@ -49,9 +52,10 @@
     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.
+     * 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) {
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
index 04e90b7..693048b 100644
--- 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
@@ -20,24 +20,27 @@
  * 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},
+ * 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}.
+ * {@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
@@ -45,16 +48,16 @@
  * <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) {
@@ -63,7 +66,7 @@
 
     /**
      * Constructs a new exception with the specified detail message.
-     *
+     * 
      * @param error Error message
      */
     public ServiceUnknownException(String message) {
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
index ae1c648..df2a6ff 100644
--- 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
@@ -30,4 +30,5 @@
     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/RCSCapabilities.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/capability/RCSCapabilities.java
index 28bbdd4..8c8b07f 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/capability/RCSCapabilities.java
@@ -20,6 +20,7 @@
  * 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.constant.APIConstant;
@@ -30,10 +31,13 @@
 import java.io.Serializable;
 
 /**
- * <p>Title: RCSCapabilities class</p>
+ * <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.
+ * capabilities of the contact, which is indicated by the field definition in
+ * this class.
  * </p>
  * <p>
  * Copyright: Copyright (c) 2014
@@ -41,75 +45,67 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
-public class RCSCapabilities implements Parcelable,Serializable {
-    
+public class RCSCapabilities implements Parcelable, Serializable {
+
     /** The Constant serialVersionUID. */
     private static final long serialVersionUID = 5516256269504150135L;
 
     /**
-     * Image sharing support,
-     * "urn%3Aurn-7%3A3gpp-application.ims.iari.gsma-is"
+     * Image sharing support, "urn%3Aurn-7%3A3gpp-application.ims.iari.gsma-is"
      */
-    //private boolean imageSharingSupported = false;
+    // private boolean imageSharingSupported = false;
 
     /**
-     * Video sharing support
-     * +g.3gpp.cs-voice
+     * Video sharing support +g.3gpp.cs-voice
      */
-    //private boolean videoSharingSupported = false;
+    // private boolean videoSharingSupported = false;
 
     /**
-     * IP voice call support
-     * "urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel"
+     * IP voice call support "urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel"
      */
-    //private boolean ipVoiceCallSupported = false;
+    // private boolean ipVoiceCallSupported = false;
 
     /**
-     * IP video call support
-     * "urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel";video
+     * IP video call support "urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel";video
      */
-    //private boolean ipVideoCallSupported = false;
+    // private boolean ipVideoCallSupported = false;
 
     /**
-     * IM session support
-     * "urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.session"
+     * IM session support "urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.session"
      */
     private boolean imSessionSupported = false;
 
     /**
-     * File transfer support
-     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.ft"
+     * File transfer support "urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.ft"
      * "urn%3Aurn-7%3A3gppservice.ims.icsi.oma.cpm.filetransfer"
      */
     private boolean fileTransferSupported = false;
 
     /**
-     * CS video support
-     * +g.3gpp.cs-voice
+     * CS video support +g.3gpp.cs-voice
      */
-    //private boolean csVideoSupported = false;
+    // private boolean csVideoSupported = false;
 
     /**
      * Presence discovery support
      * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.dp"
      */
-    //private boolean presenceDiscoverySupported = false;
+    // private boolean presenceDiscoverySupported = false;
 
     /**
-     * Social presence support
-     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.sp"
+     * Social presence support "urn%3Aurn-7%3A3gpp-application.ims.iari.rcse.sp"
      */
-    //private boolean socialPresenceSupported = false;
+    // private boolean socialPresenceSupported = false;
 
     /**
      * File transfer over HTTP support
      * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.fthttp"
      */
-    //private boolean fileTransferHttpSupported = false;
+    // private boolean fileTransferHttpSupported = false;
 
     /**
      * Geolocation push support
@@ -130,8 +126,7 @@
     private boolean fileTransferThumbnailSupported = false;
 
     /**
-     * File Transfer S&F
-     * "urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.ftstandfw"
+     * File Transfer S&F "urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.ftstandfw"
      */
     private boolean fileTransferStoreForwardSupported = false;
 
@@ -142,8 +137,7 @@
     private boolean groupChatStoreForwardSupported = false;
 
     /**
-     * SIP automata (@see RFC 3840)
-     * +g.oma.sip-im
+     * SIP automata (@see RFC 3840) +g.oma.sip-im
      */
     //
 
@@ -160,7 +154,7 @@
 
     /** vemotion. */
     private boolean vemotionSupported = false;
-    
+
     /** cloudFile. */
     private boolean cloudFileSupported = false;
 
@@ -180,21 +174,22 @@
     }
 
     /**
-     * Construct a new RCSCapabilities() with another specified instance of RCSCapabilities.
-     *
+     * Construct a new RCSCapabilities() with another specified instance of
+     * RCSCapabilities.
+     * 
      * @param source another instance of RCSCapabilities.
      */
     public RCSCapabilities(Parcel source) {
-        //this.imageSharingSupported = source.readInt() != 0;
-        //this.videoSharingSupported = source.readInt() != 0;
-        //this.ipVoiceCallSupported = source.readInt() != 0;
-        //this.ipVideoCallSupported = source.readInt() != 0;
+        // this.imageSharingSupported = source.readInt() != 0;
+        // this.videoSharingSupported = source.readInt() != 0;
+        // this.ipVoiceCallSupported = source.readInt() != 0;
+        // this.ipVideoCallSupported = source.readInt() != 0;
         this.imSessionSupported = source.readInt() != 0;
         this.fileTransferSupported = source.readInt() != 0;
-        //this.csVideoSupported = source.readInt() != 0;
-        //this.presenceDiscoverySupported = source.readInt() != 0;
-        //this.socialPresenceSupported = source.readInt() != 0;
-        //this.fileTransferHttpSupported = source.readInt() != 0;
+        // this.csVideoSupported = source.readInt() != 0;
+        // this.presenceDiscoverySupported = source.readInt() != 0;
+        // this.socialPresenceSupported = source.readInt() != 0;
+        // this.fileTransferHttpSupported = source.readInt() != 0;
         this.geolocationPushSupported = source.readInt() != 0;
         this.geolocationPullSupported = source.readInt() != 0;
         this.fileTransferThumbnailSupported = source.readInt() != 0;
@@ -207,14 +202,14 @@
         this.cloudFileSupported = source.readInt() != 0;
         this.cmccSupported = source.readInt() != 0;
         this.burnAfterReading = source.readInt() != 0;
-        //this.sipAutomata = source.readInt() != 0;
+        // this.sipAutomata = source.readInt() != 0;
         this.timestamp = source.readLong();
     }
 
     /**
      * Describe the kinds of special objects contained in this Parcelable's
      * marshalled representation.
-     *
+     * 
      * @return Integer
      */
     public int describeContents() {
@@ -223,21 +218,21 @@
 
     /**
      * Write parcelable object.
-     *
+     * 
      * @param dest The Parcel in which the object should be written
      * @param flags Additional flags about how the object should be written
      */
     public void writeToParcel(Parcel dest, int flags) {
-        //dest.writeInt(imageSharingSupported ? 1 : 0);
-        //dest.writeInt(videoSharingSupported ? 1 : 0);
-        //dest.writeInt(ipVoiceCallSupported ? 1 : 0);
-        //dest.writeInt(ipVideoCallSupported ? 1 : 0);
+        // dest.writeInt(imageSharingSupported ? 1 : 0);
+        // dest.writeInt(videoSharingSupported ? 1 : 0);
+        // dest.writeInt(ipVoiceCallSupported ? 1 : 0);
+        // dest.writeInt(ipVideoCallSupported ? 1 : 0);
         dest.writeInt(imSessionSupported ? 1 : 0);
         dest.writeInt(fileTransferSupported ? 1 : 0);
-        //dest.writeInt(csVideoSupported ? 1 : 0);
-        //dest.writeInt(presenceDiscoverySupported ? 1 : 0);
-        //dest.writeInt(socialPresenceSupported ? 1 : 0);
-        //dest.writeInt(fileTransferHttpSupported ? 1 : 0);
+        // dest.writeInt(csVideoSupported ? 1 : 0);
+        // dest.writeInt(presenceDiscoverySupported ? 1 : 0);
+        // dest.writeInt(socialPresenceSupported ? 1 : 0);
+        // dest.writeInt(fileTransferHttpSupported ? 1 : 0);
         dest.writeInt(geolocationPushSupported ? 1 : 0);
         dest.writeInt(geolocationPullSupported ? 1 : 0);
         dest.writeInt(fileTransferThumbnailSupported ? 1 : 0);
@@ -250,15 +245,14 @@
         dest.writeInt(cloudFileSupported ? 1 : 0);
         dest.writeInt(cmccSupported ? 1 : 0);
         dest.writeInt(burnAfterReading ? 1 : 0);
-        //dest.writeInt(sipAutomata ? 1 : 0);
+        // dest.writeInt(sipAutomata ? 1 : 0);
         dest.writeLong(timestamp);
     }
 
     /**
      * a fast way to get a Parcelable creator.
      */
-    public static final Parcelable.Creator<RCSCapabilities> CREATOR
-            = new Parcelable.Creator<RCSCapabilities>() {
+    public static final Parcelable.Creator<RCSCapabilities> CREATOR = new Parcelable.Creator<RCSCapabilities>() {
         public RCSCapabilities createFromParcel(Parcel source) {
             return new RCSCapabilities(source);
         }
@@ -270,88 +264,78 @@
 
     /**
      * Is image sharing supported.
-     *
+     * 
      * @return Boolean
      */
     /*
-    public boolean isImageSharingSupported() {
-        return imageSharingSupported;
-    }
-    */
+     * public boolean isImageSharingSupported() { return imageSharingSupported;
+     * }
+     */
     /**
      * Set the image sharing support
-     *
+     * 
      * @param supported Supported
      */
     /*
-    public void setImageSharingSupported(boolean supported) {
-        this.imageSharingSupported = supported;
-    }
-    */
+     * public void setImageSharingSupported(boolean supported) {
+     * this.imageSharingSupported = supported; }
+     */
     /**
      * Is video sharing supported
-     *
+     * 
      * @return Boolean
      */
     /*
-    public boolean isVideoSharingSupported() {
-        return videoSharingSupported;
-    }
-    */
+     * public boolean isVideoSharingSupported() { return videoSharingSupported;
+     * }
+     */
     /**
      * Set the video sharing support
-     *
+     * 
      * @param supported Supported
      */
     /*
-    public void setVideoSharingSupported(boolean supported) {
-        this.videoSharingSupported = supported;
-    }
-    */
+     * public void setVideoSharingSupported(boolean supported) {
+     * this.videoSharingSupported = supported; }
+     */
 
     /**
      * Is IP voice call supported
-     *
+     * 
      * @return Boolean
      */
     /*
-    public boolean isIpVoiceCallSupported() {
-        return ipVoiceCallSupported;
-    }
-    */
+     * public boolean isIpVoiceCallSupported() { return ipVoiceCallSupported; }
+     */
     /**
      * Is IP video call supported
-     *
+     * 
      * @return Boolean
      */
     /*
-    public boolean isIpVideoCallSupported() {
-        return ipVideoCallSupported;
-    }
-    */
+     * public boolean isIpVideoCallSupported() { return ipVideoCallSupported; }
+     */
     /**
      * Set the IP voice call support
-     *
+     * 
      * @param supported Supported
      */
     /*
-    public void setIpVoiceCallSupported(boolean supported) {
-        this.ipVoiceCallSupported = supported;
-    }
-    */
+     * public void setIpVoiceCallSupported(boolean supported) {
+     * this.ipVoiceCallSupported = supported; }
+     */
     /**
      * Set the IP video call support
-     *
+     * 
      * @param supported Supported
      */
     /*
-    public void setIpVideoCallSupported(boolean supported) {
-        this.ipVideoCallSupported = supported;
-    }
-    */
+     * public void setIpVideoCallSupported(boolean supported) {
+     * this.ipVideoCallSupported = supported; }
+     */
     /**
      * Is IM session supported
-     *
+     * 
      * @return Boolean
      */
     public boolean isImSessionSupported() {
@@ -360,7 +344,7 @@
 
     /**
      * Set the IM session support.
-     *
+     * 
      * @param supported Supported
      */
     public void setImSessionSupported(boolean supported) {
@@ -369,7 +353,7 @@
 
     /**
      * Is file transfer supported.
-     *
+     * 
      * @return Boolean
      */
     public boolean isFileTransferSupported() {
@@ -378,7 +362,7 @@
 
     /**
      * Set the file transfer support.
-     *
+     * 
      * @param supported Supported
      */
     public void setFileTransferSupported(boolean supported) {
@@ -387,91 +371,82 @@
 
     /**
      * Is CS video supported.
-     *
+     * 
      * @return Boolean
      */
     /*
-    public boolean isCsVideoSupported() {
-        return csVideoSupported;
-    }
-    */
+     * public boolean isCsVideoSupported() { return csVideoSupported; }
+     */
     /**
      * Set the CS video support
-     *
+     * 
      * @param supported Supported
      */
     /*
-    public void setCsVideoSupported(boolean supported) {
-        this.csVideoSupported = supported;
-    }
-    */
+     * public void setCsVideoSupported(boolean supported) {
+     * this.csVideoSupported = supported; }
+     */
     /**
      * Is presence discovery supported
-     *
+     * 
      * @return Boolean
      */
     /*
-    public boolean isPresenceDiscoverySupported() {
-        return presenceDiscoverySupported;
-    }
-    */
+     * public boolean isPresenceDiscoverySupported() { return
+     * presenceDiscoverySupported; }
+     */
 
     /**
      * Set the presence discovery support
-     *
+     * 
      * @param supported Supported
      */
     /*
-    public void setPresenceDiscoverySupported(boolean supported) {
-        this.presenceDiscoverySupported = supported;
-    }
-    */
+     * public void setPresenceDiscoverySupported(boolean supported) {
+     * this.presenceDiscoverySupported = supported; }
+     */
 
     /**
      * Is social presence supported
-     *
+     * 
      * @return Boolean
      */
     /*
-    public boolean isSocialPresenceSupported() {
-        return socialPresenceSupported;
-    }
-    */
+     * public boolean isSocialPresenceSupported() { return
+     * socialPresenceSupported; }
+     */
 
     /**
      * Set the social presence support
-     *
+     * 
      * @param supported Supported
      */
     /*
-    public void setSocialPresenceSupported(boolean supported) {
-        this.socialPresenceSupported = supported;
-    }
-    */
+     * public void setSocialPresenceSupported(boolean supported) {
+     * this.socialPresenceSupported = supported; }
+     */
 
     /**
      * Is file transfer over HTTP supported
-     *
+     * 
      * @return Boolean
      */
     /*
-    public boolean isFileTransferHttpSupported() {
-        return fileTransferHttpSupported;
-    }
-    */
+     * public boolean isFileTransferHttpSupported() { return
+     * fileTransferHttpSupported; }
+     */
     /**
      * Set the file transfer over HTTP support
-     *
+     * 
      * @param supported Supported
      */
     /*
-    public void setFileTransferHttpSupported(boolean supported) {
-        this.fileTransferHttpSupported = supported;
-    }
-    */
+     * public void setFileTransferHttpSupported(boolean supported) {
+     * this.fileTransferHttpSupported = supported; }
+     */
     /**
      * Is Geolocation Push supported
-     *
+     * 
      * @return Boolean
      */
     public boolean isGeolocationPushSupported() {
@@ -480,7 +455,7 @@
 
     /**
      * Set the Geolocation Pull support.
-     *
+     * 
      * @param supported Supported
      */
     public void setGeolocationPullSupported(boolean supported) {
@@ -489,7 +464,7 @@
 
     /**
      * Is Geolocation Pull supported.
-     *
+     * 
      * @return Boolean
      */
     public boolean isGeolocationPullSupported() {
@@ -498,7 +473,7 @@
 
     /**
      * Set the Geolocation Push support.
-     *
+     * 
      * @param supported Supported
      */
     public void setGeolocationPushSupported(boolean supported) {
@@ -507,7 +482,7 @@
 
     /**
      * Is file transfer thumbnail supported.
-     *
+     * 
      * @return Boolean
      */
     public boolean isFileTransferThumbnailSupported() {
@@ -516,7 +491,7 @@
 
     /**
      * Set the file transfer thumbnail support.
-     *
+     * 
      * @param supported Supported
      */
     public void setFileTransferThumbnailSupported(boolean supported) {
@@ -525,7 +500,7 @@
 
     /**
      * Is file transfer S&F supported.
-     *
+     * 
      * @return Boolean
      */
 
@@ -535,7 +510,7 @@
 
     /**
      * Set the file transfer S&F support.
-     *
+     * 
      * @param supported Supported
      */
 
@@ -545,7 +520,7 @@
 
     /**
      * Is group chat S&F supported.
-     *
+     * 
      * @return Boolean
      */
     public boolean isGroupChatStoreForwardSupported() {
@@ -554,7 +529,7 @@
 
     /**
      * Set the group chat S&F support.
-     *
+     * 
      * @param supported Supported
      */
     public void setGroupChatStoreForwardSupported(boolean supported) {
@@ -563,27 +538,26 @@
 
     /**
      * Is device an automata ?.
-     *
+     * 
      * @return True if automata
      */
     /*
-    public boolean isSipAutomata() {
-        return sipAutomata;
-    }
-    */
+     * public boolean isSipAutomata() { return sipAutomata; }
+     */
 
     /**
      * Set the SIP automata feature tag
+     * 
      * @param sipAutomata
      */
     /*
-    public void setSipAutomata(boolean sipAutomata) {
-        this.sipAutomata = sipAutomata;
-    }
-    */
+     * public void setSipAutomata(boolean sipAutomata) { this.sipAutomata =
+     * sipAutomata; }
+     */
 
     /**
      * page mode message or not
+     * 
      * @return
      */
     public boolean isPageModeMsgSupported() {
@@ -592,7 +566,7 @@
 
     /**
      * Set page mode message.
-     *
+     * 
      * @param pageModeMsg the new page mode msg supported
      */
     public void setPageModeMsgSupported(boolean pageModeMsg) {
@@ -601,7 +575,7 @@
 
     /**
      * large mode message or not.
-     *
+     * 
      * @return true, if is large mode msg supported
      */
     public boolean isLargeModeMsgSupported() {
@@ -610,7 +584,7 @@
 
     /**
      * set large mode message.
-     *
+     * 
      * @param largeModeMsg the new large mode msg supported
      */
     public void setLargeModeMsgSupported(boolean largeModeMsg) {
@@ -619,7 +593,7 @@
 
     /**
      * public message or not.
-     *
+     * 
      * @return true, if is public msg supported
      */
     public boolean isPublicMsgSupported() {
@@ -628,7 +602,7 @@
 
     /**
      * set public message.
-     *
+     * 
      * @param publicMsg the new public msg supported
      */
     public void setPublicMsgSupported(boolean publicMsg) {
@@ -637,7 +611,7 @@
 
     /**
      * ve motion or not.
-     *
+     * 
      * @return true, if is vemotion supported
      */
     public boolean isVemotionSupported() {
@@ -646,16 +620,16 @@
 
     /**
      * set ve motion.
-     *
+     * 
      * @param vemotion the new vemotion supported
      */
     public void setVemotionSupported(boolean vemotion) {
         this.vemotionSupported = vemotion;
     }
-    
+
     /**
      * Checks if is cloud file supported.
-     *
+     * 
      * @return true, if is cloud file supported
      */
     public boolean isCloudFileSupported() {
@@ -664,7 +638,7 @@
 
     /**
      * Sets the cloud file supported.
-     *
+     * 
      * @param cloudFileSupported the new cloud file supported
      */
     public void setCloudFileSupported(boolean cloudFileSupported) {
@@ -672,8 +646,9 @@
     }
 
     /**
-     * group management(modify group name, kick people, transfer the group) nor not.
-     *
+     * group management(modify group name, kick people, transfer the group) nor
+     * not.
+     * 
      * @return true, if is cmcc supported
      */
     public boolean isCmccSupported() {
@@ -682,7 +657,7 @@
 
     /**
      * set group management.
-     *
+     * 
      * @param cmcc the new cmcc supported
      */
     public void setCmccSupported(boolean cmcc) {
@@ -691,7 +666,7 @@
 
     /**
      * Checks is burn after reading.
-     *
+     * 
      * @return true, if is burn after reading
      */
     public boolean isBurnAfterReading() {
@@ -700,7 +675,7 @@
 
     /**
      * Set burn after reading.
-     *
+     * 
      * @param burnAfterReading the new burn after reading
      */
     public void setBurnAfterReading(boolean burnAfterReading) {
@@ -709,7 +684,7 @@
 
     /**
      * Get the capabilities timestamp.
-     *
+     * 
      * @return Timestamp (in milliseconds)
      */
     public long getTimestamp() {
@@ -718,7 +693,7 @@
 
     /**
      * Set capabilities timestamp.
-     *
+     * 
      * @param timestamp the new timestamp
      */
     public void setTimestamp(long timestamp) {
@@ -727,37 +702,39 @@
 
     /**
      * 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 +
+        // ", 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;
+                ", 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/constant/APIConstant.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/APIConstant.java
index 449cdc6..84abb1c 100644
--- 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
@@ -20,13 +20,17 @@
  * 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>
+ * 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.
+ * constants of SDK API, which is indicated by the field definition in this
+ * class.
  * </p>
  * <p>
  * Copyright: Copyright (c) 2014
@@ -34,14 +38,14 @@
  * <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
+     * The kind of special object contained in this Parcelable's marshalled
+     * representation
      */
     public static final int PARCEL_OBJECT_TYPE = 0;
 
@@ -49,7 +53,9 @@
      * 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;
 
@@ -60,7 +66,6 @@
 
     public static final int BUTTON_DISPLAY = 1;
 
-
     /** The Constant LOGIN_SUCCESS. */
     public static final int LOGIN_SUCCESS = 0;
 
@@ -75,9 +80,11 @@
 
     /** 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.**/
+
+    /** current account's status is invalid. **/
     public static final int ACCOUNT_STATUS_INVALID_ERR_CODE = -997;
 
     /** Send message auto select system sms or im */
@@ -89,11 +96,10 @@
     /** Send message auto select im */
     public static final int MSG_SEND_POLICY_IM = 3;
 
-    /** Remind me when message sent by SMS  */
+    /** Remind me when message sent by SMS */
     public static final int SMS_SEND_REMIND = 1;
 
-    /** Not need remind me when message sent by SMS  */
+    /** 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/BroadcastConstants.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/BroadcastConstants.java
index bc49fe5..aed6c35 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
 
 /**
@@ -27,7 +28,7 @@
  */
 public class BroadcastConstants {
 
-    /**  Text send by system SMS broadcast action. */
+    /** 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. */
@@ -53,25 +54,28 @@
 
     /** 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. */
+    /** 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. */
+    /** 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. */
+    /** 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. */
+    /** 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. */
+    /**
+     * 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. */
@@ -86,7 +90,10 @@
     /** 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. */
+    /**
+     * 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. */
@@ -95,7 +102,9 @@
     /** 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. */
+    /**
+     * 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. */
@@ -103,9 +112,7 @@
 
     /**
      * UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name actionType String.
-     *
-     * actionType contains:
-     * {@link BroadcastConstants#ACTION_TYPE_CREATE}
+     * actionType contains: {@link BroadcastConstants#ACTION_TYPE_CREATE}
      * {@link BroadcastConstants#ACTION_TYPE_CREATE_NOT_ACTIVE}
      * {@link BroadcastConstants#ACTION_TYPE_CONNECTED}
      * {@link BroadcastConstants#ACTION_TYPE_DEPARTED}
@@ -127,16 +134,16 @@
 
     /** * 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";
 
@@ -161,10 +168,16 @@
     /** Update the policy of group. */
     public static final String ACTION_TYPE_POLICY_UPDATE = "updatePolicy";
 
-    /** UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name phoneNumber String. */
+    /**
+     * 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. */
+    /**
+     * UI_SHOW_MESSAGE_NOTIFY broadcast passed parameter name displayName
+     * String.
+     */
     public static final String BC_VAR_MSG_DISPLAY_NAME = "displayName";
 
     /** Update download progress broadcast. */
@@ -193,20 +206,26 @@
 
     /** 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. */
+    /**
+     * 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. */
+    /**
+     * 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. */
@@ -221,22 +240,37 @@
     /** 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. */
+    /**
+     * 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. */
+    /**
+     * 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. */
+    /**
+     * 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. */
+    /**
+     * 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. */
+    /**
+     * 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. */
@@ -245,24 +279,28 @@
     /** UI_INVITE_TO_JOIN_GROUP broadcast passed parameter name alias String. */
     public static final String BC_VAR_ALIAS = "alias";
 
-    /**  Error code of group operation. */
+    /** Error code of group operation. */
     public static final String BC_VAR_ERROR_CODE = "errorCode";
 
-    /**  Description of code. */
+    /** Description of code. */
     public static final String BC_VAR_ERROR_DESC = "errorDesc";
 
     /**
-     * UI_GROUP_CHAT_MAXCOUNT_CHANGE broadcast passed parameter name maxCount String.
+     * 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. */
+    /** Description of code. */
     public static final String BC_VAR_RESULT = "result";
 
-    /** ************************************** send message error begin ******************************************************. */
+    /**
+     * ************************************** send message error begin
+     * ******************************************************.
+     */
 
     /**
      * UI send message error broadcast
@@ -277,50 +315,63 @@
 
     /** Create group not complete. */
     public static final String BC_VAR_SEND_ERROR_GROUP_NOT_COMPLETED = "group_not_completed";
-    
-    /** Wait other to join */
+
+    /** 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 message error end
+     * ******************************************************.
+     */
 
-    /** ************************************** send group refer error begin ******************************************************. */
+    /**
+     * ************************************** 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.
+     * 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";
+    public static final String REFER_TYPE_DISBAND = "disband";
 
-    /** ************************************** send group refer error end ******************************************************. */
+    /**
+     * ************************************** send group refer error end
+     * ******************************************************.
+     */
 
-    /** ************************************** send composing broadcast begin ******************************************************. */
+    /**
+     * ************************************** send composing broadcast begin
+     * ******************************************************.
+     */
     /**
      * The broadcast of composing
      */
@@ -332,7 +383,8 @@
     public static final String BC_VAR_COMPOSE_STATE = "state";
 
     /**
-     * UI_SHOW_COMPOSING_INFO broadcast passed parameter name contentType String.
+     * UI_SHOW_COMPOSING_INFO broadcast passed parameter name contentType
+     * String.
      */
     public static final String BC_VAR_COMPOSE_CONTENTTYPE = "contentType";
 
@@ -346,9 +398,15 @@
      */
     public static final String BC_VAR_COMPOSE_LASTACTIVE = "lastActive";
 
-    /** ************************************** send composing broadcast end ******************************************************. */
+    /**
+     * ************************************** send composing broadcast end
+     * ******************************************************.
+     */
 
-    /** ************************************** send report broadcast begin ******************************************************. */
+    /**
+     * ************************************** send report broadcast begin
+     * ******************************************************.
+     */
     /**
      * The broadcast of composing
      */
@@ -360,7 +418,7 @@
     public static final String BC_VAR_REPORT_STATUS = "status";
 
     /**
-     * UI_SHOW_RECV_REPORT_INFO broadcast passed parameter recipient  String.
+     * UI_SHOW_RECV_REPORT_INFO broadcast passed parameter recipient String.
      */
     public static final String BC_VAR_REPORT_RECIPIENT = "recipient";
 
@@ -369,36 +427,55 @@
      */
     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
+     * ************************************** 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. */
+    /**
+     * 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 ******************************************************. */
+    /**
+     * ************************************** 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 ******************************************************. */
+    /**
+     * ************************************** 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.
+     * 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.
+     * UI_DOWNLOADING_FILE_CHANGE broadcast passed parameter name filepath
+     * String.
      */
     public static final String BC_VAR_FILEPATH = "filepath";
 
@@ -411,16 +488,22 @@
      * 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.
+     * UI_DOWNLOADING_FILE_CHANGE broadcast passed parameter name transferId
+     * String.
      */
     public static final String BC_VAR_TRANSFER_ID = "transferId";
 
+    /**
+     * ************************************** download file end
+     * ******************************************************.
+     */
 
-    /** ************************************** download file end ******************************************************. */
-
-    /** ************************************** AV ******************************************************. */
+    /**
+     * ************************************** AV
+     * ******************************************************.
+     */
     /** Notify UI to Sending call */
     public static final String UI_AV_SENDING_CALL = "ui_av_sending_call";
 
@@ -448,7 +531,10 @@
     /** AV broadcast passed parameter name callRecordId String. */
     public static final String BC_VAR_AV_CALLRECORDID = "callRecordId";
 
-    /** ************************************** PUBLIC ACCOUNT ******************************************************. */
+    /**
+     * ************************************** PUBLIC ACCOUNT
+     * ******************************************************.
+     */
     /** Callback notification after load thumb of public account. */
     public static final String UI_PA_LOAD_THUMB = "ui_pa_load_thumb";
 
@@ -479,7 +565,10 @@
     /** Public account broadcast passed parameter name filePaths String. */
     public static final String BC_VAR_PA_LOAD_THUMB_FILEPATHS = "filePaths";
 
-    /** ************************************** MCLOUD ******************************************************. */
+    /**
+     * ************************************** MCLOUD
+     * ******************************************************.
+     */
     /** Callback notification after put file. */
     public static final String UI_MC_PUT_FILE = "ui_mc_put_file";
 
@@ -530,7 +619,7 @@
 
     /** 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";
 
@@ -548,14 +637,17 @@
 
     /** 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 ******************************************************. */
+
+    /**
+     * ************************************** IMAP
+     * ******************************************************.
+     */
     public static final String BACKUP_ALL_MESSAGE = "com.suntek.mway.rcs.BACKUP_ALL_MESSAGE";
 
     /** The Constant RESTORE_ALL_MESSAGE. */
@@ -566,58 +658,61 @@
 
     /** 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";
 
@@ -626,79 +721,116 @@
 
     /** 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";
-    
-    /** ************************************** PLUGIN ******************************************************. */
+
+    /** 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. */
+
+    /** 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. */
+    /** 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/MediaConstants.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/constant/MediaConstants.java
index ddb5510..a8568b8 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
 
 /**
@@ -35,10 +36,10 @@
 
     /** 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";
 
@@ -50,7 +51,7 @@
 
     /** 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;
 
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
index c06f0b4..96f5754 100644
--- 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
@@ -20,12 +20,14 @@
  * 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;
 
+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) {
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
index aae4f2e..0d48285 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -31,10 +32,12 @@
 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.
+ * Title: RCSContact class
+ * </p>
+ * <p>
+ * Description: The class <code>RCSContact</code> represents the informations of
+ * RCS contact.
  * </p>
  * <p>
  * Copyright: Copyright (c) 2014
@@ -42,9 +45,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class RCSContact extends Profile implements Parcelable {
 
@@ -64,7 +67,7 @@
 
     /**
      * Checks if is rcs contact.
-     *
+     * 
      * @return true, if is rcs contact
      */
     public boolean isRcsContact() {
@@ -73,7 +76,7 @@
 
     /**
      * Sets the rcs contact.
-     *
+     * 
      * @param isRcsContact the new rcs contact
      */
     public void setRcsContact(boolean isRcsContact) {
@@ -82,7 +85,7 @@
 
     /**
      * Gets the id.
-     *
+     * 
      * @return the id
      */
     public long getId() {
@@ -91,7 +94,7 @@
 
     /**
      * Sets the id.
-     *
+     * 
      * @param id the new id
      */
     public void setId(long id) {
@@ -100,7 +103,7 @@
 
     /**
      * Gets the pinyin.
-     *
+     * 
      * @return the pinyin
      */
     public String getPinyin() {
@@ -109,7 +112,7 @@
 
     /**
      * Sets the pinyin.
-     *
+     * 
      * @param pinyin the new pinyin
      */
     public void setPinyin(String pinyin) {
@@ -118,6 +121,7 @@
 
     /**
      * Get photo
+     * 
      * @return
      */
     public byte[] getPhoto() {
@@ -126,6 +130,7 @@
 
     /**
      * Set photo
+     * 
      * @param photo
      */
     public void setPhoto(byte[] photo) {
@@ -134,6 +139,7 @@
 
     /**
      * Get photo base64 code
+     * 
      * @return
      */
     public String getPhotoBase64() {
@@ -142,6 +148,7 @@
 
     /**
      * Set photo base64 code
+     * 
      * @param photoBase64
      */
     public void setPhotoBase64(String photoBase64) {
@@ -149,29 +156,27 @@
     }
 
     /**
-       * Instantiates a new RCSContact.
-       */
-      public RCSContact()
-      {}
+     * Instantiates a new RCSContact.
+     */
+    public RCSContact() {
+    }
 
-      /**
-       * Instantiates a new RCSContact.
-       *
-       * @param source the source
-       */
-      public RCSContact( Parcel source )
-      {
-          readFromParcel( source );
-      }
+    /**
+     * 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()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -179,78 +184,71 @@
      * 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 );
+    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 ) {
+        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
+     * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        super.readFromParcel( source );
+    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 ) {
+        if (photo != null) {
             source.readByteArray(photo);
         }
 
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<RCSContact>    CREATOR    = new Parcelable.Creator<RCSContact>() {
+    public static final Parcelable.Creator<RCSContact> CREATOR = new Parcelable.Creator<RCSContact>() {
         @Override
-        public RCSContact createFromParcel( Parcel source )
-        {
-            return new RCSContact( source );
+        public RCSContact createFromParcel(Parcel source) {
+            return new RCSContact(source);
         }
 
         @Override
-        public RCSContact[] newArray( int size )
-        {
-            return new RCSContact[ size ];
+        public RCSContact[] newArray(int size) {
+            return new RCSContact[size];
         }
     };
 
-
     @Override
     public String toString() {
         int photoLen = 0;
-        if( photo != null ) {
+        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());
+        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
index 8bd35fb..2bd34cb 100644
--- 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
@@ -178,7 +178,7 @@
      */
     //void authUseEmoticon( in Map paramMap, IEmoticonCallbackApi callback );
     
-    void isCanSend(String emoticonId, String phone, IEmoticonCanSendCallback cansendCallback);
+    boolean isCanSend(String emoticonId);
     
     /**
      * Gets the storage root path.
@@ -217,4 +217,8 @@
 */
 
 //    ResultBO doLogout(String userPhone, String date);
+
+	boolean isEmojiStoreInstall();
+	
+	void startEmojiStoreApp();
 }
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
index 0d2cde3..d9d4fc7 100644
--- 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
@@ -102,8 +102,10 @@
     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);
@@ -145,6 +147,9 @@
     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);
     
@@ -203,6 +208,7 @@
     long getVideoFtMaxSize();
 
     void removeMsgWithNotificationByThread(long threadId);
+    void removeButRemainLockMsgWithNotificationByThread(long threadId);
 
     void backupMessageList(in List<SimpleMsg> simpleMsgList);
 
@@ -252,4 +258,9 @@
             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/OprResponse.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/im/OprResponse.java
index 3400cce..0ad1ce0 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/im/OprResponse.java
@@ -20,14 +20,15 @@
  * 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;
 
 public class OprResponse {
 
     public static final int SUCCESS = 200;
-    
+
     public static final int OFFLINE = 900;
-    
+
     public static final int OTHRE_ERROR = 999;
-    
+
 }
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
index 2b88dd6..678c56b 100644
--- 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
@@ -28,6 +28,8 @@
 
 interface IProfileApi
 {
+	boolean checkPluginStatus();
+
     void setMyProfile(in Profile profile, IProfileListener listener);
     
     void setMyHeadPic(in Avatar avatar, IProfileListener listener);
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
index 388f2b6..d410629 100644
--- 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
@@ -42,6 +42,13 @@
 {
     
     /**
+     * Check plugin status.
+     * 
+     * @return true, if successful
+     */
+    boolean checkPluginStatus();
+    
+    /**
      * follow some public account.
      *
      * @param uuid            the public account uuid
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/PublicAccountCallback.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/PublicAccountCallback.java
index 2a39fda..615c055 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/PublicAccountCallback.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/callback/PublicAccountCallback.java
@@ -20,6 +20,7 @@
  * 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.IPublicAccountCallbackAPI;
@@ -32,30 +33,28 @@
 
 import java.util.List;
 
-public abstract class PublicAccountCallback extends IPublicAccountCallbackAPI.Stub{
+public abstract class PublicAccountCallback extends IPublicAccountCallbackAPI.Stub {
 
-
-//    public void PublicAccountCallback() {
-//
-//    }
-//    @Override
-//    public void respAddSubscribe(boolean arg0) throws RemoteException {
-//        // TODO Auto-generated method stub
-//
-//    }
+    // public void PublicAccountCallback() {
+    //
+    // }
+    // @Override
+    // public void respAddSubscribe(boolean arg0) throws RemoteException {
+    // // TODO Auto-generated method stub
+    //
+    // }
 
     @Override
-    public void respAddSubscribeAccount(boolean arg0, PublicAccounts arg1)
-            throws RemoteException {
+    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 respCancelSubscribe(boolean arg0) throws RemoteException {
+    // // TODO Auto-generated method stub
+    //
+    // }
 
     @Override
     public void respCancelSubscribeAccount(boolean arg0, PublicAccounts arg1)
@@ -64,11 +63,11 @@
 
     }
 
-//    @Override
-//    public void respComplainPublic(boolean result) throws RemoteException {
-//        // TODO Auto-generated method stub
-//        LogHelper.d("result --> "+result );
-//    }
+    // @Override
+    // public void respComplainPublic(boolean result) throws RemoteException {
+    // // TODO Auto-generated method stub
+    // LogHelper.d("result --> "+result );
+    // }
 
     @Override
     public void respComplainPublicAccount(boolean result, PublicAccounts arg1)
@@ -78,29 +77,28 @@
     }
 
     @Override
-    public void respGetPreMessage(boolean arg0, List<MsgContent> arg1)
-            throws RemoteException {
+    public void respGetPreMessage(boolean arg0, List<MsgContent> arg1) throws RemoteException {
         // TODO Auto-generated method stub
 
     }
 
-//    @Override
-//    public void respGetPreMessageAccount(boolean result, PublicAccounts pAccount)
-//            throws RemoteException {
-//        // TODO Auto-generated method stub
-//        LogHelper.d("result --> "+result + "PublicAccounts = " + pAccount.getPaUuid()+" , "+pAccount.getSipUri());
-//    }
+    // @Override
+    // public void respGetPreMessageAccount(boolean result, PublicAccounts
+    // pAccount)
+    // throws RemoteException {
+    // // TODO Auto-generated method stub
+    // LogHelper.d("result --> "+result + "PublicAccounts = " +
+    // pAccount.getPaUuid()+" , "+pAccount.getSipUri());
+    // }
 
     @Override
-    public void respGetPublicDetail(boolean arg0, PublicAccountsDetail arg1)
-            throws RemoteException {
+    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
 
     }
@@ -112,25 +110,27 @@
 
     }
 
-//    @Override
-//    public void respGetPublicMenuInfoAccount(boolean result, PublicAccounts pAccount)
-//            throws RemoteException {
-//        // TODO Auto-generated method stub
-//        LogHelper.d("result --> "+result + "PublicAccounts = " + pAccount.getPaUuid()+" , "+pAccount.getSipUri());
-//
-//    }
+    // @Override
+    // public void respGetPublicMenuInfoAccount(boolean result, PublicAccounts
+    // pAccount)
+    // throws RemoteException {
+    // // TODO Auto-generated method stub
+    // LogHelper.d("result --> "+result + "PublicAccounts = " +
+    // pAccount.getPaUuid()+" , "+pAccount.getSipUri());
+    //
+    // }
 
-//    @Override
-//    public void respGetPublicMenuInfoString(boolean result, String info)
-//            throws RemoteException {
-//        // TODO Auto-generated method stub
-//        LogHelper.d("result --> "+result + "info = " + info);
-//
-//    }
+    // @Override
+    // public void respGetPublicMenuInfoString(boolean result, String info)
+    // throws RemoteException {
+    // // TODO Auto-generated method stub
+    // LogHelper.d("result --> "+result + "info = " + info);
+    //
+    // }
 
     @Override
-    public void respGetUserSubscribePublicList(boolean result,
-            List<PublicAccounts> pubAcctList) throws RemoteException {
+    public void respGetUserSubscribePublicList(boolean result, List<PublicAccounts> pubAcctList)
+            throws RemoteException {
         // TODO Auto-generated method stub
 
     }
@@ -141,10 +141,9 @@
         // TODO Auto-generated method stub
 
     }
-    
+
     @Override
-    public void respSetAcceptStatus(boolean result, String uuid)
-            throws RemoteException {
+    public void respSetAcceptStatus(boolean result, String uuid) throws RemoteException {
         // TODO Auto-generated method stub
 
     }
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 9affe5c..043b134 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
@@ -20,110 +20,114 @@
  * 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.emoticon;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
 /**
- * <p>Title: The emoticon package entity class</p>
- * <p>Description: The emoticon package entity save some package info, such as package id, package name and so on</p>
- * <p>Copyright: Copyright (c) 2014</p>
- * <p>Company: pci-suntek</p>
- *
+ * <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
-{
+public class EmojiPackageBO implements Parcelable {
 
-      /** The package id. */
-      private String packageId;
+    /** The package id. */
+    private String packageId;
 
-      /** The package name. */
-      private String packageName;
+    /** The package name. */
+    private String packageName;
 
-      /** The package icon. */
-      private String packageIcon;
+    /** The package icon. */
+    private String packageIcon;
 
-      /** The package size. */
-      private String packageSize;
+    /** The package size. */
+    private String packageSize;
 
-      /** The package state. 1 had buyed, 0 havnt buyed*/
-      private String packageState;
+    /** The package state. 1 had buyed, 0 havnt buyed */
+    private String packageState;
 
-      /** The package price. */
-      private String packagePrice;
+    /** The package price. */
+    private String packagePrice;
 
-      /** The package use limited time. */
-      private String packageUseTime;
+    /** The package use limited time. */
+    private String packageUseTime;
 
-      /** The package cp id. */
-      private String packageCpId;
+    /** The package cp id. */
+    private String packageCpId;
 
-      /** The package cp name. */
-      private String packageCpName;
+    /** The package cp name. */
+    private String packageCpName;
 
-      /** The package description. */
-      private String packageDesc;
+    /** The package description. */
+    private String packageDesc;
 
-      /** The package zip icon. */
-      private String packageZipIcon;
+    /** The package zip icon. */
+    private String packageZipIcon;
 
-      /** The package zip name. */
-      private String packageZipName;
+    /** The package zip name. */
+    private String packageZipName;
 
-      /** The package zip path. */
-      private String packageZipPath;
+    /** The package zip path. */
+    private String packageZipPath;
 
-        /**
-         * The parcel describe contents, defaul is 0.
-         *
-         * @return the int
-         */
+    /**
+     * The parcel describe contents, defaul is 0.
+     * 
+     * @return the int
+     */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the emoticon package entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * Write the emoticon package entity to parcel stream. Pay attention to read
+     * and write variables variables sequence should be consistent or not the
      * correct results
-     *
+     * 
      * @param dest the dest
      * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( packageId );
-        dest.writeString( packageName );
-        dest.writeString( packageIcon );
-        dest.writeString( packageSize );
-        dest.writeString( packageState );
-        dest.writeString( packagePrice );
-        dest.writeString( packageUseTime );
-        dest.writeString( packageCpId );
-        dest.writeString( packageCpName );
-        dest.writeString( packageDesc );
-        dest.writeString( packageZipIcon );
-        dest.writeString( packageZipName );
-        dest.writeString( packageZipPath );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(packageId);
+        dest.writeString(packageName);
+        dest.writeString(packageIcon);
+        dest.writeString(packageSize);
+        dest.writeString(packageState);
+        dest.writeString(packagePrice);
+        dest.writeString(packageUseTime);
+        dest.writeString(packageCpId);
+        dest.writeString(packageCpName);
+        dest.writeString(packageDesc);
+        dest.writeString(packageZipIcon);
+        dest.writeString(packageZipName);
+        dest.writeString(packageZipPath);
     }
 
     /**
-     * Create the emoticon package entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 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 )
-    {
+    public void readFromParcel(Parcel source) {
         packageId = source.readString();
         packageName = source.readString();
         packageIcon = source.readString();
@@ -140,293 +144,264 @@
     }
 
     /** 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 );
+        public EmojiPackageBO createFromParcel(Parcel source) {
+            return new EmojiPackageBO(source);
         }
 
         @Override
-        public EmojiPackageBO[] newArray( int size )
-        {
-            return new EmojiPackageBO[ size ];
+        public EmojiPackageBO[] newArray(int size) {
+            return new EmojiPackageBO[size];
         }
     };
 
     /**
      * Instantiates a new emoji package bo.
      */
-    public EmojiPackageBO()
-    {}
+    public EmojiPackageBO() {
+    }
 
     /**
      * Instantiates a new emoji package bo.
-     *
+     * 
      * @param source the source
      */
-    public EmojiPackageBO( Parcel source )
-    {
-        readFromParcel( source );
+    public EmojiPackageBO(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * Gets the package id.
-     *
+     * 
      * @return the package id
      */
-    public String getPackageId()
-    {
+    public String getPackageId() {
         return packageId;
     }
 
     /**
      * Sets the package id.
-     *
+     * 
      * @param packageId the new package id
      */
-    public void setPackageId( String packageId )
-    {
+    public void setPackageId(String packageId) {
         this.packageId = packageId;
     }
 
     /**
      * Gets the package name.
-     *
+     * 
      * @return the package name
      */
-    public String getPackageName()
-    {
+    public String getPackageName() {
         return packageName;
     }
 
     /**
      * Sets the package name.
-     *
+     * 
      * @param packageName the new package name
      */
-    public void setPackageName( String packageName )
-    {
+    public void setPackageName(String packageName) {
         this.packageName = packageName;
     }
 
     /**
      * Gets the package icon.
-     *
+     * 
      * @return the package icon
      */
-    public String getPackageIcon()
-    {
+    public String getPackageIcon() {
         return packageIcon;
     }
 
     /**
      * Sets the package icon.
-     *
+     * 
      * @param packageIcon the new package icon
      */
-    public void setPackageIcon( String packageIcon )
-    {
+    public void setPackageIcon(String packageIcon) {
         this.packageIcon = packageIcon;
     }
 
     /**
      * Gets the package size.
-     *
+     * 
      * @return the package size
      */
-    public String getPackageSize()
-    {
+    public String getPackageSize() {
         return packageSize;
     }
 
     /**
      * Sets the package size.
-     *
+     * 
      * @param packageSize the new package size
      */
-    public void setPackageSize( String packageSize )
-    {
+    public void setPackageSize(String packageSize) {
         this.packageSize = packageSize;
     }
 
     /**
      * Gets the package state.
-     *
+     * 
      * @return the package state
      */
-    public String getPackageState()
-    {
+    public String getPackageState() {
         return packageState;
     }
 
     /**
      * Sets the package state.
-     *
+     * 
      * @param packageState the new package state
      */
-    public void setPackageState( String packageState )
-    {
+    public void setPackageState(String packageState) {
         this.packageState = packageState;
     }
 
     /**
      * Gets the package price.
-     *
+     * 
      * @return the package price
      */
-    public String getPackagePrice()
-    {
+    public String getPackagePrice() {
         return packagePrice;
     }
 
     /**
      * Sets the package price.
-     *
+     * 
      * @param packagePrice the new package price
      */
-    public void setPackagePrice( String packagePrice )
-    {
+    public void setPackagePrice(String packagePrice) {
         this.packagePrice = packagePrice;
     }
 
     /**
      * Gets the package use limited time.
-     *
+     * 
      * @return the package use limited time
      */
-    public String getPackageUseTime()
-    {
+    public String getPackageUseTime() {
         return packageUseTime;
     }
 
     /**
      * Sets the package use limited time.
-     *
+     * 
      * @param packageUseTime the new package use limited time
      */
-    public void setPackageUseTime( String packageUseTime )
-    {
+    public void setPackageUseTime(String packageUseTime) {
         this.packageUseTime = packageUseTime;
     }
 
     /**
      * Gets the package cp id.
-     *
+     * 
      * @return the package cp id
      */
-    public String getPackageCpId()
-    {
+    public String getPackageCpId() {
         return packageCpId;
     }
 
     /**
      * Sets the package cp id.
-     *
+     * 
      * @param packageCpId the new package cp id
      */
-    public void setPackageCpId( String packageCpId )
-    {
+    public void setPackageCpId(String packageCpId) {
         this.packageCpId = packageCpId;
     }
 
     /**
      * Gets the package cp name.
-     *
+     * 
      * @return the package cp name
      */
-    public String getPackageCpName()
-    {
+    public String getPackageCpName() {
         return packageCpName;
     }
 
     /**
      * Sets the package cp name.
-     *
+     * 
      * @param packageCpName the new package cp name
      */
-    public void setPackageCpName( String packageCpName )
-    {
+    public void setPackageCpName(String packageCpName) {
         this.packageCpName = packageCpName;
     }
 
     /**
      * Gets the package description.
-     *
+     * 
      * @return the package description
      */
-    public String getPackageDesc()
-    {
+    public String getPackageDesc() {
         return packageDesc;
     }
 
     /**
      * Sets the package description.
-     *
+     * 
      * @param packageDesc the new package description
      */
-    public void setPackageDesc( String packageDesc )
-    {
+    public void setPackageDesc(String packageDesc) {
         this.packageDesc = packageDesc;
     }
 
     /**
      * Gets the package zip icon.
-     *
+     * 
      * @return the package zip icon
      */
-    public String getPackageZipIcon()
-    {
+    public String getPackageZipIcon() {
         return packageZipIcon;
     }
 
     /**
      * Sets the package zip icon.
-     *
+     * 
      * @param packageZipIcon the new package zip icon
      */
-    public void setPackageZipIcon( String packageZipIcon )
-    {
+    public void setPackageZipIcon(String packageZipIcon) {
         this.packageZipIcon = packageZipIcon;
     }
 
     /**
      * Gets the package zip name.
-     *
+     * 
      * @return the package zip name
      */
-    public String getPackageZipName()
-    {
+    public String getPackageZipName() {
         return packageZipName;
     }
 
     /**
      * Sets the package zip name.
-     *
+     * 
      * @param packageZipName the new package zip name
      */
-    public void setPackageZipName( String packageZipName )
-    {
+    public void setPackageZipName(String packageZipName) {
         this.packageZipName = packageZipName;
     }
 
     /**
      * Gets the package zip path.
-     *
+     * 
      * @return the package zip path
      */
-    public String getPackageZipPath()
-    {
+    public String getPackageZipPath() {
         return packageZipPath;
     }
 
     /**
      * Sets the package zip path.
-     *
+     * 
      * @param packageZipPath the new package zip path
      */
-    public void setPackageZipPath( String packageZipPath )
-    {
+    public void setPackageZipPath(String packageZipPath) {
         this.packageZipPath = packageZipPath;
     }
 
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 4b161ac..84091ed 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
@@ -20,58 +20,65 @@
  * 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.emoticon;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
 /**
- * <p>Title: The emoticon entity class</p>
- * <p>Description: The emoticon entity save some emoticon info, such as emoticon id, name and so on</p>
- * <p>Copyright: Copyright (c) 2014</p>
- * <p>Company: pci-suntek</p>
- *
+ * <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;
+public class EmoticonBO implements Parcelable {
+    /** The emoticon id. */
+    private String emoticonId;
 
-      /** The emoticon name. */
-      private String emoticonName;
+    /** The emoticon name. */
+    private String emoticonName;
 
-      /** The emoticon static url. */
-      private String emoticonStatic;
+    /** The emoticon static url. */
+    private String emoticonStatic;
 
-      /** The emoticon dynamic url. */
-      private String emoticonDynamic;
+    /** The emoticon dynamic url. */
+    private String emoticonDynamic;
 
-      /** The package id. */
-      private String packageId;
+    /** The package id. */
+    private String packageId;
 
-      /** The static emoticon bytes. */
-      private byte[] emoticonStaticByte;
+    /** The static emoticon bytes. */
+    private byte[] emoticonStaticByte;
 
-      /** The dynamic emoticon bytes. */
-      private byte[] emoticonDynamicByte;
+    /** The dynamic emoticon bytes. */
+    private byte[] emoticonDynamicByte;
 
-      /** The user phone number. */
-      private String userPhone;
+    /** The user phone number. */
+    private String userPhone;
 
-      /** The is only browse. */
-      private boolean isOnlyBrowse;
+    /** The is only browse. */
+    private boolean isOnlyBrowse;
 
-        /**
-         * The parcel describe contents, defaul is 0.
-         *
-         * @return the int
-         */
+    /**
+     * The parcel describe contents, defaul is 0.
+     * 
+     * @return the int
+     */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -79,34 +86,33 @@
      * Write the emoticon entity to parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
+     * 
      * @param dest the dest
      * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( emoticonId );
-        dest.writeString( emoticonName );
-        dest.writeString( emoticonStatic );
-        dest.writeString( emoticonDynamic );
-        dest.writeString( packageId );
-        dest.writeByteArray( emoticonStaticByte );
-        dest.writeByteArray( emoticonDynamicByte );
-        dest.writeString( userPhone );
-        dest.writeBooleanArray( new boolean[]{ isOnlyBrowse } );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(emoticonId);
+        dest.writeString(emoticonName);
+        dest.writeString(emoticonStatic);
+        dest.writeString(emoticonDynamic);
+        dest.writeString(packageId);
+        dest.writeByteArray(emoticonStaticByte);
+        dest.writeByteArray(emoticonDynamicByte);
+        dest.writeString(userPhone);
+        dest.writeBooleanArray(new boolean[] {
+            isOnlyBrowse
+        });
     }
 
     /**
      * Create the emoticon entity from parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         emoticonId = source.readString();
         emoticonName = source.readString();
         emoticonStatic = source.readString();
@@ -115,219 +121,198 @@
         emoticonStaticByte = source.createByteArray();
         emoticonDynamicByte = source.createByteArray();
         userPhone = source.readString();
-        boolean[] val = new boolean[ 1 ];
-        source.readBooleanArray( val );
-        isOnlyBrowse = val[ 0 ];
+        boolean[] val = new boolean[1];
+        source.readBooleanArray(val);
+        isOnlyBrowse = val[0];
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<EmoticonBO>    CREATOR    = new Parcelable.Creator<EmoticonBO>() {
+    public static final Parcelable.Creator<EmoticonBO> CREATOR = new Parcelable.Creator<EmoticonBO>() {
         @Override
-        public EmoticonBO createFromParcel( Parcel source )
-        {
-            return new EmoticonBO( source );
+        public EmoticonBO createFromParcel(Parcel source) {
+            return new EmoticonBO(source);
         }
 
         @Override
-        public EmoticonBO[] newArray( int size )
-        {
-            return new EmoticonBO[ size ];
+        public EmoticonBO[] newArray(int size) {
+            return new EmoticonBO[size];
         }
     };
 
     /**
      * Instantiates a new emoticon entity.
      */
-    public EmoticonBO()
-    {}
+    public EmoticonBO() {
+    }
 
     /**
      * Instantiates a new emoticon entity.
-     *
+     * 
      * @param source the source parcel
      */
-    public EmoticonBO( Parcel source )
-    {
-        readFromParcel( source );
+    public EmoticonBO(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * Gets the emoticon id.
-     *
+     * 
      * @return the emoticon id
      */
-    public String getEmoticonId()
-    {
+    public String getEmoticonId() {
         return emoticonId;
     }
 
     /**
      * Sets the emoticon id.
-     *
+     * 
      * @param emoticonId the new emoticon id
      */
-    public void setEmoticonId( String emoticonId )
-    {
+    public void setEmoticonId(String emoticonId) {
         this.emoticonId = emoticonId;
     }
 
     /**
      * Gets the emoticon name.
-     *
+     * 
      * @return the emoticon name
      */
-    public String getEmoticonName()
-    {
+    public String getEmoticonName() {
         return emoticonName;
     }
 
     /**
      * Sets the emoticon name.
-     *
+     * 
      * @param emoticonName the new emoticon name
      */
-    public void setEmoticonName( String emoticonName )
-    {
+    public void setEmoticonName(String emoticonName) {
         this.emoticonName = emoticonName;
     }
 
     /**
      * Gets the emoticon static url.
-     *
+     * 
      * @return the emoticon static url
      */
-    public String getEmoticonStatic()
-    {
+    public String getEmoticonStatic() {
         return emoticonStatic;
     }
 
     /**
      * Sets the emoticon static url.
-     *
+     * 
      * @param emoticonStatic the new emoticon static url
      */
-    public void setEmoticonStatic( String emoticonStatic )
-    {
+    public void setEmoticonStatic(String emoticonStatic) {
         this.emoticonStatic = emoticonStatic;
     }
 
     /**
      * Gets the emoticon dynamic url.
-     *
+     * 
      * @return the emoticon dynamic url
      */
-    public String getEmoticonDynamic()
-    {
+    public String getEmoticonDynamic() {
         return emoticonDynamic;
     }
 
     /**
      * Sets the emoticon dynamic url.
-     *
+     * 
      * @param emoticonDynamic the new emoticon dynamic url
      */
-    public void setEmoticonDynamic( String emoticonDynamic )
-    {
+    public void setEmoticonDynamic(String emoticonDynamic) {
         this.emoticonDynamic = emoticonDynamic;
     }
 
     /**
      * Gets the package id.
-     *
+     * 
      * @return the package id
      */
-    public String getPackageId()
-    {
+    public String getPackageId() {
         return packageId;
     }
 
     /**
      * Sets the package id.
-     *
+     * 
      * @param packageId the new package id
      */
-    public void setPackageId( String packageId )
-    {
+    public void setPackageId(String packageId) {
         this.packageId = packageId;
     }
 
     /**
      * Gets the static emoticon bytes.
-     *
+     * 
      * @return the static emoticon bytes
      */
-    public byte[] getEmoticonStaticByte()
-    {
+    public byte[] getEmoticonStaticByte() {
         return emoticonStaticByte;
     }
 
     /**
      * Sets the static emoticon bytes.
-     *
+     * 
      * @param emoticonStaticByte the new static emoticon bytes
      */
-    public void setEmoticonStaticByte( byte[] emoticonStaticByte )
-    {
+    public void setEmoticonStaticByte(byte[] emoticonStaticByte) {
         this.emoticonStaticByte = emoticonStaticByte;
     }
 
     /**
      * Gets the dynamic emoticon bytes.
-     *
+     * 
      * @return the dynamic emoticon bytes
      */
-    public byte[] getEmoticonDynamicByte()
-    {
+    public byte[] getEmoticonDynamicByte() {
         return emoticonDynamicByte;
     }
 
     /**
      * Sets the dynamic emoticon bytes.
-     *
+     * 
      * @param emoticonDynamicByte the new dynamic emoticon bytes
      */
-    public void setEmoticonDynamicByte( byte[] emoticonDynamicByte )
-    {
+    public void setEmoticonDynamicByte(byte[] emoticonDynamicByte) {
         this.emoticonDynamicByte = emoticonDynamicByte;
     }
 
     /**
      * Gets the user phone number.
-     *
+     * 
      * @return the user phone number
      */
-    public String getUserPhone()
-    {
+    public String getUserPhone() {
         return userPhone;
     }
 
     /**
      * Sets the user phone number.
-     *
+     * 
      * @param userPhone the new user phone number
      */
-    public void setUserPhone( String userPhone )
-    {
+    public void setUserPhone(String userPhone) {
         this.userPhone = userPhone;
     }
 
     /**
      * Checks if is only browse.
-     *
+     * 
      * @return true, if is only browse
      */
-    public boolean isOnlyBrowse()
-    {
+    public boolean isOnlyBrowse() {
         return isOnlyBrowse;
     }
 
     /**
      * Sets the only browse.
-     *
+     * 
      * @param isOnlyBrowse the new only browse
      */
-    public void setOnlyBrowse( boolean isOnlyBrowse )
-    {
+    public void setOnlyBrowse(boolean isOnlyBrowse) {
         this.isOnlyBrowse = isOnlyBrowse;
     }
 
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonConstant.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonConstant.java
index 982b9bd..46fc823 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonConstant.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/emoticon/EmoticonConstant.java
@@ -20,6 +20,7 @@
  * 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.emoticon;
 
 /**
@@ -35,14 +36,14 @@
 
     /** The Constant EMO_PACKAGE_FILE. */
     public static final int EMO_PACKAGE_FILE = 3;
-    
+
     /** The Constant EMO_DOWNLOAD_SUCCESS. */
     public static final int EMO_DOWNLOAD_SUCCESS = 1;
-    
+
     /** The Constant EMO_DOWNLOAD_FAILURE. */
     public static final int EMO_DOWNLOAD_FAILURE = 0;
-    
+
     /** The Constant EMO_DOWNLOAD_LOADING. */
     public static final int EMO_DOWNLOAD_LOADING = 2;
-    
+
 }
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 9d9e39e..38a9837 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
@@ -20,6 +20,7 @@
  * 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.emoticon;
 
 import android.os.Parcel;
@@ -39,161 +40,144 @@
  * <p>
  * Company: pci-suntek
  * </p>
- *
+ * 
  * @author zrq
  * @version 1.0
- *
  */
-public class ResultBO implements Parcelable
-{
+public class ResultBO implements Parcelable {
     /** The result succ flag, true is succ, otherwise it is fail. */
-    private boolean                                        resultFlag;
+    private boolean resultFlag;
 
     /** The result info. */
-    private String                                        resultMsg;
+    private String resultMsg;
+
     /**
      * The result additional object, different conditions have different result
      * object.
      */
-    private Object                                        resultObj;
+    private Object resultObj;
 
     /**
      * 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 );
+        public ResultBO createFromParcel(Parcel source) {
+            return new ResultBO(source);
         }
 
         @Override
-        public ResultBO[] newArray( int size )
-        {
-            return new ResultBO[ size ];
+        public ResultBO[] newArray(int size) {
+            return new ResultBO[size];
         }
     };
 
     /**
      * Instantiates a new result entity.
      */
-    public ResultBO()
-    {}
+    public ResultBO() {
+    }
 
     /**
      * Instantiates a new result entity from parcel.
-     *
+     * 
      * @param source the parcel source.
      */
-    public ResultBO( Parcel source )
-    {
-        readFromParcel( source );
+    public ResultBO(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The result entity write to parcel stream. Pay attention to write
      * variables and read the ordering of the variables should be consistent or
      * not the correct results.
-     *
-     * @param dest
-     *            The parcel stream
-     * @param flags
-     *            The write to parcel flag
+     * 
+     * @param dest The parcel stream
+     * @param flags The write to parcel flag
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeBooleanArray( new boolean[] { resultFlag } );
-        dest.writeString( resultMsg );
-        dest.writeValue( resultObj );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeBooleanArray(new boolean[] {
+            resultFlag
+        });
+        dest.writeString(resultMsg);
+        dest.writeValue(resultObj);
     }
 
     /**
      * Create the result entity from parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        boolean[] val = new boolean[ 1 ];
-        source.readBooleanArray( val );
-        resultFlag = val[ 0 ];
+    public void readFromParcel(Parcel source) {
+        boolean[] val = new boolean[1];
+        source.readBooleanArray(val);
+        resultFlag = val[0];
         resultMsg = source.readString();
-        resultObj = source.readValue( this.getClass().getClassLoader() );
+        resultObj = source.readValue(this.getClass().getClassLoader());
     }
 
     /**
      * The parcel describe contents, defaul is 0.
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
      * Checks if is result succ
-     *
+     * 
      * @return true, if is result succ
      */
-    public boolean isResultFlag()
-    {
+    public boolean isResultFlag() {
         return resultFlag;
     }
 
     /**
      * Sets the result flag.
-     *
-     * @param resultFlag
-     *            the new result flag
+     * 
+     * @param resultFlag the new result flag
      */
-    public void setResultFlag( boolean resultFlag )
-    {
+    public void setResultFlag(boolean resultFlag) {
         this.resultFlag = resultFlag;
     }
 
     /**
      * Gets the result info.
-     *
+     * 
      * @return the result info
      */
-    public String getResultMsg()
-    {
+    public String getResultMsg() {
         return resultMsg;
     }
 
     /**
      * Sets the result info.
-     *
-     * @param resultMsg
-     *            the new result info.
+     * 
+     * @param resultMsg the new result info.
      */
-    public void setResultMsg( String resultMsg )
-    {
+    public void setResultMsg(String resultMsg) {
         this.resultMsg = resultMsg;
     }
 
     /**
      * Gets the result object.
-     *
+     * 
      * @return the result object
      */
-    public Object getResultObj()
-    {
+    public Object getResultObj() {
         return resultObj;
     }
 
     /**
      * Sets the result object.
-     *
-     * @param resultObj
-     *            the new result object
+     * 
+     * @param resultObj the new result object
      */
-    public void setResultObj( Object resultObj )
-    {
+    public void setResultObj(Object resultObj) {
         this.resultObj = resultObj;
     }
 
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 c3155fa..a69dbab 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
@@ -20,70 +20,76 @@
  * 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.emoticon;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
 /**
- * <p>Title: The emotion user entity class</p>
- * <p>Description: The emotion user entity save some user info</p>
- * <p>Copyright: Copyright (c) 2014</p>
- * <p>Company: pci-suntek</p>
- *
+ * <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
-{
+public class UserBO implements Parcelable {
     /** The user's phone number. */
-    private String    userPhone;
+    private String userPhone;
+
     /** The user's nickname. */
-    private String    userNick;
+    private String userNick;
+
     /** The user login time. */
-    private String    userLoginTime;
+    private String userLoginTime;
+
     /** The user current state. */
-    private String    userState;
+    private String userState;
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the user entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
+     * Write the user entity to parcel stream. Pay attention to read and write
+     * variables variables sequence should be consistent or not the correct
+     * results
+     * 
      * @param dest the dest
      * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( userPhone );
-        dest.writeString( userNick );
-        dest.writeString( userLoginTime );
-        dest.writeString( userState );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(userPhone);
+        dest.writeString(userNick);
+        dest.writeString(userLoginTime);
+        dest.writeString(userState);
     }
 
     /**
      * Create the user entity from parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         userPhone = source.readString();
         userNick = source.readString();
         userLoginTime = source.readString();
@@ -91,113 +97,102 @@
     }
 
     /** 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 );
+        public UserBO createFromParcel(Parcel source) {
+            return new UserBO(source);
         }
 
         @Override
-        public UserBO[] newArray( int size )
-        {
-            return new UserBO[ size ];
+        public UserBO[] newArray(int size) {
+            return new UserBO[size];
         }
     };
 
     /**
      * Instantiates a new user entity.
      */
-    public UserBO()
-    {}
+    public UserBO() {
+    }
 
     /**
      * Instantiates a new user entity from parcel.
-     *
+     * 
      * @param source the parcel source
      */
-    public UserBO( Parcel source )
-    {
-        readFromParcel( source );
+    public UserBO(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * Gets the user phone number.
-     *
+     * 
      * @return the user phone number
      */
-    public String getUserPhone()
-    {
+    public String getUserPhone() {
         return userPhone;
     }
 
     /**
      * Sets the user phone number.
-     *
+     * 
      * @param userPhone the new user phone number
      */
-    public void setUserPhone( String userPhone )
-    {
+    public void setUserPhone(String userPhone) {
         this.userPhone = userPhone;
     }
 
     /**
      * Gets the user nickname.
-     *
+     * 
      * @return the user nickname
      */
-    public String getUserNick()
-    {
+    public String getUserNick() {
         return userNick;
     }
 
     /**
      * Sets the user nickname.
-     *
+     * 
      * @param userNick the new user nickname
      */
-    public void setUserNick( String userNick )
-    {
+    public void setUserNick(String userNick) {
         this.userNick = userNick;
     }
 
     /**
      * Gets the user login time.
-     *
+     * 
      * @return the user login time
      */
-    public String getUserLoginTime()
-    {
+    public String getUserLoginTime() {
         return userLoginTime;
     }
 
     /**
      * Sets the user login time.
-     *
+     * 
      * @param userLoginTime the new user login time
      */
-    public void setUserLoginTime( String userLoginTime )
-    {
+    public void setUserLoginTime(String userLoginTime) {
         this.userLoginTime = userLoginTime;
     }
 
     /**
      * Gets the user state.
-     *
+     * 
      * @return the user state
      */
-    public String getUserState()
-    {
+    public String getUserState() {
         return userState;
     }
 
     /**
      * Sets the user state.
-     *
+     * 
      * @param userState the new user state
      */
-    public void setUserState( String userState )
-    {
+    public void setUserState(String userState) {
         this.userState = userState;
     }
 
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/mcloudfile/AuthNode.java
index d887db9..66591b7 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/mcloudfile/AuthNode.java
@@ -20,6 +20,7 @@
  * 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;
 
 import java.util.Map;
@@ -27,187 +28,168 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class AuthNode implements Parcelable
-{
-    private byte[]                captcha;
-    private boolean                isOffline;
-    private AuthNodeUpdateInfo            updateInfo;
-    private int                    timeout;
-    private UserType                userType;
-    private PwdType                pwdType;
-    private RegType                regType;
-    private ResetType            resetType;
-    private Map<String, String>    fields;
+public class AuthNode implements Parcelable {
+    private byte[] captcha;
 
-    public AuthNode()
-    {}
+    private boolean isOffline;
 
-    public AuthNode( Parcel source )
-    {
-        readFromParcel( source );
+    private AuthNodeUpdateInfo updateInfo;
+
+    private int timeout;
+
+    private UserType userType;
+
+    private PwdType pwdType;
+
+    private RegType regType;
+
+    private ResetType resetType;
+
+    private Map<String, String> fields;
+
+    public AuthNode() {
+    }
+
+    public AuthNode(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the mcloud result entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeByteArray( captcha );
-        dest.writeBooleanArray( new boolean[]{ isOffline } );
-        dest.writeValue( updateInfo );
-        dest.writeInt( timeout );
-        dest.writeInt( userType.ordinal() );
-        dest.writeInt( pwdType.ordinal() );
-        dest.writeInt( regType.ordinal() );
-        dest.writeInt( resetType.ordinal() );
-        dest.writeMap( fields );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeByteArray(captcha);
+        dest.writeBooleanArray(new boolean[] {
+            isOffline
+        });
+        dest.writeValue(updateInfo);
+        dest.writeInt(timeout);
+        dest.writeInt(userType.ordinal());
+        dest.writeInt(pwdType.ordinal());
+        dest.writeInt(regType.ordinal());
+        dest.writeInt(resetType.ordinal());
+        dest.writeMap(fields);
     }
 
     /**
-     * Create the mcloud result entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param source The parcel stream
      */
-    @SuppressWarnings( "unchecked" )
-    public void readFromParcel( Parcel source )
-    {
+    @SuppressWarnings("unchecked")
+    public void readFromParcel(Parcel source) {
         captcha = source.createByteArray();
-        boolean[] val = new boolean[ 1 ];
-        source.readBooleanArray( val );
-        isOffline = val[ 0 ];
-        updateInfo = ( AuthNodeUpdateInfo )source.readValue( this.getClass().getClassLoader() );
-        userType = UserType.valueOf( source.readInt() );
-        pwdType = PwdType.valueOf( source.readInt() );
-        regType = RegType.valueOf( source.readInt() );
-        resetType = ResetType.valueOf( source.readInt() );
-        fields = source.readHashMap( this.getClass().getClassLoader() );
+        boolean[] val = new boolean[1];
+        source.readBooleanArray(val);
+        isOffline = val[0];
+        updateInfo = (AuthNodeUpdateInfo)source.readValue(this.getClass().getClassLoader());
+        userType = UserType.valueOf(source.readInt());
+        pwdType = PwdType.valueOf(source.readInt());
+        regType = RegType.valueOf(source.readInt());
+        resetType = ResetType.valueOf(source.readInt());
+        fields = source.readHashMap(this.getClass().getClassLoader());
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<AuthNode>    CREATOR    = new Parcelable.Creator<AuthNode>() {
+    public static final Parcelable.Creator<AuthNode> CREATOR = new Parcelable.Creator<AuthNode>() {
         @Override
-        public AuthNode createFromParcel( Parcel source )
-        {
-            return new AuthNode( source );
+        public AuthNode createFromParcel(Parcel source) {
+            return new AuthNode(source);
         }
 
         @Override
-        public AuthNode[] newArray( int size )
-        {
-            return new AuthNode[ size ];
+        public AuthNode[] newArray(int size) {
+            return new AuthNode[size];
         }
     };
 
-
-    public byte[] getCaptcha()
-    {
+    public byte[] getCaptcha() {
         return captcha;
     }
 
-    public void setCaptcha( byte[] captcha )
-    {
+    public void setCaptcha(byte[] captcha) {
         this.captcha = captcha;
     }
 
-    public boolean isOffline()
-    {
+    public boolean isOffline() {
         return isOffline;
     }
 
-    public void setOffline( boolean isOffline )
-    {
+    public void setOffline(boolean isOffline) {
         this.isOffline = isOffline;
     }
 
-    public AuthNodeUpdateInfo getUpdateInfo()
-    {
+    public AuthNodeUpdateInfo getUpdateInfo() {
         return updateInfo;
     }
 
-    public void setUpdateInfo( AuthNodeUpdateInfo updateInfo )
-    {
+    public void setUpdateInfo(AuthNodeUpdateInfo updateInfo) {
         this.updateInfo = updateInfo;
     }
 
-    public int getTimeout()
-    {
+    public int getTimeout() {
         return timeout;
     }
 
-    public void setTimeout( int timeout )
-    {
+    public void setTimeout(int timeout) {
         this.timeout = timeout;
     }
 
-    public UserType getUserType()
-    {
+    public UserType getUserType() {
         return userType;
     }
 
-    public void setUserType( UserType userType )
-    {
+    public void setUserType(UserType userType) {
         this.userType = userType;
     }
 
-    public PwdType getPwdType()
-    {
+    public PwdType getPwdType() {
         return pwdType;
     }
 
-    public void setPwdType( PwdType pwdType )
-    {
+    public void setPwdType(PwdType pwdType) {
         this.pwdType = pwdType;
     }
 
-    public RegType getRegType()
-    {
+    public RegType getRegType() {
         return regType;
     }
 
-    public void setRegType( RegType regType )
-    {
+    public void setRegType(RegType regType) {
         this.regType = regType;
     }
 
-    public ResetType getResetType()
-    {
+    public ResetType getResetType() {
         return resetType;
     }
 
-    public void setResetType( ResetType resetType )
-    {
+    public void setResetType(ResetType resetType) {
         this.resetType = resetType;
     }
 
-    public Map<String, String> getFields()
-    {
+    public Map<String, String> getFields() {
         return fields;
     }
 
-    public void setFields( Map<String, String> fields )
-    {
+    public void setFields(Map<String, String> fields) {
         this.fields = fields;
     }
 
@@ -220,28 +202,24 @@
 
         thirdParty;
 
-        public static PwdType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static PwdType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
     public static enum RegType {
         cellPhone;
 
-        public static RegType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static RegType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
@@ -250,14 +228,12 @@
 
         thirdParty;
 
-        public static ResetType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static ResetType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
@@ -270,14 +246,12 @@
 
         email;
 
-        public static UserType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static UserType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 }
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/mcloudfile/AuthNodeUpdateInfo.java
index c9a36ab..0171a35 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/mcloudfile/AuthNodeUpdateInfo.java
@@ -20,74 +20,74 @@
  * 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;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class AuthNodeUpdateInfo implements Parcelable
-{
-    private String    name;
-    private String    version;
-    private String    description;
-    private String    url;
-    private String    forceupdate;
-    private String    md5;
-    private String    size;
-    private String    updateMode;
+public class AuthNodeUpdateInfo implements Parcelable {
+    private String name;
 
-    public AuthNodeUpdateInfo()
-    {}
+    private String version;
 
-    public AuthNodeUpdateInfo( Parcel source )
-    {
-        readFromParcel( source );
+    private String description;
+
+    private String url;
+
+    private String forceupdate;
+
+    private String md5;
+
+    private String size;
+
+    private String updateMode;
+
+    public AuthNodeUpdateInfo() {
+    }
+
+    public AuthNodeUpdateInfo(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the auth node update info entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
-     * @param dest
-     *            the dest parcel stream
-     * @param flags
-     *            the flags
+     * Write the auth node update info entity to parcel stream. Pay attention to
+     * read and write variables variables sequence should be consistent or not
+     * the correct results
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( name );
-        dest.writeString( version );
-        dest.writeString( description );
-        dest.writeString( url );
-        dest.writeString( forceupdate );
-        dest.writeString( md5 );
-        dest.writeString( size );
-        dest.writeString( updateMode );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(name);
+        dest.writeString(version);
+        dest.writeString(description);
+        dest.writeString(url);
+        dest.writeString(forceupdate);
+        dest.writeString(md5);
+        dest.writeString(size);
+        dest.writeString(updateMode);
     }
 
     /**
-     * Create the auth node update info entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 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 )
-    {
+    public void readFromParcel(Parcel source) {
         name = source.readString();
         version = source.readString();
         description = source.readString();
@@ -99,97 +99,79 @@
     }
 
     /** 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 );
+        public AuthNodeUpdateInfo createFromParcel(Parcel source) {
+            return new AuthNodeUpdateInfo(source);
         }
 
         @Override
-        public AuthNodeUpdateInfo[] newArray( int size )
-        {
-            return new AuthNodeUpdateInfo[ size ];
+        public AuthNodeUpdateInfo[] newArray(int size) {
+            return new AuthNodeUpdateInfo[size];
         }
     };
 
-    public String getName()
-    {
+    public String getName() {
         return name;
     }
 
-    public void setName( String name )
-    {
+    public void setName(String name) {
         this.name = name;
     }
 
-    public String getVersion()
-    {
+    public String getVersion() {
         return version;
     }
 
-    public void setVersion( String version )
-    {
+    public void setVersion(String version) {
         this.version = version;
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return description;
     }
 
-    public void setDescription( String description )
-    {
+    public void setDescription(String description) {
         this.description = description;
     }
 
-    public String getUrl()
-    {
+    public String getUrl() {
         return url;
     }
 
-    public void setUrl( String url )
-    {
+    public void setUrl(String url) {
         this.url = url;
     }
 
-    public String getForceupdate()
-    {
+    public String getForceupdate() {
         return forceupdate;
     }
 
-    public void setForceupdate( String forceupdate )
-    {
+    public void setForceupdate(String forceupdate) {
         this.forceupdate = forceupdate;
     }
 
-    public String getMd5()
-    {
+    public String getMd5() {
         return md5;
     }
 
-    public void setMd5( String md5 )
-    {
+    public void setMd5(String md5) {
         this.md5 = md5;
     }
 
-    public String getSize()
-    {
+    public String getSize() {
         return size;
     }
 
-    public void setSize( String size )
-    {
+    public void setSize(String size) {
         this.size = size;
     }
 
-    public String getUpdateMode()
-    {
+    public String getUpdateMode() {
         return updateMode;
     }
 
-    public void setUpdateMode( String updateMode )
-    {
+    public void setUpdateMode(String updateMode) {
         this.updateMode = updateMode;
     }
 }
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/mcloudfile/ConfNode.java
index fa6b7b3..b5afe67 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/mcloudfile/ConfNode.java
@@ -20,6 +20,7 @@
  * 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;
 
 import java.util.Map;
@@ -27,94 +28,81 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class ConfNode implements Parcelable
-{
+public class ConfNode implements Parcelable {
     private String version;
+
     private Map<String, String> fields;
 
-    public ConfNode()
-    {}
+    public ConfNode() {
+    }
 
-    public ConfNode( Parcel source )
-    {
-        readFromParcel( source );
+    public ConfNode(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the configure node entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( version );
-        dest.writeMap( fields );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(version);
+        dest.writeMap(fields);
     }
 
     /**
-     * Create the configure node entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * Create the configure node entity from parcel stream. Pay attention to
+     * read and write variables variables sequence should be consistent or not
+     * the correct results
+     * 
+     * @param source The parcel stream
      */
-    @SuppressWarnings( "unchecked" )
-    public void readFromParcel( Parcel source )
-    {
+    @SuppressWarnings("unchecked")
+    public void readFromParcel(Parcel source) {
         version = source.readString();
-        fields = source.readHashMap( this.getClass().getClassLoader() );
+        fields = source.readHashMap(this.getClass().getClassLoader());
     }
 
     /** 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 );
+        public ConfNode createFromParcel(Parcel source) {
+            return new ConfNode(source);
         }
 
         @Override
-        public ConfNode[] newArray( int size )
-        {
-            return new ConfNode[ size ];
+        public ConfNode[] newArray(int size) {
+            return new ConfNode[size];
         }
     };
 
-    public String getVersion()
-    {
+    public String getVersion() {
         return version;
     }
 
-    public void setVersion( String version )
-    {
+    public void setVersion(String version) {
         this.version = version;
     }
 
-    public Map<String, String> getFields()
-    {
+    public Map<String, String> getFields() {
         return fields;
     }
 
-    public void setFields( Map<String, String> fields )
-    {
+    public void setFields(Map<String, String> fields) {
         this.fields = fields;
     }
 }
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/mcloudfile/Config.java
index 1a384ba..cf3e18a 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/mcloudfile/Config.java
@@ -20,6 +20,7 @@
  * 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;
 
 /**
@@ -30,438 +31,438 @@
     /** The Constant USER_ACCOUNT. */
     public static final String USER_ACCOUNT = "user_account";
 
-      /** The Constant USER_PASS_SHA. */
-      public static final String USER_PASS_SHA = "user_pass_sha";
+    /** The Constant USER_PASS_SHA. */
+    public static final String USER_PASS_SHA = "user_pass_sha";
 
-      /** The Constant USER_TOKEN. */
-      public static final String USER_TOKEN = "user_token";
+    /** The Constant USER_TOKEN. */
+    public static final String USER_TOKEN = "user_token";
 
-      /** The Constant USER_TOKEN_EXPIRE. */
-      public static final String USER_TOKEN_EXPIRE = "user_token_expire";
+    /** The Constant USER_TOKEN_EXPIRE. */
+    public static final String USER_TOKEN_EXPIRE = "user_token_expire";
 
-      /** The Constant USER_ACCESS_TOKEN. */
-      public static final String USER_ACCESS_TOKEN = "userext_accessToken";
+    /** The Constant USER_ACCESS_TOKEN. */
+    public static final String USER_ACCESS_TOKEN = "userext_accessToken";
 
-      /** The Constant USER_AUTHOR_KEY. */
-      public static final String USER_AUTHOR_KEY = "user_author_key";
+    /** The Constant USER_AUTHOR_KEY. */
+    public static final String USER_AUTHOR_KEY = "user_author_key";
 
-      /** The Constant USER_SYSID. */
-      public static final String USER_SYSID = "user_sysid";
+    /** The Constant USER_SYSID. */
+    public static final String USER_SYSID = "user_sysid";
 
-      /** The Constant USER_LOGIN_ID. */
-      public static final String USER_LOGIN_ID = "user_loginid";
+    /** The Constant USER_LOGIN_ID. */
+    public static final String USER_LOGIN_ID = "user_loginid";
 
-      /** The Constant USER_PINTYPE. */
-      public static final String USER_PINTYPE = "user_pintype";
+    /** The Constant USER_PINTYPE. */
+    public static final String USER_PINTYPE = "user_pintype";
 
-      /** The Constant USER_SECURE1. */
-      public static final String USER_SECURE1 = "user_secure1";
+    /** The Constant USER_SECURE1. */
+    public static final String USER_SECURE1 = "user_secure1";
 
-      /** The Constant USER_SECURE2. */
-      public static final String USER_SECURE2 = "user_secure2";
+    /** The Constant USER_SECURE2. */
+    public static final String USER_SECURE2 = "user_secure2";
 
-      /** The Constant ADDR_AAS. */
-      public static final String ADDR_AAS = "addr_aas";
+    /** The Constant ADDR_AAS. */
+    public static final String ADDR_AAS = "addr_aas";
 
-      /** The Constant ADDR_AAS_HTTPS. */
-      public static final String ADDR_AAS_HTTPS = "addr_aas_https";
+    /** The Constant ADDR_AAS_HTTPS. */
+    public static final String ADDR_AAS_HTTPS = "addr_aas_https";
 
-      /** The Constant ADDR_RIF. */
-      public static final String ADDR_RIF = "addr_rif";
+    /** The Constant ADDR_RIF. */
+    public static final String ADDR_RIF = "addr_rif";
 
-      /** The Constant ADDR_RIF_HTTPS. */
-      public static final String ADDR_RIF_HTTPS = "addr_rif_https";
+    /** The Constant ADDR_RIF_HTTPS. */
+    public static final String ADDR_RIF_HTTPS = "addr_rif_https";
 
-      /** The Constant INFO_MARKET_URL. */
-      public static final String INFO_MARKET_URL = "Info_marketurl";
+    /** The Constant INFO_MARKET_URL. */
+    public static final String INFO_MARKET_URL = "Info_marketurl";
 
-      /** The Constant INFO_FEEDBACK_URL. */
-      public static final String INFO_FEEDBACK_URL = "Info_fburl";
+    /** The Constant INFO_FEEDBACK_URL. */
+    public static final String INFO_FEEDBACK_URL = "Info_fburl";
 
-      /** The Constant INFO_CYTXL_URL. */
-      public static final String INFO_CYTXL_URL = "Info_cytxlurl";
+    /** The Constant INFO_CYTXL_URL. */
+    public static final String INFO_CYTXL_URL = "Info_cytxlurl";
 
-      /** The Constant ADDR_IMS. */
-      public static final String ADDR_IMS = "addr_ims";
+    /** The Constant ADDR_IMS. */
+    public static final String ADDR_IMS = "addr_ims";
 
-      /** The Constant ADDR_INNERIMS. */
-      public static final String ADDR_INNERIMS = "addr_innerims";
+    /** The Constant ADDR_INNERIMS. */
+    public static final String ADDR_INNERIMS = "addr_innerims";
 
-      /** The Constant ADDR_XMPP. */
-      public static final String ADDR_XMPP = "addr_xmpp";
+    /** The Constant ADDR_XMPP. */
+    public static final String ADDR_XMPP = "addr_xmpp";
 
-      /** The Constant ADDR_XMPPADAPTOR. */
-      public static final String ADDR_XMPPADAPTOR = "addr_xmppadaptor";
+    /** The Constant ADDR_XMPPADAPTOR. */
+    public static final String ADDR_XMPPADAPTOR = "addr_xmppadaptor";
 
-      /** The Constant ADDR_AP. */
-      public static final String ADDR_AP = "addr_ap";
+    /** The Constant ADDR_AP. */
+    public static final String ADDR_AP = "addr_ap";
 
-      /** The Constant ADDR_CABSYNCML. */
-      public static final String ADDR_CABSYNCML = "addr_cabsyncml";
+    /** The Constant ADDR_CABSYNCML. */
+    public static final String ADDR_CABSYNCML = "addr_cabsyncml";
 
-      /** The Constant ADDR_CABGROUP. */
-      public static final String ADDR_CABGROUP = "addr_cabgroup";
+    /** The Constant ADDR_CABGROUP. */
+    public static final String ADDR_CABGROUP = "addr_cabgroup";
 
-      /** The Constant ADDR_CAB_HTTP. */
-      public static final String ADDR_CAB_HTTP = "addr_cab_http";
+    /** The Constant ADDR_CAB_HTTP. */
+    public static final String ADDR_CAB_HTTP = "addr_cab_http";
 
-      /** The Constant ADDR_CAB_HTTPS. */
-      public static final String ADDR_CAB_HTTPS = "addr_cab_https";
+    /** The Constant ADDR_CAB_HTTPS. */
+    public static final String ADDR_CAB_HTTPS = "addr_cab_https";
 
-      /** The Constant ADDR_TEP. */
-      public static final String ADDR_TEP = "addr_tep";
+    /** The Constant ADDR_TEP. */
+    public static final String ADDR_TEP = "addr_tep";
 
-      /** The Constant ADDR_VOIPSTUN. */
-      public static final String ADDR_VOIPSTUN = "addr_voipstun";
+    /** The Constant ADDR_VOIPSTUN. */
+    public static final String ADDR_VOIPSTUN = "addr_voipstun";
 
-      /** The Constant ADDR_PORTAL. */
-      public static final String ADDR_PORTAL = "addr_portal";
+    /** The Constant ADDR_PORTAL. */
+    public static final String ADDR_PORTAL = "addr_portal";
 
-      /** The Constant ADDR_LIVEUPDATE. */
-      public static final String ADDR_LIVEUPDATE = "addr_liveupdate";
+    /** The Constant ADDR_LIVEUPDATE. */
+    public static final String ADDR_LIVEUPDATE = "addr_liveupdate";
 
-      /** The Constant ADDR_SNSCONNECTOR. */
-      public static final String ADDR_SNSCONNECTOR = "addr_snsconnector";
+    /** The Constant ADDR_SNSCONNECTOR. */
+    public static final String ADDR_SNSCONNECTOR = "addr_snsconnector";
 
-      /** The Constant ADDR_BOSH. */
-      public static final String ADDR_BOSH = "addr_bosh";
+    /** The Constant ADDR_BOSH. */
+    public static final String ADDR_BOSH = "addr_bosh";
 
-      /** The Constant ADDR_CHATSIPURI. */
-      public static final String ADDR_CHATSIPURI = "addr_chatsipuri";
+    /** The Constant ADDR_CHATSIPURI. */
+    public static final String ADDR_CHATSIPURI = "addr_chatsipuri";
 
-      /** The Constant ADDR_SVNLIST. */
-      public static final String ADDR_SVNLIST = "addr_svnlist";
+    /** The Constant ADDR_SVNLIST. */
+    public static final String ADDR_SVNLIST = "addr_svnlist";
 
-      /** The Constant CONF_IMSDOMAIN. */
-      public static final String CONF_IMSDOMAIN = "conf_imsdomain";
+    /** The Constant CONF_IMSDOMAIN. */
+    public static final String CONF_IMSDOMAIN = "conf_imsdomain";
 
-      /** The Constant CONF_IMSUSER. */
-      public static final String CONF_IMSUSER = "conf_imsuser";
+    /** The Constant CONF_IMSUSER. */
+    public static final String CONF_IMSUSER = "conf_imsuser";
 
-      /** The Constant CONF_IMSPWD. */
-      public static final String CONF_IMSPWD = "conf_imspwd";
+    /** The Constant CONF_IMSPWD. */
+    public static final String CONF_IMSPWD = "conf_imspwd";
 
-      /** The Constant CONF_SVNUSER. */
-      public static final String CONF_SVNUSER = "conf_svnuser";
+    /** The Constant CONF_SVNUSER. */
+    public static final String CONF_SVNUSER = "conf_svnuser";
 
-      /** The Constant CONF_SVNPWD. */
-      public static final String CONF_SVNPWD = "conf_svnpwd";
+    /** The Constant CONF_SVNPWD. */
+    public static final String CONF_SVNPWD = "conf_svnpwd";
 
-      /** The Constant CONF_POPUP. */
-      public static final String CONF_POPUP = "conf_popup";
+    /** The Constant CONF_POPUP. */
+    public static final String CONF_POPUP = "conf_popup";
 
-      /** The Constant CONF_SMS_SCHEDULE. */
-      public static final String CONF_SMS_SCHEDULE = "conf_sms_schedule";
+    /** The Constant CONF_SMS_SCHEDULE. */
+    public static final String CONF_SMS_SCHEDULE = "conf_sms_schedule";
 
-      /** The Constant CONF_SMS_MAXSIZE. */
-      public static final String CONF_SMS_MAXSIZE = "conf_sms_maxsize";
+    /** The Constant CONF_SMS_MAXSIZE. */
+    public static final String CONF_SMS_MAXSIZE = "conf_sms_maxsize";
 
-      /** The Constant CONF_MMS_MAXSIZE. */
-      public static final String CONF_MMS_MAXSIZE = "conf_mms_maxsize";
+    /** The Constant CONF_MMS_MAXSIZE. */
+    public static final String CONF_MMS_MAXSIZE = "conf_mms_maxsize";
 
-      /** The Constant CONF_EMAIL_MAXSIZE. */
-      public static final String CONF_EMAIL_MAXSIZE = "conf_email_maxsize";
+    /** The Constant CONF_EMAIL_MAXSIZE. */
+    public static final String CONF_EMAIL_MAXSIZE = "conf_email_maxsize";
 
-      /** The Constant CONF_RVCENABLED. */
-      public static final String CONF_RVCENABLED = "conf_rvcenabled";
+    /** The Constant CONF_RVCENABLED. */
+    public static final String CONF_RVCENABLED = "conf_rvcenabled";
 
-      /** The Constant CONF_HBTIME. */
-      public static final String CONF_HBTIME = "conf_hbtime";
+    /** The Constant CONF_HBTIME. */
+    public static final String CONF_HBTIME = "conf_hbtime";
 
-      /** The Constant CONF_ORDERSTAT. */
-      public static final String CONF_ORDERSTAT = "conf_orderstat";
+    /** The Constant CONF_ORDERSTAT. */
+    public static final String CONF_ORDERSTAT = "conf_orderstat";
 
-      /** The Constant CONF_ENDDATE. */
-      public static final String CONF_ENDDATE = "conf_enddate";
+    /** The Constant CONF_ENDDATE. */
+    public static final String CONF_ENDDATE = "conf_enddate";
 
-      /** The Constant CONF_PUBKEY. */
-      public static final String CONF_PUBKEY = "conf_pubkey";
+    /** The Constant CONF_PUBKEY. */
+    public static final String CONF_PUBKEY = "conf_pubkey";
 
-      /** The Constant CONF_CTDACCESSCODE. */
-      public static final String CONF_CTDACCESSCODE = "conf_ctdaccesscode";
+    /** The Constant CONF_CTDACCESSCODE. */
+    public static final String CONF_CTDACCESSCODE = "conf_ctdaccesscode";
 
-      /** The Constant CONF_SERVER_VER. */
-      public static final String CONF_SERVER_VER = "conf_server_ver";
+    /** The Constant CONF_SERVER_VER. */
+    public static final String CONF_SERVER_VER = "conf_server_ver";
 
-      /** The Constant INFO. */
-      public static final String INFO = "Info_";
+    /** The Constant INFO. */
+    public static final String INFO = "Info_";
 
-      /** The Constant USER_NDUID. */
-      public static final String USER_NDUID = "user_nduid";
+    /** The Constant USER_NDUID. */
+    public static final String USER_NDUID = "user_nduid";
 
-      /** The Constant USER_EXT_PASSID. */
-      public static final String USER_EXT_PASSID = "Userext_passID";
+    /** The Constant USER_EXT_PASSID. */
+    public static final String USER_EXT_PASSID = "Userext_passID";
 
-      /** The Constant USER_EXT. */
-      public static final String USER_EXT = "Userext_";
+    /** The Constant USER_EXT. */
+    public static final String USER_EXT = "Userext_";
 
-      /** The Constant USER_HTTPS_AUTH. */
-      public static final String USER_HTTPS_AUTH = "use_https_auth";
+    /** The Constant USER_HTTPS_AUTH. */
+    public static final String USER_HTTPS_AUTH = "use_https_auth";
 
-      /** The Constant USER_HTTPS_HICLOUD_FILE. */
-      public static final String USER_HTTPS_HICLOUD_FILE = "use_https_hicloud_file";
+    /** The Constant USER_HTTPS_HICLOUD_FILE. */
+    public static final String USER_HTTPS_HICLOUD_FILE = "use_https_hicloud_file";
 
-      /** The Constant USER_HTTPS_HICLOUD_MSG. */
-      public static final String USER_HTTPS_HICLOUD_MSG = "use_https_hicloud_msg";
+    /** The Constant USER_HTTPS_HICLOUD_MSG. */
+    public static final String USER_HTTPS_HICLOUD_MSG = "use_https_hicloud_msg";
 
-      /** The Constant USER_HTTPS_HICLOUD_SHARE. */
-      public static final String USER_HTTPS_HICLOUD_SHARE = "use_https_hicloud_share";
+    /** The Constant USER_HTTPS_HICLOUD_SHARE. */
+    public static final String USER_HTTPS_HICLOUD_SHARE = "use_https_hicloud_share";
 
-      /** The Constant USER_HTTPS_HICLOUD_TRANS. */
-      public static final String USER_HTTPS_HICLOUD_TRANS = "use_https_hicloud_trans";
+    /** The Constant USER_HTTPS_HICLOUD_TRANS. */
+    public static final String USER_HTTPS_HICLOUD_TRANS = "use_https_hicloud_trans";
 
-      /** The Constant USER_HTTPS_HICLOUD_CONF. */
-      public static final String USER_HTTPS_HICLOUD_CONF = "use_https_hicloud_conf";
+    /** The Constant USER_HTTPS_HICLOUD_CONF. */
+    public static final String USER_HTTPS_HICLOUD_CONF = "use_https_hicloud_conf";
 
-      /** The Constant USER_HTTPS_HICLOUD_CONTACT. */
-      public static final String USER_HTTPS_HICLOUD_CONTACT = "use_https_hicloud_contact";
+    /** The Constant USER_HTTPS_HICLOUD_CONTACT. */
+    public static final String USER_HTTPS_HICLOUD_CONTACT = "use_https_hicloud_contact";
 
-      /** The Constant USER_HTTPS_ALL. */
-      public static final String USER_HTTPS_ALL = "use_https_all";
+    /** The Constant USER_HTTPS_ALL. */
+    public static final String USER_HTTPS_ALL = "use_https_all";
 
-      /** The Constant OSE_TATA_HTTPS_NEED. */
-      public static final String OSE_TATA_HTTPS_NEED = "ose_tata_https_need";
+    /** The Constant OSE_TATA_HTTPS_NEED. */
+    public static final String OSE_TATA_HTTPS_NEED = "ose_tata_https_need";
 
-      /** The Constant HICLOUD_USERROOT_ID. */
-      public static final String HICLOUD_USERROOT_ID = "hiCloud_userroot_id";
+    /** The Constant HICLOUD_USERROOT_ID. */
+    public static final String HICLOUD_USERROOT_ID = "hiCloud_userroot_id";
 
-      /** The Constant HICLOUD_FOLDER_PRESET_ID. */
-      public static final String HICLOUD_FOLDER_PRESET_ID = "hiCloud_Folder_Preset_ID";
+    /** The Constant HICLOUD_FOLDER_PRESET_ID. */
+    public static final String HICLOUD_FOLDER_PRESET_ID = "hiCloud_Folder_Preset_ID";
 
-      /** The Constant HICLOUD_FLASHUPLOAD. */
-      public static final String HICLOUD_FLASHUPLOAD = "hiCloud_flashupload";
+    /** The Constant HICLOUD_FLASHUPLOAD. */
+    public static final String HICLOUD_FLASHUPLOAD = "hiCloud_flashupload";
 
-      /** The Constant HICLOUD_FILE_EXTINFO. */
-      public static final String HICLOUD_FILE_EXTINFO = "hiCloud_File_ExtInfo";
+    /** The Constant HICLOUD_FILE_EXTINFO. */
+    public static final String HICLOUD_FILE_EXTINFO = "hiCloud_File_ExtInfo";
 
-      /** The Constant MCS_PROGRESSINTERVAL. */
-      public static final String MCS_PROGRESSINTERVAL = "Mcs_ProgressInterval";
+    /** The Constant MCS_PROGRESSINTERVAL. */
+    public static final String MCS_PROGRESSINTERVAL = "Mcs_ProgressInterval";
 
-      /** The Constant HICLOUD_GZIP_DOWNLOAD. */
-      public static final String HICLOUD_GZIP_DOWNLOAD = "hiCloud_GZip_Download";
+    /** The Constant HICLOUD_GZIP_DOWNLOAD. */
+    public static final String HICLOUD_GZIP_DOWNLOAD = "hiCloud_GZip_Download";
 
-      /** The Constant HICLOUD_GZIP_UPLOAD. */
-      public static final String HICLOUD_GZIP_UPLOAD = "hiCloud_GZip_Upload";
+    /** The Constant HICLOUD_GZIP_UPLOAD. */
+    public static final String HICLOUD_GZIP_UPLOAD = "hiCloud_GZip_Upload";
 
-      /** The Constant MCS_GZIP_REQUEST. */
-      public static final String MCS_GZIP_REQUEST = "Mcs_GZip_Request";
+    /** The Constant MCS_GZIP_REQUEST. */
+    public static final String MCS_GZIP_REQUEST = "Mcs_GZip_Request";
 
-      /** The Constant MCS_GZIP_RESPONSE. */
-      public static final String MCS_GZIP_RESPONSE = "Mcs_GZip_Response";
+    /** The Constant MCS_GZIP_RESPONSE. */
+    public static final String MCS_GZIP_RESPONSE = "Mcs_GZip_Response";
 
-      /** The Constant HICLOUD_FILEOPRLISTDIRSYNCTYPE. */
-      public static final String HICLOUD_FILEOPRLISTDIRSYNCTYPE = "hiCloud_FileOprListDirSyncType";
+    /** The Constant HICLOUD_FILEOPRLISTDIRSYNCTYPE. */
+    public static final String HICLOUD_FILEOPRLISTDIRSYNCTYPE = "hiCloud_FileOprListDirSyncType";
 
-      /** The Constant HICLOUD_FILEOPRLISTDIRRATE. */
-      public static final String HICLOUD_FILEOPRLISTDIRRATE = "hiCloud_FileOprListDirRate";
+    /** The Constant HICLOUD_FILEOPRLISTDIRRATE. */
+    public static final String HICLOUD_FILEOPRLISTDIRRATE = "hiCloud_FileOprListDirRate";
 
-      /** The Constant HICLOUD_UPLOAD_EXPIRETIME. */
-      public static final String HICLOUD_UPLOAD_EXPIRETIME = "hiCloud_Upload_ExpireTime";
+    /** The Constant HICLOUD_UPLOAD_EXPIRETIME. */
+    public static final String HICLOUD_UPLOAD_EXPIRETIME = "hiCloud_Upload_ExpireTime";
 
-      /** The Constant HICLOUD_SYNCACHEOPRETION. */
-      public static final String HICLOUD_SYNCACHEOPRETION = "hiCloud_SyncCacheOperation";
+    /** The Constant HICLOUD_SYNCACHEOPRETION. */
+    public static final String HICLOUD_SYNCACHEOPRETION = "hiCloud_SyncCacheOperation";
 
-      /** The Constant HICLOUD_SYNCCACHETIMEOUT. */
-      public static final String HICLOUD_SYNCCACHETIMEOUT = "hiCloud_SyncCacheTimeout";
+    /** The Constant HICLOUD_SYNCCACHETIMEOUT. */
+    public static final String HICLOUD_SYNCCACHETIMEOUT = "hiCloud_SyncCacheTimeout";
 
-      /** The Constant AUTH_TOKEN_TIMEOUT. */
-      public static final String AUTH_TOKEN_TIMEOUT = "Auth_Token_Timeout";
+    /** The Constant AUTH_TOKEN_TIMEOUT. */
+    public static final String AUTH_TOKEN_TIMEOUT = "Auth_Token_Timeout";
 
-      /** The Constant MCS_CONFLICTSTATUS_REPORT. */
-      public static final String MCS_CONFLICTSTATUS_REPORT = "Mcs_ConflictStatus_Report";
+    /** The Constant MCS_CONFLICTSTATUS_REPORT. */
+    public static final String MCS_CONFLICTSTATUS_REPORT = "Mcs_ConflictStatus_Report";
 
-      /** The Constant HICLOUD_MSG_BACKUP_THREADS. */
-      public static final String HICLOUD_MSG_BACKUP_THREADS = "HiCloudMsgBackupThreads";
+    /** The Constant HICLOUD_MSG_BACKUP_THREADS. */
+    public static final String HICLOUD_MSG_BACKUP_THREADS = "HiCloudMsgBackupThreads";
 
-      /** The Constant HICLOUD_MSG_IGNOREMMS. */
-      public static final String HICLOUD_MSG_IGNOREMMS = "HiCloud_Msg_IgnorMMS";
+    /** The Constant HICLOUD_MSG_IGNOREMMS. */
+    public static final String HICLOUD_MSG_IGNOREMMS = "HiCloud_Msg_IgnorMMS";
 
-      /** The Constant HICLOUD_MSG_IGNORDRAF. */
-      public static final String HICLOUD_MSG_IGNORDRAF = "HiCloud_Msg_IgnorDraft";
+    /** The Constant HICLOUD_MSG_IGNORDRAF. */
+    public static final String HICLOUD_MSG_IGNORDRAF = "HiCloud_Msg_IgnorDraft";
 
-      /** The Constant SMS_BACKUP_BATCH_COUNT. */
-      public static final String SMS_BACKUP_BATCH_COUNT = "SmsBackupBatchCount";
+    /** The Constant SMS_BACKUP_BATCH_COUNT. */
+    public static final String SMS_BACKUP_BATCH_COUNT = "SmsBackupBatchCount";
 
-      /** The Constant HICLOUD_MSG_DELSESSIONMSGS. */
-      public static final String HICLOUD_MSG_DELSESSIONMSGS = "HiCloud_Msg_DelSessionMsgs";
+    /** The Constant HICLOUD_MSG_DELSESSIONMSGS. */
+    public static final String HICLOUD_MSG_DELSESSIONMSGS = "HiCloud_Msg_DelSessionMsgs";
 
-      /** The Constant HICLOUD_MSG_DELSESSIONMAX. */
-      public static final String HICLOUD_MSG_DELSESSIONMAX = "HiCloud_Msg_DelSessionMax";
+    /** The Constant HICLOUD_MSG_DELSESSIONMAX. */
+    public static final String HICLOUD_MSG_DELSESSIONMAX = "HiCloud_Msg_DelSessionMax";
 
-      /** The Constant STATUS_NETWORK_ID. */
-      public static final String STATUS_NETWORK_ID = "Status_Network_ID";
+    /** The Constant STATUS_NETWORK_ID. */
+    public static final String STATUS_NETWORK_ID = "Status_Network_ID";
 
-      /** The Constant STATUS_NETWORK_TYPE. */
-      public static final String STATUS_NETWORK_TYPE = "Status_Network_Type";
+    /** The Constant STATUS_NETWORK_TYPE. */
+    public static final String STATUS_NETWORK_TYPE = "Status_Network_Type";
 
-      /** The Constant STATUS_NETWORK_STATE. */
-      public static final String STATUS_NETWORK_STATE = "Status_Network_State";
+    /** The Constant STATUS_NETWORK_STATE. */
+    public static final String STATUS_NETWORK_STATE = "Status_Network_State";
 
-      /** The Constant NETMONITOR_STABLEDELAY_WIFI. */
-      public static final String NETMONITOR_STABLEDELAY_WIFI = "NetMonitor_StableDelay_WIFI";
+    /** The Constant NETMONITOR_STABLEDELAY_WIFI. */
+    public static final String NETMONITOR_STABLEDELAY_WIFI = "NetMonitor_StableDelay_WIFI";
 
-      /** The Constant NETMONITOR_STABLESIGNAL_WIFI. */
-      public static final String NETMONITOR_STABLESIGNAL_WIFI = "NetMonitor_StableSignal_WIFI";
+    /** The Constant NETMONITOR_STABLESIGNAL_WIFI. */
+    public static final String NETMONITOR_STABLESIGNAL_WIFI = "NetMonitor_StableSignal_WIFI";
 
-      /** The Constant NETMONITOR_STABLEDELAY_MOBILE. */
-      public static final String NETMONITOR_STABLEDELAY_MOBILE = "NetMonitor_StableDelay_Mobile";
+    /** The Constant NETMONITOR_STABLEDELAY_MOBILE. */
+    public static final String NETMONITOR_STABLEDELAY_MOBILE = "NetMonitor_StableDelay_Mobile";
 
-      /** The Constant NETMONITOR_STABLESIGNAL_MOBILE. */
-      public static final String NETMONITOR_STABLESIGNAL_MOBILE = "NetMonitor_StableSignal_Mobile";
+    /** The Constant NETMONITOR_STABLESIGNAL_MOBILE. */
+    public static final String NETMONITOR_STABLESIGNAL_MOBILE = "NetMonitor_StableSignal_Mobile";
 
-      /** The Constant HICLOUD_TRANSTASK_MAXTOTAL. */
-      public static final String HICLOUD_TRANSTASK_MAXTOTAL = "HiCloud_TransTask_MaxTotal";
+    /** The Constant HICLOUD_TRANSTASK_MAXTOTAL. */
+    public static final String HICLOUD_TRANSTASK_MAXTOTAL = "HiCloud_TransTask_MaxTotal";
 
-      /** The Constant HICLOUD_FILETASK_THREADS. */
-      public static final String HICLOUD_FILETASK_THREADS = "HiCloud_FileTask_Threads";
+    /** The Constant HICLOUD_FILETASK_THREADS. */
+    public static final String HICLOUD_FILETASK_THREADS = "HiCloud_FileTask_Threads";
 
-      /** The Constant HICLOUD_FILETASK_OVERWRITE. */
-      public static final String HICLOUD_FILETASK_OVERWRITE = "HiCloud_FileTask_Overwrite";
+    /** The Constant HICLOUD_FILETASK_OVERWRITE. */
+    public static final String HICLOUD_FILETASK_OVERWRITE = "HiCloud_FileTask_Overwrite";
 
-      /** The Constant HICLOUD_BAKTASK_OVERWRITE. */
-      public static final String HICLOUD_BAKTASK_OVERWRITE = "HiCloud_BakTask_Overwrite";
+    /** The Constant HICLOUD_BAKTASK_OVERWRITE. */
+    public static final String HICLOUD_BAKTASK_OVERWRITE = "HiCloud_BakTask_Overwrite";
 
-      /** The Constant HICLOUD_TRANSTASK_PHOTOQUALITY. */
-      public static final String HICLOUD_TRANSTASK_PHOTOQUALITY = "HiCloud_TransTask_PhotoQuality";
+    /** The Constant HICLOUD_TRANSTASK_PHOTOQUALITY. */
+    public static final String HICLOUD_TRANSTASK_PHOTOQUALITY = "HiCloud_TransTask_PhotoQuality";
 
-      /** The Constant HICLOUD_TRANSTASK_ORDER_START. */
-      public static final String HICLOUD_TRANSTASK_ORDER_START = "HiCloud_TransTask_Order_Start";
+    /** The Constant HICLOUD_TRANSTASK_ORDER_START. */
+    public static final String HICLOUD_TRANSTASK_ORDER_START = "HiCloud_TransTask_Order_Start";
 
-      /** The Constant HICLOUD_TRANSTASK_ORDER_PAUSE. */
-      public static final String HICLOUD_TRANSTASK_ORDER_PAUSE = "HiCloud_TransTask_Order_Pause";
+    /** The Constant HICLOUD_TRANSTASK_ORDER_PAUSE. */
+    public static final String HICLOUD_TRANSTASK_ORDER_PAUSE = "HiCloud_TransTask_Order_Pause";
 
-      /** The Constant HICLOUD_TRANSTASK_ORDER_FAIL. */
-      public static final String HICLOUD_TRANSTASK_ORDER_FAIL = "HiCloud_TransTask_Order_Fail";
+    /** The Constant HICLOUD_TRANSTASK_ORDER_FAIL. */
+    public static final String HICLOUD_TRANSTASK_ORDER_FAIL = "HiCloud_TransTask_Order_Fail";
 
-      /** The Constant HICLOUD_TRANSTASK_DELTMPFILE. */
-      public static final String HICLOUD_TRANSTASK_DELTMPFILE = "HiCloud_TransTask_DelTmpFile";
+    /** The Constant HICLOUD_TRANSTASK_DELTMPFILE. */
+    public static final String HICLOUD_TRANSTASK_DELTMPFILE = "HiCloud_TransTask_DelTmpFile";
 
-      /** The Constant MCS_NETWORK_RETRYCOUNT. */
-      public static final String MCS_NETWORK_RETRYCOUNT = "Mcs_Network_RetryCount";
+    /** The Constant MCS_NETWORK_RETRYCOUNT. */
+    public static final String MCS_NETWORK_RETRYCOUNT = "Mcs_Network_RetryCount";
 
-      /** The Constant HICLOUD_X_USERAGENT. */
-      public static final String HICLOUD_X_USERAGENT = "hiCloud_X_UserAgent";
+    /** The Constant HICLOUD_X_USERAGENT. */
+    public static final String HICLOUD_X_USERAGENT = "hiCloud_X_UserAgent";
 
-      /** The Constant MCS_REQUEST_SOCKETBUFFER. */
-      public static final String MCS_REQUEST_SOCKETBUFFER = "Mcs_Request_SocketBuffer";
+    /** The Constant MCS_REQUEST_SOCKETBUFFER. */
+    public static final String MCS_REQUEST_SOCKETBUFFER = "Mcs_Request_SocketBuffer";
 
-      /** The Constant HICLOUD_TIMELINE_BACKUP_PHOTO. */
-      public static final String HICLOUD_TIMELINE_BACKUP_PHOTO = "HiCloud_TimeLine_Backup_Photo";
+    /** The Constant HICLOUD_TIMELINE_BACKUP_PHOTO. */
+    public static final String HICLOUD_TIMELINE_BACKUP_PHOTO = "HiCloud_TimeLine_Backup_Photo";
 
-      /** The Constant HICLOUD_TIMELINE_BACKUP_APP. */
-      public static final String HICLOUD_TIMELINE_BACKUP_APP = "HiCloud_TimeLine_Backup_App";
+    /** The Constant HICLOUD_TIMELINE_BACKUP_APP. */
+    public static final String HICLOUD_TIMELINE_BACKUP_APP = "HiCloud_TimeLine_Backup_App";
 
-      /** The Constant HICLOUD_TIMELINE_BACKUP_VIDEO. */
-      public static final String HICLOUD_TIMELINE_BACKUP_VIDEO = "HiCloud_TimeLine_Backup_Video";
+    /** The Constant HICLOUD_TIMELINE_BACKUP_VIDEO. */
+    public static final String HICLOUD_TIMELINE_BACKUP_VIDEO = "HiCloud_TimeLine_Backup_Video";
 
-      /** The Constant HICLOUD_TIMELINE_RESTORE_PHOTO. */
-      public static final String HICLOUD_TIMELINE_RESTORE_PHOTO = "HiCloud_TimeLine_Restore_Photo";
+    /** The Constant HICLOUD_TIMELINE_RESTORE_PHOTO. */
+    public static final String HICLOUD_TIMELINE_RESTORE_PHOTO = "HiCloud_TimeLine_Restore_Photo";
 
-      /** The Constant HICLOUD_TIMELINE_RESTORE_APP. */
-      public static final String HICLOUD_TIMELINE_RESTORE_APP = "HiCloud_TimeLine_Restore_App";
+    /** The Constant HICLOUD_TIMELINE_RESTORE_APP. */
+    public static final String HICLOUD_TIMELINE_RESTORE_APP = "HiCloud_TimeLine_Restore_App";
 
-      /** The Constant HICLOUD_TIMELINE_RESTORE_VIDEO. */
-      public static final String HICLOUD_TIMELINE_RESTORE_VIDEO = "HiCloud_TimeLine_Restore_Video";
+    /** The Constant HICLOUD_TIMELINE_RESTORE_VIDEO. */
+    public static final String HICLOUD_TIMELINE_RESTORE_VIDEO = "HiCloud_TimeLine_Restore_Video";
 
-      /** The Constant CAB_HTTPS_NEED. */
-      public static final String CAB_HTTPS_NEED = "cab_https_need";
+    /** The Constant CAB_HTTPS_NEED. */
+    public static final String CAB_HTTPS_NEED = "cab_https_need";
 
-      /** The Constant HICLOUD_SYNCACHEOPRETION_DEF. */
-      public static final int HICLOUD_SYNCACHEOPRETION_DEF = 1;
+    /** The Constant HICLOUD_SYNCACHEOPRETION_DEF. */
+    public static final int HICLOUD_SYNCACHEOPRETION_DEF = 1;
 
-      /** The Constant HICLOUD_SYNCACHEOPRETION_LOC. */
-      public static final int HICLOUD_SYNCACHEOPRETION_LOC = 0;
+    /** The Constant HICLOUD_SYNCACHEOPRETION_LOC. */
+    public static final int HICLOUD_SYNCACHEOPRETION_LOC = 0;
 
-      /** The Constant HICLOUD_SYNCACHEOPRETION_SYNC. */
-      public static final int HICLOUD_SYNCACHEOPRETION_SYNC = 2;
+    /** The Constant HICLOUD_SYNCACHEOPRETION_SYNC. */
+    public static final int HICLOUD_SYNCACHEOPRETION_SYNC = 2;
 
-      /** The Constant HICLOUD_FILEOPRLISTDIRSYNCTYPE_DEF. */
-      public static final int HICLOUD_FILEOPRLISTDIRSYNCTYPE_DEF = 0;
+    /** The Constant HICLOUD_FILEOPRLISTDIRSYNCTYPE_DEF. */
+    public static final int HICLOUD_FILEOPRLISTDIRSYNCTYPE_DEF = 0;
 
-      /** The Constant HICLOUD_FILEOPRLISTDIRSYNCTYPE_ROOT. */
-      public static final int HICLOUD_FILEOPRLISTDIRSYNCTYPE_ROOT = 1;
+    /** The Constant HICLOUD_FILEOPRLISTDIRSYNCTYPE_ROOT. */
+    public static final int HICLOUD_FILEOPRLISTDIRSYNCTYPE_ROOT = 1;
 
-      /** The Constant HICLOUD_FILEOPRLISTDIRRATE_DEF. */
-      public static final int HICLOUD_FILEOPRLISTDIRRATE_DEF = 200;
+    /** The Constant HICLOUD_FILEOPRLISTDIRRATE_DEF. */
+    public static final int HICLOUD_FILEOPRLISTDIRRATE_DEF = 200;
 
-      /** The Constant HICLOUD_UPLOAD_EXPIRETIME_DEF. */
-      public static final int HICLOUD_UPLOAD_EXPIRETIME_DEF = 7;
+    /** The Constant HICLOUD_UPLOAD_EXPIRETIME_DEF. */
+    public static final int HICLOUD_UPLOAD_EXPIRETIME_DEF = 7;
 
-      /** The Constant HICLOUD_SYNCCACHETIMEOUT_DEF. */
-      public static final int HICLOUD_SYNCCACHETIMEOUT_DEF = 60;
+    /** The Constant HICLOUD_SYNCCACHETIMEOUT_DEF. */
+    public static final int HICLOUD_SYNCCACHETIMEOUT_DEF = 60;
 
-      /** The Constant HICLOUD_PROGRESSINTERVAL_DEF. */
-      public static final int HICLOUD_PROGRESSINTERVAL_DEF = 1000;
+    /** The Constant HICLOUD_PROGRESSINTERVAL_DEF. */
+    public static final int HICLOUD_PROGRESSINTERVAL_DEF = 1000;
 
-      /** The Constant AUTH_TOKEN_TIMEOUT_DEF. */
-      public static final int AUTH_TOKEN_TIMEOUT_DEF = 600;
+    /** The Constant AUTH_TOKEN_TIMEOUT_DEF. */
+    public static final int AUTH_TOKEN_TIMEOUT_DEF = 600;
 
-      /** The Constant HICLOUD_CONFLICTSTATUS_REPORT_NO. */
-      public static final int HICLOUD_CONFLICTSTATUS_REPORT_NO = 0;
+    /** The Constant HICLOUD_CONFLICTSTATUS_REPORT_NO. */
+    public static final int HICLOUD_CONFLICTSTATUS_REPORT_NO = 0;
 
-      /** The Constant HICLOUD_CONFLICTSTATUS_REPORT_YES. */
-      public static final int HICLOUD_CONFLICTSTATUS_REPORT_YES = 1;
+    /** The Constant HICLOUD_CONFLICTSTATUS_REPORT_YES. */
+    public static final int HICLOUD_CONFLICTSTATUS_REPORT_YES = 1;
 
-      /** The Constant HICLOUD_SDK_VERSION. */
-      public static final String HICLOUD_SDK_VERSION = "SDKVersion";
+    /** The Constant HICLOUD_SDK_VERSION. */
+    public static final String HICLOUD_SDK_VERSION = "SDKVersion";
 
-      /** The Constant HICLOUD_SDK_VERSION_FILE. */
-      public static final String HICLOUD_SDK_VERSION_FILE = "SDKVersionFILE";
+    /** The Constant HICLOUD_SDK_VERSION_FILE. */
+    public static final String HICLOUD_SDK_VERSION_FILE = "SDKVersionFILE";
 
-      /** The Constant HICLOUD_SDK_VERSION_MSG. */
-      public static final String HICLOUD_SDK_VERSION_MSG = "SDKVersionMSG";
+    /** The Constant HICLOUD_SDK_VERSION_MSG. */
+    public static final String HICLOUD_SDK_VERSION_MSG = "SDKVersionMSG";
 
-      /** The Constant HICLOUD_APP_CHANNEL. */
-      public static final String HICLOUD_APP_CHANNEL = "AppChannel";
+    /** The Constant HICLOUD_APP_CHANNEL. */
+    public static final String HICLOUD_APP_CHANNEL = "AppChannel";
 
-      /** The Constant MCS_APPLICATION_VERSION. */
-      public static final String MCS_APPLICATION_VERSION = "applicationVersion";
+    /** The Constant MCS_APPLICATION_VERSION. */
+    public static final String MCS_APPLICATION_VERSION = "applicationVersion";
 
-      /** The Constant MCS_SDK_VERSION_BASE. */
-      public static final String MCS_SDK_VERSION_BASE = "SDKVersionBase";
+    /** The Constant MCS_SDK_VERSION_BASE. */
+    public static final String MCS_SDK_VERSION_BASE = "SDKVersionBase";
 
-      /** The Constant MCS_APPLICATION_CLIENTTYPE. */
-      public static final String MCS_APPLICATION_CLIENTTYPE = "applicationClientType";
+    /** The Constant MCS_APPLICATION_CLIENTTYPE. */
+    public static final String MCS_APPLICATION_CLIENTTYPE = "applicationClientType";
 
-      /** The Constant AUTH_AUTOFILL_CHECKVERSION. */
-      public static final String AUTH_AUTOFILL_CHECKVERSION = "autoFillCheckVersion";
+    /** The Constant AUTH_AUTOFILL_CHECKVERSION. */
+    public static final String AUTH_AUTOFILL_CHECKVERSION = "autoFillCheckVersion";
 
-      /** The Constant AUTH_AUTOFILL_ROUTECODE. */
-      public static final String AUTH_AUTOFILL_ROUTECODE = "autoFillRouteCode";
+    /** The Constant AUTH_AUTOFILL_ROUTECODE. */
+    public static final String AUTH_AUTOFILL_ROUTECODE = "autoFillRouteCode";
 
-      /** The Constant USER_DEVICEID. */
-      public static final String USER_DEVICEID = "user_deviceid";
+    /** The Constant USER_DEVICEID. */
+    public static final String USER_DEVICEID = "user_deviceid";
 
-      /** The Constant USER_LOGIN_NAME. */
-      public static final String USER_LOGIN_NAME = "user_loginname";
+    /** The Constant USER_LOGIN_NAME. */
+    public static final String USER_LOGIN_NAME = "user_loginname";
 
-      /** The Constant USER_LOGIN_TYPE. */
-      public static final String USER_LOGIN_TYPE = "user_logintype";
+    /** The Constant USER_LOGIN_TYPE. */
+    public static final String USER_LOGIN_TYPE = "user_logintype";
 
-      /** The Constant USER_LOGIN_PASS. */
-      public static final String USER_LOGIN_PASS = "user_loginpass";
+    /** The Constant USER_LOGIN_PASS. */
+    public static final String USER_LOGIN_PASS = "user_loginpass";
 
-      /** The Constant USER_PASS_TYPE. */
-      public static final String USER_PASS_TYPE = "user_passtype";
+    /** The Constant USER_PASS_TYPE. */
+    public static final String USER_PASS_TYPE = "user_passtype";
 
-      /** The Constant USER_LOGIN_EXTINFO. */
-      public static final String USER_LOGIN_EXTINFO = "user_loginextinfo";
+    /** The Constant USER_LOGIN_EXTINFO. */
+    public static final String USER_LOGIN_EXTINFO = "user_loginextinfo";
 
-      /** The Constant USER_LOGIN_SOURCE. */
-      public static final String USER_LOGIN_SOURCE = "user_loginxsource";
+    /** The Constant USER_LOGIN_SOURCE. */
+    public static final String USER_LOGIN_SOURCE = "user_loginxsource";
 
-      /** The Constant COM_CONF_VERSION. */
-      public static final String COM_CONF_VERSION = "ComConf_Version";
+    /** The Constant COM_CONF_VERSION. */
+    public static final String COM_CONF_VERSION = "ComConf_Version";
 
-      /** The Constant COM_CONF. */
-      public static final String COM_CONF = "ComConf_";
+    /** The Constant COM_CONF. */
+    public static final String COM_CONF = "ComConf_";
 
-      /** The Constant CONFIG_XML_NAME. */
-      public static final String CONFIG_XML_NAME = "mcsConfig";
+    /** The Constant CONFIG_XML_NAME. */
+    public static final String CONFIG_XML_NAME = "mcsConfig";
 
-      /** The Constant SERVER_CERT_CONTENT. */
-      public static final String SERVER_CERT_CONTENT = "server_cert_content";
+    /** The Constant SERVER_CERT_CONTENT. */
+    public static final String SERVER_CERT_CONTENT = "server_cert_content";
 
-      /** The Constant SERVER_CERT_NOT_BEFORE. */
-      public static final String SERVER_CERT_NOT_BEFORE = "server_cert_not_before";
+    /** The Constant SERVER_CERT_NOT_BEFORE. */
+    public static final String SERVER_CERT_NOT_BEFORE = "server_cert_not_before";
 }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Error.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcloudfile/Error.java
index 72f149f..95b3e41 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/mcloudfile/Error.java
@@ -20,8 +20,8 @@
  * 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.mcloudfile;
 
 public enum Error {
     Timeout,
@@ -84,13 +84,11 @@
 
     sdkInnerError;
 
-    public static Error valueOf( int ordinal )
-    {
-        if( ordinal < 0 || ordinal >= values().length )
-        {
-            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+    public static Error valueOf(int ordinal) {
+        if (ordinal < 0 || ordinal >= values().length) {
+            throw new IndexOutOfBoundsException("Invalid ordinal");
         }
 
-        return values()[ ordinal ];
+        return values()[ordinal];
     }
 }
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/mcloudfile/Event.java
index 40bbb72..e953a6a 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/mcloudfile/Event.java
@@ -20,35 +20,33 @@
  * 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;
 
-
 public enum Event {
-      started,
+    started,
 
-      success,
+    success,
 
-      error,
+    error,
 
-      canceled,
+    canceled,
 
-      progress,
+    progress,
 
-      paused,
+    paused,
 
-      resumed,
+    resumed,
 
-      pendding,
+    pendding,
 
-      sub_started;
+    sub_started;
 
-    public static Event valueOf( int ordinal )
-    {
-        if( ordinal < 0 || ordinal >= values().length )
-        {
-            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+    public static Event valueOf(int ordinal) {
+        if (ordinal < 0 || ordinal >= values().length) {
+            throw new IndexOutOfBoundsException("Invalid ordinal");
         }
 
-        return values()[ ordinal ];
+        return values()[ordinal];
     }
 }
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/mcloudfile/FileNode.java
index c7888e9..2e48e2b 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/mcloudfile/FileNode.java
@@ -20,6 +20,7 @@
  * 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;
 
 import java.util.Map;
@@ -27,122 +28,157 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class FileNode implements Parcelable
-{
+public class FileNode implements Parcelable {
     private boolean isFile;
+
     private boolean isShared;
+
     private boolean isFixed;
+
     private boolean isNeedUpdate;
+
     private boolean isNeedUpload;
+
     private boolean isSuccess;
+
     private long uploadSize;
+
     private FileType type;
+
     private int dirLevel;
+
     private long eTag;
+
     private String name;
+
     private String suffix;
+
     private ShareType shareType;
+
     private String createTime;
+
     private String updateTime;
+
     private long size;
+
     private String digest;
+
     private String remotePath;
+
     private String oldName;
+
     private String oldRemotePath;
+
     private String localPath;
+
     private String parentPath;
+
     private String thumbnailURL;
+
     private String localThumbPath;
+
     private String bigThumbURL;
+
     private String localBigThumbPath;
+
     private long version;
+
     private String id;
+
     private String parentID;
+
     private String fullPathInID;
+
     private String shareParentID;
+
     private Map<String, String> fields;
 
-    public FileNode()
-    {}
+    public FileNode() {
+    }
 
-    public FileNode( Parcel source )
-    {
-        readFromParcel( source );
+    public FileNode(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the mcloud result entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( name );
-        dest.writeString( suffix );
-        dest.writeString( createTime );
-        dest.writeString( updateTime );
-        dest.writeString( digest );
-        dest.writeString( remotePath );
-        dest.writeString( oldName );
-        dest.writeString( oldRemotePath );
-        dest.writeString( localPath );
-        dest.writeString( parentPath );
-        dest.writeString( thumbnailURL );
-        dest.writeString( localThumbPath );
-        dest.writeString( bigThumbURL );
-        dest.writeString( localBigThumbPath );
-        dest.writeString( id );
-        dest.writeString( parentID );
-        dest.writeString( fullPathInID );
-        dest.writeString( shareParentID );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(name);
+        dest.writeString(suffix);
+        dest.writeString(createTime);
+        dest.writeString(updateTime);
+        dest.writeString(digest);
+        dest.writeString(remotePath);
+        dest.writeString(oldName);
+        dest.writeString(oldRemotePath);
+        dest.writeString(localPath);
+        dest.writeString(parentPath);
+        dest.writeString(thumbnailURL);
+        dest.writeString(localThumbPath);
+        dest.writeString(bigThumbURL);
+        dest.writeString(localBigThumbPath);
+        dest.writeString(id);
+        dest.writeString(parentID);
+        dest.writeString(fullPathInID);
+        dest.writeString(shareParentID);
 
-        dest.writeBooleanArray( new boolean[]{ isFile } );
-        dest.writeBooleanArray( new boolean[]{ isShared } );
-        dest.writeBooleanArray( new boolean[]{ isFixed } );
-        dest.writeBooleanArray( new boolean[]{ isNeedUpdate } );
-        dest.writeBooleanArray( new boolean[]{ isNeedUpload } );
-        dest.writeBooleanArray( new boolean[]{ isSuccess } );
+        dest.writeBooleanArray(new boolean[] {
+            isFile
+        });
+        dest.writeBooleanArray(new boolean[] {
+            isShared
+        });
+        dest.writeBooleanArray(new boolean[] {
+            isFixed
+        });
+        dest.writeBooleanArray(new boolean[] {
+            isNeedUpdate
+        });
+        dest.writeBooleanArray(new boolean[] {
+            isNeedUpload
+        });
+        dest.writeBooleanArray(new boolean[] {
+            isSuccess
+        });
 
-        dest.writeLong( uploadSize );
-        dest.writeInt( dirLevel );
-        dest.writeLong( eTag );
-        dest.writeLong( size );
-        dest.writeLong( version );
+        dest.writeLong(uploadSize);
+        dest.writeInt(dirLevel);
+        dest.writeLong(eTag);
+        dest.writeLong(size);
+        dest.writeLong(version);
 
-        dest.writeInt( shareType.ordinal() );
-        dest.writeInt( type.ordinal() );
+        dest.writeInt(shareType.ordinal());
+        dest.writeInt(type.ordinal());
 
-        dest.writeMap( fields );
+        dest.writeMap(fields);
     }
 
     /**
-     * Create the mcloud result entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param source The parcel stream
      */
-    @SuppressWarnings( "unchecked" )
-    public void readFromParcel( Parcel source )
-    {
+    @SuppressWarnings("unchecked")
+    public void readFromParcel(Parcel source) {
         name = source.readString();
         suffix = source.readString();
         createTime = source.readString();
@@ -162,12 +198,12 @@
         fullPathInID = source.readString();
         shareParentID = source.readString();
 
-        isFile = source.createBooleanArray()[ 0 ];
-        isShared = source.createBooleanArray()[ 0 ];
-        isFixed = source.createBooleanArray()[ 0 ];
-        isNeedUpdate = source.createBooleanArray()[ 0 ];
-        isNeedUpload = source.createBooleanArray()[ 0 ];
-        isSuccess = source.createBooleanArray()[ 0 ];
+        isFile = source.createBooleanArray()[0];
+        isShared = source.createBooleanArray()[0];
+        isFixed = source.createBooleanArray()[0];
+        isNeedUpdate = source.createBooleanArray()[0];
+        isNeedUpload = source.createBooleanArray()[0];
+        isSuccess = source.createBooleanArray()[0];
 
         uploadSize = source.readLong();
         dirLevel = source.readInt();
@@ -175,344 +211,278 @@
         size = source.readLong();
         version = source.readLong();
 
-        shareType = ShareType.valueOf( source.readInt() );
-        type = FileType.valueOf( source.readInt() );
+        shareType = ShareType.valueOf(source.readInt());
+        type = FileType.valueOf(source.readInt());
 
-        fields = source.readHashMap( this.getClass().getClassLoader() );
+        fields = source.readHashMap(this.getClass().getClassLoader());
     }
 
     /** 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 );
+        public FileNode createFromParcel(Parcel source) {
+            return new FileNode(source);
         }
 
         @Override
-        public FileNode[] newArray( int size )
-        {
-            return new FileNode[ size ];
+        public FileNode[] newArray(int size) {
+            return new FileNode[size];
         }
     };
 
-    public boolean isFile()
-    {
+    public boolean isFile() {
         return isFile;
     }
 
-    public void setFile( boolean isFile )
-    {
+    public void setFile(boolean isFile) {
         this.isFile = isFile;
     }
 
-    public boolean isShared()
-    {
+    public boolean isShared() {
         return isShared;
     }
 
-    public void setShared( boolean isShared )
-    {
+    public void setShared(boolean isShared) {
         this.isShared = isShared;
     }
 
-    public boolean isFixed()
-    {
+    public boolean isFixed() {
         return isFixed;
     }
 
-    public void setFixed( boolean isFixed )
-    {
+    public void setFixed(boolean isFixed) {
         this.isFixed = isFixed;
     }
 
-    public boolean isNeedUpdate()
-    {
+    public boolean isNeedUpdate() {
         return isNeedUpdate;
     }
 
-    public void setNeedUpdate( boolean isNeedUpdate )
-    {
+    public void setNeedUpdate(boolean isNeedUpdate) {
         this.isNeedUpdate = isNeedUpdate;
     }
 
-    public boolean isNeedUpload()
-    {
+    public boolean isNeedUpload() {
         return isNeedUpload;
     }
 
-    public void setNeedUpload( boolean isNeedUpload )
-    {
+    public void setNeedUpload(boolean isNeedUpload) {
         this.isNeedUpload = isNeedUpload;
     }
 
-    public boolean isSuccess()
-    {
+    public boolean isSuccess() {
         return isSuccess;
     }
 
-    public void setSuccess( boolean isSuccess )
-    {
+    public void setSuccess(boolean isSuccess) {
         this.isSuccess = isSuccess;
     }
 
-    public long getUploadSize()
-    {
+    public long getUploadSize() {
         return uploadSize;
     }
 
-    public void setUploadSize( long uploadSize )
-    {
+    public void setUploadSize(long uploadSize) {
         this.uploadSize = uploadSize;
     }
 
-    public FileType getType()
-    {
+    public FileType getType() {
         return type;
     }
 
-    public void setType( FileType type )
-    {
+    public void setType(FileType type) {
         this.type = type;
     }
 
-    public int getDirLevel()
-    {
+    public int getDirLevel() {
         return dirLevel;
     }
 
-    public void setDirLevel( int dirLevel )
-    {
+    public void setDirLevel(int dirLevel) {
         this.dirLevel = dirLevel;
     }
 
-    public long geteTag()
-    {
+    public long geteTag() {
         return eTag;
     }
 
-    public void seteTag( long eTag )
-    {
+    public void seteTag(long eTag) {
         this.eTag = eTag;
     }
 
-    public String getName()
-    {
+    public String getName() {
         return name;
     }
 
-    public void setName( String name )
-    {
+    public void setName(String name) {
         this.name = name;
     }
 
-    public String getSuffix()
-    {
+    public String getSuffix() {
         return suffix;
     }
 
-    public void setSuffix( String suffix )
-    {
+    public void setSuffix(String suffix) {
         this.suffix = suffix;
     }
 
-    public ShareType getShareType()
-    {
+    public ShareType getShareType() {
         return shareType;
     }
 
-    public void setShareType( ShareType shareType )
-    {
+    public void setShareType(ShareType shareType) {
         this.shareType = shareType;
     }
 
-    public String getCreateTime()
-    {
+    public String getCreateTime() {
         return createTime;
     }
 
-    public void setCreateTime( String createTime )
-    {
+    public void setCreateTime(String createTime) {
         this.createTime = createTime;
     }
 
-    public String getUpdateTime()
-    {
+    public String getUpdateTime() {
         return updateTime;
     }
 
-    public void setUpdateTime( String updateTime )
-    {
+    public void setUpdateTime(String updateTime) {
         this.updateTime = updateTime;
     }
 
-    public long getSize()
-    {
+    public long getSize() {
         return size;
     }
 
-    public void setSize( long size )
-    {
+    public void setSize(long size) {
         this.size = size;
     }
 
-    public String getDigest()
-    {
+    public String getDigest() {
         return digest;
     }
 
-    public void setDigest( String digest )
-    {
+    public void setDigest(String digest) {
         this.digest = digest;
     }
 
-    public String getRemotePath()
-    {
+    public String getRemotePath() {
         return remotePath;
     }
 
-    public void setRemotePath( String remotePath )
-    {
+    public void setRemotePath(String remotePath) {
         this.remotePath = remotePath;
     }
 
-    public String getOldName()
-    {
+    public String getOldName() {
         return oldName;
     }
 
-    public void setOldName( String oldName )
-    {
+    public void setOldName(String oldName) {
         this.oldName = oldName;
     }
 
-    public String getOldRemotePath()
-    {
+    public String getOldRemotePath() {
         return oldRemotePath;
     }
 
-    public void setOldRemotePath( String oldRemotePath )
-    {
+    public void setOldRemotePath(String oldRemotePath) {
         this.oldRemotePath = oldRemotePath;
     }
 
-    public String getLocalPath()
-    {
+    public String getLocalPath() {
         return localPath;
     }
 
-    public void setLocalPath( String localPath )
-    {
+    public void setLocalPath(String localPath) {
         this.localPath = localPath;
     }
 
-    public String getParentPath()
-    {
+    public String getParentPath() {
         return parentPath;
     }
 
-    public void setParentPath( String parentPath )
-    {
+    public void setParentPath(String parentPath) {
         this.parentPath = parentPath;
     }
 
-    public String getThumbnailURL()
-    {
+    public String getThumbnailURL() {
         return thumbnailURL;
     }
 
-    public void setThumbnailURL( String thumbnailURL )
-    {
+    public void setThumbnailURL(String thumbnailURL) {
         this.thumbnailURL = thumbnailURL;
     }
 
-    public String getLocalThumbPath()
-    {
+    public String getLocalThumbPath() {
         return localThumbPath;
     }
 
-    public void setLocalThumbPath( String localThumbPath )
-    {
+    public void setLocalThumbPath(String localThumbPath) {
         this.localThumbPath = localThumbPath;
     }
 
-    public String getBigThumbURL()
-    {
+    public String getBigThumbURL() {
         return bigThumbURL;
     }
 
-    public void setBigThumbURL( String bigThumbURL )
-    {
+    public void setBigThumbURL(String bigThumbURL) {
         this.bigThumbURL = bigThumbURL;
     }
 
-    public String getLocalBigThumbPath()
-    {
+    public String getLocalBigThumbPath() {
         return localBigThumbPath;
     }
 
-    public void setLocalBigThumbPath( String localBigThumbPath )
-    {
+    public void setLocalBigThumbPath(String localBigThumbPath) {
         this.localBigThumbPath = localBigThumbPath;
     }
 
-    public long getVersion()
-    {
+    public long getVersion() {
         return version;
     }
 
-    public void setVersion( long version )
-    {
+    public void setVersion(long version) {
         this.version = version;
     }
 
-    public String getId()
-    {
+    public String getId() {
         return id;
     }
 
-    public void setId( String id )
-    {
+    public void setId(String id) {
         this.id = id;
     }
 
-    public String getParentID()
-    {
+    public String getParentID() {
         return parentID;
     }
 
-    public void setParentID( String parentID )
-    {
+    public void setParentID(String parentID) {
         this.parentID = parentID;
     }
 
-    public String getFullPathInID()
-    {
+    public String getFullPathInID() {
         return fullPathInID;
     }
 
-    public void setFullPathInID( String fullPathInID )
-    {
+    public void setFullPathInID(String fullPathInID) {
         this.fullPathInID = fullPathInID;
     }
 
-    public String getShareParentID()
-    {
+    public String getShareParentID() {
         return shareParentID;
     }
 
-    public void setShareParentID( String shareParentID )
-    {
+    public void setShareParentID(String shareParentID) {
         this.shareParentID = shareParentID;
     }
 
-    public Map<String, String> getFields()
-    {
+    public Map<String, String> getFields() {
         return fields;
     }
 
-    public void setFields( Map<String, String> fields )
-    {
+    public void setFields(Map<String, String> fields) {
         this.fields = fields;
     }
 
@@ -533,14 +503,12 @@
 
         searchByExt;
 
-        public static FileType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static FileType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
@@ -551,19 +519,16 @@
 
         both;
 
-        public static ShareType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static ShareType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
-    public static enum Order
-    {
+    public static enum Order {
         name,
 
         name_revers,
@@ -576,41 +541,35 @@
 
         updatedate_revers;
 
-        public static Order valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static Order valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
-    public static enum SyncType
-    {
+    public static enum SyncType {
         noSync,
 
         autoSync,
 
         forceSync;
 
-        public static SyncType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static SyncType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
     /**
      * The Enum ThumbType.
      */
-    public static enum ThumbType
-    {
+    public static enum ThumbType {
 
         /** The big thumb. */
         bigThumb,
@@ -623,18 +582,16 @@
 
         /**
          * Value of.
-         *
+         * 
          * @param ordinal the ordinal
          * @return the thumb type
          */
-        public static ThumbType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static ThumbType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 }
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/mcloudfile/MsgNode.java
index 429d31d..2757427 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/mcloudfile/MsgNode.java
@@ -20,6 +20,7 @@
  * 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;
 
 import java.util.Map;
@@ -27,89 +28,99 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class MsgNode implements Parcelable
-{
+public class MsgNode implements Parcelable {
     private String content;
+
     private String sender;
+
     private String receiver;
+
     private String time;
+
     private String id;
+
     private MsgType msgType;
+
     private BoxType boxType;
+
     private MsgResult result;
+
     private boolean isSend;
+
     private boolean isRead;
+
     private int size;
+
     private int number;
+
     private int locked;
+
     private byte[] attachment;
+
     private Map<String, String> fields;
 
-    public MsgNode()
-    {}
+    public MsgNode() {
+    }
 
-    public MsgNode( Parcel source )
-    {
-        readFromParcel( source );
+    public MsgNode(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the configure node entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( content );
-        dest.writeString( sender );
-        dest.writeString( receiver );
-        dest.writeString( time );
-        dest.writeString( id );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(content);
+        dest.writeString(sender);
+        dest.writeString(receiver);
+        dest.writeString(time);
+        dest.writeString(id);
 
-        dest.writeInt( size );
-        dest.writeInt( number );
-        dest.writeInt( locked );
+        dest.writeInt(size);
+        dest.writeInt(number);
+        dest.writeInt(locked);
 
-        dest.writeInt( msgType.ordinal() );
-        dest.writeInt( boxType.ordinal() );
-        dest.writeInt( result.ordinal() );
+        dest.writeInt(msgType.ordinal());
+        dest.writeInt(boxType.ordinal());
+        dest.writeInt(result.ordinal());
 
-        dest.writeBooleanArray( new boolean[]{ isSend } );
-        dest.writeBooleanArray( new boolean[]{ isRead } );
+        dest.writeBooleanArray(new boolean[] {
+            isSend
+        });
+        dest.writeBooleanArray(new boolean[] {
+            isRead
+        });
 
-        dest.writeByteArray( attachment );
+        dest.writeByteArray(attachment);
 
-        dest.writeMap( fields );
+        dest.writeMap(fields);
     }
 
     /**
-     * Create the configure node entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * Create the configure node entity from parcel stream. Pay attention to
+     * read and write variables variables sequence should be consistent or not
+     * the correct results
+     * 
+     * @param source The parcel stream
      */
-    @SuppressWarnings( "unchecked" )
-    public void readFromParcel( Parcel source )
-    {
+    @SuppressWarnings("unchecked")
+    public void readFromParcel(Parcel source) {
         content = source.readString();
         sender = source.readString();
         receiver = source.readString();
@@ -120,221 +131,182 @@
         number = source.readInt();
         locked = source.readInt();
 
-        msgType = MsgType.valueOf( source.readInt() );
-        boxType = BoxType.valueOf( source.readInt() );
-        result = MsgResult.valueOf( source.readInt() );
+        msgType = MsgType.valueOf(source.readInt());
+        boxType = BoxType.valueOf(source.readInt());
+        result = MsgResult.valueOf(source.readInt());
 
-        isSend = source.createBooleanArray()[ 0 ];
-        isRead = source.createBooleanArray()[ 0 ];
+        isSend = source.createBooleanArray()[0];
+        isRead = source.createBooleanArray()[0];
 
         attachment = source.createByteArray();
 
-        fields = source.readHashMap( this.getClass().getClassLoader() );
+        fields = source.readHashMap(this.getClass().getClassLoader());
     }
 
     /** 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 );
+        public MsgNode createFromParcel(Parcel source) {
+            return new MsgNode(source);
         }
 
         @Override
-        public MsgNode[] newArray( int size )
-        {
-            return new MsgNode[ size ];
+        public MsgNode[] newArray(int size) {
+            return new MsgNode[size];
         }
     };
 
-    public String getContent()
-    {
+    public String getContent() {
         return content;
     }
 
-    public void setContent( String content )
-    {
+    public void setContent(String content) {
         this.content = content;
     }
 
-    public String getSender()
-    {
+    public String getSender() {
         return sender;
     }
 
-    public void setSender( String sender )
-    {
+    public void setSender(String sender) {
         this.sender = sender;
     }
 
-    public String getReceiver()
-    {
+    public String getReceiver() {
         return receiver;
     }
 
-    public void setReceiver( String receiver )
-    {
+    public void setReceiver(String receiver) {
         this.receiver = receiver;
     }
 
-    public String getTime()
-    {
+    public String getTime() {
         return time;
     }
 
-    public void setTime( String time )
-    {
+    public void setTime(String time) {
         this.time = time;
     }
 
-    public String getId()
-    {
+    public String getId() {
         return id;
     }
 
-    public void setId( String id )
-    {
+    public void setId(String id) {
         this.id = id;
     }
 
-    public MsgType getMsgType()
-    {
+    public MsgType getMsgType() {
         return msgType;
     }
 
-    public void setMsgType( MsgType msgType )
-    {
+    public void setMsgType(MsgType msgType) {
         this.msgType = msgType;
     }
 
-    public BoxType getBoxType()
-    {
+    public BoxType getBoxType() {
         return boxType;
     }
 
-    public void setBoxType( BoxType boxType )
-    {
+    public void setBoxType(BoxType boxType) {
         this.boxType = boxType;
     }
 
-    public MsgResult getResult()
-    {
+    public MsgResult getResult() {
         return result;
     }
 
-    public void setResult( MsgResult result )
-    {
+    public void setResult(MsgResult result) {
         this.result = result;
     }
 
-    public boolean isSend()
-    {
+    public boolean isSend() {
         return isSend;
     }
 
-    public void setSend( boolean isSend )
-    {
+    public void setSend(boolean isSend) {
         this.isSend = isSend;
     }
 
-    public boolean isRead()
-    {
+    public boolean isRead() {
         return isRead;
     }
 
-    public void setRead( boolean isRead )
-    {
+    public void setRead(boolean isRead) {
         this.isRead = isRead;
     }
 
-    public int getSize()
-    {
+    public int getSize() {
         return size;
     }
 
-    public void setSize( int size )
-    {
+    public void setSize(int size) {
         this.size = size;
     }
 
-    public int getNumber()
-    {
+    public int getNumber() {
         return number;
     }
 
-    public void setNumber( int number )
-    {
+    public void setNumber(int number) {
         this.number = number;
     }
 
-    public int getLocked()
-    {
+    public int getLocked() {
         return locked;
     }
 
-    public void setLocked( int locked )
-    {
+    public void setLocked(int locked) {
         this.locked = locked;
     }
 
-    public byte[] getAttachment()
-    {
+    public byte[] getAttachment() {
         return attachment;
     }
 
-    public void setAttachment( byte[] attachment )
-    {
+    public void setAttachment(byte[] attachment) {
         this.attachment = attachment;
     }
 
-    public Map<String, String> getFields()
-    {
+    public Map<String, String> getFields() {
         return fields;
     }
 
-    public void setFields( Map<String, String> fields )
-    {
+    public void setFields(Map<String, String> fields) {
         this.fields = fields;
     }
 
-    public static enum BoxType
-    {
+    public static enum BoxType {
         inbox,
 
         outbox,
 
         draft;
 
-        public static BoxType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static BoxType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
-    public static enum MsgType
-    {
+    public static enum MsgType {
         sms,
 
         mms;
 
-        public static MsgType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static MsgType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
-    public static enum Order
-    {
+    public static enum Order {
         date,
 
         date_Reverse,
@@ -351,19 +323,16 @@
 
         thread_Reverse;
 
-        public static Order valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static Order valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
-    public static enum MsgResult
-    {
+    public static enum MsgResult {
         success,
 
         duplication,
@@ -372,14 +341,12 @@
 
         ignor;
 
-        public static MsgResult valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static MsgResult valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 }
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/mcloudfile/Param.java
index 9ce33b2..1c7db59 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/mcloudfile/Param.java
@@ -20,111 +20,98 @@
  * 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;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class Param implements Parcelable
-{
-    private int[]        paramInt;
-    private long[]        paramLong;
-    private String[]    paramString;
+public class Param implements Parcelable {
+    private int[] paramInt;
 
-    public Param()
-    {}
+    private long[] paramLong;
 
-    public Param( Parcel source )
-    {
-        readFromParcel( source );
+    private String[] paramString;
+
+    public Param() {
+    }
+
+    public Param(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the param entity to parcel stream. Pay attention to read
-     * and write variables variables sequence should be consistent or not the
-     * correct results
-     *
-     * @param dest
-     *            the dest parcel stream
-     * @param flags
-     *            the flags
+     * Write the param entity to parcel stream. Pay attention to read and write
+     * variables variables sequence should be consistent or not the correct
+     * results
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeIntArray( paramInt );
-        dest.writeLongArray( paramLong );
-        dest.writeStringArray( paramString );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeIntArray(paramInt);
+        dest.writeLongArray(paramLong);
+        dest.writeStringArray(paramString);
     }
 
     /**
-     * Create the param entity from parcel stream. Pay attention to read
-     * and write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         paramInt = source.createIntArray();
         paramLong = source.createLongArray();
         paramString = source.createStringArray();
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<Param>    CREATOR    = new Parcelable.Creator<Param>() {
+    public static final Parcelable.Creator<Param> CREATOR = new Parcelable.Creator<Param>() {
         @Override
-        public Param createFromParcel( Parcel source )
-        {
-            return new Param( source );
+        public Param createFromParcel(Parcel source) {
+            return new Param(source);
         }
 
         @Override
-        public Param[] newArray( int size )
-        {
-            return new Param[ size ];
+        public Param[] newArray(int size) {
+            return new Param[size];
         }
     };
 
-    public int[] getParamInt()
-    {
+    public int[] getParamInt() {
         return paramInt;
     }
 
-    public void setParamInt( int[] paramInt )
-    {
+    public void setParamInt(int[] paramInt) {
         this.paramInt = paramInt;
     }
 
-    public long[] getParamLong()
-    {
+    public long[] getParamLong() {
         return paramLong;
     }
 
-    public void setParamLong( long[] paramLong )
-    {
+    public void setParamLong(long[] paramLong) {
         this.paramLong = paramLong;
     }
 
-    public String[] getParamString()
-    {
+    public String[] getParamString() {
         return paramString;
     }
 
-    public void setParamString( String[] paramString )
-    {
+    public void setParamString(String[] paramString) {
         this.paramString = paramString;
     }
 }
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/mcloudfile/Result.java
index b55087d..1fd603f 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/mcloudfile/Result.java
@@ -20,70 +20,66 @@
  * 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;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class Result implements Parcelable
-{
-    private Error    mcloudError;
-    private String        mcloudDesc;
-    private String        socketCode;
-    private String        httpCode;
-    private String        serverCode;
+public class Result implements Parcelable {
+    private Error mcloudError;
 
-    public Result()
-    {
+    private String mcloudDesc;
+
+    private String socketCode;
+
+    private String httpCode;
+
+    private String serverCode;
+
+    public Result() {
     }
 
-    public Result( Parcel source )
-    {
-        readFromParcel( source );
+    public Result(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the mcloud result entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeInt( mcloudError.ordinal() );
-        dest.writeString( mcloudDesc );
-        dest.writeString( socketCode );
-        dest.writeString( httpCode );
-        dest.writeString( serverCode );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mcloudError.ordinal());
+        dest.writeString(mcloudDesc);
+        dest.writeString(socketCode);
+        dest.writeString(httpCode);
+        dest.writeString(serverCode);
     }
 
     /**
-     * Create the mcloud result entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        mcloudError = Error.valueOf( source.readInt() );
+    public void readFromParcel(Parcel source) {
+        mcloudError = Error.valueOf(source.readInt());
         mcloudDesc = source.readString();
         socketCode = source.readString();
         httpCode = source.readString();
@@ -91,67 +87,55 @@
     }
 
     /** 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 );
+        public Result createFromParcel(Parcel source) {
+            return new Result(source);
         }
 
         @Override
-        public Result[] newArray( int size )
-        {
-            return new Result[ size ];
+        public Result[] newArray(int size) {
+            return new Result[size];
         }
     };
 
-    public Error getMcloudError()
-    {
+    public Error getMcloudError() {
         return mcloudError;
     }
 
-    public void setMcloudError( Error mcloudError )
-    {
+    public void setMcloudError(Error mcloudError) {
         this.mcloudError = mcloudError;
     }
 
-    public String getMcloudDesc()
-    {
+    public String getMcloudDesc() {
         return mcloudDesc;
     }
 
-    public void setMcloudDesc( String mcloudDesc )
-    {
+    public void setMcloudDesc(String mcloudDesc) {
         this.mcloudDesc = mcloudDesc;
     }
 
-    public String getSocketCode()
-    {
+    public String getSocketCode() {
         return socketCode;
     }
 
-    public void setSocketCode( String socketCode )
-    {
+    public void setSocketCode(String socketCode) {
         this.socketCode = socketCode;
     }
 
-    public String getHttpCode()
-    {
+    public String getHttpCode() {
         return httpCode;
     }
 
-    public void setHttpCode( String httpCode )
-    {
+    public void setHttpCode(String httpCode) {
         this.httpCode = httpCode;
     }
 
-    public String getServerCode()
-    {
+    public String getServerCode() {
         return serverCode;
     }
 
-    public void setServerCode( String serverCode )
-    {
+    public void setServerCode(String serverCode) {
         this.serverCode = serverCode;
     }
 }
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/mcloudfile/SdkType.java
index 0b4a368..1d00e94 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/mcloudfile/SdkType.java
@@ -20,6 +20,7 @@
  * 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;
 
 public enum SdkType {
@@ -31,13 +32,11 @@
 
     None;
 
-    public static SdkType valueOf( int ordinal )
-    {
-        if( ordinal < 0 || ordinal >= values().length )
-        {
-            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+    public static SdkType valueOf(int ordinal) {
+        if (ordinal < 0 || ordinal >= values().length) {
+            throw new IndexOutOfBoundsException("Invalid ordinal");
         }
 
-        return values()[ ordinal ];
+        return values()[ordinal];
     }
 }
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/mcloudfile/ShareNode.java
index c2656cf..a11daab 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/mcloudfile/ShareNode.java
@@ -20,6 +20,7 @@
  * 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;
 
 import java.util.Arrays;
@@ -28,253 +29,233 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class ShareNode implements Parcelable
-{
+public class ShareNode implements Parcelable {
     private String url;
+
     private String thumbUrl;
+
     private String createTime;
+
     private String updateTime;
+
     private ShareType type;
+
     private String desc;
+
     private int downloads;
+
     private FileNode[] file;
+
     private ShareNode[] subShares;
+
     private String id;
+
     private boolean isSuccess;
+
     private Order order;
+
     private Map<String, String> fields;
 
-    public ShareNode()
-    {}
+    public ShareNode() {
+    }
 
-    public ShareNode( Parcel source )
-    {
-        readFromParcel( source );
+    public ShareNode(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the configure node entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( url );
-        dest.writeString( thumbUrl );
-        dest.writeString( createTime );
-        dest.writeString( updateTime );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(url);
+        dest.writeString(thumbUrl);
+        dest.writeString(createTime);
+        dest.writeString(updateTime);
         dest.writeInt(type.ordinal());
-        dest.writeString( desc );
+        dest.writeString(desc);
         dest.writeInt(downloads);
         dest.writeParcelableArray(file, flags);
         dest.writeParcelableArray(subShares, flags);
-        dest.writeString( id );
+        dest.writeString(id);
         dest.writeInt(isSuccess ? 1 : 0);
         dest.writeInt(order.ordinal());
-        dest.writeMap( fields );
+        dest.writeMap(fields);
     }
 
     /**
-     * Create the share node entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param source The parcel stream
      */
-    @SuppressWarnings( "unchecked" )
-    public void readFromParcel( Parcel source )
-    {
+    @SuppressWarnings("unchecked")
+    public void readFromParcel(Parcel source) {
         url = source.readString();
         thumbUrl = source.readString();
         createTime = source.readString();
         updateTime = source.readString();
-        type = ShareType.valueOf( source.readInt() );
+        type = ShareType.valueOf(source.readInt());
         desc = source.readString();
         downloads = source.readInt();
-//        file = (FileNode[])source.readParcelableArray( this.getClass().getClassLoader() );
-//        subShares = (ShareNode[])source.readParcelableArray( this.getClass().getClassLoader() );
-        Parcelable[] fileParcelableArray = source.readParcelableArray( this.getClass().getClassLoader() );
-        file = new FileNode[]{};
+        // file = (FileNode[])source.readParcelableArray(
+        // this.getClass().getClassLoader() );
+        // subShares = (ShareNode[])source.readParcelableArray(
+        // this.getClass().getClassLoader() );
+        Parcelable[] fileParcelableArray = source.readParcelableArray(this.getClass()
+                .getClassLoader());
+        file = new FileNode[] {};
         if (fileParcelableArray != null) {
             file = Arrays.copyOf(fileParcelableArray, fileParcelableArray.length, FileNode[].class);
         }
 
-        Parcelable[] subSharesParcelableArray = source.readParcelableArray( this.getClass().getClassLoader() );
-        subShares = new ShareNode[]{};
+        Parcelable[] subSharesParcelableArray = source.readParcelableArray(this.getClass()
+                .getClassLoader());
+        subShares = new ShareNode[] {};
         if (subSharesParcelableArray != null) {
-            subShares = Arrays.copyOf(subSharesParcelableArray, subSharesParcelableArray.length, ShareNode[].class);
+            subShares = Arrays.copyOf(subSharesParcelableArray, subSharesParcelableArray.length,
+                    ShareNode[].class);
         }
         id = source.readString();
         isSuccess = source.readInt() == 1 ? true : false;
         order = Order.valueOf(source.readInt());
-        fields = source.readHashMap( this.getClass().getClassLoader() );
+        fields = source.readHashMap(this.getClass().getClassLoader());
     }
 
     /** 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 );
+        public ShareNode createFromParcel(Parcel source) {
+            return new ShareNode(source);
         }
 
         @Override
-        public ShareNode[] newArray( int size )
-        {
-            return new ShareNode[ size ];
+        public ShareNode[] newArray(int size) {
+            return new ShareNode[size];
         }
     };
 
-    public String getUrl()
-    {
+    public String getUrl() {
         return url;
     }
 
-    public void setUrl( String url )
-    {
+    public void setUrl(String url) {
         this.url = url;
     }
 
-    public String getThumbUrl()
-    {
+    public String getThumbUrl() {
         return thumbUrl;
     }
 
-    public void setThumbUrl( String thumbUrl )
-    {
+    public void setThumbUrl(String thumbUrl) {
         this.thumbUrl = thumbUrl;
     }
 
-    public String getCreateTime()
-    {
+    public String getCreateTime() {
         return createTime;
     }
 
-    public void setCreateTime( String createTime )
-    {
+    public void setCreateTime(String createTime) {
         this.createTime = createTime;
     }
 
-    public String getUpdateTime()
-    {
+    public String getUpdateTime() {
         return updateTime;
     }
 
-    public void setUpdateTime( String updateTime )
-    {
+    public void setUpdateTime(String updateTime) {
         this.updateTime = updateTime;
     }
 
-    public ShareType getType()
-    {
+    public ShareType getType() {
         return type;
     }
 
-    public void setType( ShareType type )
-    {
+    public void setType(ShareType type) {
         this.type = type;
     }
 
-    public String getDesc()
-    {
+    public String getDesc() {
         return desc;
     }
 
-    public void setDesc( String desc )
-    {
+    public void setDesc(String desc) {
         this.desc = desc;
     }
 
-    public int getDownloads()
-    {
+    public int getDownloads() {
         return downloads;
     }
 
-    public void setDownloads( int downloads )
-    {
+    public void setDownloads(int downloads) {
         this.downloads = downloads;
     }
 
-    public FileNode[] getFile()
-    {
+    public FileNode[] getFile() {
         return file;
     }
 
-    public void setFile( FileNode[] file )
-    {
+    public void setFile(FileNode[] file) {
         this.file = file;
     }
 
-    public ShareNode[] getSubShares()
-    {
+    public ShareNode[] getSubShares() {
         return subShares;
     }
 
-    public void setSubShares( ShareNode[] subShares )
-    {
+    public void setSubShares(ShareNode[] subShares) {
         this.subShares = subShares;
     }
 
-    public String getId()
-    {
+    public String getId() {
         return id;
     }
 
-    public void setId( String id )
-    {
+    public void setId(String id) {
         this.id = id;
     }
 
-    public boolean isSuccess()
-    {
+    public boolean isSuccess() {
         return isSuccess;
     }
 
-    public void setSuccess( boolean isSuccess )
-    {
+    public void setSuccess(boolean isSuccess) {
         this.isSuccess = isSuccess;
     }
 
-    public Order getOrder()
-    {
+    public Order getOrder() {
         return order;
     }
 
-    public void setOrder( Order order )
-    {
+    public void setOrder(Order order) {
         this.order = order;
     }
 
-    public Map<String, String> getFields()
-    {
+    public Map<String, String> getFields() {
         return fields;
     }
 
-    public void setFields( Map<String, String> fields )
-    {
+    public void setFields(Map<String, String> fields) {
         this.fields = fields;
     }
 
-    public static enum Order
-    {
+    public static enum Order {
         createTime,
 
         createTime_Reverse,
@@ -287,33 +268,28 @@
 
         Downloads_Reverse;
 
-        public static Order valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static Order valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
-    public static enum ShareType
-    {
+    public static enum ShareType {
         sharedFile,
 
         sharedFolder,
 
         sharedGroup;
 
-        public static ShareType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static ShareType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 }
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/mcloudfile/Status.java
index 382ffbd..f02bde4 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/mcloudfile/Status.java
@@ -20,8 +20,8 @@
  * 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.mcloudfile;
 
 public enum Status {
     waitting,
@@ -38,13 +38,11 @@
 
     failed;
 
-    public static Status valueOf( int ordinal )
-    {
-        if( ordinal < 0 || ordinal >= values().length )
-        {
-            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+    public static Status valueOf(int ordinal) {
+        if (ordinal < 0 || ordinal >= values().length) {
+            throw new IndexOutOfBoundsException("Invalid ordinal");
         }
 
-        return values()[ ordinal ];
+        return values()[ordinal];
     }
 }
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/mcloudfile/TransNode.java
index 2434f5f..c504f2b 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/mcloudfile/TransNode.java
@@ -26,6 +26,7 @@
  * 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.plugin.entity.mcloudfile;
 
 import java.util.Map;
@@ -33,93 +34,103 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class TransNode implements Parcelable
-{
+public class TransNode implements Parcelable {
     private String id;
+
     private long completeSize;
+
     private String url;
+
     private String localPath;
+
     private TransType type;
+
     private FileNode file;
+
     private Status status;
+
     private boolean isSuccess;
+
     private String uploadID;
+
     private String batchID;
+
     private int speed;
+
     private int percent;
+
     private FileNode.FileType mode;
+
     private String param;
+
     private long order;
+
     private Result result;
+
     private Map<String, String> fields;
 
-    public TransNode()
-    {}
+    public TransNode() {
+    }
 
-    public TransNode( Parcel source )
-    {
-        readFromParcel( source );
+    public TransNode(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the mcloud result entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( id );
-        dest.writeString( url );
-        dest.writeString( localPath );
-        dest.writeString( param );
-        dest.writeString( uploadID );
-        dest.writeString( batchID );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(id);
+        dest.writeString(url);
+        dest.writeString(localPath);
+        dest.writeString(param);
+        dest.writeString(uploadID);
+        dest.writeString(batchID);
 
-        dest.writeLong( completeSize );
-        dest.writeLong( order );
-        dest.writeInt( speed );
-        dest.writeInt( percent );
+        dest.writeLong(completeSize);
+        dest.writeLong(order);
+        dest.writeInt(speed);
+        dest.writeInt(percent);
 
-        dest.writeBooleanArray( new boolean[]{ isSuccess } );
+        dest.writeBooleanArray(new boolean[] {
+            isSuccess
+        });
 
-        dest.writeInt( type.ordinal() );
-        dest.writeInt( mode.ordinal() );
-        dest.writeInt( status.ordinal() );
+        dest.writeInt(type.ordinal());
+        dest.writeInt(mode.ordinal());
+        dest.writeInt(status.ordinal());
 
-        dest.writeValue( file );
-        dest.writeValue( result );
+        dest.writeValue(file);
+        dest.writeValue(result);
 
-        dest.writeMap( fields );
+        dest.writeMap(fields);
     }
 
     /**
-     * Create the mcloud result entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param source The parcel stream
      */
-    @SuppressWarnings( "unchecked" )
-    public void readFromParcel( Parcel source )
-    {
+    @SuppressWarnings("unchecked")
+    public void readFromParcel(Parcel source) {
         id = source.readString();
         url = source.readString();
         localPath = source.readString();
@@ -132,205 +143,168 @@
         speed = source.readInt();
         percent = source.readInt();
 
-        isSuccess = source.createBooleanArray()[ 0 ];
+        isSuccess = source.createBooleanArray()[0];
 
-        type = TransType.valueOf( source.readInt() );
-        mode = FileNode.FileType.valueOf( source.readInt() );
-        status = Status.valueOf( source.readInt() );
+        type = TransType.valueOf(source.readInt());
+        mode = FileNode.FileType.valueOf(source.readInt());
+        status = Status.valueOf(source.readInt());
 
-        file = ( FileNode )source.readValue( this.getClass().getClassLoader() );
-        result = ( Result )source.readValue( this.getClass().getClassLoader() );
+        file = (FileNode)source.readValue(this.getClass().getClassLoader());
+        result = (Result)source.readValue(this.getClass().getClassLoader());
 
-        fields = source.readHashMap( this.getClass().getClassLoader() );
+        fields = source.readHashMap(this.getClass().getClassLoader());
     }
 
     /** 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 );
+        public TransNode createFromParcel(Parcel source) {
+            return new TransNode(source);
         }
 
         @Override
-        public TransNode[] newArray( int size )
-        {
-            return new TransNode[ size ];
+        public TransNode[] newArray(int size) {
+            return new TransNode[size];
         }
     };
 
-    public String getId()
-    {
+    public String getId() {
         return id;
     }
 
-    public void setId( String id )
-    {
+    public void setId(String id) {
         this.id = id;
     }
 
-    public long getCompleteSize()
-    {
+    public long getCompleteSize() {
         return completeSize;
     }
 
-    public void setCompleteSize( long completeSize )
-    {
+    public void setCompleteSize(long completeSize) {
         this.completeSize = completeSize;
     }
 
-    public String getUrl()
-    {
+    public String getUrl() {
         return url;
     }
 
-    public void setUrl( String url )
-    {
+    public void setUrl(String url) {
         this.url = url;
     }
 
-    public String getLocalPath()
-    {
+    public String getLocalPath() {
         return localPath;
     }
 
-    public void setLocalPath( String localPath )
-    {
+    public void setLocalPath(String localPath) {
         this.localPath = localPath;
     }
 
-    public TransType getType()
-    {
+    public TransType getType() {
         return type;
     }
 
-    public void setType( TransType type )
-    {
+    public void setType(TransType type) {
         this.type = type;
     }
 
-    public FileNode getFile()
-    {
+    public FileNode getFile() {
         return file;
     }
 
-    public void setFile( FileNode file )
-    {
+    public void setFile(FileNode file) {
         this.file = file;
     }
 
-    public Status getStatus()
-    {
+    public Status getStatus() {
         return status;
     }
 
-    public void setStatus( Status status )
-    {
+    public void setStatus(Status status) {
         this.status = status;
     }
 
-    public boolean isSuccess()
-    {
+    public boolean isSuccess() {
         return isSuccess;
     }
 
-    public void setSuccess( boolean isSuccess )
-    {
+    public void setSuccess(boolean isSuccess) {
         this.isSuccess = isSuccess;
     }
 
-    public String getUploadID()
-    {
+    public String getUploadID() {
         return uploadID;
     }
 
-    public void setUploadID( String uploadID )
-    {
+    public void setUploadID(String uploadID) {
         this.uploadID = uploadID;
     }
 
-    public String getBatchID()
-    {
+    public String getBatchID() {
         return batchID;
     }
 
-    public void setBatchID( String batchID )
-    {
+    public void setBatchID(String batchID) {
         this.batchID = batchID;
     }
 
-    public int getSpeed()
-    {
+    public int getSpeed() {
         return speed;
     }
 
-    public void setSpeed( int speed )
-    {
+    public void setSpeed(int speed) {
         this.speed = speed;
     }
 
-    public int getPercent()
-    {
+    public int getPercent() {
         return percent;
     }
 
-    public void setPercent( int percent )
-    {
+    public void setPercent(int percent) {
         this.percent = percent;
     }
 
-    public FileNode.FileType getMode()
-    {
+    public FileNode.FileType getMode() {
         return mode;
     }
 
-    public void setMode( FileNode.FileType mode )
-    {
+    public void setMode(FileNode.FileType mode) {
         this.mode = mode;
     }
 
-    public String getParam()
-    {
+    public String getParam() {
         return param;
     }
 
-    public void setParam( String param )
-    {
+    public void setParam(String param) {
         this.param = param;
     }
 
-    public long getOrder()
-    {
+    public long getOrder() {
         return order;
     }
 
-    public void setOrder( long order )
-    {
+    public void setOrder(long order) {
         this.order = order;
     }
 
-    public Result getResult()
-    {
+    public Result getResult() {
         return result;
     }
 
-    public void setResult( Result result )
-    {
+    public void setResult(Result result) {
         this.result = result;
     }
 
-    public Map<String, String> getFields()
-    {
+    public Map<String, String> getFields() {
         return fields;
     }
 
-    public void setFields( Map<String, String> fields )
-    {
+    public void setFields(Map<String, String> fields) {
         this.fields = fields;
     }
 
-    public static enum TransOper
-    {
+    public static enum TransOper {
         NEW,
 
         OVER_WRITE,
@@ -339,19 +313,16 @@
 
         GET_INFO;
 
-        public static TransOper valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static TransOper valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
-    public static enum TransType
-    {
+    public static enum TransType {
         UPLOAD,
 
         DOWNLOAD,
@@ -366,14 +337,12 @@
 
         SHOOT;
 
-        public static TransType valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static TransType valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 }
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/mcontact/Auth.java
index fc72ef6..97b3c89 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/mcontact/Auth.java
@@ -20,46 +20,70 @@
  * 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;
 
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class Auth implements Parcelable{
+public class Auth implements Parcelable {
 
     private String username;
+
     private String session;
+
     private String userId;
+
     private String sessionkey;
+
     private String message;
+
     private String imei;
+
     private String deviceId;
+
     private String token;
+
     private String version;
+
     private String mContact_session;
+
     private boolean enableSync;
+
     private boolean isAutoSync;
+
     private String syncSn;
+
     private String aoiToken;
+
     private String contactUserId;
+
     private boolean isLocalIntent;
+
     private String channelId;
+
     private boolean isThirdPart = false;
+
     private int error_code;
+
     private String error_message;
+
     private String syncFrequency;
+
     private int result_code;
 
-    public Auth(){}
+    public Auth() {
+    }
 
-    public Auth(Parcel source){
-        readFromParcel( source );
+    public Auth(Parcel source) {
+        readFromParcel(source);
     }
 
     @Override
     public int describeContents() {
         return 0;
     }
+
     @Override
     public void writeToParcel(Parcel paramParcel, int paramInt) {
         paramParcel.writeString(this.username);
@@ -86,7 +110,7 @@
         paramParcel.writeInt(this.result_code);
     }
 
-    public void readFromParcel( Parcel paramParcel ){
+    public void readFromParcel(Parcel paramParcel) {
         String str1 = paramParcel.readString();
         setUsername(str1);
         String str2 = paramParcel.readString();
@@ -134,149 +158,190 @@
     }
 
     /** 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 );
+        public Auth createFromParcel(Parcel source) {
+            return new Auth(source);
         }
 
         @Override
-        public Auth[] newArray( int size )
-        {
-            return new Auth[ size ];
+        public Auth[] newArray(int size) {
+            return new Auth[size];
         }
     };
 
     public String getUsername() {
         return username;
     }
+
     public void setUsername(String username) {
         this.username = username;
     }
+
     public String getSession() {
         return session;
     }
+
     public void setSession(String session) {
         this.session = session;
     }
+
     public String getUserId() {
         return userId;
     }
+
     public void setUserId(String userId) {
         this.userId = userId;
     }
+
     public String getSessionkey() {
         return sessionkey;
     }
+
     public void setSessionkey(String sessionkey) {
         this.sessionkey = sessionkey;
     }
+
     public String getMessage() {
         return message;
     }
+
     public void setMessage(String message) {
         this.message = message;
     }
+
     public String getImei() {
         return imei;
     }
+
     public void setImei(String imei) {
         this.imei = imei;
     }
+
     public String getDeviceId() {
         return deviceId;
     }
+
     public void setDeviceId(String deviceId) {
         this.deviceId = deviceId;
     }
+
     public String getToken() {
         return token;
     }
+
     public void setToken(String token) {
         this.token = token;
     }
+
     public String getVersion() {
         return version;
     }
+
     public void setVersion(String version) {
         this.version = version;
     }
+
     public String getmContact_session() {
         return mContact_session;
     }
+
     public void setmContact_session(String mContact_session) {
         this.mContact_session = mContact_session;
     }
+
     public boolean isEnableSync() {
         return enableSync;
     }
+
     public void setEnableSync(boolean enableSync) {
         this.enableSync = enableSync;
     }
+
     public boolean isAutoSync() {
         return isAutoSync;
     }
+
     public void setAutoSync(boolean isAutoSync) {
         this.isAutoSync = isAutoSync;
     }
+
     public String getSyncSn() {
         return syncSn;
     }
+
     public void setSyncSn(String syncSn) {
         this.syncSn = syncSn;
     }
+
     public String getAoiToken() {
         return aoiToken;
     }
+
     public void setAoiToken(String aoiToken) {
         this.aoiToken = aoiToken;
     }
+
     public String getContactUserId() {
         return contactUserId;
     }
+
     public void setContactUserId(String contactUserId) {
         this.contactUserId = contactUserId;
     }
+
     public boolean isLocalIntent() {
         return isLocalIntent;
     }
+
     public void setLocalIntent(boolean isLocalIntent) {
         this.isLocalIntent = isLocalIntent;
     }
+
     public String getChannelId() {
         return channelId;
     }
+
     public void setChannelId(String channelId) {
         this.channelId = channelId;
     }
+
     public boolean isThirdPart() {
         return isThirdPart;
     }
+
     public void setThirdPart(boolean isThirdPart) {
         this.isThirdPart = isThirdPart;
     }
+
     public int getError_code() {
         return error_code;
     }
+
     public void setError_code(int error_code) {
         this.error_code = error_code;
     }
+
     public String getError_message() {
         return error_message;
     }
+
     public void setError_message(String error_message) {
         this.error_message = error_message;
     }
+
     public String getSyncFrequency() {
         return syncFrequency;
     }
+
     public void setSyncFrequency(String syncFrequency) {
         this.syncFrequency = syncFrequency;
     }
+
     public int getResult_code() {
         return result_code;
     }
+
     public void setResult_code(int result_code) {
         this.result_code = result_code;
     }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/ContactAction.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/mcontact/ContactAction.java
index c811064..228bcb9 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/mcontact/ContactAction.java
@@ -20,29 +20,23 @@
  * 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;
 
-
 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
      */
-    public static ContactAction valueOf( int ordinal )
-    {
-        if( ordinal < 0 || ordinal >= values().length )
-        {
-            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+    public static ContactAction valueOf(int ordinal) {
+        if (ordinal < 0 || ordinal >= values().length) {
+            throw new IndexOutOfBoundsException("Invalid ordinal");
         }
 
-        return values()[ ordinal ];
+        return values()[ordinal];
     }
 }
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/mcontact/IntervalAction.java
index 21468c8..8d7a39f 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/mcontact/IntervalAction.java
@@ -20,27 +20,23 @@
  * 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;
 
 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
      */
-    public static IntervalAction valueOf( int ordinal )
-    {
-        if( ordinal < 0 || ordinal >= values().length )
-        {
-            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+    public static IntervalAction valueOf(int ordinal) {
+        if (ordinal < 0 || ordinal >= values().length) {
+            throw new IndexOutOfBoundsException("Invalid ordinal");
         }
 
-        return values()[ ordinal ];
+        return values()[ordinal];
     }
 }
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/mcontact/SyncAction.java
index 74762cc..2da3d5b 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/mcontact/SyncAction.java
@@ -20,27 +20,23 @@
  * 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;
 
 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
      */
-    public static SyncAction valueOf( int ordinal )
-    {
-        if( ordinal < 0 || ordinal >= values().length )
-        {
-            throw new IndexOutOfBoundsException( "Invalid ordinal" );
+    public static SyncAction valueOf(int ordinal) {
+        if (ordinal < 0 || ordinal >= values().length) {
+            throw new IndexOutOfBoundsException("Invalid ordinal");
         }
 
-        return values()[ ordinal ];
+        return values()[ordinal];
     }
 }
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 e3e44c4..7603001 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
@@ -20,6 +20,7 @@
  * 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.profile;
 
 import java.io.Serializable;
@@ -30,140 +31,136 @@
 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>
- *
+ * <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
-{
+public class Avatar extends BaseModel implements Parcelable, Serializable {
     private static final long serialVersionUID = -47856440160432L;
 
     /** The avatar image type. */
-    private IMAGE_TYPE    avatarImgType    = IMAGE_TYPE.PNG;
+    private IMAGE_TYPE avatarImgType = IMAGE_TYPE.PNG;
 
     /** The image encoding. */
-    private String        imgEncoding        = "BASE64";
+    private String imgEncoding = "BASE64";
 
     /** The image base64 str. */
-    private String        imgBase64Str;
+    private String imgBase64Str;
 
     /**
      * Instantiates a new avatar.
      */
-    public Avatar()
-    {}
+    public Avatar() {
+    }
 
     /**
      * Instantiates a new avatar.
-     *
+     * 
      * @param source the source
      */
-    public Avatar( Parcel source )
-    {
-        readFromParcel( source );
+    public Avatar(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the avatar entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
+     * Write the avatar entity to parcel stream. Pay attention to read and write
+     * variables variables sequence should be consistent or not the correct
+     * results
+     * 
      * @param dest the dest
      * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        super.writeToParcel( dest, flags );
-        dest.writeInt( avatarImgType.ordinal() );
-        dest.writeString( imgEncoding );
-        dest.writeString( imgBase64Str );
+    public void writeToParcel(Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeInt(avatarImgType.ordinal());
+        dest.writeString(imgEncoding);
+        dest.writeString(imgBase64Str);
     }
 
     /**
      * Create the avatar entity from parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        super.readFromParcel( source );
-        avatarImgType = IMAGE_TYPE.valueOf( source.readInt() );
+    public void readFromParcel(Parcel source) {
+        super.readFromParcel(source);
+        avatarImgType = IMAGE_TYPE.valueOf(source.readInt());
         imgEncoding = source.readString();
         imgBase64Str = source.readString();
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<Avatar>    CREATOR    = new Parcelable.Creator<Avatar>() {
+    public static final Parcelable.Creator<Avatar> CREATOR = new Parcelable.Creator<Avatar>() {
         @Override
-        public Avatar createFromParcel( Parcel source )
-        {
-            return new Avatar( source );
+        public Avatar createFromParcel(Parcel source) {
+            return new Avatar(source);
         }
 
         @Override
-        public Avatar[] newArray( int size )
-        {
-            return new Avatar[ size ];
+        public Avatar[] newArray(int size) {
+            return new Avatar[size];
         }
     };
 
     /**
      * Gets the avatar image type.
-     *
+     * 
      * @return the avatar image type
      */
-    public IMAGE_TYPE getAvatarImgType()
-    {
+    public IMAGE_TYPE getAvatarImgType() {
         return avatarImgType;
     }
 
     /**
      * Sets the avatar image type.
-     *
+     * 
      * @param avatarImgType the new avatar image type
      */
-    public void setAvatarImgType( IMAGE_TYPE avatarImgType )
-    {
+    public void setAvatarImgType(IMAGE_TYPE avatarImgType) {
         this.avatarImgType = avatarImgType;
     }
 
     /**
      * Gets the image base64 string.
-     *
+     * 
      * @return the image base64 string
      */
-    public String getImgBase64Str()
-    {
+    public String getImgBase64Str() {
         return imgBase64Str;
     }
 
     /**
      * Sets the image base64 string.
-     *
+     * 
      * @param imgBase64Str the new image base64 string
      */
-    public void setImgBase64Str( String imgBase64Str )
-    {
+    public void setImgBase64Str(String imgBase64Str) {
         this.imgBase64Str = imgBase64Str;
     }
 
@@ -173,26 +170,23 @@
     public static enum IMAGE_TYPE {
         PNG, JPG, GIF;
 
-        public static IMAGE_TYPE valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static IMAGE_TYPE valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
 
-
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
-        list.add("avatarImgType="+ this.avatarImgType);
-        list.add("account="+getAccount());
+        list.add("avatarImgType=" + this.avatarImgType);
+        list.add("account=" + getAccount());
         list.add("etag=" + getEtag());
-        list.add("imgEncoding="+ this.imgEncoding);
-        list.add("imgBase64Str="+ this.imgBase64Str);
+        list.add("imgEncoding=" + this.imgEncoding);
+        list.add("imgBase64Str=" + this.imgBase64Str);
 
         return list.toString();
     }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/BaseModel.java
index 0c44c41..a6b53f3 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
@@ -20,6 +20,7 @@
  * 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.profile;
 
 import java.io.Serializable;
@@ -30,98 +31,101 @@
 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>
- *
+ * <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
-{
+public class BaseModel implements Parcelable, Serializable {
 
     private static final long serialVersionUID = -1599075631882399753L;
 
     /** The account. */
-    private String    account;
+    private String account;
 
     /** The etag. */
-    private String    etag;
-    public BaseModel(){
+    private String etag;
+
+    public BaseModel() {
 
     }
+
     /**
      * Instantiates a new BaseModel.
-     *
+     * 
      * @param source the source
      */
-    public BaseModel( Parcel source )
-    {
-        readFromParcel( source );
+    public BaseModel(Parcel source) {
+        readFromParcel(source);
     }
+
     @Override
     public void writeToParcel(Parcel dest, int arg1) {
-        dest.writeString( account );
-        dest.writeString( etag );
+        dest.writeString(account);
+        dest.writeString(etag);
     }
 
     /**
      * Read from parcel.
-     *
+     * 
      * @param source the source parcel
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         account = source.readString();
         etag = source.readString();
     }
 
     /**
      * Gets the account.
-     *
+     * 
      * @return the account
      */
-    public String getAccount()
-    {
+    public String getAccount() {
         return account;
     }
 
     /**
      * Sets the account.
-     *
+     * 
      * @param account the new account
      */
-    public void setAccount( String account )
-    {
+    public void setAccount(String account) {
         this.account = account;
     }
 
     /**
      * Gets the etag.
-     *
+     * 
      * @return the etag
      */
-    public String getEtag()
-    {
+    public String getEtag() {
         return etag;
     }
 
     /**
      * Sets the etag.
-     *
+     * 
      * @param etag the new etag
      */
-    public void setEtag( String etag )
-    {
+    public void setEtag(String etag) {
         this.etag = etag;
     }
 
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
-        list.add("account="+this.account);
+        list.add("account=" + this.account);
         list.add("etag=" + this.etag);
         return list.toString();
     }
@@ -132,17 +136,15 @@
     }
 
     /** 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 );
+        public BaseModel createFromParcel(Parcel source) {
+            return new BaseModel(source);
         }
 
         @Override
-        public BaseModel[] newArray( int size )
-        {
-            return new BaseModel[ size ];
+        public BaseModel[] newArray(int size) {
+            return new BaseModel[size];
         }
     };
 
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 c582e4c..8066850 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
@@ -20,6 +20,7 @@
  * 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.profile;
 
 import java.util.ArrayList;
@@ -29,32 +30,30 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class OtherTels implements Parcelable
-{
-    //private String                    homeTel;
+public class OtherTels implements Parcelable {
+    // private String homeTel;
 
-    //private String                    mobilePhone;
+    // private String mobilePhone;
 
-    //private String                    fixedTel;
+    // private String fixedTel;
 
-    private HashMap<String, String>    otherTels    ;
+    private HashMap<String, String> otherTels;
 
-    public OtherTels()
-    {otherTels = new HashMap<String, String>();}
+    public OtherTels() {
+        otherTels = new HashMap<String, String>();
+    }
 
-    public OtherTels( Parcel source )
-    {
-        readFromParcel( source );
+    public OtherTels(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -62,99 +61,69 @@
      * 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
+     * 
+     * @param dest the dest
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        //dest.writeString( homeTel );
-        //dest.writeString( mobilePhone );
-        //dest.writeString( fixedTel );
-        dest.writeMap( otherTels );
+    public void writeToParcel(Parcel dest, int flags) {
+        // dest.writeString( homeTel );
+        // dest.writeString( mobilePhone );
+        // dest.writeString( fixedTel );
+        dest.writeMap(otherTels);
     }
 
     /**
      * Create the avatar entity from parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    @SuppressWarnings( "unchecked" )
-    public void readFromParcel( Parcel source )
-    {
-        //homeTel = source.readString();
-        //mobilePhone = source.readString();
-        //fixedTel = source.readString();
+    @SuppressWarnings("unchecked")
+    public void readFromParcel(Parcel source) {
+        // homeTel = source.readString();
+        // mobilePhone = source.readString();
+        // fixedTel = source.readString();
         source.readMap(otherTels, this.getClass().getClassLoader());
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<OtherTels>    CREATOR    = new Parcelable.Creator<OtherTels>() {
+    public static final Parcelable.Creator<OtherTels> CREATOR = new Parcelable.Creator<OtherTels>() {
         @Override
-        public OtherTels createFromParcel( Parcel source )
-        {
-            return new OtherTels( source );
+        public OtherTels createFromParcel(Parcel source) {
+            return new OtherTels(source);
         }
 
         @Override
-        public OtherTels[] newArray( int size )
-        {
-            return new OtherTels[ size ];
+        public OtherTels[] newArray(int size) {
+            return new OtherTels[size];
         }
     };
-/*
-    public String getHomeTel()
-    {
-        return homeTel;
-    }
 
-    public void setHomeTel( String homeTel )
-    {
-        this.homeTel = homeTel;
-    }
-
-    public String getMobilePhone()
-    {
-        return mobilePhone;
-    }
-
-    public void setMobilePhone( String mobilePhone )
-    {
-        this.mobilePhone = mobilePhone;
-    }
-
-    public String getFixedTel()
-    {
-        return fixedTel;
-    }
-
-    public void setFixedTel( String fixedTel )
-    {
-        this.fixedTel = fixedTel;
-    }
-*/
-    public HashMap<String, String> getOtherTels()
-    {
+    /*
+     * public String getHomeTel() { return homeTel; } public void setHomeTel(
+     * String homeTel ) { this.homeTel = homeTel; } public String
+     * getMobilePhone() { return mobilePhone; } public void setMobilePhone(
+     * String mobilePhone ) { this.mobilePhone = mobilePhone; } public String
+     * getFixedTel() { return fixedTel; } public void setFixedTel( String
+     * fixedTel ) { this.fixedTel = fixedTel; }
+     */
+    public HashMap<String, String> getOtherTels() {
         return otherTels;
     }
 
-    public void setOtherTels( HashMap<String, String> otherTels )
-    {
+    public void setOtherTels(HashMap<String, String> otherTels) {
         this.otherTels = otherTels;
     }
+
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
-        //list.add("homeTel="+ this.homeTel);
-        //list.add("mobilePhone="+ this.mobilePhone);
-        //list.add("fixedTel="+ this.fixedTel);
-        list.add("otherTels="+otherTels);
+        // list.add("homeTel="+ this.homeTel);
+        // list.add("mobilePhone="+ this.mobilePhone);
+        // list.add("fixedTel="+ this.fixedTel);
+        list.add("otherTels=" + otherTels);
         return list.toString();
     }
 }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/Profile.java
index 098a3c8..842fec5 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
@@ -20,6 +20,7 @@
  * 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.profile;
 
 import java.io.Serializable;
@@ -31,16 +32,24 @@
 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>.
- *
+ * <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
-{
+public class Profile extends BaseModel implements Parcelable, Serializable {
 
     /** The Constant serialVersionUID. */
     private static final long serialVersionUID = -8351378268771321120L;
@@ -48,60 +57,58 @@
     /** The home address. */
     private String homeAddress;
 
-      /** The email. */
-      private String email;
+    /** The email. */
+    private String email;
 
-      /** The birthday. */
-      private String birthday;
+    /** The birthday. */
+    private String birthday;
 
-      /** The company name. */
-      private String companyName;
+    /** The company name. */
+    private String companyName;
 
-      /** The company duty. */
-      private String companyDuty;
+    /** The company duty. */
+    private String companyDuty;
 
-      /** The company tel. */
-      private String companyTel;
+    /** The company tel. */
+    private String companyTel;
 
-      /** The company address. */
-      private String companyAddress;
+    /** The company address. */
+    private String companyAddress;
 
-      /** The company fax. */
-      private String companyFax;
+    /** The company fax. */
+    private String companyFax;
 
-      /** The first name. */
-      private String firstName;
+    /** The first name. */
+    private String firstName;
 
-      /** The last name. */
-      private String lastName;
+    /** The last name. */
+    private String lastName;
 
-      /** The other tels. */
-      private ArrayList<TelephoneModel> otherTels;
+    /** The other tels. */
+    private ArrayList<TelephoneModel> otherTels;
 
-      /**
-       * Instantiates a new profile.
-       */
-      public Profile()
-      {}
+    /**
+     * Instantiates a new profile.
+     */
+    public Profile() {
+    }
 
-      /**
-       * Instantiates a new profile.
-       *
-       * @param source the source
-       */
-      public Profile( Parcel source )
-      {
-          readFromParcel( source );
-      }
+    /**
+     * Instantiates a new profile.
+     * 
+     * @param source the source
+     */
+    public Profile(Parcel source) {
+        readFromParcel(source);
+    }
 
-      /**
+    /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -109,24 +116,23 @@
      * Write the profile entity to parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
+     * 
      * @param dest the dest
      * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        super.writeToParcel( dest,flags );
-        dest.writeString( homeAddress );
-        dest.writeString( email );
-        dest.writeString( birthday );
-        dest.writeString( companyName );
-        dest.writeString( companyDuty );
-        dest.writeString( companyTel );
-        dest.writeString( companyAddress );
-        dest.writeString( companyFax );
-        dest.writeString( this.firstName );
-        dest.writeString( this.lastName );
+    public void writeToParcel(Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeString(homeAddress);
+        dest.writeString(email);
+        dest.writeString(birthday);
+        dest.writeString(companyName);
+        dest.writeString(companyDuty);
+        dest.writeString(companyTel);
+        dest.writeString(companyAddress);
+        dest.writeString(companyFax);
+        dest.writeString(this.firstName);
+        dest.writeString(this.lastName);
         dest.writeList(otherTels);
     }
 
@@ -134,13 +140,11 @@
      * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        super.readFromParcel( source );
+    public void readFromParcel(Parcel source) {
+        super.readFromParcel(source);
         homeAddress = source.readString();
         email = source.readString();
         birthday = source.readString();
@@ -157,185 +161,165 @@
     }
 
     /** 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 );
+        public Profile createFromParcel(Parcel source) {
+            return new Profile(source);
         }
 
         @Override
-        public Profile[] newArray( int size )
-        {
-            return new Profile[ size ];
+        public Profile[] newArray(int size) {
+            return new Profile[size];
         }
     };
 
     /**
      * Gets the home address.
-     *
+     * 
      * @return the home address
      */
-    public String getHomeAddress()
-    {
+    public String getHomeAddress() {
         return homeAddress;
     }
 
     /**
      * Sets the home address.
-     *
+     * 
      * @param homeAddress the new home address
      */
-    public void setHomeAddress( String homeAddress )
-    {
+    public void setHomeAddress(String homeAddress) {
         this.homeAddress = homeAddress;
     }
 
     /**
      * Gets the email.
-     *
+     * 
      * @return the email
      */
-    public String getEmail()
-    {
+    public String getEmail() {
         return email;
     }
 
     /**
      * Sets the email.
-     *
+     * 
      * @param email the new email
      */
-    public void setEmail( String email )
-    {
+    public void setEmail(String email) {
         this.email = email;
     }
 
     /**
      * Gets the birthday.
-     *
+     * 
      * @return the birthday
      */
-    public String getBirthday()
-    {
+    public String getBirthday() {
         return birthday;
     }
 
     /**
      * Sets the birthday.
-     *
+     * 
      * @param birthday the new birthday
      */
-    public void setBirthday( String birthday )
-    {
+    public void setBirthday(String birthday) {
         this.birthday = birthday;
     }
 
     /**
      * Gets the company name.
-     *
+     * 
      * @return the company name
      */
-    public String getCompanyName()
-    {
+    public String getCompanyName() {
         return companyName;
     }
 
     /**
      * Sets the company name.
-     *
+     * 
      * @param companyName the new company name
      */
-    public void setCompanyName( String companyName )
-    {
+    public void setCompanyName(String companyName) {
         this.companyName = companyName;
     }
 
     /**
      * Gets the company duty.
-     *
+     * 
      * @return the company duty
      */
-    public String getCompanyDuty()
-    {
+    public String getCompanyDuty() {
         return companyDuty;
     }
 
     /**
      * Sets the company duty.
-     *
+     * 
      * @param companyDuty the new company duty
      */
-    public void setCompanyDuty( String companyDuty )
-    {
+    public void setCompanyDuty(String companyDuty) {
         this.companyDuty = companyDuty;
     }
 
     /**
      * Gets the company tel.
-     *
+     * 
      * @return the company tel
      */
-    public String getCompanyTel()
-    {
+    public String getCompanyTel() {
         return companyTel;
     }
 
     /**
      * Sets the company tel.
-     *
+     * 
      * @param companyTel the new company tel
      */
-    public void setCompanyTel( String companyTel )
-    {
+    public void setCompanyTel(String companyTel) {
         this.companyTel = companyTel;
     }
 
     /**
      * Gets the company address.
-     *
+     * 
      * @return the company address
      */
-    public String getCompanyAddress()
-    {
+    public String getCompanyAddress() {
         return companyAddress;
     }
 
     /**
      * Sets the company address.
-     *
+     * 
      * @param companyAddress the new company address
      */
-    public void setCompanyAddress( String companyAddress )
-    {
+    public void setCompanyAddress(String companyAddress) {
         this.companyAddress = companyAddress;
     }
 
     /**
      * Gets the company fax.
-     *
+     * 
      * @return the company fax
      */
-    public String getCompanyFax()
-    {
+    public String getCompanyFax() {
         return companyFax;
     }
 
     /**
      * Sets the company fax.
-     *
+     * 
      * @param companyFax the new company fax
      */
-    public void setCompanyFax( String companyFax )
-    {
+    public void setCompanyFax(String companyFax) {
         this.companyFax = companyFax;
     }
 
-
-
     /**
      * Gets the first name.
-     *
+     * 
      * @return the first name
      */
     public String getFirstName() {
@@ -344,7 +328,7 @@
 
     /**
      * Sets the first name.
-     *
+     * 
      * @param firstName the new first name
      */
     public void setFirstName(String firstName) {
@@ -353,7 +337,7 @@
 
     /**
      * Gets the last name.
-     *
+     * 
      * @return the last name
      */
     public String getLastName() {
@@ -362,7 +346,7 @@
 
     /**
      * Combine the first name and the last name.
-     *
+     * 
      * @return displayName
      */
     public String getDisplayName() {
@@ -413,7 +397,7 @@
 
     /**
      * Sets the last name.
-     *
+     * 
      * @param lastName the new last name
      */
     public void setLastName(String lastName) {
@@ -422,11 +406,11 @@
 
     /**
      * Gets the other tels.
-     *
+     * 
      * @return the other tels
      */
     public ArrayList<TelephoneModel> getOtherTels() {
-        if(otherTels == null){
+        if (otherTels == null) {
             return new ArrayList<TelephoneModel>();
         }
         return otherTels;
@@ -434,7 +418,7 @@
 
     /**
      * Sets the other tels.
-     *
+     * 
      * @param otherTels the new other tels
      */
     public void setOtherTels(ArrayList<TelephoneModel> otherTels) {
@@ -442,23 +426,24 @@
     }
 
     /*
-     * @see com.suntek.mway.rcs.client.api.plugin.entity.profile.BaseModel#toString()
+     * @see
+     * com.suntek.mway.rcs.client.api.plugin.entity.profile.BaseModel#toString()
      */
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
-        list.add("homeAddress="+ this.homeAddress);
-        list.add("email="+ this.email);
-        list.add("birthday="+ this.birthday);
-        list.add("companyName="+ this.companyName);
-        list.add("companyDuty="+ this.companyDuty);
-        list.add("companyTel="+ this.companyTel);
-        list.add("companyAddress="+ this.companyAddress);
-        list.add("companyFax="+ this.companyFax);
-        list.add("firstName="+ this.firstName);
-        list.add("lastName="+ this.lastName);
-        list.add("otherTels="+ (this.otherTels == null ? null : this.otherTels.toString()));
-        list.add("account="+getAccount());
+        list.add("homeAddress=" + this.homeAddress);
+        list.add("email=" + this.email);
+        list.add("birthday=" + this.birthday);
+        list.add("companyName=" + this.companyName);
+        list.add("companyDuty=" + this.companyDuty);
+        list.add("companyTel=" + this.companyTel);
+        list.add("companyAddress=" + this.companyAddress);
+        list.add("companyFax=" + this.companyFax);
+        list.add("firstName=" + this.firstName);
+        list.add("lastName=" + this.lastName);
+        list.add("otherTels=" + (this.otherTels == null ? null : this.otherTels.toString()));
+        list.add("account=" + getAccount());
         list.add("etag=" + getEtag());
         return list.toString();
     }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/ProfileName.java
index f31cfd6..99af83c 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
@@ -20,6 +20,7 @@
  * 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.profile;
 
 import java.util.ArrayList;
@@ -28,189 +29,166 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class ProfileName implements Parcelable
-{
-      private String displayName = null;
+public class ProfileName implements Parcelable {
+    private String displayName = null;
 
-      private String nickName = null;
+    private String nickName = null;
 
-      private String familyName = null;
+    private String familyName = null;
 
-      private String firstName = null;
+    private String firstName = null;
 
-      private String givenName = null;
+    private String givenName = null;
 
-      private String middleName = null;
+    private String middleName = null;
 
-      private String nameSuffix = null;
+    private String nameSuffix = null;
 
-      private String namePrefix = null;
+    private String namePrefix = null;
 
-      public ProfileName()
-      {}
+    public ProfileName() {
+    }
 
-      public ProfileName( Parcel source )
-      {
-          readFromParcel( source );
-      }
+    public ProfileName(Parcel source) {
+        readFromParcel(source);
+    }
 
-      /**
+    /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the avatar entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
+     * Write the avatar entity to parcel stream. Pay attention to read and write
+     * variables variables sequence should be consistent or not the correct
+     * results
+     * 
      * @param dest the dest
      * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-          dest.writeString( displayName );
-          dest.writeString( nickName );
-          dest.writeString( familyName );
-          dest.writeString( firstName );
-          dest.writeString( givenName );
-          dest.writeString( middleName );
-          dest.writeString( nameSuffix );
-          dest.writeString( namePrefix );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(displayName);
+        dest.writeString(nickName);
+        dest.writeString(familyName);
+        dest.writeString(firstName);
+        dest.writeString(givenName);
+        dest.writeString(middleName);
+        dest.writeString(nameSuffix);
+        dest.writeString(namePrefix);
     }
 
     /**
      * Create the avatar entity from parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-          displayName = source.readString();
-          nickName = source.readString();
-          familyName = source.readString();
-          firstName = source.readString();
-          givenName = source.readString();
-          middleName = source.readString();
-          nameSuffix = source.readString();
-          namePrefix = source.readString();
+    public void readFromParcel(Parcel source) {
+        displayName = source.readString();
+        nickName = source.readString();
+        familyName = source.readString();
+        firstName = source.readString();
+        givenName = source.readString();
+        middleName = source.readString();
+        nameSuffix = source.readString();
+        namePrefix = source.readString();
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<ProfileName>    CREATOR    = new Parcelable.Creator<ProfileName>() {
+    public static final Parcelable.Creator<ProfileName> CREATOR = new Parcelable.Creator<ProfileName>() {
         @Override
-        public ProfileName createFromParcel( Parcel source )
-        {
-            return new ProfileName( source );
+        public ProfileName createFromParcel(Parcel source) {
+            return new ProfileName(source);
         }
 
         @Override
-        public ProfileName[] newArray( int size )
-        {
-            return new ProfileName[ size ];
+        public ProfileName[] newArray(int size) {
+            return new ProfileName[size];
         }
     };
 
-    public String getDisplayName()
-    {
+    public String getDisplayName() {
         return displayName;
     }
 
-    public void setDisplayName( String displayName )
-    {
+    public void setDisplayName(String displayName) {
         this.displayName = displayName;
     }
 
-    public String getNickName()
-    {
+    public String getNickName() {
         return nickName;
     }
 
-    public void setNickName( String nickName )
-    {
+    public void setNickName(String nickName) {
         this.nickName = nickName;
     }
 
-    public String getFamilyName()
-    {
+    public String getFamilyName() {
         return familyName;
     }
 
-    public void setFamilyName( String familyName )
-    {
+    public void setFamilyName(String familyName) {
         this.familyName = familyName;
     }
 
-    public String getFirstName()
-    {
+    public String getFirstName() {
         return firstName;
     }
 
-    public void setFirstName( String firstName )
-    {
+    public void setFirstName(String firstName) {
         this.firstName = firstName;
     }
 
-    public String getGivenName()
-    {
+    public String getGivenName() {
         return givenName;
     }
 
-    public void setGivenName( String givenName )
-    {
+    public void setGivenName(String givenName) {
         this.givenName = givenName;
     }
 
-    public String getMiddleName()
-    {
+    public String getMiddleName() {
         return middleName;
     }
 
-    public void setMiddleName( String middleName )
-    {
+    public void setMiddleName(String middleName) {
         this.middleName = middleName;
     }
 
-    public String getNameSuffix()
-    {
+    public String getNameSuffix() {
         return nameSuffix;
     }
 
-    public void setNameSuffix( String nameSuffix )
-    {
+    public void setNameSuffix(String nameSuffix) {
         this.nameSuffix = nameSuffix;
     }
 
-    public String getNamePrefix()
-    {
+    public String getNamePrefix() {
         return namePrefix;
     }
 
-    public void setNamePrefix( String namePrefix )
-    {
+    public void setNamePrefix(String namePrefix) {
         this.namePrefix = namePrefix;
     }
+
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
-        list.add("displayName="+ this.displayName);
-        list.add("nickName="+ this.nickName);
-        list.add("familyName="+ this.familyName);
-        list.add("firstName="+ this.firstName);
-        list.add("givenName="+ this.givenName);
-        list.add("middleName="+ this.middleName);
-        list.add("nameSuffix="+ this.nameSuffix);
-        list.add("namePrefix="+ this.namePrefix);
+        list.add("displayName=" + this.displayName);
+        list.add("nickName=" + this.nickName);
+        list.add("familyName=" + this.familyName);
+        list.add("firstName=" + this.firstName);
+        list.add("givenName=" + this.givenName);
+        list.add("middleName=" + this.middleName);
+        list.add("nameSuffix=" + this.nameSuffix);
+        list.add("namePrefix=" + this.namePrefix);
         return list.toString();
     }
 }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardBusinessFlag.java
index d6529ff..2ab0bb1 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
@@ -20,6 +20,7 @@
  * 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.profile;
 
 import java.util.ArrayList;
@@ -28,91 +29,82 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class QRCardBusinessFlag extends BaseModel implements Parcelable
-{
+public class QRCardBusinessFlag extends BaseModel implements Parcelable {
     private boolean businessFlag;
 
-    public QRCardBusinessFlag()
-    {}
+    public QRCardBusinessFlag() {
+    }
 
-    public QRCardBusinessFlag( Parcel source )
-    {
-        readFromParcel( source );
+    public QRCardBusinessFlag(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the qr card business flag entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
-     * @param dest
-     *            the dest
-     * @param flags
-     *            the flags
+     * Write the qr card business flag entity to parcel stream. Pay attention to
+     * read and write variables variables sequence should be consistent or not
+     * the correct results
+     * 
+     * @param dest the dest
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        super.writeToParcel( dest,flags );
-        dest.writeBooleanArray( new boolean[]{ businessFlag } );
+    public void writeToParcel(Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeBooleanArray(new boolean[] {
+            businessFlag
+        });
     }
 
     /**
-     * Create the qr card business flag entity from parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
-     * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * Create the qr card business flag entity from parcel stream. Pay attention
+     * to read and write variables variables sequence should be consistent or
+     * not the correct results
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        super.readFromParcel( source );
-        boolean[] val = new boolean[ 1 ];
-        source.readBooleanArray( val );
-        businessFlag = val[ 0 ];
+    public void readFromParcel(Parcel source) {
+        super.readFromParcel(source);
+        boolean[] val = new boolean[1];
+        source.readBooleanArray(val);
+        businessFlag = val[0];
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<QRCardBusinessFlag>    CREATOR    = new Parcelable.Creator<QRCardBusinessFlag>() {
+    public static final Parcelable.Creator<QRCardBusinessFlag> CREATOR = new Parcelable.Creator<QRCardBusinessFlag>() {
         @Override
-        public QRCardBusinessFlag createFromParcel( Parcel source )
-        {
-            return new QRCardBusinessFlag( source );
+        public QRCardBusinessFlag createFromParcel(Parcel source) {
+            return new QRCardBusinessFlag(source);
         }
 
         @Override
-        public QRCardBusinessFlag[] newArray( int size )
-        {
-            return new QRCardBusinessFlag[ size ];
+        public QRCardBusinessFlag[] newArray(int size) {
+            return new QRCardBusinessFlag[size];
         }
     };
 
-    public boolean isBusinessFlag()
-    {
+    public boolean isBusinessFlag() {
         return businessFlag;
     }
 
-    public void setBusinessFlag( boolean businessFlag )
-    {
+    public void setBusinessFlag(boolean businessFlag) {
         this.businessFlag = businessFlag;
     }
+
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
-        list.add("businessFlag="+ this.businessFlag);
-        list.add("account="+getAccount());
+        list.add("businessFlag=" + this.businessFlag);
+        list.add("account=" + getAccount());
         list.add("etag=" + getEtag());
         return list.toString();
     }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardImg.java
index 932fe2c..250edc6 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
@@ -20,6 +20,7 @@
  * 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.profile;
 
 import java.io.Serializable;
@@ -29,36 +30,33 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class QRCardImg extends BaseModel implements Parcelable,Serializable
-{
+public class QRCardImg extends BaseModel implements Parcelable, Serializable {
     private static final long serialVersionUID = 4674425471217216710L;
 
-    private boolean        businessFlag;
+    private boolean businessFlag;
 
-    private IMAGE_TYPE    imgType        = IMAGE_TYPE.PNG;
+    private IMAGE_TYPE imgType = IMAGE_TYPE.PNG;
 
-    private String        imgEncoding    = "BASE64";
+    private String imgEncoding = "BASE64";
 
-    private String        description;
+    private String description;
 
-    private String        imgBase64Str;
+    private String imgBase64Str;
 
-    public QRCardImg()
-    {}
+    public QRCardImg() {
+    }
 
-    public QRCardImg( Parcel source )
-    {
-        readFromParcel( source );
+    public QRCardImg(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -66,129 +64,113 @@
      * 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
+     * 
+     * @param dest the dest
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        super.writeToParcel( dest,flags );
-        dest.writeBooleanArray( new boolean[] { businessFlag } );
-        dest.writeInt( imgType.ordinal() );
-        dest.writeString( imgEncoding );
-        dest.writeString( description );
-        dest.writeString( imgBase64Str );
+    public void writeToParcel(Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeBooleanArray(new boolean[] {
+            businessFlag
+        });
+        dest.writeInt(imgType.ordinal());
+        dest.writeString(imgEncoding);
+        dest.writeString(description);
+        dest.writeString(imgBase64Str);
     }
 
     /**
      * Create the qr card image entity from parcel stream. Pay attention to read
      * and write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        super.readFromParcel( source );
-        boolean[] val = new boolean[ 1 ];
-        source.readBooleanArray( val );
-        businessFlag = val[ 0 ];
-        imgType = IMAGE_TYPE.valueOf( source.readInt() );
+    public void readFromParcel(Parcel source) {
+        super.readFromParcel(source);
+        boolean[] val = new boolean[1];
+        source.readBooleanArray(val);
+        businessFlag = val[0];
+        imgType = IMAGE_TYPE.valueOf(source.readInt());
         imgEncoding = source.readString();
         description = source.readString();
         imgBase64Str = source.readString();
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<QRCardImg>    CREATOR    = new Parcelable.Creator<QRCardImg>() {
+    public static final Parcelable.Creator<QRCardImg> CREATOR = new Parcelable.Creator<QRCardImg>() {
         @Override
-        public QRCardImg createFromParcel( Parcel source )
-        {
-            return new QRCardImg( source );
+        public QRCardImg createFromParcel(Parcel source) {
+            return new QRCardImg(source);
         }
 
         @Override
-        public QRCardImg[] newArray( int size )
-        {
-            return new QRCardImg[ size ];
+        public QRCardImg[] newArray(int size) {
+            return new QRCardImg[size];
         }
     };
 
-    public boolean isBusinessFlag()
-    {
+    public boolean isBusinessFlag() {
         return businessFlag;
     }
 
-    public void setBusinessFlag( boolean businessFlag )
-    {
+    public void setBusinessFlag(boolean businessFlag) {
         this.businessFlag = businessFlag;
     }
 
-    public IMAGE_TYPE getImgType()
-    {
+    public IMAGE_TYPE getImgType() {
         return imgType;
     }
 
-    public void setImgType( IMAGE_TYPE imgType )
-    {
+    public void setImgType(IMAGE_TYPE imgType) {
         this.imgType = imgType;
     }
 
-    public String getImgEncoding()
-    {
+    public String getImgEncoding() {
         return imgEncoding;
     }
 
-    public void setImgEncoding( String imgEncoding )
-    {
+    public void setImgEncoding(String imgEncoding) {
         this.imgEncoding = imgEncoding;
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return description;
     }
 
-    public void setDescription( String description )
-    {
+    public void setDescription(String description) {
         this.description = description;
     }
 
-    public String getImgBase64Str()
-    {
+    public String getImgBase64Str() {
         return imgBase64Str;
     }
 
-    public void setImgBase64Str( String imgBase64Str )
-    {
+    public void setImgBase64Str(String imgBase64Str) {
         this.imgBase64Str = imgBase64Str;
     }
 
     public static enum IMAGE_TYPE {
         PNG, JPG, GIF;
 
-        public static IMAGE_TYPE valueOf( int ordinal )
-        {
-            if( ordinal < 0 || ordinal >= values().length )
-            {
-                throw new IndexOutOfBoundsException( "Invalid ordinal" );
+        public static IMAGE_TYPE valueOf(int ordinal) {
+            if (ordinal < 0 || ordinal >= values().length) {
+                throw new IndexOutOfBoundsException("Invalid ordinal");
             }
 
-            return values()[ ordinal ];
+            return values()[ordinal];
         }
     }
+
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
-        list.add("businessFlag="+ this.businessFlag);
-        list.add("imgEncoding="+ this.imgEncoding);
-        list.add("imgBase64Str="+ this.imgBase64Str);
-        list.add("imgType="+ this.imgType);
-        list.add("description="+ this.description);
+        list.add("businessFlag=" + this.businessFlag);
+        list.add("imgEncoding=" + this.imgEncoding);
+        list.add("imgBase64Str=" + this.imgBase64Str);
+        list.add("imgType=" + this.imgType);
+        list.add("description=" + this.description);
         list.add("account=" + getAccount());
         list.add("etag=" + getEtag());
         return list.toString();
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/QRCardInfo.java
index d39e082..08d0bec 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
@@ -20,6 +20,7 @@
  * 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.profile;
 
 import java.io.Serializable;
@@ -29,34 +30,38 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class QRCardInfo extends BaseModel implements Parcelable,Serializable
-{
+public class QRCardInfo extends BaseModel implements Parcelable, Serializable {
     private static final long serialVersionUID = 5140344570754052168L;
-    private String    name;
-    private String    tel;
-    //private String    imgUrl;
-    private String    companyTel;
-    private String    companyFax;
-    private String    companyName;
-    private String    companyDuty;
-    private String    companyEmail;
 
-    public QRCardInfo()
-    {}
+    private String name;
 
-    public QRCardInfo( Parcel source )
-    {
-        readFromParcel( source );
+    private String tel;
+
+    // private String imgUrl;
+    private String companyTel;
+
+    private String companyFax;
+
+    private String companyName;
+
+    private String companyDuty;
+
+    private String companyEmail;
+
+    public QRCardInfo() {
+    }
+
+    public QRCardInfo(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -64,40 +69,35 @@
      * 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
+     * 
+     * @param dest the dest
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        super.writeToParcel( dest,flags );
-        dest.writeString( name );
-        dest.writeString( tel );
-        //dest.writeString( imgUrl );
-        dest.writeString( companyTel );
-        dest.writeString( companyFax );
-        dest.writeString( companyName );
-        dest.writeString( companyDuty );
-        dest.writeString( companyEmail );
+    public void writeToParcel(Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeString(name);
+        dest.writeString(tel);
+        // dest.writeString( imgUrl );
+        dest.writeString(companyTel);
+        dest.writeString(companyFax);
+        dest.writeString(companyName);
+        dest.writeString(companyDuty);
+        dest.writeString(companyEmail);
     }
 
     /**
      * Create the qr card entity from parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        super.readFromParcel( source );
+    public void readFromParcel(Parcel source) {
+        super.readFromParcel(source);
         name = source.readString();
         tel = source.readString();
-        //imgUrl = source.readString();
+        // imgUrl = source.readString();
         companyTel = source.readString();
         companyFax = source.readString();
         companyName = source.readString();
@@ -106,111 +106,89 @@
     }
 
     /** 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 );
+        public QRCardInfo createFromParcel(Parcel source) {
+            return new QRCardInfo(source);
         }
 
         @Override
-        public QRCardInfo[] newArray( int size )
-        {
-            return new QRCardInfo[ size ];
+        public QRCardInfo[] newArray(int size) {
+            return new QRCardInfo[size];
         }
     };
 
-    public String getName()
-    {
+    public String getName() {
         return name;
     }
 
-    public void setName( String name )
-    {
+    public void setName(String name) {
         this.name = name;
     }
 
-    public String getTel()
-    {
+    public String getTel() {
         return tel;
     }
 
-    public void setTel( String tel )
-    {
+    public void setTel(String tel) {
         this.tel = tel;
     }
 
     /*
-    public String getImgUrl()
-    {
-        return imgUrl;
-    }
-
-    public void setImgUrl( String imgUrl )
-    {
-        this.imgUrl = imgUrl;
-    }
-    */
-    public String getCompanyTel()
-    {
+     * public String getImgUrl() { return imgUrl; } public void setImgUrl(
+     * String imgUrl ) { this.imgUrl = imgUrl; }
+     */
+    public String getCompanyTel() {
         return companyTel;
     }
 
-    public void setCompanyTel( String companyTel )
-    {
+    public void setCompanyTel(String companyTel) {
         this.companyTel = companyTel;
     }
 
-    public String getCompanyFax()
-    {
+    public String getCompanyFax() {
         return companyFax;
     }
 
-    public void setCompanyFax( String companyFax )
-    {
+    public void setCompanyFax(String companyFax) {
         this.companyFax = companyFax;
     }
 
-    public String getCompanyName()
-    {
+    public String getCompanyName() {
         return companyName;
     }
 
-    public void setCompanyName( String companyName )
-    {
+    public void setCompanyName(String companyName) {
         this.companyName = companyName;
     }
 
-    public String getCompanyDuty()
-    {
+    public String getCompanyDuty() {
         return companyDuty;
     }
 
-    public void setCompanyDuty( String companyDuty )
-    {
+    public void setCompanyDuty(String companyDuty) {
         this.companyDuty = companyDuty;
     }
 
-    public String getCompanyEmail()
-    {
+    public String getCompanyEmail() {
         return companyEmail;
     }
 
-    public void setCompanyEmail( String companyEmail )
-    {
+    public void setCompanyEmail(String companyEmail) {
         this.companyEmail = companyEmail;
     }
+
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
-        list.add("name="+ this.name);
-        list.add("tel="+ this.tel);
-        //list.add("imgUrl="+ this.imgUrl);
-        list.add("companyTel="+ this.companyTel);
-        list.add("companyFax="+ this.companyFax);
-        list.add("companyName="+ this.companyName);
-        list.add("companyDuty="+ this.companyDuty);
-        list.add("companyEmail="+ this.companyEmail);
+        list.add("name=" + this.name);
+        list.add("tel=" + this.tel);
+        // list.add("imgUrl="+ this.imgUrl);
+        list.add("companyTel=" + this.companyTel);
+        list.add("companyFax=" + this.companyFax);
+        list.add("companyName=" + this.companyName);
+        list.add("companyDuty=" + this.companyDuty);
+        list.add("companyEmail=" + this.companyEmail);
         list.add("account=" + getAccount());
         list.add("etag=" + getEtag());
         return list.toString();
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/profile/TelephoneModel.java
index 62fe121..bda2d67 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
@@ -20,6 +20,7 @@
  * 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.profile;
 
 import java.io.Serializable;
@@ -29,23 +30,28 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-public class TelephoneModel implements Parcelable,Serializable{
+public class TelephoneModel implements Parcelable, Serializable {
 
     private static final long serialVersionUID = 2509804884372655920L;
+
     public static int TYPE_HOME = 1;
+
     public static int TYPE_MOBILE = 2;
+
     public static int TYPE_FIXED = 3;
+
     public static int TYPE_WORK = 4;
+
     public static int TYPE_OTHER = 5;
 
     private int type;
+
     private String telephone;
 
-    public TelephoneModel()
-    {}
+    public TelephoneModel() {
+    }
 
-    public TelephoneModel( Parcel source )
-    {
+    public TelephoneModel(Parcel source) {
         this.type = source.readInt();
         this.telephone = source.readString();
     }
@@ -53,36 +59,39 @@
     public int getType() {
         return type;
     }
+
     public void setType(int type) {
         this.type = type;
     }
+
     public String getTelephone() {
         return telephone;
     }
+
     public void setTelephone(String telephone) {
         this.telephone = telephone;
     }
+
     @Override
     public int describeContents() {
         return 0;
     }
+
     @Override
     public void writeToParcel(Parcel dest, int arg1) {
         dest.writeInt(this.type);
         dest.writeString(this.telephone);
     }
 
-    public static final Parcelable.Creator<TelephoneModel>    CREATOR    = new Parcelable.Creator<TelephoneModel>() {
+    public static final Parcelable.Creator<TelephoneModel> CREATOR = new Parcelable.Creator<TelephoneModel>() {
         @Override
-        public TelephoneModel createFromParcel( Parcel source )
-        {
-            return new TelephoneModel( source );
+        public TelephoneModel createFromParcel(Parcel source) {
+            return new TelephoneModel(source);
         }
 
         @Override
-        public TelephoneModel[] newArray( int size )
-        {
-            return new TelephoneModel[ size ];
+        public TelephoneModel[] newArray(int size) {
+            return new TelephoneModel[size];
         }
     };
 
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 166122d..72a1eac 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
@@ -79,7 +79,7 @@
     // private String viewType;
 
     /** The major article. */
-//    private int majorArticle;
+    // private int majorArticle;
 
     /** The child articles. */
     // private List<MediaArticle> childArticles;
@@ -132,7 +132,7 @@
         // dest.writeString( mediaType );
         dest.writeString(digest);
         // dest.writeString( viewType );
-//        dest.writeInt(majorArticle);
+        // dest.writeInt(majorArticle);
         // dest.writeList( childArticles );
         dest.writeString(bodyLink);
     }
@@ -156,7 +156,7 @@
         // mediaType = source.readString();
         digest = source.readString();
         // viewType = source.readString();
-//        majorArticle = source.readInt();
+        // majorArticle = source.readInt();
         // childArticles = new LinkedList<MediaArticle>();
         // source.readList( childArticles, this.getClass().getClassLoader() );
         bodyLink = source.readString();
@@ -384,18 +384,18 @@
      * 
      * @return the major article
      */
-//    public int getMajorArticle() {
-//        return majorArticle;
-//    }
+    // public int getMajorArticle() {
+    // return majorArticle;
+    // }
 
     /**
      * Sets the major article.
      * 
      * @param majorArticle the new major article
      */
-//    public void setMajorArticle(int majorArticle) {
-//        this.majorArticle = majorArticle;
-//    }
+    // public void setMajorArticle(int majorArticle) {
+    // this.majorArticle = majorArticle;
+    // }
 
     /**
      * Gets the child articles.
@@ -452,7 +452,7 @@
         if (null != this.bodyLink) {
             sbuffer.append(",bodyLink=").append(this.bodyLink);
         }
-//        sbuffer.append(",majorArticle=").append(this.majorArticle);
+        // sbuffer.append(",majorArticle=").append(this.majorArticle);
 
         if (sbuffer.length() > 1) {
             return sbuffer.substring(1).toString();
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 0cab53e..6a4712d 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
@@ -20,6 +20,7 @@
  * 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.pubacct;
 
 import android.os.Parcel;
@@ -38,65 +39,60 @@
  * <p>
  * Company: pci-suntek
  * </p>
- *
+ * 
  * @author zrq
  * @version 1.0
- *
  */
-public class MediaBasic implements Parcelable
-{
+public class MediaBasic implements Parcelable {
     /** The thumb picture link. */
-    private String    thumbLink;
+    private String thumbLink;
 
     /** The original picture link. */
-    private String    originalLink;
+    private String originalLink;
 
     /** The title. */
-    private String    title;
+    private String title;
 
     /** The file size. */
-    private String    fileSize;
+    private String fileSize;
 
     /** The duration. */
-    private String    duration;
+    private String duration;
 
     /** The file type. */
-    private String    fileType;
+    private String fileType;
 
     /** The create time. */
-    private String    createTime;
+    private String createTime;
 
     /** The media uuid. */
-    private String    mediaUuid;
+    private String mediaUuid;
 
     /** The pa uuid. */
-    private String    paUuid;
+    private String paUuid;
 
     /**
      * Instantiates a new media basic.
      */
-    public MediaBasic()
-    {}
+    public MediaBasic() {
+    }
 
     /**
      * Instantiates a new media basic.
-     *
-     * @param source
-     *            the source
+     * 
+     * @param source the source
      */
-    public MediaBasic( Parcel source )
-    {
-        readFromParcel( source );
+    public MediaBasic(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -104,36 +100,31 @@
      * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( thumbLink );
-        dest.writeString( originalLink );
-        dest.writeString( title );
-        dest.writeString( fileSize );
-        dest.writeString( duration );
-        dest.writeString( fileType );
-        dest.writeString( createTime );
-        dest.writeString( mediaUuid );
-        dest.writeString( paUuid );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(thumbLink);
+        dest.writeString(originalLink);
+        dest.writeString(title);
+        dest.writeString(fileSize);
+        dest.writeString(duration);
+        dest.writeString(fileType);
+        dest.writeString(createTime);
+        dest.writeString(mediaUuid);
+        dest.writeString(paUuid);
     }
 
     /**
      * Create the media basic entity from parcel stream. Pay attention to read
      * and write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         thumbLink = source.readString();
         originalLink = source.readString();
         title = source.readString();
@@ -146,243 +137,214 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<MediaBasic>    CREATOR    = new Parcelable.Creator<MediaBasic>() {
-                                                                    @Override
-                                                                    public MediaBasic createFromParcel( Parcel source )
-                                                                    {
-                                                                        return new MediaBasic( source );
-                                                                    }
+    public static final Parcelable.Creator<MediaBasic> CREATOR = new Parcelable.Creator<MediaBasic>() {
+        @Override
+        public MediaBasic createFromParcel(Parcel source) {
+            return new MediaBasic(source);
+        }
 
-                                                                    @Override
-                                                                    public MediaBasic[] newArray( int size )
-                                                                    {
-                                                                        return new MediaBasic[ size ];
-                                                                    }
-                                                                };
+        @Override
+        public MediaBasic[] newArray(int size) {
+            return new MediaBasic[size];
+        }
+    };
 
     /**
      * Gets the thumb picture link.
-     *
+     * 
      * @return the thumb picture link
      */
-    public String getThumbLink()
-    {
+    public String getThumbLink() {
         return thumbLink;
     }
 
     /**
      * Sets the thumb picture link.
-     *
-     * @param thumbLink
-     *            the new thumb picture link
+     * 
+     * @param thumbLink the new thumb picture link
      */
-    public void setThumbLink( String thumbLink )
-    {
+    public void setThumbLink(String thumbLink) {
         this.thumbLink = thumbLink;
     }
 
     /**
      * Gets the original link.
-     *
+     * 
      * @return the original link
      */
-    public String getOriginalLink()
-    {
+    public String getOriginalLink() {
         return originalLink;
     }
 
     /**
      * Sets the original link.
-     *
-     * @param originalLink
-     *            the new original link
+     * 
+     * @param originalLink the new original link
      */
-    public void setOriginalLink( String originalLink )
-    {
+    public void setOriginalLink(String originalLink) {
         this.originalLink = originalLink;
     }
 
     /**
      * Gets the title.
-     *
+     * 
      * @return the title
      */
-    public String getTitle()
-    {
+    public String getTitle() {
         return title;
     }
 
     /**
      * Sets the title.
-     *
-     * @param title
-     *            the new title
+     * 
+     * @param title the new title
      */
-    public void setTitle( String title )
-    {
+    public void setTitle(String title) {
         this.title = title;
     }
 
     /**
      * Gets the file size.
-     *
+     * 
      * @return the file size
      */
-    public String getFileSize()
-    {
+    public String getFileSize() {
         return fileSize;
     }
 
     /**
      * Sets the file size.
-     *
-     * @param fileSize
-     *            the new file size
+     * 
+     * @param fileSize the new file size
      */
-    public void setFileSize( String fileSize )
-    {
+    public void setFileSize(String fileSize) {
         this.fileSize = fileSize;
     }
 
     /**
      * Gets the duration.
-     *
+     * 
      * @return the duration
      */
-    public String getDuration()
-    {
+    public String getDuration() {
         return duration;
     }
 
     /**
      * Sets the duration.
-     *
-     * @param duration
-     *            the new duration
+     * 
+     * @param duration the new duration
      */
-    public void setDuration( String duration )
-    {
+    public void setDuration(String duration) {
         this.duration = duration;
     }
 
     /**
      * Gets the file type.
-     *
+     * 
      * @return the file type
      */
-    public String getFileType()
-    {
+    public String getFileType() {
         return fileType;
     }
 
     /**
      * Sets the file type.
-     *
-     * @param fileType
-     *            the new file type
+     * 
+     * @param fileType the new file type
      */
-    public void setFileType( String fileType )
-    {
+    public void setFileType(String fileType) {
         this.fileType = fileType;
     }
 
     /**
      * Gets the creates the time.
-     *
+     * 
      * @return the creates the time
      */
-    public String getCreateTime()
-    {
+    public String getCreateTime() {
         return createTime;
     }
 
     /**
      * Sets the creates the time.
-     *
-     * @param createTime
-     *            the new creates the time
+     * 
+     * @param createTime the new creates the time
      */
-    public void setCreateTime( String createTime )
-    {
+    public void setCreateTime(String createTime) {
         this.createTime = createTime;
     }
 
     /**
      * Gets the media uuid.
-     *
+     * 
      * @return the media uuid
      */
-    public String getMediaUuid()
-    {
+    public String getMediaUuid() {
         return mediaUuid;
     }
 
     /**
      * Sets the media uuid.
-     *
-     * @param mediaUuid
-     *            the new media uuid
+     * 
+     * @param mediaUuid the new media uuid
      */
-    public void setMediaUuid( String mediaUuid )
-    {
+    public void setMediaUuid(String mediaUuid) {
         this.mediaUuid = mediaUuid;
     }
 
     /**
      * Gets the pa uuid.
-     *
+     * 
      * @return the pa uuid
      */
-    public String getPaUuid()
-    {
+    public String getPaUuid() {
         return paUuid;
     }
 
     /**
      * Sets the pa uuid.
-     *
-     * @param paUuid
-     *            the new pa uuid
+     * 
+     * @param paUuid the new pa uuid
      */
-    public void setPaUuid( String paUuid )
-    {
+    public void setPaUuid(String paUuid) {
         this.paUuid = paUuid;
     }
 
     @Override
     public String toString() {
         StringBuffer sbuffer = new StringBuffer();
-        if(null != this.thumbLink){
+        if (null != this.thumbLink) {
             sbuffer.append(",thumbLink=").append(this.thumbLink);
         }
-        if(null != this.originalLink){
+        if (null != this.originalLink) {
             sbuffer.append(",originalLink=").append(this.originalLink);
         }
-        if(null != this.title){
+        if (null != this.title) {
             sbuffer.append(",title=").append(this.title);
         }
-        if(null != this.fileSize){
+        if (null != this.fileSize) {
             sbuffer.append(",fileSize=").append(this.fileSize);
         }
-        if(null != this.duration){
+        if (null != this.duration) {
             sbuffer.append(",duration=").append(this.duration);
         }
-        if(null != this.fileType){
+        if (null != this.fileType) {
             sbuffer.append(",fileType=").append(this.fileType);
         }
-        if(null != this.createTime){
+        if (null != this.createTime) {
             sbuffer.append(",createTime=").append(this.createTime);
         }
-        if(null != this.mediaUuid){
+        if (null != this.mediaUuid) {
             sbuffer.append(",mediaUuid=").append(this.mediaUuid);
         }
-        if(null != this.paUuid){
+        if (null != this.paUuid) {
             sbuffer.append(",paUuid=").append(this.paUuid);
         }
 
-        if(sbuffer.length() > 1){
+        if (sbuffer.length() > 1) {
             return sbuffer.substring(1).toString();
-        }else{
+        } else {
             return "";
         }
     }
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 b07be88..4f82b50 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
@@ -20,6 +20,7 @@
  * 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.pubacct;
 
 import java.util.LinkedList;
@@ -29,16 +30,24 @@
 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>.
- *
+ * <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
-{
+public class MenuInfo implements Parcelable {
 
     /** The command id. */
     private String commandId;
@@ -58,197 +67,176 @@
     /**
      * Instantiates a new menu info.
      */
-    public MenuInfo( )
-    {}
+    public MenuInfo() {
+    }
 
     /**
      * Instantiates a new menu info.
-     *
+     * 
      * @param source the source
      */
-    public MenuInfo( Parcel source )
-    {
-        readFromParcel( source );
+    public MenuInfo(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    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
+     * 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 );
+    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
+     * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    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() );
+        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 );
-                                                                    }
+    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 ];
-                                                                    }
-                                                                };
+        @Override
+        public MenuInfo[] newArray(int size) {
+            return new MenuInfo[size];
+        }
+    };
 
     /**
      * Gets the command id.
-     *
+     * 
      * @return the command id
      */
-    public String getCommandId()
-    {
+    public String getCommandId() {
         return commandId;
     }
 
     /**
      * Sets the command id.
-     *
+     * 
      * @param commandId the new command id
      */
-    public void setCommandId( String commandId )
-    {
+    public void setCommandId(String commandId) {
         this.commandId = commandId;
     }
 
     /**
      * Gets the title.
-     *
+     * 
      * @return the title
      */
-    public String getTitle()
-    {
+    public String getTitle() {
         return title;
     }
 
     /**
      * Sets the title.
-     *
+     * 
      * @param title the new title
      */
-    public void setTitle( String title )
-    {
+    public void setTitle(String title) {
         this.title = title;
     }
 
     /**
      * Gets the type.
-     *
+     * 
      * @return the type
      */
-    public int getType()
-    {
+    public int getType() {
         return type;
     }
 
     /**
      * Sets the type.
-     *
+     * 
      * @param type the new type
      */
-    public void setType( int type )
-    {
+    public void setType(int type) {
         this.type = type;
     }
 
     /**
      * Gets the priority.
-     *
+     * 
      * @return the priority
      */
-    public int getPriority()
-    {
+    public int getPriority() {
         return priority;
     }
 
     /**
      * Sets the priority.
-     *
+     * 
      * @param priority the new priority
      */
-    public void setPriority( int priority )
-    {
+    public void setPriority(int priority) {
         this.priority = priority;
     }
 
     /**
      * Gets the sub menu list.
-     *
+     * 
      * @return the sub menu list
      */
-    public List<MenuInfo> getSubMenuList()
-    {
+    public List<MenuInfo> getSubMenuList() {
         return subMenuList;
     }
 
     /**
      * Sets the sub menu list.
-     *
+     * 
      * @param subMenuList the new sub menu list
      */
-    public void setSubMenuList( List<MenuInfo> subMenuList )
-    {
+    public void setSubMenuList(List<MenuInfo> subMenuList) {
         this.subMenuList = subMenuList;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (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("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){
+            for (MenuInfo menu : this.subMenuList) {
                 sbuffer.append(menu.toString());
             }
             sbuffer.append("]");
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 725fd8f..ef6f9e6 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
@@ -20,6 +20,7 @@
  * 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.pubacct;
 
 import android.os.Parcel;
@@ -31,7 +32,7 @@
 /**
  * The Class MenuInfoMode.
  */
-public class MenuInfoMode implements Parcelable{
+public class MenuInfoMode implements Parcelable {
 
     /** The pa uuid. */
     private String paUuid;
@@ -45,81 +46,73 @@
     /**
      * Instantiates a new menu info mode.
      */
-    public MenuInfoMode(){
-        
+    public MenuInfoMode() {
+
     }
-    
+
     /**
      * Instantiates a new menu info mode.
-     *
+     * 
      * @param source the source
      */
-    public MenuInfoMode( Parcel source )
-    {
-        readFromParcel( source );
+    public MenuInfoMode(Parcel source) {
+        readFromParcel(source);
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
      * @see android.os.Parcelable#describeContents()
      */
     @Override
-    public int describeContents()
-    {
+    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( paUuid );
-        dest.writeString( menutimestamp );
-        dest.writeList( menuInfoList );
-    }
 
     /**
-     * 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
+     * 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
      */
-    public void readFromParcel( Parcel source )
-    {
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(paUuid);
+        dest.writeString(menutimestamp);
+        dest.writeList(menuInfoList);
+    }
+
+    /**
+     * 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) {
         paUuid = source.readString();
         menutimestamp = source.readString();
         menuInfoList = new LinkedList<MenuInfo>();
-        source.readList( menuInfoList, this.getClass().getClassLoader() );
+        source.readList(menuInfoList, this.getClass().getClassLoader());
     }
 
     /** 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 );
+        public MenuInfoMode createFromParcel(Parcel source) {
+            return new MenuInfoMode(source);
         }
 
         @Override
-        public MenuInfoMode[] newArray( int size )
-        {
-            return new MenuInfoMode[ size ];
+        public MenuInfoMode[] newArray(int size) {
+            return new MenuInfoMode[size];
         }
     };
-    
+
     /**
      * Gets the pa uuid.
-     *
+     * 
      * @return the pa uuid
      */
     public String getPaUuid() {
@@ -128,7 +121,7 @@
 
     /**
      * Sets the pa uuid.
-     *
+     * 
      * @param paUuid the new pa uuid
      */
     public void setPaUuid(String paUuid) {
@@ -137,7 +130,7 @@
 
     /**
      * Gets the menutimestamp.
-     *
+     * 
      * @return the menutimestamp
      */
     public String getMenutimestamp() {
@@ -146,7 +139,7 @@
 
     /**
      * Sets the menutimestamp.
-     *
+     * 
      * @param menutimestamp the new menutimestamp
      */
     public void setMenutimestamp(String menutimestamp) {
@@ -155,7 +148,7 @@
 
     /**
      * Gets the menu info list.
-     *
+     * 
      * @return the menu info list
      */
     public List<MenuInfo> getMenuInfoList() {
@@ -164,7 +157,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.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/MsgContent.java
index ba869a4..d7f3eeb 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
@@ -20,6 +20,7 @@
  * 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.pubacct;
 
 import java.util.LinkedList;
@@ -41,330 +42,292 @@
  * <p>
  * Company: pci-suntek
  * </p>
- *
+ * 
  * @author zrq
  * @version 1.0
- *
  */
-public class MsgContent implements Parcelable
-{
+public class MsgContent implements Parcelable {
     /** The media type. */
-    private String                mediaType;
+    private String mediaType;
 
     /** The create time. */
-    private String                createTime;
+    private String createTime;
 
     /** The message uuid. */
-    private String                msgUuid;
+    private String msgUuid;
 
     /** The sms digest. */
-    private String                smsDigest;
+    private String smsDigest;
 
     /** The text. */
-    private String                text;
+    private String text;
 
     /** The public account uuid. */
-    private String                paUuid;
+    private String paUuid;
 
     /** The basic. */
-    private MediaBasic            basic;
+    private MediaBasic basic;
 
     /** The article list. */
-    private List<MediaArticle>    articleList;
+    private List<MediaArticle> articleList;
 
     /**
      * Instantiates a new message content.
      */
-    public MsgContent()
-    {}
+    public MsgContent() {
+    }
 
     /**
      * Instantiates a new message content.
-     *
-     * @param source
-     *            the source parcel stream
+     * 
+     * @param source the source parcel stream
      */
-    public MsgContent( Parcel source )
-    {
-        readFromParcel( source );
+    public MsgContent(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
-     * Write the message content entity to parcel stream. Pay attention to read and
-     * write variables variables sequence should be consistent or not the
+     * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( mediaType );
-        dest.writeString( createTime );
-        dest.writeString( msgUuid );
-        dest.writeString( smsDigest );
-        dest.writeString( text );
-        dest.writeString( paUuid );
-        dest.writeValue( basic );
-        dest.writeList( articleList );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mediaType);
+        dest.writeString(createTime);
+        dest.writeString(msgUuid);
+        dest.writeString(smsDigest);
+        dest.writeString(text);
+        dest.writeString(paUuid);
+        dest.writeValue(basic);
+        dest.writeList(articleList);
     }
 
     /**
-     * Create the message content entity from parcel stream. Pay attention to read
-     * and write variables variables sequence should be consistent or not the
-     * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 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 )
-    {
+    public void readFromParcel(Parcel source) {
         mediaType = source.readString();
         createTime = source.readString();
         msgUuid = source.readString();
         smsDigest = source.readString();
         text = source.readString();
         paUuid = source.readString();
-        basic = ( MediaBasic )source.readValue( this.getClass().getClassLoader() );
+        basic = (MediaBasic)source.readValue(this.getClass().getClassLoader());
         articleList = new LinkedList<MediaArticle>();
-        source.readList( articleList, this.getClass().getClassLoader() );
+        source.readList(articleList, this.getClass().getClassLoader());
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<MsgContent>    CREATOR    = new Parcelable.Creator<MsgContent>() {
-                                                                    @Override
-                                                                    public MsgContent createFromParcel( Parcel source )
-                                                                    {
-                                                                        return new MsgContent( source );
-                                                                    }
+    public static final Parcelable.Creator<MsgContent> CREATOR = new Parcelable.Creator<MsgContent>() {
+        @Override
+        public MsgContent createFromParcel(Parcel source) {
+            return new MsgContent(source);
+        }
 
-                                                                    @Override
-                                                                    public MsgContent[] newArray( int size )
-                                                                    {
-                                                                        return new MsgContent[ size ];
-                                                                    }
-                                                                };
+        @Override
+        public MsgContent[] newArray(int size) {
+            return new MsgContent[size];
+        }
+    };
 
     /**
      * Gets the media type.
-     *
+     * 
      * @return the media type
      */
-    public String getMediaType()
-    {
+    public String getMediaType() {
         return mediaType;
     }
 
     /**
      * Sets the media type.
-     *
-     * @param mediaType
-     *            the new media type
+     * 
+     * @param mediaType the new media type
      */
-    public void setMediaType( String mediaType )
-    {
+    public void setMediaType(String mediaType) {
         this.mediaType = mediaType;
     }
 
     /**
      * Gets the creates time.
-     *
+     * 
      * @return the creates time
      */
-    public String getCreateTime()
-    {
+    public String getCreateTime() {
         return createTime;
     }
 
     /**
      * Sets the creates time.
-     *
-     * @param createTime
-     *            the new creates time
+     * 
+     * @param createTime the new creates time
      */
-    public void setCreateTime( String createTime )
-    {
+    public void setCreateTime(String createTime) {
         this.createTime = createTime;
     }
 
     /**
      * Gets the msg_ uuid.
-     *
+     * 
      * @return the message uuid
      */
-    public String getMsgUuid()
-    {
+    public String getMsgUuid() {
         return msgUuid;
     }
 
     /**
      * Sets the message uuid.
-     *
-     * @param msg_Uuid
-     *            the new message uuid
+     * 
+     * @param msg_Uuid the new message uuid
      */
-    public void setMsgUuid( String msgUuid )
-    {
+    public void setMsgUuid(String msgUuid) {
         this.msgUuid = msgUuid;
     }
 
     /**
      * Gets the sms digest.
-     *
+     * 
      * @return the sms digest
      */
-    public String getSmsDigest()
-    {
+    public String getSmsDigest() {
         return smsDigest;
     }
 
     /**
      * Sets the sms digest.
-     *
-     * @param smsDigest
-     *            the new sms digest
+     * 
+     * @param smsDigest the new sms digest
      */
-    public void setSmsDigest( String smsDigest )
-    {
+    public void setSmsDigest(String smsDigest) {
         this.smsDigest = smsDigest;
     }
 
     /**
      * Gets the text.
-     *
+     * 
      * @return the text
      */
-    public String getText()
-    {
+    public String getText() {
         return text;
     }
 
     /**
      * Sets the text.
-     *
-     * @param text
-     *            the new text
+     * 
+     * @param text the new text
      */
-    public void setText( String text )
-    {
+    public void setText(String text) {
         this.text = text;
     }
 
     /**
      * Gets the public account uuid.
-     *
+     * 
      * @return the public account uuid
      */
-    public String getPaUuid()
-    {
+    public String getPaUuid() {
         return paUuid;
     }
 
     /**
      * Sets the public account uuid.
-     *
-     * @param paUuid
-     *            the new public account uuid
+     * 
+     * @param paUuid the new public account uuid
      */
-    public void setPaUuid( String paUuid )
-    {
+    public void setPaUuid(String paUuid) {
         this.paUuid = paUuid;
     }
 
     /**
      * Gets the basic.
-     *
+     * 
      * @return the basic
      */
-    public MediaBasic getBasic()
-    {
+    public MediaBasic getBasic() {
         return basic;
     }
 
     /**
      * Sets the basic.
-     *
-     * @param basic
-     *            the new basic
+     * 
+     * @param basic the new basic
      */
-    public void setBasic( MediaBasic basic )
-    {
+    public void setBasic(MediaBasic basic) {
         this.basic = basic;
     }
 
     /**
      * Gets the article list.
-     *
+     * 
      * @return the article list
      */
-    public List<MediaArticle> getArticleList()
-    {
+    public List<MediaArticle> getArticleList() {
         return articleList;
     }
 
     /**
      * Sets the article list.
-     *
-     * @param articleList
-     *            the new article list
+     * 
+     * @param articleList the new article list
      */
-    public void setArticleList( List<MediaArticle> articleList )
-    {
+    public void setArticleList(List<MediaArticle> articleList) {
         this.articleList = articleList;
     }
 
     @Override
     public String toString() {
         StringBuffer sbuffer = new StringBuffer();
-        if(null != this.mediaType){
+        if (null != this.mediaType) {
             sbuffer.append(",mediaType=").append(this.mediaType);
         }
-        if(null != this.createTime){
+        if (null != this.createTime) {
             sbuffer.append(",createTime=").append(this.createTime);
         }
-        if(null != this.msgUuid){
+        if (null != this.msgUuid) {
             sbuffer.append(",msgUuid=").append(this.msgUuid);
         }
-        if(null != this.smsDigest){
+        if (null != this.smsDigest) {
             sbuffer.append(",smsDigest=").append(this.smsDigest);
         }
-        if(null != this.text){
+        if (null != this.text) {
             sbuffer.append(",text=").append(this.text);
         }
-        if(null != this.paUuid){
+        if (null != this.paUuid) {
             sbuffer.append(",paUuid=").append(this.paUuid);
         }
-        if(null != this.basic){
-            sbuffer.append(",basic=").append("{")
-                   .append(this.basic.toString())
-                   .append("}");
+        if (null != this.basic) {
+            sbuffer.append(",basic=").append("{").append(this.basic.toString()).append("}");
         }
 
-        if(null != this.articleList && this.articleList.size() > 0){
+        if (null != this.articleList && this.articleList.size() > 0) {
             sbuffer.append(",articleList=").append("[");
-            for(MediaArticle article : this.articleList){
+            for (MediaArticle article : this.articleList) {
                 sbuffer.append(article.toString());
             }
             sbuffer.append("]");
         }
 
-        if(sbuffer.length() > 1){
+        if (sbuffer.length() > 1) {
             return sbuffer.substring(1).toString();
-        }else{
+        } else {
             return "";
         }
     }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountCallbackType.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountCallbackType.java
index f9da0bd..a488a1b 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountCallbackType.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountCallbackType.java
@@ -20,76 +20,75 @@
  * 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.pubacct;
 
+package com.suntek.mway.rcs.client.aidl.plugin.entity.pubacct;
 
 /**
  * The Class PublicAccountCallbackType.
  */
-public class PublicAccountCallbackType{
+public class PublicAccountCallbackType {
 
-      /** The Constant TAG_GET_PUBLIC_LIST_RETURN_CODE. */
-      public static final int TAG_GET_PUBLIC_LIST_RETURN_CODE = 1001;
+    /** The Constant TAG_GET_PUBLIC_LIST_RETURN_CODE. */
+    public static final int TAG_GET_PUBLIC_LIST_RETURN_CODE = 1001;
 
-      /** The Constant TAG_GET_PUBLIC_LIST_RETURN_ENTITY. */
-      public static final int TAG_GET_PUBLIC_LIST_RETURN_ENTITY = 1002;
+    /** The Constant TAG_GET_PUBLIC_LIST_RETURN_ENTITY. */
+    public static final int TAG_GET_PUBLIC_LIST_RETURN_ENTITY = 1002;
 
-      /** The Constant TAG_GET_PUBLIC_DETAIL_RETURN_CODE. */
-      public static final int TAG_GET_PUBLIC_DETAIL_RETURN_CODE = 1003;
+    /** The Constant TAG_GET_PUBLIC_DETAIL_RETURN_CODE. */
+    public static final int TAG_GET_PUBLIC_DETAIL_RETURN_CODE = 1003;
 
-      /** The Constant TAG_GET_PUBLIC_DETAIL_RETURN_ENTITY. */
-      public static final int TAG_GET_PUBLIC_DETAIL_RETURN_ENTITY = 1004;
+    /** The Constant TAG_GET_PUBLIC_DETAIL_RETURN_ENTITY. */
+    public static final int TAG_GET_PUBLIC_DETAIL_RETURN_ENTITY = 1004;
 
-      /** The Constant TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_CODE. */
-      public static final int TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_CODE = 1005;
+    /** The Constant TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_CODE. */
+    public static final int TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_CODE = 1005;
 
-      /** The Constant TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_ENTITY. */
-      public static final int TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_ENTITY = 1006;
+    /** The Constant TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_ENTITY. */
+    public static final int TAG_GET_SUBSCRIBE_PUBLIC_LIST_RETURN_ENTITY = 1006;
 
-      /** The Constant TAG_ADD_SUBSCRIBE_RETURN_CODE. */
-      public static final int TAG_ADD_SUBSCRIBE_RETURN_CODE = 1007;
+    /** The Constant TAG_ADD_SUBSCRIBE_RETURN_CODE. */
+    public static final int TAG_ADD_SUBSCRIBE_RETURN_CODE = 1007;
 
-      /** The Constant TAG_ADD_SUBSCRIBE_RETURN_ENTITY. */
-      public static final int TAG_ADD_SUBSCRIBE_RETURN_ENTITY = 1008;
+    /** The Constant TAG_ADD_SUBSCRIBE_RETURN_ENTITY. */
+    public static final int TAG_ADD_SUBSCRIBE_RETURN_ENTITY = 1008;
 
-      /** The Constant TAG_CANCEL_SUBSCRIBE_RETURN_CODE. */
-      public static final int TAG_CANCEL_SUBSCRIBE_RETURN_CODE = 1009;
+    /** The Constant TAG_CANCEL_SUBSCRIBE_RETURN_CODE. */
+    public static final int TAG_CANCEL_SUBSCRIBE_RETURN_CODE = 1009;
 
-      /** The Constant TAG_CANCEL_SUBSCRIBE_RETURN_ENTITY. */
-      public static final int TAG_CANCEL_SUBSCRIBE_RETURN_ENTITY = 1010;
+    /** The Constant TAG_CANCEL_SUBSCRIBE_RETURN_ENTITY. */
+    public static final int TAG_CANCEL_SUBSCRIBE_RETURN_ENTITY = 1010;
 
-      /** The Constant TAG_GET_PRE_MESSAGE_RETURN_CODE. */
-      public static final int TAG_GET_PRE_MESSAGE_RETURN_CODE = 1011;
+    /** The Constant TAG_GET_PRE_MESSAGE_RETURN_CODE. */
+    public static final int TAG_GET_PRE_MESSAGE_RETURN_CODE = 1011;
 
-      /** The Constant TAG_GET_PRE_MESSAGE_RETURN_ENTITY. */
-      public static final int TAG_GET_PRE_MESSAGE_RETURN_ENTITY = 1012;
+    /** The Constant TAG_GET_PRE_MESSAGE_RETURN_ENTITY. */
+    public static final int TAG_GET_PRE_MESSAGE_RETURN_ENTITY = 1012;
 
-      /** The Constant TAG_COMPLAIN_PUBLIC_RETURN_CODE. */
-      public static final int TAG_COMPLAIN_PUBLIC_RETURN_CODE = 1013;
+    /** The Constant TAG_COMPLAIN_PUBLIC_RETURN_CODE. */
+    public static final int TAG_COMPLAIN_PUBLIC_RETURN_CODE = 1013;
 
-      /** The Constant TAG_COMPLAIN_PUBLIC_RETURN_ENTITY. */
-      public static final int TAG_COMPLAIN_PUBLIC_RETURN_ENTITY = 1014;
+    /** The Constant TAG_COMPLAIN_PUBLIC_RETURN_ENTITY. */
+    public static final int TAG_COMPLAIN_PUBLIC_RETURN_ENTITY = 1014;
 
-      /** The Constant TAG_GET_PUBLIC_MENU_INFO_RETURN_CODE. */
-      public static final int TAG_GET_PUBLIC_MENU_INFO_RETURN_CODE = 1015;
+    /** The Constant TAG_GET_PUBLIC_MENU_INFO_RETURN_CODE. */
+    public static final int TAG_GET_PUBLIC_MENU_INFO_RETURN_CODE = 1015;
 
-      /** The Constant TAG_GET_PUBLIC_MENU_INFO_RETURN_ENTITY. */
-      public static final int TAG_GET_PUBLIC_MENU_INFO_RETURN_ENTITY = 1016;
+    /** The Constant TAG_GET_PUBLIC_MENU_INFO_RETURN_ENTITY. */
+    public static final int TAG_GET_PUBLIC_MENU_INFO_RETURN_ENTITY = 1016;
 
-      /** The Constant TAG_GET_PUBLIC_MENU_STRING. */
-      public static final int TAG_GET_PUBLIC_MENU_STRING = 1017;
+    /** The Constant TAG_GET_PUBLIC_MENU_STRING. */
+    public static final int TAG_GET_PUBLIC_MENU_STRING = 1017;
 
-      /** The Constant TAG_GET_PUBLIC_RECOMMEND_RETURN_CODE. */
-      public static final int TAG_GET_PUBLIC_RECOMMEND_RETURN_CODE = 1018;
+    /** The Constant TAG_GET_PUBLIC_RECOMMEND_RETURN_CODE. */
+    public static final int TAG_GET_PUBLIC_RECOMMEND_RETURN_CODE = 1018;
 
-      /** The Constant TAG_GET_PUBLIC_RECOMMEND_RETURN_ENTITY. */
-      public static final int TAG_GET_PUBLIC_RECOMMEND_RETURN_ENTITY = 1019;
+    /** The Constant TAG_GET_PUBLIC_RECOMMEND_RETURN_ENTITY. */
+    public static final int TAG_GET_PUBLIC_RECOMMEND_RETURN_ENTITY = 1019;
 
-      /** The Constant TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_CODE. */
-      public static final int TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_CODE = 1020;
+    /** The Constant TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_CODE. */
+    public static final int TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_CODE = 1020;
 
-      /** The Constant TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_ENTITY. */
-      public static final int TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_ENTITY = 1021;
-
+    /** The Constant TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_ENTITY. */
+    public static final int TAG_SET_ACCEPT_ACCOUNT_STATUS_RETURN_ENTITY = 1021;
 
 }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountConstant.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountConstant.java
index 8a699f9..ad886c7 100644
--- a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountConstant.java
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/plugin/entity/pubacct/PublicAccountConstant.java
@@ -27,7 +27,7 @@
  * The Class PublicAccountConstant.
  */
 public class PublicAccountConstant {
-    
+
     /** account pre number. */
     public static final int ACCOUNT_PRE_NUMBER = 8;
 
@@ -87,11 +87,11 @@
 
     /** The Constant MENU_TYPE_APPLICATION. */
     public static final int MENU_TYPE_APPLICATION = 3;
-    
+
     /** The Constant MESSAGE_FORWARD_ABLE. */
     public static final int MESSAGE_FORWARD_ABLE = 0;
-    
+
     /** The Constant MESSAGE_FORWARD_UNABLE. */
     public static final int MESSAGE_FORWARD_UNABLE = 1;
-    
+
 }
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 19826c6..41b495a 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
@@ -20,6 +20,7 @@
  * 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.pubacct;
 
 import android.os.Parcel;
@@ -39,49 +40,48 @@
  * Company: pci-suntek
  * </p>
  * .
- *
+ * 
  * @author zrq
  * @version 1.0
  */
-public class PublicAccountReqEntity implements Parcelable
-{
+public class PublicAccountReqEntity implements Parcelable {
     /** the public account uuid. */
-    private String    paUuid;
+    private String paUuid;
+
     /** the public account name. */
-    private String    name;
+    private String name;
+
     /**
      * the public account recommend level. the value range is 1-5, default value
      * is 1.
      */
-    private int        recommendLevel;
+    private int recommendLevel;
+
     /** the public account logo url. */
-    private String    logo;
+    private String logo;
 
     /**
      * Instantiates a new public account request entity.
      */
-    public PublicAccountReqEntity()
-    {}
+    public PublicAccountReqEntity() {
+    }
 
     /**
      * Instantiates a new public account request entity.
-     *
-     * @param source
-     *            the parcel source
+     * 
+     * @param source the parcel source
      */
-    public PublicAccountReqEntity( Parcel source )
-    {
-        readFromParcel( source );
+    public PublicAccountReqEntity(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         // TODO Auto-generated method stub
         return 0;
     }
@@ -90,31 +90,26 @@
      * 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
+     * 
+     * @param dest the dest
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( paUuid );
-        dest.writeString( name );
-        dest.writeInt( recommendLevel );
-        dest.writeString( logo );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(paUuid);
+        dest.writeString(name);
+        dest.writeInt(recommendLevel);
+        dest.writeString(logo);
     }
 
     /**
      * Create the public account request entity from parcel stream. Pay
      * attention to read and write variables variables sequence should be
      * consistent or not the correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         paUuid = source.readString();
         name = source.readString();
         recommendLevel = source.readInt();
@@ -122,101 +117,87 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicAccountReqEntity>    CREATOR    = new Parcelable.Creator<PublicAccountReqEntity>() {
-                                                                                @Override
-                                                                                public PublicAccountReqEntity createFromParcel( Parcel source )
-                                                                                {
-                                                                                    return new PublicAccountReqEntity( source );
-                                                                                }
+    public static final Parcelable.Creator<PublicAccountReqEntity> CREATOR = new Parcelable.Creator<PublicAccountReqEntity>() {
+        @Override
+        public PublicAccountReqEntity createFromParcel(Parcel source) {
+            return new PublicAccountReqEntity(source);
+        }
 
-                                                                                @Override
-                                                                                public PublicAccountReqEntity[] newArray( int size )
-                                                                                {
-                                                                                    return new PublicAccountReqEntity[ size ];
-                                                                                }
-                                                                            };
+        @Override
+        public PublicAccountReqEntity[] newArray(int size) {
+            return new PublicAccountReqEntity[size];
+        }
+    };
 
     /**
      * Gets the public account uuid.
-     *
+     * 
      * @return the public account uuid
      */
-    public String getPaUuid()
-    {
+    public String getPaUuid() {
         return paUuid;
     }
 
     /**
      * Sets the public account uuid.
-     *
-     * @param paUuid
-     *            the new public account uuid
+     * 
+     * @param paUuid the new public account uuid
      */
-    public void setPaUuid( String paUuid )
-    {
+    public void setPaUuid(String paUuid) {
         this.paUuid = paUuid;
     }
 
     /**
      * Gets the public account name.
-     *
+     * 
      * @return the public account name
      */
-    public String getName()
-    {
+    public String getName() {
         return name;
     }
 
     /**
      * Sets the public account name.
-     *
-     * @param name
-     *            the new public account name
+     * 
+     * @param name the new public account name
      */
-    public void setName( String name )
-    {
+    public void setName(String name) {
         this.name = name;
     }
 
     /**
      * Gets the recommend level.
-     *
+     * 
      * @return the recommend level
      */
-    public int getRecommendLevel()
-    {
+    public int getRecommendLevel() {
         return recommendLevel;
     }
 
     /**
      * Sets the recommend level.
-     *
-     * @param recommendLevel
-     *            the new recommend level
+     * 
+     * @param recommendLevel the new recommend level
      */
-    public void setRecommendLevel( int recommendLevel )
-    {
+    public void setRecommendLevel(int recommendLevel) {
         this.recommendLevel = recommendLevel;
     }
 
     /**
      * Gets the logo url.
-     *
+     * 
      * @return the logo url
      */
-    public String getLogo()
-    {
+    public String getLogo() {
         return logo;
     }
 
     /**
      * Sets the logo url.
-     *
-     * @param logo
-     *            the new logo url
+     * 
+     * @param logo the new logo url
      */
-    public void setLogo( String logo )
-    {
+    public void setLogo(String logo) {
         this.logo = logo;
     }
 }
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 c08dfa2..9637697 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
@@ -20,6 +20,7 @@
  * 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.pubacct;
 
 import android.os.Parcel;
@@ -40,56 +41,51 @@
  * <p>
  * Company: pci-suntek
  * </p>
- *
+ * 
  * @author zrq
  * @version 1.0
- *
  */
-public class PublicAccounts implements Parcelable, Comparable<PublicAccounts>
-{
+public class PublicAccounts implements Parcelable, Comparable<PublicAccounts> {
     /** The logo url. */
-    private String    logo;
+    private String logo;
 
     /** The name. */
-    private String    name;
+    private String name;
 
     /** The public account uuid. */
-    private String    paUuid;
+    private String paUuid;
 
     /** The recommend level. */
-    private int        recommendLevel;
+    private int recommendLevel;
 
     /** The sip uri. */
-    private String    sipUri;
+    private String sipUri;
 
     /** The subscribestatus. */
-    private int    subscribestatus;
+    private int subscribestatus;
 
     /**
      * Instantiates a new public accounts.
      */
-    public PublicAccounts()
-    {}
+    public PublicAccounts() {
+    }
 
     /**
      * Instantiates a new public accounts.
-     *
-     * @param source
-     *            the source
+     * 
+     * @param source the source
      */
-    public PublicAccounts( Parcel source )
-    {
-        readFromParcel( source );
+    public PublicAccounts(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -97,20 +93,17 @@
      * 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
+     * 
+     * @param dest the dest
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( paUuid );
-        dest.writeString( name );
-        dest.writeInt( recommendLevel );
-        dest.writeString( logo );
-        dest.writeString( sipUri );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(paUuid);
+        dest.writeString(name);
+        dest.writeInt(recommendLevel);
+        dest.writeString(logo);
+        dest.writeString(sipUri);
         dest.writeInt(subscribestatus);
     }
 
@@ -118,12 +111,10 @@
      * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         paUuid = source.readString();
         name = source.readString();
         recommendLevel = source.readInt();
@@ -133,129 +124,111 @@
     }
 
     /** 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 );
+        public PublicAccounts createFromParcel(Parcel source) {
+            return new PublicAccounts(source);
         }
 
         @Override
-        public PublicAccounts[] newArray( int size )
-        {
-            return new PublicAccounts[ size ];
+        public PublicAccounts[] newArray(int size) {
+            return new PublicAccounts[size];
         }
     };
 
     /**
      * Gets the logo url.
-     *
+     * 
      * @return the logo url
      */
-    public String getLogo()
-    {
+    public String getLogo() {
         return logo;
     }
 
     /**
      * Sets the logo url.
-     *
-     * @param logo
-     *            the new logo url
+     * 
+     * @param logo the new logo url
      */
-    public void setLogo( String logo )
-    {
+    public void setLogo(String logo) {
         this.logo = logo;
     }
 
     /**
      * Gets the name.
-     *
+     * 
      * @return the name
      */
-    public String getName()
-    {
+    public String getName() {
         return name;
     }
 
     /**
      * Sets the name.
-     *
-     * @param name
-     *            the new name
+     * 
+     * @param name the new name
      */
-    public void setName( String name )
-    {
+    public void setName(String name) {
         this.name = name;
     }
 
     /**
      * Gets the public account uuid.
-     *
+     * 
      * @return the public account uuid
      */
-    public String getPaUuid()
-    {
+    public String getPaUuid() {
         return paUuid;
     }
 
     /**
      * Sets the public account uuid.
-     *
-     * @param paUuid
-     *            the new public account uuid
+     * 
+     * @param paUuid the new public account uuid
      */
-    public void setPaUuid( String paUuid )
-    {
+    public void setPaUuid(String paUuid) {
         this.paUuid = paUuid;
     }
 
     /**
      * Gets the recommend level.
-     *
+     * 
      * @return the recommend level
      */
-    public int getRecommendLevel()
-    {
+    public int getRecommendLevel() {
         return recommendLevel;
     }
 
     /**
      * Sets the recommend level.
-     *
-     * @param recommendLevel
-     *            the new recommend level
+     * 
+     * @param recommendLevel the new recommend level
      */
-    public void setRecommendLevel( int recommendLevel )
-    {
+    public void setRecommendLevel(int recommendLevel) {
         this.recommendLevel = recommendLevel;
     }
 
     /**
      * Gets the sip uri.
-     *
+     * 
      * @return the sip uri
      */
-    public String getSipUri()
-    {
+    public String getSipUri() {
         return sipUri;
     }
 
     /**
      * Sets the sip uri.
-     *
-     * @param sipUri
-     *            the new sip uri
+     * 
+     * @param sipUri the new sip uri
      */
-    public void setSipUri( String sipUri )
-    {
+    public void setSipUri(String sipUri) {
         this.sipUri = sipUri;
     }
 
-
     /**
      * Gets the subscribestatus.
-     *
+     * 
      * @return the subscribestatus
      */
     public int getSubscribestatus() {
@@ -264,7 +237,7 @@
 
     /**
      * Sets the subscribestatus.
-     *
+     * 
      * @param subscribestatus the new subscribestatus
      */
     public void setSubscribestatus(int subscribestatus) {
@@ -274,12 +247,9 @@
     @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)
-        ;
+        sbuffer.append("paUuid=").append(this.paUuid).append(",name=").append(this.name)
+                .append(",logo=").append(this.logo).append(",recommendLevel=")
+                .append(this.recommendLevel).append(",sipUri=").append(this.sipUri);
 
         return sbuffer.toString();
     }
@@ -290,28 +260,31 @@
         int lenB = account.getName().length();
         int lenComp = lenA >= lenB ? lenB : lenA;
         int result = 0;
-        for(int i = 0; i < lenComp; i++){
-            result = getHexString(name.charAt(0)).compareTo(getHexString(account.getName().charAt(0)));
-            if(result == 0){
+        for (int i = 0; i < lenComp; i++) {
+            result = getHexString(name.charAt(0)).compareTo(
+                    getHexString(account.getName().charAt(0)));
+            if (result == 0) {
                 continue;
-            }else{
+            } else {
                 return result;
             }
         }
-        if(lenA > lenB){
+        if (lenA > lenB) {
             return 1;
-        }else if(lenA == lenB){
+        } else if (lenA == lenB) {
             return 0;
-        }else{
+        } else {
             return -1;
         }
     }
-    
+
     public static String getHexString(char c) {
         byte[] b = null;
         StringBuffer sb = new StringBuffer();
         try {
-            b = new String(new char[] {c}).getBytes("gb2312");
+            b = new String(new char[] {
+                c
+            }).getBytes("gb2312");
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
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 02db2bf..83a3cbc 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
@@ -20,6 +20,7 @@
  * 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.pubacct;
 
 import android.os.Parcel;
@@ -37,42 +38,42 @@
  * </p>
  * <p>
  * Company: pci-suntek
- * </p>.
- *
+ * </p>
+ * .
+ * 
  * @author zrq
  * @version 1.0
  */
-public class PublicAccountsDetail implements Parcelable
-{
+public class PublicAccountsDetail implements Parcelable {
     /** The public account uuid. */
-    private String    paUuid;
+    private String paUuid;
 
     /** The name. */
-    private String    name;
+    private String name;
 
     /** The company. */
-    private String    company;
+    private String company;
 
     /** The introduce. */
-    private String    intro;
+    private String intro;
 
     /** The type. */
-    private String    type;
+    private String type;
 
     /** The recommend level. */
-    private int        recommendLevel;
+    private int recommendLevel;
 
     /** The update time. */
-    private String    updateTime;
+    private String updateTime;
 
     /** The menu type. */
-    private int        menuType;
+    private int menuType;
 
     /** The menu timestamp. */
-    private String    menuTimestamp;
+    private String menuTimestamp;
 
     /** The subscribe status. */
-    private int        subscribeStatus;
+    private int subscribeStatus;
 
     /** The accept status. */
     private int acceptstatus;
@@ -96,42 +97,39 @@
     private String field;
 
     /** The qr code. */
-    private String    qrCode;
+    private String qrCode;
 
     /** The logo url. */
-    private String    logoUrl;
+    private String logoUrl;
 
     /** The sip uri. */
-//    private String    sipUri;
-    
+    // private String sipUri;
+
     /** The number. */
-    private String    number;
+    private String number;
 
     /**
      * Instantiates a new public accounts detail.
      */
-    public PublicAccountsDetail()
-    {}
+    public PublicAccountsDetail() {
+    }
 
     /**
      * Instantiates a new public accounts detail.
-     *
-     * @param source
-     *            the source
+     * 
+     * @param source the source
      */
-    public PublicAccountsDetail( Parcel source )
-    {
-        readFromParcel( source );
+    public PublicAccountsDetail(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -139,48 +137,43 @@
      * 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
+     * 
+     * @param dest the dest
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( paUuid );
-        dest.writeString( name );
-        dest.writeString( company );
-        dest.writeString( intro );
-        dest.writeString( type );
-        dest.writeInt( recommendLevel );
-        dest.writeString( updateTime );
-        dest.writeInt( menuType );
-        dest.writeString( menuTimestamp );
-        dest.writeInt( subscribeStatus );
-        dest.writeInt( acceptstatus );
-        dest.writeInt( activeStatus );
-        dest.writeString( tel );
-        dest.writeString( email );
-        dest.writeString( zip );
-        dest.writeString( addr );
-        dest.writeString( field );
-        dest.writeString( qrCode );
-        dest.writeString( logoUrl );
-//        dest.writeString( sipUri );
-        dest.writeString( number );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(paUuid);
+        dest.writeString(name);
+        dest.writeString(company);
+        dest.writeString(intro);
+        dest.writeString(type);
+        dest.writeInt(recommendLevel);
+        dest.writeString(updateTime);
+        dest.writeInt(menuType);
+        dest.writeString(menuTimestamp);
+        dest.writeInt(subscribeStatus);
+        dest.writeInt(acceptstatus);
+        dest.writeInt(activeStatus);
+        dest.writeString(tel);
+        dest.writeString(email);
+        dest.writeString(zip);
+        dest.writeString(addr);
+        dest.writeString(field);
+        dest.writeString(qrCode);
+        dest.writeString(logoUrl);
+        // dest.writeString( sipUri );
+        dest.writeString(number);
     }
 
     /**
      * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         paUuid = source.readString();
         name = source.readString();
         company = source.readString();
@@ -200,238 +193,206 @@
         field = source.readString();
         qrCode = source.readString();
         logoUrl = source.readString();
-//        sipUri = source.readString();
+        // sipUri = source.readString();
         number = 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 );
+        public PublicAccountsDetail createFromParcel(Parcel source) {
+            return new PublicAccountsDetail(source);
         }
 
         @Override
-        public PublicAccountsDetail[] newArray( int size )
-        {
-            return new PublicAccountsDetail[ size ];
+        public PublicAccountsDetail[] newArray(int size) {
+            return new PublicAccountsDetail[size];
         }
     };
 
     /**
      * Gets the public account uuid.
-     *
+     * 
      * @return the public account uuid
      */
-    public String getPaUuid()
-    {
+    public String getPaUuid() {
         return paUuid;
     }
 
     /**
      * Sets the public account uuid.
-     *
-     * @param paUuid
-     *            the new public account uuid
+     * 
+     * @param paUuid the new public account uuid
      */
-    public void setPaUuid( String paUuid )
-    {
+    public void setPaUuid(String paUuid) {
         this.paUuid = paUuid;
     }
 
     /**
      * Gets the name.
-     *
+     * 
      * @return the name
      */
-    public String getName()
-    {
+    public String getName() {
         return name;
     }
 
     /**
      * Sets the name.
-     *
-     * @param name
-     *            the new name
+     * 
+     * @param name the new name
      */
-    public void setName( String name )
-    {
+    public void setName(String name) {
         this.name = name;
     }
 
     /**
      * Gets the company.
-     *
+     * 
      * @return the company
      */
-    public String getCompany()
-    {
+    public String getCompany() {
         return company;
     }
 
     /**
      * Sets the company.
-     *
-     * @param company
-     *            the new company
+     * 
+     * @param company the new company
      */
-    public void setCompany( String company )
-    {
+    public void setCompany(String company) {
         this.company = company;
     }
 
     /**
      * Gets the introduce.
-     *
+     * 
      * @return the introduce
      */
-    public String getIntro()
-    {
+    public String getIntro() {
         return intro;
     }
 
     /**
      * Sets the introduce.
-     *
-     * @param intro
-     *            the new introduce
+     * 
+     * @param intro the new introduce
      */
-    public void setIntro( String intro )
-    {
+    public void setIntro(String intro) {
         this.intro = intro;
     }
 
     /**
      * Gets the type.
-     *
+     * 
      * @return the type
      */
-    public String getType()
-    {
+    public String getType() {
         return type;
     }
 
     /**
      * Sets the type.
-     *
-     * @param type
-     *            the new type
+     * 
+     * @param type the new type
      */
-    public void setType( String type )
-    {
+    public void setType(String type) {
         this.type = type;
     }
 
     /**
      * Gets the recommend level.
-     *
+     * 
      * @return the recommend level
      */
-    public int getRecommendLevel()
-    {
+    public int getRecommendLevel() {
         return recommendLevel;
     }
 
     /**
      * Sets the recommend level.
-     *
-     * @param recommendLevel
-     *            the new recommend level
+     * 
+     * @param recommendLevel the new recommend level
      */
-    public void setRecommendLevel( int recommendLevel )
-    {
+    public void setRecommendLevel(int recommendLevel) {
         this.recommendLevel = recommendLevel;
     }
 
     /**
      * Gets the update time.
-     *
+     * 
      * @return the update time
      */
-    public String getUpdateTime()
-    {
+    public String getUpdateTime() {
         return updateTime;
     }
 
     /**
      * Sets the update time.
-     *
-     * @param updateTime
-     *            the new update time
+     * 
+     * @param updateTime the new update time
      */
-    public void setUpdateTime( String updateTime )
-    {
+    public void setUpdateTime(String updateTime) {
         this.updateTime = updateTime;
     }
 
     /**
      * Gets the menu type.
-     *
+     * 
      * @return the menu type
      */
-    public int getMenuType()
-    {
+    public int getMenuType() {
         return menuType;
     }
 
     /**
      * Sets the menu type.
-     *
-     * @param menuType
-     *            the new menu type
+     * 
+     * @param menuType the new menu type
      */
-    public void setMenuType( int menuType )
-    {
+    public void setMenuType(int menuType) {
         this.menuType = menuType;
     }
 
     /**
      * Gets the menu timestamp.
-     *
+     * 
      * @return the menu timestamp
      */
-    public String getMenuTimestamp()
-    {
+    public String getMenuTimestamp() {
         return menuTimestamp;
     }
 
     /**
      * Sets the menu timestamp.
-     *
-     * @param menuTimestamp
-     *            the new menu timestamp
+     * 
+     * @param menuTimestamp the new menu timestamp
      */
-    public void setMenuTimestamp( String menuTimestamp )
-    {
+    public void setMenuTimestamp(String menuTimestamp) {
         this.menuTimestamp = menuTimestamp;
     }
 
     /**
      * Gets the subscribe status.
-     *
+     * 
      * @return the subscribe status
      */
-    public int getSubscribeStatus()
-    {
+    public int getSubscribeStatus() {
         return subscribeStatus;
     }
 
     /**
      * Sets the subscribe status.
-     *
-     * @param subscribeStatus
-     *            the new subscribe status
+     * 
+     * @param subscribeStatus the new subscribe status
      */
-    public void setSubscribeStatus( int subscribeStatus )
-    {
+    public void setSubscribeStatus(int subscribeStatus) {
         this.subscribeStatus = subscribeStatus;
     }
 
     /**
      * Gets the acceptstatus.
-     *
+     * 
      * @return the acceptstatus
      */
     public int getAcceptstatus() {
@@ -440,7 +401,7 @@
 
     /**
      * Sets the acceptstatus.
-     *
+     * 
      * @param acceptstatus the new acceptstatus
      */
     public void setAcceptstatus(int acceptstatus) {
@@ -449,7 +410,7 @@
 
     /**
      * Gets the active status.
-     *
+     * 
      * @return the active status
      */
     public int getActiveStatus() {
@@ -458,7 +419,7 @@
 
     /**
      * Sets the active status.
-     *
+     * 
      * @param activeStatus the new active status
      */
     public void setActiveStatus(int activeStatus) {
@@ -467,7 +428,7 @@
 
     /**
      * Gets the tel.
-     *
+     * 
      * @return the tel
      */
     public String getTel() {
@@ -476,7 +437,7 @@
 
     /**
      * Sets the tel.
-     *
+     * 
      * @param tel the new tel
      */
     public void setTel(String tel) {
@@ -485,7 +446,7 @@
 
     /**
      * Gets the email.
-     *
+     * 
      * @return the email
      */
     public String getEmail() {
@@ -494,7 +455,7 @@
 
     /**
      * Sets the email.
-     *
+     * 
      * @param email the new email
      */
     public void setEmail(String email) {
@@ -503,7 +464,7 @@
 
     /**
      * Gets the zip.
-     *
+     * 
      * @return the zip
      */
     public String getZip() {
@@ -512,7 +473,7 @@
 
     /**
      * Sets the zip.
-     *
+     * 
      * @param zip the new zip
      */
     public void setZip(String zip) {
@@ -521,7 +482,7 @@
 
     /**
      * Gets the addr.
-     *
+     * 
      * @return the addr
      */
     public String getAddr() {
@@ -530,7 +491,7 @@
 
     /**
      * Sets the addr.
-     *
+     * 
      * @param addr the new addr
      */
     public void setAddr(String addr) {
@@ -539,7 +500,7 @@
 
     /**
      * Gets the field.
-     *
+     * 
      * @return the field
      */
     public String getField() {
@@ -548,7 +509,7 @@
 
     /**
      * Sets the field.
-     *
+     * 
      * @param field the new field
      */
     public void setField(String field) {
@@ -557,99 +518,89 @@
 
     /**
      * Gets the qr code.
-     *
+     * 
      * @return the qr code
      */
-    public String getQrCode()
-    {
+    public String getQrCode() {
         return qrCode;
     }
 
     /**
      * Sets the qr code.
-     *
-     * @param qrCode
-     *            the new qr code
+     * 
+     * @param qrCode the new qr code
      */
-    public void setQrCode( String qrCode )
-    {
+    public void setQrCode(String qrCode) {
         this.qrCode = qrCode;
     }
 
     /**
      * Gets the logo url.
-     *
+     * 
      * @return the logo url
      */
-    public String getLogoUrl()
-    {
+    public String getLogoUrl() {
         return logoUrl;
     }
 
     /**
      * Sets the logo url.
-     *
-     * @param logoUrl
-     *            the new logo url
+     * 
+     * @param logoUrl the new logo url
      */
-    public void setLogoUrl( String logoUrl )
-    {
+    public void setLogoUrl(String logoUrl) {
         this.logoUrl = logoUrl;
     }
 
     /**
      * 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
+     * 
+     * @param sipUri the new sip uri
      */
-//    public void setSipUri( String sipUri )
-//    {
-//        this.sipUri = sipUri;
-//    }
+    // public void setSipUri( String sipUri )
+    // {
+    // this.sipUri = sipUri;
+    // }
 
     /**
      * toString
-     *
+     * 
      * @return the gson string
      */
     @Override
-    public String toString()
-    {
-//        return new Gson().toJson( this );
+    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=").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)
-        ;
+        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);
 
         return sbuffer.toString();
     }
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 c175f31..dd9b442 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
@@ -20,104 +20,137 @@
  * 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.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>
- *
+ * <p>
+ * Title: The phone event
+ * </p>
+ * <p>
+ * Description: Coding scheme defined by terminal. The suggestion part coding
+ * rules supports the following events and code.
+ * </p>
+ * <p>
+ * PhoneEvent = A B C DE FGHIJ code
+ * </p>
+ * <p>
+ * The A:< event classification >, 1 char , A=1 -- a voice call; 2 -- 9 -- video
+ * call, terminal event, other reservations.
+ * </p>
+ * <p>
+ * The B:< participant ID >, 1 char. When the A=1 or 2, B=1 -- 2 -- calling,
+ * called, 3 -- 4 -- card terminal.
+ * </p>
+ * <p>
+ * The C:< process description >, 1 char. When the A=1 or 2, C=1- issued a
+ * session request, 2- receives the session invitation, 3- session has been
+ * established, the 4- session termination.
+ * </p>
+ * <p>
+ * The DE:< extended description >, 2 char. Therefore, the default 0.
+ * </p>
+ * <p>
+ * The FGHIJ:< reference code >, 5 char. Therefore, the default 0. Can carry
+ * relevant information, such as the SIP message code and expansion, said 180xx
+ * SIP 180 ringing message and other instructions.
+ * </p>
+ * <p>
+ * Copyright: Copyright (c) 2014
+ * </p>
+ * <p>
+ * Company: pci-suntek
+ * </p>
+ * 
  * @author zrq
  * @version 1.0
- *
  */
 public enum PhoneEvent {
 
     /** Non specific events. */
-    DEFAULT_EVENT( "0000000000" ),
+    DEFAULT_EVENT("0000000000"),
 
     /** The launch the voice call. */
-    LAUNCH_V_CALL( "1110000000" ),
+    LAUNCH_V_CALL("1110000000"),
 
     /** A voice call incoming, terminal began ringing. */
-    V_CALL_IN_RINGING( "1220018000" ),
+    V_CALL_IN_RINGING("1220018000"),
 
     /** Voice call connection ( caller side ). */
-    V_CALL_CONN_CALLER( "1130020000" ),
+    V_CALL_CONN_CALLER("1130020000"),
 
     /** Voice call connection ( called side ). */
-    V_CALL_CONN_CALLED( "123 00 20000" ),
+    V_CALL_CONN_CALLED("123 00 20000"),
 
     /** Voice call hang up ( caller side ). */
-    V_CALL_HANG_UP_CALLER( "1140020000" ),
+    V_CALL_HANG_UP_CALLER("1140020000"),
 
     /** Voice call hung ( called side ). */
-    V_CALL_HANG_UP_CALLED( "1240020000" ),
+    V_CALL_HANG_UP_CALLED("1240020000"),
 
     /** Start a video call out. */
-    LAUNCH_VD_CALL( "2110000000" ),
+    LAUNCH_VD_CALL("2110000000"),
 
     /** A video call incoming, terminal began ringing. */
-    VD_CALL_IN_RINGING( "2220000000" ),
+    VD_CALL_IN_RINGING("2220000000"),
 
     /** Video call connection ( caller side ). */
-    VD_CALL_CONN_CALLER( "2130020000" ),
+    VD_CALL_CONN_CALLER("2130020000"),
 
     /** Video call connection ( called side ). */
-    VD_CALL_CONN_CALLED( "2230020000" ),
+    VD_CALL_CONN_CALLED("2230020000"),
 
     /** Video call hang up ( caller side ). */
-    VD_CALL_HANG_UP_CALLER( "2140020000" ),
+    VD_CALL_HANG_UP_CALLER("2140020000"),
 
     /** Video call hung ( called side ). */
-    VD_CALL_HANG_UP_CALLED( "2240020000" ),
+    VD_CALL_HANG_UP_CALLED("2240020000"),
 
-    /** Terminal communications, is being viewed, main requirements for reinforced screen. */
-    CONTACT_READING_REQ_SCRN( "9331011000" ),
+    /**
+     * Terminal communications, is being viewed, main requirements for
+     * reinforced screen.
+     */
+    CONTACT_READING_REQ_SCRN("9331011000"),
 
-    /** Terminal communications, is viewed, the main requirements set enhanced screen. */
-    CONTACT_READING_SET_SCRN( "9331012000" ),
+    /**
+     * Terminal communications, is viewed, the main requirements set enhanced
+     * screen.
+     */
+    CONTACT_READING_SET_SCRN("9331012000"),
 
-    /** Terminal contacts to complete the update (such as add or revise a contact). */
-    CONTACT_UPDATE_FINISH( "9341020000" ),
+    /**
+     * Terminal contacts to complete the update (such as add or revise a
+     * contact).
+     */
+    CONTACT_UPDATE_FINISH("9341020000"),
 
     /** Terminal is to restore the factory settings. */
-    FACTORY_SETTING_READY_RESTORE( "9319030000" ),
+    FACTORY_SETTING_READY_RESTORE("9319030000"),
 
     /** The terminal has been completed to restore factory settings. */
-    FACTORY_SETTING_RESTORE_FINISH( "9349030000" ),
+    FACTORY_SETTING_RESTORE_FINISH("9349030000"),
 
     /** The terminal has replaced the SIM card. */
-    SIM_CARD_CHANGED( "9449040000" );
+    SIM_CARD_CHANGED("9449040000");
 
     /** The ctrl string. */
-    private String    ctrlString;
+    private String ctrlString;
 
     /**
      * Instantiates a new phone event.
-     *
+     * 
      * @param ctrlString the ctrl string
      */
-    private PhoneEvent( String ctrlString )
-    {
+    private PhoneEvent(String ctrlString) {
         this.ctrlString = ctrlString;
     }
 
     /**
      * Gets the control string.
-     *
+     * 
      * @return the control string
      */
-    public String getCtrlStr()
-    {
+    public String getCtrlStr() {
         return ctrlString;
     }
 }
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 294c618..9815fe9 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
@@ -20,6 +20,7 @@
  * 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.richscrn;
 
 import java.util.ArrayList;
@@ -40,17 +41,14 @@
  * <p>
  * Company: pci-suntek
  * </p>
- *
+ * 
  * @author zrq
  * @version 1.0
- *
  */
-public class PhoneList implements Parcelable
-{
-
+public class PhoneList implements Parcelable {
 
     /** The phone list . */
-    private ArrayList<String>    phoneList;
+    private ArrayList<String> phoneList;
 
     public ArrayList<String> getPhoneList() {
         return phoneList;
@@ -63,28 +61,25 @@
     /**
      * Instantiates a new phone list.
      */
-    public PhoneList()
-    {}
+    public PhoneList() {
+    }
 
     /**
      * Instantiates a new phone list.
-     *
-     * @param source
-     *            the source
+     * 
+     * @param source the source
      */
-    public PhoneList( Parcel source )
-    {
-        readFromParcel( source );
+    public PhoneList(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -92,15 +87,12 @@
      * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
+    public void writeToParcel(Parcel dest, int flags) {
         dest.writeStringList(phoneList);
     }
 
@@ -108,31 +100,24 @@
      * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         phoneList = source.createStringArrayList();
     }
 
     /** 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 );
+        public PhoneList createFromParcel(Parcel source) {
+            return new PhoneList(source);
         }
 
         @Override
-        public PhoneList[] newArray( int size )
-        {
-            return new PhoneList[ size ];
+        public PhoneList[] newArray(int size) {
+            return new PhoneList[size];
         }
     };
 
-
-
-
 }
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 c8ccd83..625229a 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
@@ -20,6 +20,7 @@
  * 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.richscrn;
 
 import android.os.Parcel;
@@ -38,45 +39,40 @@
  * <p>
  * Company: pci-suntek
  * </p>
- *
+ * 
  * @author zrq
  * @version 1.0
- *
  */
-public class ResultInfo implements Parcelable
-{
+public class ResultInfo implements Parcelable {
 
     /** The is success flag. */
-    private boolean    isSuccess;
+    private boolean isSuccess;
 
     /** The result message. */
-    private String    resultMsg;
+    private String resultMsg;
 
     /**
      * Instantiates a new result info.
      */
-    public ResultInfo()
-    {}
+    public ResultInfo() {
+    }
 
     /**
      * Instantiates a new result info.
-     *
-     * @param source
-     *            the source
+     * 
+     * @param source the source
      */
-    public ResultInfo( Parcel source )
-    {
-        readFromParcel( source );
+    public ResultInfo(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -84,90 +80,79 @@
      * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeBooleanArray( new boolean[] { isSuccess } );
-        dest.writeString( resultMsg );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeBooleanArray(new boolean[] {
+            isSuccess
+        });
+        dest.writeString(resultMsg);
     }
 
     /**
      * Create the result entity from parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        boolean[] value = new boolean[ 1 ];
+    public void readFromParcel(Parcel source) {
+        boolean[] value = new boolean[1];
 
-        source.readBooleanArray( value );
-        isSuccess = value[ 0 ];
+        source.readBooleanArray(value);
+        isSuccess = value[0];
         resultMsg = source.readString();
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<ResultInfo>    CREATOR    = new Parcelable.Creator<ResultInfo>() {
-                                                                    @Override
-                                                                    public ResultInfo createFromParcel( Parcel source )
-                                                                    {
-                                                                        return new ResultInfo( source );
-                                                                    }
+    public static final Parcelable.Creator<ResultInfo> CREATOR = new Parcelable.Creator<ResultInfo>() {
+        @Override
+        public ResultInfo createFromParcel(Parcel source) {
+            return new ResultInfo(source);
+        }
 
-                                                                    @Override
-                                                                    public ResultInfo[] newArray( int size )
-                                                                    {
-                                                                        return new ResultInfo[ size ];
-                                                                    }
-                                                                };
+        @Override
+        public ResultInfo[] newArray(int size) {
+            return new ResultInfo[size];
+        }
+    };
 
     /**
      * Checks if is success flag.
-     *
+     * 
      * @return true, if is success flag
      */
-    public boolean isSuccess()
-    {
+    public boolean isSuccess() {
         return isSuccess;
     }
 
     /**
      * Sets the success flag.
-     *
-     * @param isSuccess
-     *            the new success flag
+     * 
+     * @param isSuccess the new success flag
      */
-    public void setSuccess( boolean isSuccess )
-    {
+    public void setSuccess(boolean isSuccess) {
         this.isSuccess = isSuccess;
     }
 
     /**
      * Gets the result message.
-     *
+     * 
      * @return the result message
      */
-    public String getResultMsg()
-    {
+    public String getResultMsg() {
         return resultMsg;
     }
 
     /**
      * Sets the result message.
-     *
-     * @param resultMsg
-     *            the new result message
+     * 
+     * @param resultMsg the new result message
      */
-    public void setResultMsg( String resultMsg )
-    {
+    public void setResultMsg(String resultMsg) {
         this.resultMsg = resultMsg;
     }
 }
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 dc51fbd..b9c5065 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
@@ -20,6 +20,7 @@
  * 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.richscrn;
 
 import android.os.Parcel;
@@ -38,162 +39,144 @@
  * <p>
  * Company: pci-suntek
  * </p>
- *
+ * 
  * @author zrq
  * @version 1.0
- *
  */
-public class ResultUtil implements Parcelable
-{
+public class ResultUtil implements Parcelable {
     /** The result succ flag, true is succ, otherwise it is fail. */
-    private boolean                                        resultFlag;
+    private boolean resultFlag;
 
     /** The result info. */
-    private String                                        resultMsg;
+    private String resultMsg;
+
     /**
      * The result additional object, different conditions have different result
      * object.
      */
-    private Object                                        resultObj;
+    private Object resultObj;
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<ResultUtil>    CREATOR    = new Parcelable.Creator<ResultUtil>() {
-                                                                    @Override
-                                                                    public ResultUtil createFromParcel( Parcel source )
-                                                                    {
-                                                                        return new ResultUtil( source );
-                                                                    }
+    public static final Parcelable.Creator<ResultUtil> CREATOR = new Parcelable.Creator<ResultUtil>() {
+        @Override
+        public ResultUtil createFromParcel(Parcel source) {
+            return new ResultUtil(source);
+        }
 
-                                                                    @Override
-                                                                    public ResultUtil[] newArray( int size )
-                                                                    {
-                                                                        return new ResultUtil[ size ];
-                                                                    }
-                                                                };
+        @Override
+        public ResultUtil[] newArray(int size) {
+            return new ResultUtil[size];
+        }
+    };
 
     /**
      * Instantiates a new result entity.
      */
-    public ResultUtil()
-    {}
+    public ResultUtil() {
+    }
 
     /**
      * Instantiates a new result entity from parcel.
-     *
-     * @param source
-     *            the parcel source.
+     * 
+     * @param source the parcel source.
      */
-    public ResultUtil( Parcel source )
-    {
-        readFromParcel( source );
+    public ResultUtil(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The result entity write to parcel stream. Pay attention to write
      * variables and read the ordering of the variables should be consistent or
      * not the correct results.
-     *
-     * @param dest
-     *            The parcel stream
-     * @param flags
-     *            The write to parcel flag
+     * 
+     * @param dest The parcel stream
+     * @param flags The write to parcel flag
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeBooleanArray( new boolean[] { resultFlag } );
-        dest.writeString( resultMsg );
-        dest.writeValue( resultObj );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeBooleanArray(new boolean[] {
+            resultFlag
+        });
+        dest.writeString(resultMsg);
+        dest.writeValue(resultObj);
     }
 
     /**
      * Create the result entity from parcel stream. Pay attention to read and
      * write variables variables sequence should be consistent or not the
      * correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
-        boolean[] val = new boolean[ 1 ];
-        source.readBooleanArray( val );
-        resultFlag = val[ 0 ];
+    public void readFromParcel(Parcel source) {
+        boolean[] val = new boolean[1];
+        source.readBooleanArray(val);
+        resultFlag = val[0];
         resultMsg = source.readString();
-        resultObj = source.readValue( this.getClass().getClassLoader() );
+        resultObj = source.readValue(this.getClass().getClassLoader());
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
     /**
      * Checks if is result succ.
-     *
+     * 
      * @return true, if is result succ
      */
-    public boolean isResultFlag()
-    {
+    public boolean isResultFlag() {
         return resultFlag;
     }
 
     /**
      * Sets the result flag.
-     *
-     * @param resultFlag
-     *            the new result flag
+     * 
+     * @param resultFlag the new result flag
      */
-    public void setResultFlag( boolean resultFlag )
-    {
+    public void setResultFlag(boolean resultFlag) {
         this.resultFlag = resultFlag;
     }
 
     /**
      * Gets the result info.
-     *
+     * 
      * @return the result info
      */
-    public String getResultMsg()
-    {
+    public String getResultMsg() {
         return resultMsg;
     }
 
     /**
      * Sets the result info.
-     *
-     * @param resultMsg
-     *            the new result info.
+     * 
+     * @param resultMsg the new result info.
      */
-    public void setResultMsg( String resultMsg )
-    {
+    public void setResultMsg(String resultMsg) {
         this.resultMsg = resultMsg;
     }
 
     /**
      * Gets the result object.
-     *
+     * 
      * @return the result object
      */
-    public Object getResultObj()
-    {
+    public Object getResultObj() {
         return resultObj;
     }
 
     /**
      * Sets the result object.
-     *
-     * @param resultObj
-     *            the new result object
+     * 
+     * @param resultObj the new result object
      */
-    public void setResultObj( Object resultObj )
-    {
+    public void setResultObj(Object resultObj) {
         this.resultObj = resultObj;
     }
 }
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 03b117b..e76bb22 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
@@ -20,6 +20,7 @@
  * 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.richscrn;
 
 import android.os.Parcel;
@@ -38,56 +39,51 @@
  * <p>
  * Company: pci-suntek
  * </p>
- *
+ * 
  * @author zrq
  * @version 1.0
- *
  */
-public class RichScrnShowing implements Parcelable
-{
+public class RichScrnShowing implements Parcelable {
     /** The missdn. */
-    private String    missdn;
+    private String missdn;
 
     /** The cid. */
-    private String    cid;
+    private String cid;
 
     /** The greeting. */
-    private String    greeting;
+    private String greeting;
 
     /** The source type. */
-    private String    sourceType;
+    private String sourceType;
 
     /** The missdn address. */
-    private String    missdnAddress;
+    private String missdnAddress;
 
     /** The local source url. */
-    private String    localSourceUrl;
+    private String localSourceUrl;
 
     /**
      * Instantiates a new rich scrn showing.
      */
-    public RichScrnShowing()
-    {}
+    public RichScrnShowing() {
+    }
 
     /**
      * Instantiates a new rich scrn showing.
-     *
-     * @param source
-     *            the source
+     * 
+     * @param source the source
      */
-    public RichScrnShowing( Parcel source )
-    {
-        readFromParcel( source );
+    public RichScrnShowing(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -95,33 +91,28 @@
      * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
-        dest.writeString( missdn );
-        dest.writeString( cid );
-        dest.writeString( greeting );
-        dest.writeString( sourceType );
-        dest.writeString( missdnAddress );
-        dest.writeString( localSourceUrl );
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(missdn);
+        dest.writeString(cid);
+        dest.writeString(greeting);
+        dest.writeString(sourceType);
+        dest.writeString(missdnAddress);
+        dest.writeString(localSourceUrl);
     }
 
     /**
      * Create the rich screen showing entity from parcel stream. Pay attention
      * to read and write variables variables sequence should be consistent or
      * not the correct results
-     *
-     * @param source
-     *            The parcel stream
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         missdn = source.readString();
         cid = source.readString();
         greeting = source.readString();
@@ -131,143 +122,123 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<RichScrnShowing>    CREATOR    = new Parcelable.Creator<RichScrnShowing>() {
-                                                                        @Override
-                                                                        public RichScrnShowing createFromParcel( Parcel source )
-                                                                        {
-                                                                            return new RichScrnShowing( source );
-                                                                        }
+    public static final Parcelable.Creator<RichScrnShowing> CREATOR = new Parcelable.Creator<RichScrnShowing>() {
+        @Override
+        public RichScrnShowing createFromParcel(Parcel source) {
+            return new RichScrnShowing(source);
+        }
 
-                                                                        @Override
-                                                                        public RichScrnShowing[] newArray( int size )
-                                                                        {
-                                                                            return new RichScrnShowing[ size ];
-                                                                        }
-                                                                    };
+        @Override
+        public RichScrnShowing[] newArray(int size) {
+            return new RichScrnShowing[size];
+        }
+    };
 
     /**
      * Gets the missdn.
-     *
+     * 
      * @return the missdn
      */
-    public String getMissdn()
-    {
+    public String getMissdn() {
         return missdn;
     }
 
     /**
      * Sets the missdn.
-     *
-     * @param missdn
-     *            the new missdn
+     * 
+     * @param missdn the new missdn
      */
-    public void setMissdn( String missdn )
-    {
+    public void setMissdn(String missdn) {
         this.missdn = missdn;
     }
 
     /**
      * Gets the cid.
-     *
+     * 
      * @return the cid
      */
-    public String getCid()
-    {
+    public String getCid() {
         return cid;
     }
 
     /**
      * Sets the cid.
-     *
-     * @param cid
-     *            the new cid
+     * 
+     * @param cid the new cid
      */
-    public void setCid( String cid )
-    {
+    public void setCid(String cid) {
         this.cid = cid;
     }
 
     /**
      * Gets the greeting.
-     *
+     * 
      * @return the greeting
      */
-    public String getGreeting()
-    {
+    public String getGreeting() {
         return greeting;
     }
 
     /**
      * Sets the greeting.
-     *
-     * @param greeting
-     *            the new greeting
+     * 
+     * @param greeting the new greeting
      */
-    public void setGreeting( String greeting )
-    {
+    public void setGreeting(String greeting) {
         this.greeting = greeting;
     }
 
     /**
      * Gets the source type.
-     *
+     * 
      * @return the source type
      */
-    public String getSourceType()
-    {
+    public String getSourceType() {
         return sourceType;
     }
 
     /**
      * Sets the source type.
-     *
-     * @param sourceType
-     *            the new source type
+     * 
+     * @param sourceType the new source type
      */
-    public void setSourceType( String sourceType )
-    {
+    public void setSourceType(String sourceType) {
         this.sourceType = sourceType;
     }
 
     /**
      * Gets the missdn address.
-     *
+     * 
      * @return the missdn address
      */
-    public String getMissdnAddress()
-    {
+    public String getMissdnAddress() {
         return missdnAddress;
     }
 
     /**
      * Sets the missdn address.
-     *
-     * @param missdnAddress
-     *            the new missdn address
+     * 
+     * @param missdnAddress the new missdn address
      */
-    public void setMissdnAddress( String missdnAddress )
-    {
+    public void setMissdnAddress(String missdnAddress) {
         this.missdnAddress = missdnAddress;
     }
 
     /**
      * Gets the local source url.
-     *
+     * 
      * @return the local source url
      */
-    public String getLocalSourceUrl()
-    {
+    public String getLocalSourceUrl() {
         return localSourceUrl;
     }
 
     /**
      * Sets the local source url.
-     *
-     * @param localSourceUrl
-     *            the new local source url
+     * 
+     * @param localSourceUrl the new local source url
      */
-    public void setLocalSourceUrl( String localSourceUrl )
-    {
+    public void setLocalSourceUrl(String localSourceUrl) {
         this.localSourceUrl = localSourceUrl;
     }
 }
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
index 931a291..6cff09f 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
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
index 67221b1..d00ba35 100644
--- 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
@@ -20,16 +20,19 @@
  * 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.
+ * 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
@@ -37,45 +40,40 @@
  * <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");
+    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";
 
@@ -88,98 +86,78 @@
     /** 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";
 
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
index ff123bf..8570f06 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -34,12 +35,13 @@
 
     /** 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);
+    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";
@@ -109,10 +111,10 @@
 
     /** 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
index 78c5669..7df4b63 100644
--- 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
@@ -20,17 +20,20 @@
  * 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.
+ * 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
@@ -38,9 +41,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class SuntekMessageData {
 
@@ -59,33 +62,52 @@
     public static final String TABLE_RICH_MESSAGE_BACKUP = "stkMessageBak";
 
     /** Table name of group */
-    public static final String TABLE_CHAT_GROUP= "chatGroup";
-    
+    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);
+    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);
-    
+    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);
-    
+    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);
-    
+    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);
-    
+    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);
-    
+    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);
+    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.
@@ -93,16 +115,15 @@
     public static final int CHAT_TYPE_ONE2ONE = 1;
 
     /**
-     *  Chat type about group chat.
+     * Chat type about group chat.
      */
     public static final int CHAT_TYPE_ONE2GROUP = 2;
 
     /**
-     *  Chat type about group chat.
+     * Chat type about group chat.
      */
     public static final int CHAT_TYPE_GROUP = 3;
 
-
     /**
      * Chat type about group-sent message.
      */
@@ -112,34 +133,42 @@
      * 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.
      */
@@ -175,7 +204,8 @@
     public static final int MSG_STATE_SEND_REC = -1;
 
     /**
-     * Message status about message is sent out but not received by the other side.
+     * Message status about message is sent out but not received by the other
+     * side.
      */
     public static final int MSG_STATE_SENDED = 32;
 
@@ -190,6 +220,11 @@
     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;
@@ -205,14 +240,12 @@
     public static final int MSG_UNREAD = 0;
 
     /**
-     * Message status about send.
-     * Ue send message to another
+     * 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
+     * Message status about receive. Ue received message from another
      */
     public static final int MSG_RECEIVE = 1;
 
@@ -222,6 +255,9 @@
     /** 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;
 
@@ -258,6 +294,7 @@
      * Column name about contact of message.
      */
     public static final String KEY_CONTACT = "_contact";
+
     /**
      * Column name about message id of message.
      */
@@ -267,26 +304,32 @@
      * 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.
      */
@@ -301,18 +344,20 @@
      * 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.
-    */
+     * Column name about contribution id of chat message.
+     */
     public static final String KEY_CONTRIBUTION_ID = "_contribution_id";
 
     /**
@@ -421,4 +466,9 @@
      * 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
index 78bf56f..985ab8c 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -36,9 +37,12 @@
 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.
+ * Title: SuntekMessageDbSlct class
+ * </p>
+ * <p>
+ * Description: The class <code>SuntekMessageDbSlct</code> offers functions for
+ * query rich message database.
  * </p>
  * <p>
  * Copyright: Copyright (c) 2014
@@ -46,9 +50,9 @@
  * <p>
  * Company: pci-sunteck
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class SuntekMessageDbSlct {
 
@@ -63,15 +67,17 @@
     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.
+     * 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){
+        if (instance == null) {
+            synchronized (SuntekMessageDbSlct.class) {
+                if (instance == null) {
                     instance = new SuntekMessageDbSlct(context);
                 }
             }
@@ -81,25 +87,27 @@
 
     /**
      * Private constructor to avoid creating instance directly
-     * @param context subclass of android.content.Context, here is the instance of RCSApplication.
+     * 
+     * @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 + ""
+        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();
@@ -119,22 +127,26 @@
     }
 
     /**
-     * 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}
+     * 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()) {
+        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;
             }
@@ -144,22 +156,23 @@
     }
 
     /**
-     * Query a list of chat group information which is represented by class {@link  com.suntek.mway.rcs.client.api.provider.model.ChatGroupModel}
+     * 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()) {
+        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);
             }
@@ -169,18 +182,24 @@
     }
 
     /**
-     * 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}
+     * 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}
+     * @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));
+        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);
@@ -195,15 +214,19 @@
     }
 
     /**
-     * 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}
+     * 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}
+     * @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 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));
@@ -236,32 +259,29 @@
 
     /**
      * 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()) {
+        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);
             }
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
new file mode 100644
index 0000000..98c1e62
--- /dev/null
+++ b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/CapabilitiesColumn.java
@@ -0,0 +1,74 @@
+/*
+ * 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.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/ChatMessage.java
index c386337..203787e 100644
--- 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
@@ -26,16 +26,21 @@
  * 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.
+ * 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
@@ -43,9 +48,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class ChatMessage implements Parcelable, Comparable<ChatMessage> {
     /**
@@ -67,6 +72,7 @@
      * The chat message data.
      */
     private String data;
+
     /**
      * The chat message time.
      */
@@ -76,6 +82,7 @@
      * The filename of chat message.
      */
     private String filename;
+
     /**
      * The file size of file name.
      */
@@ -90,6 +97,7 @@
      * The chat message type.
      */
     private int msgType;
+
     /**
      * Whether send or receive of chat message.
      */
@@ -151,7 +159,7 @@
     private String header;
 
     /** Body of message, when receive message then set the body. */
-    private String body ;
+    private String body;
 
     /** public account message. */
     private PublicMessage publicMessage;
@@ -175,29 +183,30 @@
     /**
      * Instantiates a new Chat Messages.
      */
-    public ChatMessage()
-    {
+    public ChatMessage() {
     }
 
     /**
      * Instantiates a new Chat Messages.
-     *
-     * @param source
-     *            the source
+     * 
+     * @param source the source
      */
-    public ChatMessage( Parcel source )
-    {
-        readFromParcel( 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) {
@@ -206,7 +215,7 @@
 
     /**
      * Get contact.
-     *
+     * 
      * @return contact
      */
     public String getContact() {
@@ -215,14 +224,16 @@
 
     /**
      * Set contact.
-     *
+     * 
      * @param contact contact
      */
     public void setContact(String contact) {
         this.contact = contact;
     }
+
     /**
      * Get message id.
+     * 
      * @return message id
      */
     public String getMessageId() {
@@ -231,17 +242,22 @@
 
     /**
      * 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.
+     * 
+     * @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;
@@ -249,7 +265,7 @@
 
     /**
      * Set the message content.
-     *
+     * 
      * @param data the new data
      */
     public void setData(String data) {
@@ -258,7 +274,7 @@
 
     /**
      * Get message time.
-     *
+     * 
      * @return the time
      */
     public long getTime() {
@@ -267,7 +283,7 @@
 
     /**
      * Set message time.
-     *
+     * 
      * @param time the new time
      */
     public void setTime(long time) {
@@ -276,7 +292,7 @@
 
     /**
      * Get file name.
-     *
+     * 
      * @return the filename
      */
     public String getFilename() {
@@ -285,7 +301,7 @@
 
     /**
      * Set file name.
-     *
+     * 
      * @param filename the new filename
      */
     public void setFilename(String filename) {
@@ -294,7 +310,7 @@
 
     /**
      * Get file size.
-     *
+     * 
      * @return the filesize
      */
     public long getFilesize() {
@@ -303,7 +319,7 @@
 
     /**
      * Set file size.
-     *
+     * 
      * @param filesize the new filesize
      */
     public void setFilesize(long filesize) {
@@ -312,7 +328,7 @@
 
     /**
      * Get mine type.
-     *
+     * 
      * @return the mime type
      */
     public String getMimeType() {
@@ -321,32 +337,36 @@
 
     /**
      * 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
+     *         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
+     * 
+     * @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;
@@ -354,10 +374,10 @@
 
     /**
      * Get whether send or receive.
-     *
-     * @return  The possible value can be<br/>
-     * RichMessageData.MSG_SEND,<br/>
-     * RichMessageData.MSG_RECEIVE
+     * 
+     * @return The possible value can be<br/>
+     *         RichMessageData.MSG_SEND,<br/>
+     *         RichMessageData.MSG_RECEIVE
      */
     public int getSendReceive() {
         return sendReceive;
@@ -365,10 +385,10 @@
 
     /**
      * Set send or receive.
-     *
-     * @param sendReceive  The possible value can be<br/>
-     * RichMessageData.MSG_SEND,<br/>
-     * RichMessageData.MSG_RECEIVE
+     * 
+     * @param sendReceive The possible value can be<br/>
+     *            RichMessageData.MSG_SEND,<br/>
+     *            RichMessageData.MSG_RECEIVE
      */
     public void setSendReceive(int sendReceive) {
         this.sendReceive = sendReceive;
@@ -376,7 +396,7 @@
 
     /**
      * Get whether the message id read or not.
-     *
+     * 
      * @return the checks if is read
      */
     public int getIsRead() {
@@ -385,20 +405,22 @@
 
     /**
      * 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
+     * 
+     * @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;
@@ -406,7 +428,7 @@
 
     /**
      * Set status of message.
-     *
+     * 
      * @param msgState the new msg state
      */
     public void setMsgState(int msgState) {
@@ -415,7 +437,7 @@
 
     /**
      * Get the thread id.
-     *
+     * 
      * @return the thread id
      */
     public long getThreadId() {
@@ -424,18 +446,20 @@
 
     /**
      * 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
+     * 
+     * @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;
@@ -443,7 +467,7 @@
 
     /**
      * Set the chat type.
-     *
+     * 
      * @param chatType the new chat type
      */
     public void setChatType(int chatType) {
@@ -452,7 +476,7 @@
 
     /**
      * Get message conversation id.
-     *
+     * 
      * @return chat message conversation id
      */
     public String getConversationId() {
@@ -461,7 +485,7 @@
 
     /**
      * Set message conversation id.
-     *
+     * 
      * @param conversationId the new conversation id
      * @return conversationId
      */
@@ -471,7 +495,7 @@
 
     /**
      * Get message contribution id.
-     *
+     * 
      * @return chat message contribution id
      */
     public String getContributionId() {
@@ -480,7 +504,7 @@
 
     /**
      * Set message contribution id.
-     *
+     * 
      * @param contributionId the new contribution id
      * @return contributionId
      */
@@ -490,7 +514,7 @@
 
     /**
      * Get file selector.
-     *
+     * 
      * @return the file selector
      */
     public String getFileSelector() {
@@ -499,7 +523,7 @@
 
     /**
      * Set file selector .
-     *
+     * 
      * @param fileSelector the new file selector
      */
     public void setFileSelector(String fileSelector) {
@@ -508,7 +532,7 @@
 
     /**
      * Get file transfer extend info.
-     *
+     * 
      * @return the file transfer ext
      */
     public String getFileTransferExt() {
@@ -517,7 +541,7 @@
 
     /**
      * Set file transfer extend info.
-     *
+     * 
      * @param fileTransferExt the new file transfer ext
      */
     public void setFileTransferExt(String fileTransferExt) {
@@ -526,7 +550,7 @@
 
     /**
      * Get file transfer extend info id.
-     *
+     * 
      * @return the file transfer id
      */
     public String getFileTransferId() {
@@ -535,7 +559,7 @@
 
     /**
      * Set file transfer extend info id.
-     *
+     * 
      * @param fileTransferId the new file transfer id
      */
     public void setFileTransferId(String fileTransferId) {
@@ -544,7 +568,7 @@
 
     /**
      * Get transfer file icon.
-     *
+     * 
      * @return the file icon
      */
     public String getFileIcon() {
@@ -553,7 +577,7 @@
 
     /**
      * Set transfer file icon.
-     *
+     * 
      * @param fileIcon the new file icon
      */
     public void setFileIcon(String fileIcon) {
@@ -562,7 +586,7 @@
 
     /**
      * Get message burn after reading flag.
-     *
+     * 
      * @return the msg burn after read flag
      */
     public int getMsgBurnAfterReadFlag() {
@@ -571,7 +595,7 @@
 
     /**
      * Set message burn after reading flag.
-     *
+     * 
      * @param msgBurnAfterReadFlag the new msg burn after read flag
      */
     public void setMsgBurnAfterReadFlag(int msgBurnAfterReadFlag) {
@@ -580,7 +604,7 @@
 
     /**
      * Get barCycle of burn after reading message.
-     *
+     * 
      * @return the bar cycle
      */
     public int getBarCycle() {
@@ -589,7 +613,7 @@
 
     /**
      * Set barCycle of burn after reading message.
-     *
+     * 
      * @param barCycle the new bar cycle
      */
     public void setBarCycle(int barCycle) {
@@ -598,7 +622,7 @@
 
     /**
      * Gets the public message.
-     *
+     * 
      * @return the public message
      */
     public PublicMessage getPublicMessage() {
@@ -607,7 +631,7 @@
 
     /**
      * Sets the public message.
-     *
+     * 
      * @param publicMessage the new public message
      */
     public void setPublicMessage(PublicMessage publicMessage) {
@@ -616,7 +640,7 @@
 
     /**
      * Gets the cloud file message.
-     *
+     * 
      * @return the cloud file message
      */
     public CloudFileMessage getCloudFileMessage() {
@@ -625,7 +649,7 @@
 
     /**
      * Sets the cloud file message.
-     *
+     * 
      * @param cloudFileMessage the new cloud file message
      */
     public void setCloudFileMessage(CloudFileMessage cloudFileMessage) {
@@ -634,7 +658,7 @@
 
     /**
      * Get the message body.
-     *
+     * 
      * @return the body
      */
     public String getBody() {
@@ -643,7 +667,7 @@
 
     /**
      * Set the message body.
-     *
+     * 
      * @param body the new body
      */
     public void setBody(String body) {
@@ -652,7 +676,7 @@
 
     /**
      * Get the message header.
-     *
+     * 
      * @return the header
      */
     public String getHeader() {
@@ -661,7 +685,7 @@
 
     /**
      * Set the message header.
-     *
+     * 
      * @param header the new header
      */
     public void setHeader(String header) {
@@ -670,7 +694,7 @@
 
     /**
      * Gets the msg black flag.
-     *
+     * 
      * @return the msg black flag
      */
     public int getMsgBlackFlag() {
@@ -679,7 +703,7 @@
 
     /**
      * Sets the msg black flag.
-     *
+     * 
      * @param msgBlackFlag the new msg black flag
      */
     public void setMsgBlackFlag(int msgBlackFlag) {
@@ -688,7 +712,7 @@
 
     /**
      * Get the continue flag.
-     *
+     * 
      * @return the continue flag
      */
     public int getContinueFlag() {
@@ -697,7 +721,7 @@
 
     /**
      * Set the continue flag.
-     *
+     * 
      * @param continueFlag
      */
     public void setContinueFlag(int continueFlag) {
@@ -705,6 +729,25 @@
     }
 
     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;
     }
 
@@ -728,7 +771,8 @@
         this.thumbpath = thumbpath;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
      * @see android.os.Parcelable#describeContents()
      */
     @Override
@@ -737,41 +781,42 @@
         return 0;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (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.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.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);
@@ -781,11 +826,10 @@
 
     /**
      * Read from parcel.
-     *
+     * 
      * @param source the source
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         id = source.readInt();
         contact = source.readString();
         messageId = source.readString();
@@ -814,10 +858,11 @@
 
         header = source.readString();
         body = source.readString();
-        publicMessage = (PublicMessage) source.readValue(PublicMessage.class.getClassLoader());
+        publicMessage = (PublicMessage)source.readValue(PublicMessage.class.getClassLoader());
         msgBlackFlag = source.readInt();
         continueFlag = source.readInt();
-        cloudFileMessage = (CloudFileMessage) source.readValue(CloudFileMessage.class.getClassLoader());
+        cloudFileMessage = (CloudFileMessage)source.readValue(CloudFileMessage.class
+                .getClassLoader());
 
         duration = source.readInt();
         filepath = source.readString();
@@ -833,41 +878,39 @@
         @Override
         public ChatMessage[] newArray(int size) {
             // TODO Auto-generated method stub
-            return new ChatMessage[ size ];
+            return new ChatMessage[size];
         }
 
     };
 
-    /* (non-Javadoc)
+    /*
+     * (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);
+        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();
     }
@@ -879,14 +922,14 @@
     @Override
     public int compareTo(ChatMessage message) {
         // TODO Auto-generated method stub
-        if (time - message.getTime()>0) {
+        if (time - message.getTime() > 0) {
             return 1;
-        }else if (time - message.getTime()==0) {
+        } else if (time - message.getTime() == 0) {
             return 0;
         } else {
             return -1;
         }
-//        return (int) (time - message.getTime());
+        // 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
index dd44d81..ed46455 100644
--- 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
@@ -20,16 +20,19 @@
  * 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.
+ * 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
@@ -37,9 +40,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class ChatThread implements Parcelable {
 
@@ -100,111 +103,142 @@
 
     /**
      * 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/>
+     * 
+     * @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
+     * 
+     * @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/>
+     * 
+     * @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) {
@@ -213,6 +247,7 @@
 
     /**
      * Get count of unread message
+     * 
      * @return
      */
     public int getUnreadCount() {
@@ -221,6 +256,7 @@
 
     /**
      * Set count of unread message
+     * 
      * @param unreadCount
      */
     public void setUnreadCount(int unreadCount) {
@@ -229,6 +265,7 @@
 
     /**
      * Get group identity
+     * 
      * @return
      */
     public String getGroupId() {
@@ -237,6 +274,7 @@
 
     /**
      * Set group identity
+     * 
      * @param groupId
      */
     public void setGroupId(String groupId) {
@@ -245,6 +283,7 @@
 
     /**
      * Get message conversation id
+     * 
      * @return
      */
     public String getConversationId() {
@@ -253,6 +292,7 @@
 
     /**
      * Set message conversation id
+     * 
      * @param conversationId
      */
     public void setConversationId(String conversationId) {
@@ -281,7 +321,7 @@
         dest.writeString(groupId);
     }
 
-    public void readFromParcel( Parcel source ) {
+    public void readFromParcel(Parcel source) {
         threadId = source.readLong();
         contact = source.readString();
         lastMsgId = source.readInt();
@@ -297,11 +337,10 @@
 
     @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;
+        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
index b480777..4bc8e90 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -28,7 +29,7 @@
 /**
  * The Class CloudFileMessage.
  */
-public class CloudFileMessage implements Parcelable{
+public class CloudFileMessage implements Parcelable {
 
     /** The file name. */
     private String fileName;
@@ -42,12 +43,13 @@
     /**
      * Instantiates a new cloud file message.
      */
-    public CloudFileMessage(){}
+    public CloudFileMessage() {
+    }
 
     /**
      * Instantiates a new cloud file message.
      */
-    public CloudFileMessage(String fileName, long fileSize, String shareUrl){
+    public CloudFileMessage(String fileName, long fileSize, String shareUrl) {
         this.fileName = fileName;
         this.fileSize = fileSize;
         this.shareUrl = shareUrl;
@@ -55,15 +57,15 @@
 
     /**
      * Instantiates a new cloud file message.
-     *
+     * 
      * @param source the source
      */
-    public CloudFileMessage( Parcel source )
-    {
-        readFromParcel( source );
+    public CloudFileMessage(Parcel source) {
+        readFromParcel(source);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
      * @see android.os.Parcelable#describeContents()
      */
     @Override
@@ -71,47 +73,44 @@
         return 0;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (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 );
+        dest.writeString(fileName);
+        dest.writeLong(fileSize);
+        dest.writeString(shareUrl);
     }
 
     /**
      * Read from parcel.
-     *
+     * 
      * @param source the source
      */
-    public void readFromParcel( Parcel 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 );
-                                                                                }
+    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 ];
-                                                                                }
-                                                                            };
-
+        @Override
+        public CloudFileMessage[] newArray(int size) {
+            return new CloudFileMessage[size];
+        }
+    };
 
     /**
      * Gets the file name.
-     *
+     * 
      * @return the file name
      */
     public String getFileName() {
@@ -120,7 +119,7 @@
 
     /**
      * Sets the file name.
-     *
+     * 
      * @param fileName the new file name
      */
     public void setFileName(String fileName) {
@@ -129,7 +128,7 @@
 
     /**
      * Gets the file size.
-     *
+     * 
      * @return the file size
      */
     public long getFileSize() {
@@ -138,7 +137,7 @@
 
     /**
      * Sets the file size.
-     *
+     * 
      * @param fileSize the new file size
      */
     public void setFileSize(long fileSize) {
@@ -147,7 +146,7 @@
 
     /**
      * Gets the share url.
-     *
+     * 
      * @return the share url
      */
     public String getShareUrl() {
@@ -156,7 +155,7 @@
 
     /**
      * 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/provider/model/FavoriteMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/FavoriteMessage.java
index 99c230b..c0e9517 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -290,14 +291,12 @@
 
     @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="
+        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.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/GroupChatModel.java
index f8c1a6e..0d17a88 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -31,10 +32,12 @@
 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.
+ * 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
@@ -42,9 +45,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class GroupChatModel implements Parcelable {
 
@@ -124,7 +127,8 @@
     private String contactGroupId;
 
     /**
-     * The list of chat group user represented by class {@link com.suntek.mway.rcs.client.api.provider.model.ChatGroupUser}
+     * 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>();
 
@@ -148,21 +152,25 @@
      */
     private int remindPolicy;
 
-    public GroupChatModel(){
+    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) {
@@ -171,20 +179,25 @@
 
     /**
      * 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.
+     * Get the chat group name for display. Return 'subject' if the 'remark' is
+     * empry.
      */
     public String getDisplayName() {
         if (!TextUtils.isEmpty(remark)) {
@@ -193,99 +206,127 @@
             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.
+     * 
+     * @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.
+     * 
+     * @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
+     * 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.
+     * 
+     * @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}
+     * 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) {
+        if (this.dataMembers != null) {
             String[] dataList = dataMembers.split(";");
-            for(int i = 0; i < dataList.length; i++) {
+            for (int i = 0; i < dataList.length; i++) {
                 GroupChatUser groupUser = GroupChatUser.fromFormatString(dataMembers);
-                if(groupUser != null) {
+                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++) {
+        for (int i = 0; i < members.size(); i++) {
             GroupChatUser user = new GroupChatUser();
             user.setNumber(members.get(i));
             users.add(user);
@@ -295,16 +336,18 @@
     }
 
     /**
-     * Format a list chat group contact phone number to a string which are semicolon-separated.
+     * 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++) {
+        for (int i = 0; i < users.size(); i++) {
             GroupChatUser user = users.get(i);
             sb.append(user.toFormatString());
-            if(i != users.size() - 1) {
+            if (i != users.size() - 1) {
                 sb.append(";");
             }
         }
@@ -313,6 +356,7 @@
 
     /**
      * Get a list of chat group user.
+     * 
      * @return
      */
     public List<GroupChatUser> getUserList() {
@@ -321,6 +365,7 @@
 
     /**
      * Get time of creating group
+     * 
      * @return
      */
     public long getTime() {
@@ -329,6 +374,7 @@
 
     /**
      * Set time of creating group
+     * 
      * @param time
      */
     public void setTime(long time) {
@@ -337,6 +383,7 @@
 
     /**
      * Set group member
+     * 
      * @param userList
      */
     public void setUserList(List<GroupChatUser> userList) {
@@ -345,6 +392,7 @@
 
     /**
      * Get group status
+     * 
      * @return
      */
     public int getStatus() {
@@ -353,6 +401,7 @@
 
     /**
      * Set group status
+     * 
      * @param status
      */
     public void setStatus(int status) {
@@ -361,6 +410,7 @@
 
     /**
      * Get max count of members
+     * 
      * @return
      */
     public int getMaxCount() {
@@ -369,6 +419,7 @@
 
     /**
      * Set max count of members
+     * 
      * @param maxCount
      */
     public void setMaxCount(int maxCount) {
@@ -377,6 +428,7 @@
 
     /**
      * Get conversationId
+     * 
      * @return
      */
     public String getConversationId() {
@@ -385,6 +437,7 @@
 
     /**
      * Set conversationId
+     * 
      * @param conversationId
      */
     public void setConversationId(String conversationId) {
@@ -393,6 +446,7 @@
 
     /**
      * Get remark
+     * 
      * @return remark
      */
     public String getRemark() {
@@ -401,6 +455,7 @@
 
     /**
      * Set remark
+     * 
      * @param remark the remark of group
      */
     public void setRemark(String remark) {
@@ -409,6 +464,7 @@
 
     /**
      * Get message reminding policy
+     * 
      * @return remindPolicy
      */
     public int getRemindPolicy() {
@@ -417,6 +473,7 @@
 
     /**
      * Set message reminding policy
+     * 
      * @param remindPolicy
      */
     public void setRemindPolicy(int remindPolicy) {
@@ -466,14 +523,12 @@
 
     @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 + "]";
+        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) {
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
index ef678ea..d143245 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -33,10 +34,12 @@
 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.
+ * 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
@@ -44,14 +47,16 @@
  * <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;
 
     /**
@@ -136,7 +141,7 @@
      */
     public static final String ETYPE_CAN_ASSIGN_AS_CHAIRMAN = "gpmanage";
 
-    public GroupChatUser(){
+    public GroupChatUser() {
     }
 
     public GroupChatUser(Parcel in) {
@@ -145,6 +150,7 @@
 
     /**
      * Get user uri
+     * 
      * @return
      */
     public String getUri() {
@@ -153,6 +159,7 @@
 
     /**
      * Set user uri
+     * 
      * @param uri
      */
     public void setUri(String uri) {
@@ -161,13 +168,16 @@
 
     /**
      * 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) {
@@ -177,7 +187,11 @@
         }
 
         if (!TextUtils.isEmpty(number)) {
-            String displayName = getDisplayNameOnContactsProviderByNumber(context, number); // TODO Add country code support.
+            String displayName = getDisplayNameOnContactsProviderByNumber(context, number); // TODO
+                                                                                            // Add
+                                                                                            // country
+                                                                                            // code
+                                                                                            // support.
             if (!TextUtils.isEmpty(displayName)) {
                 return displayName;
             }
@@ -212,27 +226,34 @@
 
     /**
      * 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() {
@@ -241,6 +262,7 @@
 
     /**
      * Whether user is group administrator
+     * 
      * @return if true then user is group administrator
      */
     public boolean isAdminRole() {
@@ -249,31 +271,40 @@
 
     /**
      * Set role
+     * 
      * @param role role
      */
     public void setRole(String role) {
         this.role = role;
     }
+
     /**
-     * Get the formatted string which format is "number, displayName, status, 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);
+        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
+     * 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) {
+        if (strs.length == 4) {
             GroupChatUser user = new GroupChatUser();
             user.setNumber(strs[0].trim());
             user.setDisplayName(strs[1].trim());
@@ -285,6 +316,7 @@
 
     /**
      * Get disconnection method
+     * 
      * @return disconnection method
      */
     public String getDisconnectionMethod() {
@@ -293,6 +325,7 @@
 
     /**
      * Set disconnection method
+     * 
      * @param disconnectionMethod disconnection method
      */
     public void setDisconnectionMethod(String disconnectionMethod) {
@@ -301,6 +334,7 @@
 
     /**
      * Get state
+     * 
      * @return state
      */
     public String getState() {
@@ -309,6 +343,7 @@
 
     /**
      * Set state
+     * 
      * @param state state
      */
     public void setState(String state) {
@@ -317,6 +352,7 @@
 
     /**
      * Get status
+     * 
      * @return
      */
     public String getStatus() {
@@ -325,6 +361,7 @@
 
     /**
      * Set status
+     * 
      * @param status
      */
     public void setStatus(String status) {
@@ -333,6 +370,7 @@
 
     /**
      * Get time of join the group
+     * 
      * @return
      */
     public long getTime() {
@@ -341,6 +379,7 @@
 
     /**
      * Get user identity of group
+     * 
      * @return
      */
     public String getId() {
@@ -349,6 +388,7 @@
 
     /**
      * Set user identity of group
+     * 
      * @param id
      */
     public void setId(String id) {
@@ -357,6 +397,7 @@
 
     /**
      * Get group id
+     * 
      * @return
      */
     public String getGroupId() {
@@ -365,6 +406,7 @@
 
     /**
      * Set group id
+     * 
      * @param groupId
      */
     public void setGroupId(String groupId) {
@@ -373,6 +415,7 @@
 
     /**
      * Set time of join the group
+     * 
      * @param time
      */
     public void setTime(long time) {
@@ -381,6 +424,7 @@
 
     /**
      * Get agree to join
+     * 
      * @return
      */
     public int getAgreeToJoin() {
@@ -389,6 +433,7 @@
 
     /**
      * Set agree to join
+     * 
      * @param agreeToJoin
      */
     public void setAgreeToJoin(int agreeToJoin) {
@@ -397,6 +442,7 @@
 
     /**
      * Get invite number
+     * 
      * @return
      */
     public String getInviteNumber() {
@@ -405,6 +451,7 @@
 
     /**
      * Set invite number
+     * 
      * @param inviteNumber
      */
     public void setInviteNumber(String inviteNumber) {
@@ -413,6 +460,7 @@
 
     /**
      * Set etype
+     * 
      * @return
      */
     public String getEtype() {
@@ -421,6 +469,7 @@
 
     /**
      * Get etype
+     * 
      * @param etype
      */
     public void setEtype(String etype) {
@@ -429,14 +478,16 @@
 
     /**
      * Get alias
+     * 
      * @return
      */
     public String getAlias() {
-        return alias == null ? "" : alias;
+        return alias;
     }
 
     /**
      * Set alias
+     * 
      * @param alias
      */
     public void setAlias(String alias) {
@@ -483,7 +534,6 @@
         inviteNumber = source.readString();
     }
 
-
     @Override
     public String toString() {
         List<String> list = new ArrayList<String>();
@@ -504,7 +554,6 @@
         return list.toString();
     }
 
-
     public static final Parcelable.Creator<GroupChatUser> CREATOR = new Parcelable.Creator<GroupChatUser>() {
         public GroupChatUser createFromParcel(Parcel in) {
             return new GroupChatUser(in);
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
index d36e49a..237e1d2 100644
--- 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
@@ -20,6 +20,7 @@
  * 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 {
@@ -45,8 +46,7 @@
     public static final String MEMBER_QUIT = "quit";
 
     public static final String DISBAND = "disband";
-    
-    public static final String GONE = "gone";
 
+    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
index 4f6217b..47c633c 100644
--- 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
@@ -20,16 +20,23 @@
  * 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() {
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
index 571f8e5..bc1418a 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
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
index 3b8d2d4..0ceacca 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -41,7 +42,7 @@
  * <p>
  * Company:pci-suntek
  * </p>
- *
+ * 
  * @author YFB
  * @version 1.0
  */
@@ -73,13 +74,15 @@
     private long time;
 
     /**
-     * Receiving or sending messages
-     * send message @see {@link SuntekMessageData#MSG_SEND} or receive message @see {@link SuntekMessageData#MSG_RECEIVE}
+     * 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;
@@ -95,14 +98,14 @@
     private long lastTime;
 
     /**
-     * The receivers of one to many chat message
-     * null if chat type is not @see {@link SuntekMessageData#CHAT_TYPE_ONE2GROUP}
+     * 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}
+     * The group chat info null if chat type is not @see
+     * {@link SuntekMessageData#CHAT_TYPE_GROUP}
      */
     private GroupChatModel groupChatModel;
 
@@ -112,20 +115,20 @@
 
     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_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;
+    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
+            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() {
     }
 
     public MessageSessionModel(Parcel in) {
@@ -135,18 +138,13 @@
     @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("}");
+        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();
     }
 
@@ -278,8 +276,8 @@
         lastTime = source.readLong();
         chatType = source.readInt();
         receiversOfOne2Many = source.readString();
-        groupChatModel = (GroupChatModel) source.readValue(this.getClass().getClassLoader());
-        publicAccountModel = (PublicAccounts) source.readValue(this.getClass().getClassLoader());
+        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>() {
@@ -297,10 +295,10 @@
     @Override
     public int compareTo(MessageSessionModel msgSession) {
         // TODO Auto-generated method stub
-//        return (int) (time - msgSession.getTime());
-        if (time - msgSession.getTime()>0) {
+        // return (int) (time - msgSession.getTime());
+        if (time - msgSession.getTime() > 0) {
             return 1;
-        }else if (time - msgSession.getTime()==0) {
+        } 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
index 0127bfb..8347b16 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
 
 /**
@@ -64,13 +65,13 @@
     private String updateTime;
 
     /** The menu type. */
-    private int    menuType;
+    private int menuType;
 
     /** The menu timestamp. */
     private String menuTimestamp;
 
     /** The subscribe status. */
-    private int    subscribeStatus;
+    private int subscribeStatus;
 
     /** The qr code. */
     private String qrCode;
@@ -92,16 +93,16 @@
 
     /** 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() {
@@ -110,7 +111,7 @@
 
     /**
      * Sets the pa uuid.
-     *
+     * 
      * @param paUuid the new pa uuid
      */
     public void setPaUuid(String paUuid) {
@@ -119,7 +120,7 @@
 
     /**
      * Gets the name.
-     *
+     * 
      * @return the name
      */
     public String getName() {
@@ -128,7 +129,7 @@
 
     /**
      * Sets the name.
-     *
+     * 
      * @param name the new name
      */
     public void setName(String name) {
@@ -137,7 +138,7 @@
 
     /**
      * Gets the logo.
-     *
+     * 
      * @return the logo
      */
     public String getLogo() {
@@ -146,7 +147,7 @@
 
     /**
      * Sets the logo.
-     *
+     * 
      * @param logo the new logo
      */
     public void setLogo(String logo) {
@@ -155,7 +156,7 @@
 
     /**
      * Gets the recommend level.
-     *
+     * 
      * @return the recommend level
      */
     public int getRecommendLevel() {
@@ -164,7 +165,7 @@
 
     /**
      * Sets the recommend level.
-     *
+     * 
      * @param recommendLevel the new recommend level
      */
     public void setRecommendLevel(int recommendLevel) {
@@ -173,7 +174,7 @@
 
     /**
      * Gets the sip uri.
-     *
+     * 
      * @return the sip uri
      */
     public String getSipUri() {
@@ -182,7 +183,7 @@
 
     /**
      * Sets the sip uri.
-     *
+     * 
      * @param sipUri the new sip uri
      */
     public void setSipUri(String sipUri) {
@@ -191,7 +192,7 @@
 
     /**
      * Checks if is followed.
-     *
+     * 
      * @return true, if is followed
      */
     public boolean isFollowed() {
@@ -200,7 +201,7 @@
 
     /**
      * Sets the followed.
-     *
+     * 
      * @param followed the new followed
      */
     public void setFollowed(boolean followed) {
@@ -209,7 +210,7 @@
 
     /**
      * Checks if is accept.
-     *
+     * 
      * @return true, if is accept
      */
     public boolean isAccept() {
@@ -218,7 +219,7 @@
 
     /**
      * Sets the accept.
-     *
+     * 
      * @param accept the new accept
      */
     public void setAccept(boolean accept) {
@@ -227,7 +228,7 @@
 
     /**
      * Gets the followed time.
-     *
+     * 
      * @return the followed time
      */
     public String getFollowedTime() {
@@ -236,7 +237,7 @@
 
     /**
      * Sets the followed time.
-     *
+     * 
      * @param followedTime the new followed time
      */
     public void setFollowedTime(String followedTime) {
@@ -245,7 +246,7 @@
 
     /**
      * Gets the company.
-     *
+     * 
      * @return the company
      */
     public String getCompany() {
@@ -254,7 +255,7 @@
 
     /**
      * Sets the company.
-     *
+     * 
      * @param company the new company
      */
     public void setCompany(String company) {
@@ -263,7 +264,7 @@
 
     /**
      * Gets the intro.
-     *
+     * 
      * @return the intro
      */
     public String getIntro() {
@@ -272,7 +273,7 @@
 
     /**
      * Sets the intro.
-     *
+     * 
      * @param intro the new intro
      */
     public void setIntro(String intro) {
@@ -281,7 +282,7 @@
 
     /**
      * Gets the type.
-     *
+     * 
      * @return the type
      */
     public String getType() {
@@ -290,7 +291,7 @@
 
     /**
      * Sets the type.
-     *
+     * 
      * @param type the new type
      */
     public void setType(String type) {
@@ -299,7 +300,7 @@
 
     /**
      * Gets the update time.
-     *
+     * 
      * @return the update time
      */
     public String getUpdateTime() {
@@ -308,7 +309,7 @@
 
     /**
      * Sets the update time.
-     *
+     * 
      * @param updateTime the new update time
      */
     public void setUpdateTime(String updateTime) {
@@ -317,7 +318,7 @@
 
     /**
      * Gets the menu type.
-     *
+     * 
      * @return the menu type
      */
     public int getMenuType() {
@@ -326,7 +327,7 @@
 
     /**
      * Sets the menu type.
-     *
+     * 
      * @param menuType the new menu type
      */
     public void setMenuType(int menuType) {
@@ -335,7 +336,7 @@
 
     /**
      * Gets the menu timestamp.
-     *
+     * 
      * @return the menu timestamp
      */
     public String getMenuTimestamp() {
@@ -344,7 +345,7 @@
 
     /**
      * Sets the menu timestamp.
-     *
+     * 
      * @param menuTimestamp the new menu timestamp
      */
     public void setMenuTimestamp(String menuTimestamp) {
@@ -353,7 +354,7 @@
 
     /**
      * Gets the subscribe status.
-     *
+     * 
      * @return the subscribe status
      */
     public int getSubscribeStatus() {
@@ -362,7 +363,7 @@
 
     /**
      * Sets the subscribe status.
-     *
+     * 
      * @param subscribeStatus the new subscribe status
      */
     public void setSubscribeStatus(int subscribeStatus) {
@@ -371,7 +372,7 @@
 
     /**
      * Gets the qr code.
-     *
+     * 
      * @return the qr code
      */
     public String getQrCode() {
@@ -380,7 +381,7 @@
 
     /**
      * Sets the qr code.
-     *
+     * 
      * @param qrCode the new qr code
      */
     public void setQrCode(String qrCode) {
@@ -389,7 +390,7 @@
 
     /**
      * Gets the active status.
-     *
+     * 
      * @return the active status
      */
     public int getActiveStatus() {
@@ -398,7 +399,7 @@
 
     /**
      * Sets the active status.
-     *
+     * 
      * @param activeStatus the new active status
      */
     public void setActiveStatus(int activeStatus) {
@@ -407,7 +408,7 @@
 
     /**
      * Gets the tel.
-     *
+     * 
      * @return the tel
      */
     public String getTel() {
@@ -416,7 +417,7 @@
 
     /**
      * Sets the tel.
-     *
+     * 
      * @param tel the new tel
      */
     public void setTel(String tel) {
@@ -425,7 +426,7 @@
 
     /**
      * Gets the email.
-     *
+     * 
      * @return the email
      */
     public String getEmail() {
@@ -434,7 +435,7 @@
 
     /**
      * Sets the email.
-     *
+     * 
      * @param email the new email
      */
     public void setEmail(String email) {
@@ -443,7 +444,7 @@
 
     /**
      * Gets the zip.
-     *
+     * 
      * @return the zip
      */
     public String getZip() {
@@ -452,7 +453,7 @@
 
     /**
      * Sets the zip.
-     *
+     * 
      * @param zip the new zip
      */
     public void setZip(String zip) {
@@ -461,7 +462,7 @@
 
     /**
      * Gets the addr.
-     *
+     * 
      * @return the addr
      */
     public String getAddr() {
@@ -470,7 +471,7 @@
 
     /**
      * Sets the addr.
-     *
+     * 
      * @param addr the new addr
      */
     public void setAddr(String addr) {
@@ -479,7 +480,7 @@
 
     /**
      * Gets the field.
-     *
+     * 
      * @return the field
      */
     public String getField() {
@@ -488,16 +489,16 @@
 
     /**
      * 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() {
@@ -506,7 +507,7 @@
 
     /**
      * Sets the logo type.
-     *
+     * 
      * @param logoType the new logo type
      */
     public void setLogoType(String logoType) {
@@ -515,7 +516,7 @@
 
     /**
      * Gets the menu string.
-     *
+     * 
      * @return the menu string
      */
     public String getMenuString() {
@@ -524,44 +525,35 @@
 
     /**
      * Sets the menu string.
-     *
+     * 
      * @param menuString the new menu string
      */
     public void setMenuString(String menuString) {
         this.menuString = menuString;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (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)
-        ;
+        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/PublicMediaMessage.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/PublicMediaMessage.java
index 1d15029..c1937ec 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/provider/model/PublicMediaMessage.java
@@ -20,6 +20,7 @@
  * 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;
@@ -28,7 +29,7 @@
 /**
  * The Class PublicMediaMessage.
  */
-public class PublicMediaMessage extends PublicMessage implements Parcelable{
+public class PublicMediaMessage extends PublicMessage implements Parcelable {
 
     /** The media. */
     private PublicMediaContent media;
@@ -36,72 +37,75 @@
     /**
      * Instantiates a new public media message.
      */
-    public PublicMediaMessage(){}
+    public PublicMediaMessage() {
+    }
 
     /**
      * Instantiates a new public media message.
-     *
+     * 
      * @param source the source
      */
-    public PublicMediaMessage( Parcel source )
-    {
-        readFromParcel( source );
+    public PublicMediaMessage(Parcel source) {
+        readFromParcel(source);
     }
 
-    /* (non-Javadoc)
-     * @see com.suntek.mway.rcs.client.api.provider.model.PublicMessage#describeContents()
+    /*
+     * (non-Javadoc)
+     * @see
+     * com.suntek.mway.rcs.client.api.provider.model.PublicMessage#describeContents
+     * ()
      */
     @Override
     public int describeContents() {
         return 0;
     }
 
-    /* (non-Javadoc)
-     * @see com.suntek.mway.rcs.client.api.provider.model.PublicMessage#writeToParcel(android.os.Parcel, int)
+    /*
+     * (non-Javadoc)
+     * @see
+     * com.suntek.mway.rcs.client.api.provider.model.PublicMessage#writeToParcel
+     * (android.os.Parcel, int)
      */
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString( createtime );
-        dest.writeInt( forwardable );
-        dest.writeString( msgtype );
-        dest.writeInt( activeStatus );
-        dest.writeString( paUuid );
-        dest.writeValue( media );
+        dest.writeString(createtime);
+        dest.writeInt(forwardable);
+        dest.writeString(msgtype);
+        dest.writeInt(activeStatus);
+        dest.writeString(paUuid);
+        dest.writeValue(media);
     }
 
     /**
      * Read from parcel.
-     *
+     * 
      * @param source the source
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         createtime = source.readString();
         forwardable = source.readInt();
         msgtype = source.readString();
         activeStatus = source.readInt();
         paUuid = source.readString();
-        media = (PublicMediaContent) source.readValue(this.getClass().getClassLoader());
+        media = (PublicMediaContent)source.readValue(this.getClass().getClassLoader());
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicMediaMessage>    CREATOR    = new Parcelable.Creator<PublicMediaMessage>() {
-                                                                                @Override
-                                                                                public PublicMediaMessage createFromParcel( Parcel source )
-                                                                                {
-                                                                                    return new PublicMediaMessage( source );
-                                                                                }
+    public static final Parcelable.Creator<PublicMediaMessage> CREATOR = new Parcelable.Creator<PublicMediaMessage>() {
+        @Override
+        public PublicMediaMessage createFromParcel(Parcel source) {
+            return new PublicMediaMessage(source);
+        }
 
-                                                                                @Override
-                                                                                public PublicMediaMessage[] newArray( int size )
-                                                                                {
-                                                                                    return new PublicMediaMessage[ size ];
-                                                                                }
-                                                                            };
+        @Override
+        public PublicMediaMessage[] newArray(int size) {
+            return new PublicMediaMessage[size];
+        }
+    };
 
     /**
      * Gets the media.
-     *
+     * 
      * @return the media
      */
     public PublicMediaContent getMedia() {
@@ -110,7 +114,7 @@
 
     /**
      * Sets the media.
-     *
+     * 
      * @param media the new media
      */
     public void setMedia(PublicMediaContent media) {
@@ -120,7 +124,7 @@
     /**
      * The Class PublicMediaContent.
      */
-    public static class PublicMediaContent implements Parcelable{
+    public static class PublicMediaContent implements Parcelable {
 
         /** The thumb link. */
         private String thumbLink;
@@ -141,7 +145,7 @@
         private String fileType;
 
         /** The createtime. */
-//        private String createtime;
+        // private String createtime;
 
         /** The media uuid. */
         private String mediaUuid;
@@ -149,19 +153,20 @@
         /**
          * Instantiates a new public media content.
          */
-        public PublicMediaContent(){}
+        public PublicMediaContent() {
+        }
 
         /**
          * Instantiates a new public media content.
-         *
+         * 
          * @param source the source
          */
-        public PublicMediaContent( Parcel source )
-        {
-            readFromParcel( source );
+        public PublicMediaContent(Parcel source) {
+            readFromParcel(source);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
          * @see android.os.Parcelable#describeContents()
          */
         @Override
@@ -169,56 +174,54 @@
             return 0;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
          * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
          */
         @Override
         public void writeToParcel(Parcel dest, int flags) {
-            dest.writeString( thumbLink );
-            dest.writeString( originalLink );
-            dest.writeString( title );
-            dest.writeString( fileSize );
-            dest.writeString( duration );
-            dest.writeString( fileType );
-//            dest.writeString( createtime );
-            dest.writeString( mediaUuid );
+            dest.writeString(thumbLink);
+            dest.writeString(originalLink);
+            dest.writeString(title);
+            dest.writeString(fileSize);
+            dest.writeString(duration);
+            dest.writeString(fileType);
+            // dest.writeString( createtime );
+            dest.writeString(mediaUuid);
         }
 
         /**
          * Read from parcel.
-         *
+         * 
          * @param source the source
          */
-        public void readFromParcel( Parcel source )
-        {
+        public void readFromParcel(Parcel source) {
             thumbLink = source.readString();
             originalLink = source.readString();
             title = source.readString();
             fileSize = source.readString();
             duration = source.readString();
             fileType = source.readString();
-//            createtime = source.readString();
+            // createtime = source.readString();
             mediaUuid = source.readString();
         }
 
         /** The parcel creator. */
-        public static final Parcelable.Creator<PublicMediaContent>    CREATOR    = new Parcelable.Creator<PublicMediaContent>() {
-                                                                                    @Override
-                                                                                    public PublicMediaContent createFromParcel( Parcel source )
-                                                                                    {
-                                                                                        return new PublicMediaContent( source );
-                                                                                    }
+        public static final Parcelable.Creator<PublicMediaContent> CREATOR = new Parcelable.Creator<PublicMediaContent>() {
+            @Override
+            public PublicMediaContent createFromParcel(Parcel source) {
+                return new PublicMediaContent(source);
+            }
 
-                                                                                    @Override
-                                                                                    public PublicMediaContent[] newArray( int size )
-                                                                                    {
-                                                                                        return new PublicMediaContent[ size ];
-                                                                                    }
-                                                                                };
+            @Override
+            public PublicMediaContent[] newArray(int size) {
+                return new PublicMediaContent[size];
+            }
+        };
 
         /**
          * Gets the thumb link.
-         *
+         * 
          * @return the thumb link
          */
         public String getThumbLink() {
@@ -227,7 +230,7 @@
 
         /**
          * Sets the thumb link.
-         *
+         * 
          * @param thumbLink the new thumb link
          */
         public void setThumbLink(String thumbLink) {
@@ -236,7 +239,7 @@
 
         /**
          * Gets the original link.
-         *
+         * 
          * @return the original link
          */
         public String getOriginalLink() {
@@ -245,7 +248,7 @@
 
         /**
          * Sets the original link.
-         *
+         * 
          * @param originalLink the new original link
          */
         public void setOriginalLink(String originalLink) {
@@ -254,7 +257,7 @@
 
         /**
          * Gets the title.
-         *
+         * 
          * @return the title
          */
         public String getTitle() {
@@ -263,7 +266,7 @@
 
         /**
          * Sets the title.
-         *
+         * 
          * @param title the new title
          */
         public void setTitle(String title) {
@@ -272,7 +275,7 @@
 
         /**
          * Gets the file size.
-         *
+         * 
          * @return the file size
          */
         public String getFileSize() {
@@ -281,7 +284,7 @@
 
         /**
          * Sets the file size.
-         *
+         * 
          * @param fileSize the new file size
          */
         public void setFileSize(String fileSize) {
@@ -290,7 +293,7 @@
 
         /**
          * Gets the duration.
-         *
+         * 
          * @return the duration
          */
         public String getDuration() {
@@ -299,7 +302,7 @@
 
         /**
          * Sets the duration.
-         *
+         * 
          * @param duration the new duration
          */
         public void setDuration(String duration) {
@@ -308,7 +311,7 @@
 
         /**
          * Gets the file type.
-         *
+         * 
          * @return the file type
          */
         public String getFileType() {
@@ -317,7 +320,7 @@
 
         /**
          * Sets the file type.
-         *
+         * 
          * @param fileType the new file type
          */
         public void setFileType(String fileType) {
@@ -326,25 +329,21 @@
 
         /**
          * Gets the createtime.
-         *
-         * @return the createtime
-        public String getCreatetime() {
-            return 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;
-        }
+         * 
+         * @param createtime the new createtime public void setCreatetime(String
+         *            createtime) { this.createtime = createtime; }
          */
 
         /**
          * Gets the media uuid.
-         *
+         * 
          * @return the media uuid
          */
         public String getMediaUuid() {
@@ -353,7 +352,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/provider/model/PublicMessage.java
index c5361af..f81fed5 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/provider/model/PublicMessage.java
@@ -20,6 +20,7 @@
  * 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;
@@ -28,7 +29,7 @@
 /**
  * The Class PublicMessage.
  */
-public class PublicMessage  implements Parcelable{
+public class PublicMessage implements Parcelable {
 
     /** The Constant TEXT. */
     public static final String TEXT = "10";
@@ -50,14 +51,13 @@
 
     /** The Constant TOPIC MORE. */
     public static final String TOPIC_MORE = "52";
-    
+
     /** The Constant LOCATION. */
     public static final String LOCATION = "19";
-    
+
     /** The Constant VCARD. */
     public static final String VCARD = "18";
 
-    
     /** The createtime. */
     protected String createtime;
 
@@ -69,10 +69,10 @@
 
     /** The activeStatus. */
     protected int activeStatus;
-    
+
     /** The paUuid. */
     protected String paUuid;
-    
+
     /**
      * Instantiates a new public message.
      */
@@ -82,13 +82,13 @@
 
     /**
      * Instantiates a new public message.
-     *
+     * 
      * @param source the source
      */
     public PublicMessage(Parcel source) {
-        readFromParcel( source );
+        readFromParcel(source);
     }
-    
+
     public String getCreatetime() {
         return createtime;
     }
@@ -129,7 +129,8 @@
         this.paUuid = paUuid;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
      * @see android.os.Parcelable#describeContents()
      */
     @Override
@@ -137,23 +138,24 @@
         return 0;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
      * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
      */
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        
+
     }
 
     /**
      * Read from parcel.
-     *
+     * 
      * @param source the source
      */
-    public void readFromParcel( Parcel source ){
-        
+    public void readFromParcel(Parcel source) {
+
     }
-    
+
     /** The Constant CREATOR. */
     public static final Parcelable.Creator<PublicMessage> CREATOR = new Parcelable.Creator<PublicMessage>() {
         public PublicMessage createFromParcel(Parcel 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/provider/model/PublicTextMessage.java
index 7bf3cf8..3b59fd1 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/provider/model/PublicTextMessage.java
@@ -20,6 +20,7 @@
  * 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;
@@ -28,7 +29,7 @@
 /**
  * The Class PublicTextMessage.
  */
-public class PublicTextMessage extends PublicMessage implements Parcelable{
+public class PublicTextMessage extends PublicMessage implements Parcelable {
 
     /** The content. */
     private String content;
@@ -36,46 +37,51 @@
     /**
      * Instantiates a new public text message.
      */
-    public PublicTextMessage(){}
+    public PublicTextMessage() {
+    }
 
     /**
      * Instantiates a new public text message.
-     *
+     * 
      * @param source the source
      */
-    public PublicTextMessage( Parcel source )
-    {
-        readFromParcel( source );
+    public PublicTextMessage(Parcel source) {
+        readFromParcel(source);
     }
 
-    /* (non-Javadoc)
-     * @see com.suntek.mway.rcs.client.aidl.provider.model.PublicMessage#describeContents()
+    /*
+     * (non-Javadoc)
+     * @see
+     * com.suntek.mway.rcs.client.aidl.provider.model.PublicMessage#describeContents
+     * ()
      */
     @Override
     public int describeContents() {
         return 0;
     }
 
-    /* (non-Javadoc)
-     * @see com.suntek.mway.rcs.client.aidl.provider.model.PublicMessage#writeToParcel(android.os.Parcel, int)
+    /*
+     * (non-Javadoc)
+     * @see
+     * com.suntek.mway.rcs.client.aidl.provider.model.PublicMessage#writeToParcel
+     * (android.os.Parcel, int)
      */
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString( createtime );
-        dest.writeInt( forwardable );
-        dest.writeString( msgtype );
-        dest.writeString( content );
-        dest.writeInt( activeStatus );
-        dest.writeString( paUuid );
+        dest.writeString(createtime);
+        dest.writeInt(forwardable);
+        dest.writeString(msgtype);
+        dest.writeString(content);
+        dest.writeInt(activeStatus);
+        dest.writeString(paUuid);
     }
 
     /**
      * Read from parcel.
-     *
+     * 
      * @param source the source
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         createtime = source.readString();
         forwardable = source.readInt();
         msgtype = source.readString();
@@ -85,24 +91,21 @@
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicTextMessage>    CREATOR    = new Parcelable.Creator<PublicTextMessage>() {
-                                                                                @Override
-                                                                                public PublicTextMessage createFromParcel( Parcel source )
-                                                                                {
-                                                                                    return new PublicTextMessage( source );
-                                                                                }
+    public static final Parcelable.Creator<PublicTextMessage> CREATOR = new Parcelable.Creator<PublicTextMessage>() {
+        @Override
+        public PublicTextMessage createFromParcel(Parcel source) {
+            return new PublicTextMessage(source);
+        }
 
-                                                                                @Override
-                                                                                public PublicTextMessage[] newArray( int size )
-                                                                                {
-                                                                                    return new PublicTextMessage[ size ];
-                                                                                }
-                                                                            };
-
+        @Override
+        public PublicTextMessage[] newArray(int size) {
+            return new PublicTextMessage[size];
+        }
+    };
 
     /**
      * Gets the content.
-     *
+     * 
      * @return the content
      */
     public String getContent() {
@@ -111,7 +114,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/provider/model/PublicTopicMessage.java
index fcbfcf6..188a49b 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/provider/model/PublicTopicMessage.java
@@ -20,6 +20,7 @@
  * 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.LinkedList;
@@ -31,7 +32,7 @@
 /**
  * The Class PublicTopicMessage.
  */
-public class PublicTopicMessage extends PublicMessage implements Parcelable{
+public class PublicTopicMessage extends PublicMessage implements Parcelable {
 
     /** The topics. */
     private List<PublicTopicContent> topics;
@@ -39,73 +40,76 @@
     /**
      * Instantiates a new public topic message.
      */
-    public PublicTopicMessage(){}
+    public PublicTopicMessage() {
+    }
 
     /**
      * Instantiates a new public topic message.
-     *
+     * 
      * @param source the source
      */
-    public PublicTopicMessage( Parcel source )
-    {
-        readFromParcel( source );
+    public PublicTopicMessage(Parcel source) {
+        readFromParcel(source);
     }
 
-    /* (non-Javadoc)
-     * @see com.suntek.mway.rcs.client.api.provider.model.PublicMessage#describeContents()
+    /*
+     * (non-Javadoc)
+     * @see
+     * com.suntek.mway.rcs.client.api.provider.model.PublicMessage#describeContents
+     * ()
      */
     @Override
     public int describeContents() {
         return 0;
     }
 
-    /* (non-Javadoc)
-     * @see com.suntek.mway.rcs.client.api.provider.model.PublicMessage#writeToParcel(android.os.Parcel, int)
+    /*
+     * (non-Javadoc)
+     * @see
+     * com.suntek.mway.rcs.client.api.provider.model.PublicMessage#writeToParcel
+     * (android.os.Parcel, int)
      */
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString( createtime );
-        dest.writeInt( forwardable );
-        dest.writeString( msgtype );
-        dest.writeInt( activeStatus );
-        dest.writeString( paUuid );
-        dest.writeList( topics );
+        dest.writeString(createtime);
+        dest.writeInt(forwardable);
+        dest.writeString(msgtype);
+        dest.writeInt(activeStatus);
+        dest.writeString(paUuid);
+        dest.writeList(topics);
     }
 
     /**
      * Read from parcel.
-     *
+     * 
      * @param source the source
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         createtime = source.readString();
         forwardable = source.readInt();
         msgtype = source.readString();
         activeStatus = source.readInt();
         paUuid = source.readString();
         topics = new LinkedList<PublicTopicContent>();
-        source.readList( topics, this.getClass().getClassLoader() );
+        source.readList(topics, this.getClass().getClassLoader());
     }
 
     /** The parcel creator. */
-    public static final Parcelable.Creator<PublicTopicMessage>    CREATOR    = new Parcelable.Creator<PublicTopicMessage>() {
-                                                                                @Override
-                                                                                public PublicTopicMessage createFromParcel( Parcel source )
-                                                                                {
-                                                                                    return new PublicTopicMessage( source );
-                                                                                }
+    public static final Parcelable.Creator<PublicTopicMessage> CREATOR = new Parcelable.Creator<PublicTopicMessage>() {
+        @Override
+        public PublicTopicMessage createFromParcel(Parcel source) {
+            return new PublicTopicMessage(source);
+        }
 
-                                                                                @Override
-                                                                                public PublicTopicMessage[] newArray( int size )
-                                                                                {
-                                                                                    return new PublicTopicMessage[ size ];
-                                                                                }
-                                                                            };
+        @Override
+        public PublicTopicMessage[] newArray(int size) {
+            return new PublicTopicMessage[size];
+        }
+    };
 
     /**
      * Gets the topics.
-     *
+     * 
      * @return the topics
      */
     public List<PublicTopicContent> getTopics() {
@@ -114,7 +118,7 @@
 
     /**
      * Sets the topics.
-     *
+     * 
      * @param topics the new topics
      */
     public void setTopics(List<PublicTopicContent> topics) {
@@ -124,7 +128,7 @@
     /**
      * The Class PublicTopicContent.
      */
-    public static class PublicTopicContent implements Parcelable{
+    public static class PublicTopicContent implements Parcelable {
 
         /** The title. */
         private String title;
@@ -153,18 +157,20 @@
         /**
          * Instantiates a new public topic content.
          */
-        public PublicTopicContent(){}
+        public PublicTopicContent() {
+        }
 
         /**
          * Instantiates a new public topic content.
-         *
+         * 
          * @param source the source
          */
-        public PublicTopicContent(Parcel source){
-            readFromParcel( source );
+        public PublicTopicContent(Parcel source) {
+            readFromParcel(source);
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
          * @see android.os.Parcelable#describeContents()
          */
         @Override
@@ -172,7 +178,8 @@
             return 0;
         }
 
-        /* (non-Javadoc)
+        /*
+         * (non-Javadoc)
          * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
          */
         @Override
@@ -189,10 +196,10 @@
 
         /**
          * Read from parcel.
-         *
+         * 
          * @param source the source
          */
-        public void readFromParcel( Parcel source ){
+        public void readFromParcel(Parcel source) {
             title = source.readString();
             author = source.readString();
             thumbLink = source.readString();
@@ -204,23 +211,21 @@
         }
 
         /** The parcel creator. */
-        public static final Parcelable.Creator<PublicTopicContent>    CREATOR    = new Parcelable.Creator<PublicTopicContent>() {
-                                                                                    @Override
-                                                                                    public PublicTopicContent createFromParcel( Parcel source )
-                                                                                    {
-                                                                                        return new PublicTopicContent( source );
-                                                                                    }
+        public static final Parcelable.Creator<PublicTopicContent> CREATOR = new Parcelable.Creator<PublicTopicContent>() {
+            @Override
+            public PublicTopicContent createFromParcel(Parcel source) {
+                return new PublicTopicContent(source);
+            }
 
-                                                                                    @Override
-                                                                                    public PublicTopicContent[] newArray( int size )
-                                                                                    {
-                                                                                        return new PublicTopicContent[ size ];
-                                                                                    }
-                                                                                };
+            @Override
+            public PublicTopicContent[] newArray(int size) {
+                return new PublicTopicContent[size];
+            }
+        };
 
         /**
          * Gets the title.
-         *
+         * 
          * @return the title
          */
         public String getTitle() {
@@ -229,7 +234,7 @@
 
         /**
          * Sets the title.
-         *
+         * 
          * @param title the new title
          */
         public void setTitle(String title) {
@@ -238,7 +243,7 @@
 
         /**
          * Gets the author.
-         *
+         * 
          * @return the author
          */
         public String getAuthor() {
@@ -247,7 +252,7 @@
 
         /**
          * Sets the author.
-         *
+         * 
          * @param author the new author
          */
         public void setAuthor(String author) {
@@ -256,7 +261,7 @@
 
         /**
          * Gets the thumb link.
-         *
+         * 
          * @return the thumb link
          */
         public String getThumbLink() {
@@ -265,7 +270,7 @@
 
         /**
          * Sets the thumb link.
-         *
+         * 
          * @param thumbLink the new thumb link
          */
         public void setThumbLink(String thumbLink) {
@@ -274,7 +279,7 @@
 
         /**
          * Gets the original link.
-         *
+         * 
          * @return the original link
          */
         public String getOriginalLink() {
@@ -283,7 +288,7 @@
 
         /**
          * Sets the original link.
-         *
+         * 
          * @param originalLink the new original link
          */
         public void setOriginalLink(String originalLink) {
@@ -292,7 +297,7 @@
 
         /**
          * Gets the source link.
-         *
+         * 
          * @return the source link
          */
         public String getSourceLink() {
@@ -301,7 +306,7 @@
 
         /**
          * Sets the source link.
-         *
+         * 
          * @param sourceLink the new source link
          */
         public void setSourceLink(String sourceLink) {
@@ -310,7 +315,7 @@
 
         /**
          * Gets the media uuid.
-         *
+         * 
          * @return the media uuid
          */
         public String getMediaUuid() {
@@ -319,7 +324,7 @@
 
         /**
          * Sets the media uuid.
-         *
+         * 
          * @param mediaUuid the new media uuid
          */
         public void setMediaUuid(String mediaUuid) {
@@ -328,7 +333,7 @@
 
         /**
          * Gets the main text.
-         *
+         * 
          * @return the main text
          */
         public String getMainText() {
@@ -337,7 +342,7 @@
 
         /**
          * Sets the main text.
-         *
+         * 
          * @param mainText the new main text
          */
         public void setMainText(String mainText) {
@@ -346,7 +351,7 @@
 
         /**
          * Gets the body link.
-         *
+         * 
          * @return the body link
          */
         public String getBodyLink() {
@@ -355,13 +360,12 @@
 
         /**
          * Sets the body link.
-         *
+         * 
          * @param bodyLink the new body link
          */
         public void setBodyLink(String bodyLink) {
             this.bodyLink = bodyLink;
         }
 
-
     }
 }
diff --git a/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/provider/model/SimpleMsg.java
index f4846bb..e4025c8 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/provider/model/SimpleMsg.java
@@ -20,6 +20,7 @@
  * 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;
@@ -35,7 +36,7 @@
 
     private int storeType;
 
-    public SimpleMsg(){
+    public SimpleMsg() {
     }
 
     public SimpleMsg(Parcel in) {
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
index 10fbe0d..afd6bb1 100644
--- 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
@@ -20,14 +20,13 @@
  * 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{
-
+public class TopMessageData implements Parcelable {
 
     // messages show on the top of frame
     public static final String TABLE_TOP_MESSAGE = "topMessage";
@@ -41,14 +40,13 @@
     // 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() {
     }
 
     public TopMessageData(Parcel in) {
@@ -111,7 +109,6 @@
 
     @Override
     public String toString() {
-        return "TopMessageData [id=" + id + ", threadId=" + threadId
-                + ", time=" + time + "]";
+        return "TopMessageData [id=" + id + ", threadId=" + threadId + ", time=" + time + "]";
     }
 }
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
index 2942ea4..beedc13 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -31,10 +32,12 @@
 public class LoginUser implements Parcelable {
 
     private String loginAccout;
+
     private String password;
+
     private boolean isSupportVoLTE;
 
-    public LoginUser(String account,String pwd) {
+    public LoginUser(String account, String pwd) {
         // TODO Auto-generated constructor stub
         this.loginAccout = account;
         this.password = pwd;
@@ -42,7 +45,7 @@
 
     public LoginUser(Parcel source) {
         // TODO Auto-generated constructor stub
-        readFromParcel( source );
+        readFromParcel(source);
     }
 
     public String getLoginAccout() {
@@ -80,17 +83,18 @@
         // TODO Auto-generated method stub
         dest.writeString(loginAccout);
         dest.writeString(password);
-        dest.writeBooleanArray( new boolean[]{ isSupportVoLTE } );
+        dest.writeBooleanArray(new boolean[] {
+            isSupportVoLTE
+        });
     }
 
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         loginAccout = source.readString();
         password = source.readString();
 
-        boolean[] val = new boolean[ 1 ];
-        source.readBooleanArray( val );
-        isSupportVoLTE = val[ 0 ];
+        boolean[] val = new boolean[1];
+        source.readBooleanArray(val);
+        isSupportVoLTE = val[0];
     }
 
     /**
@@ -115,5 +119,4 @@
         return list.toString();
     }
 
-
 }
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
index 0c4fa6f..af40f8b 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -28,10 +29,13 @@
 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.
+ * 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
@@ -39,9 +43,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class RcsUserProfileInfo implements Parcelable {
 
@@ -54,12 +58,19 @@
      * 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;
 
     /**
@@ -71,6 +82,7 @@
 
     /**
      * Create a new instance of UserProfileInfo with another Parcelable object.
+     * 
      * @param source Parcelable source
      */
     public RcsUserProfileInfo(Parcel source) {
@@ -79,9 +91,9 @@
         userName = source.readString();
         imStatus = source.readInt();
 
-        boolean[] value = new boolean[ 1 ];
-        source.readBooleanArray( value );
-        isLocalUser = value[ 0 ];
+        boolean[] value = new boolean[1];
+        source.readBooleanArray(value);
+        isLocalUser = value[0];
 
         terminalType = source.readInt();
         IMSI = source.readString();
@@ -92,6 +104,7 @@
 
     /**
      * Get SIP private uri
+     * 
      * @return SIP private uri
      */
     public String getSipPrivateUri() {
@@ -100,6 +113,7 @@
 
     /**
      * Set SIP private uri
+     * 
      * @param sipPrivateUri SIP private uri
      */
     public void setSipPrivateUri(String sipPrivateUri) {
@@ -173,7 +187,7 @@
     /**
      * Describe the kinds of special objects contained in this Parcelable's
      * marshalled representation
-     *
+     * 
      * @return Integer
      */
     @Override
@@ -183,7 +197,7 @@
 
     /**
      * 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
      */
@@ -194,7 +208,9 @@
         dest.writeString(userName);
         dest.writeInt(imStatus);
 
-        dest.writeBooleanArray( new boolean[] { isLocalUser } );
+        dest.writeBooleanArray(new boolean[] {
+            isLocalUser
+        });
 
         dest.writeInt(terminalType);
 
@@ -219,10 +235,9 @@
 
     @Override
     public String toString() {
-        return "RcsUserProfileInfo [sipPrivateUri=" + sipPrivateUri
-                + ", userName=" + userName + ", imStatus=" + imStatus
-                + ", isLocalUser=" + isLocalUser + ", terminalType="
-                + terminalType + ", IMSI=" + IMSI + ", MCC=" + MCC + ", MNC="
-                + MNC + ", version=" + version + "]";
+        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.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/setting/SystemInfo.java
index e335227..7d79948 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -28,15 +29,21 @@
 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();
@@ -44,9 +51,9 @@
         ssid = source.readString();
         apn = source.readString();
 
-        boolean[] value = new boolean[ 1 ];
-        source.readBooleanArray( value );
-        isSimCardExist = value[ 0 ];
+        boolean[] value = new boolean[1];
+        source.readBooleanArray(value);
+        isSimCardExist = value[0];
 
         ipAddress = source.readString();
     }
@@ -54,39 +61,51 @@
     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
@@ -113,16 +132,17 @@
         dest.writeInt(networkFastType);
         dest.writeString(ssid);
         dest.writeString(apn);
-        dest.writeBooleanArray( new boolean[] { isSimCardExist } );
+        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 + "]";
+        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/utils/CloseFileUtils.java b/rcs_service_aidl/src/com/suntek/mway/rcs/client/aidl/utils/CloseFileUtils.java
index 26b46e6..f7419bc 100644
--- 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
@@ -20,16 +20,19 @@
  * 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...)
+ * 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
@@ -37,17 +40,17 @@
  * <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
+     * 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) {
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
index 80fde73..72bb00b 100644
--- 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
@@ -20,14 +20,18 @@
  * 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.
+ * 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
@@ -35,9 +39,9 @@
  * <p>
  * Company: pci-suntek
  * </p>
+ * 
  * @author YE JIE MING
  * @version 1.0
- *
  */
 public class FirstInFirstOutBuffer {
     /**
@@ -52,7 +56,7 @@
 
     /**
      * Add an object in the buffer
-     *
+     * 
      * @param obj Object
      */
     public synchronized void addObject(Object obj) {
@@ -62,8 +66,9 @@
     }
 
     /**
-     * Read an object in the buffer. This is a blocking method until an object is read.
-     *
+     * Read an object in the buffer. This is a blocking method until an object
+     * is read.
+     * 
      * @return Object
      */
     public synchronized Object getObject() {
@@ -86,9 +91,8 @@
 
     /**
      * Read an object in the buffer.
-     *
-     * @param timeout
-     *             the milliseconds that thread wait
+     * 
+     * @param timeout the milliseconds that thread wait
      * @return Object
      */
     public synchronized Object getObject(int timeout) {
@@ -113,7 +117,7 @@
      * Notify thread
      */
     public void close() {
-        synchronized(this) {
+        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
index e468775..33850de 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -39,112 +40,112 @@
 
     /**
      * 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)){
+    public static boolean isImageFile(String fileName) {
+        if (TextUtils.isEmpty(fileName)) {
             return false;
         }
 
         int suffixIndex = fileName.lastIndexOf(".");
-        if(suffixIndex != -1){
+        if (suffixIndex != -1) {
             String suffix = fileName.substring(suffixIndex + 1);
             return isImageSuffix(suffix);
-        }else{
+        } 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)){
+    public static boolean isAudioFile(String fileName) {
+        if (TextUtils.isEmpty(fileName)) {
             return false;
         }
 
         int suffixIndex = fileName.lastIndexOf(".");
-        if(suffixIndex != -1){
+        if (suffixIndex != -1) {
             String suffix = fileName.substring(suffixIndex + 1);
             return isAudioSuffix(suffix);
-        }else{
+        } 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)){
+    public static boolean isVideoFile(String fileName) {
+        if (TextUtils.isEmpty(fileName)) {
             return false;
         }
 
         int suffixIndex = fileName.lastIndexOf(".");
-        if(suffixIndex != -1){
+        if (suffixIndex != -1) {
             String suffix = fileName.substring(suffixIndex + 1);
             return isVideoSuffix(suffix);
-        }else{
+        } 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)){
+    public static boolean isVcardFile(String fileName) {
+        if (TextUtils.isEmpty(fileName)) {
             return false;
         }
-        
+
         int suffixIndex = fileName.lastIndexOf(".");
-        if(suffixIndex != -1){
+        if (suffixIndex != -1) {
             String suffix = fileName.substring(suffixIndex + 1);
             return isVcardSuffix(suffix);
-        }else{
+        } 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)){
+    public static boolean isCloudFileAllowedFile(String fileName) {
+        if (TextUtils.isEmpty(fileName)) {
             return false;
         }
 
         int suffixIndex = fileName.lastIndexOf(".");
-        if(suffixIndex != -1){
+        if (suffixIndex != -1) {
             String suffix = fileName.substring(suffixIndex + 1);
             return !isCloudFileExcludeSuffix(suffix);
-        }else{
+        } 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)){
+    public static boolean isImageSuffix(String suffix) {
+        if (TextUtils.isEmpty(suffix)) {
             return false;
         }
 
@@ -153,12 +154,12 @@
 
     /**
      * 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)){
+    public static boolean isAudioSuffix(String suffix) {
+        if (TextUtils.isEmpty(suffix)) {
             return false;
         }
 
@@ -167,53 +168,52 @@
 
     /**
      * 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)){
+    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)){
+    public static boolean isVcardSuffix(String suffix) {
+        if (TextUtils.isEmpty(suffix)) {
             return false;
         }
 
-        return MediaConstants.CLOUD_FILE_EXCLUDE_SUFFIX.indexOf(suffix.toUpperCase(Locale.getDefault())) != -1;
+        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
+     * 
+     * @param context the context
+     * @param file the file
      * @return the amr file duration
      */
     public static final int getAmrFileDuration(Context context, File file) {
@@ -225,11 +225,9 @@
 
     /**
      * Gets the video file duration.
-     *
-     * @param context
-     *            the context
-     * @param file
-     *            the file
+     * 
+     * @param context the context
+     * @param file the file
      * @return the video file duration
      */
     public static final int getVideoFileDuration(Context context, File file) {
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
index afbb729..7d45d6d 100644
--- 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
@@ -20,14 +20,18 @@
  * 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
+ * Title: RcsPhoneUtils class
+ * </p>
+ * <p>
+ * Description: The class <code>RcsPhoneUtils</code> is a utility for phone
+ * number operation
  * </p>
  * <p>
  * Copyright: Copyright (c) 2014
@@ -35,19 +39,20 @@
  * <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
+     * 
+     * @param number the phone number
      * @return international phone
      */
     public static String parseNumToInternational(String number) {
@@ -61,8 +66,8 @@
 
         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)) {
+        } 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;
@@ -72,9 +77,8 @@
 
     /**
      * Draw out phone from URI
-     *
-     * @param uri
-     *             the URI
+     * 
+     * @param uri the URI
      * @return international phone
      */
     public static String drawNumberFromUri(String uri) {
@@ -85,18 +89,18 @@
         try {
             int index0 = uri.indexOf("<");
             if (index0 != -1) {
-                uri = uri.substring(index0+1, uri.indexOf(">", index0));
+                uri = uri.substring(index0 + 1, uri.indexOf(">", index0));
             }
 
             int index1 = uri.indexOf("tel:");
             if (index1 != -1) {
-                uri = uri.substring(index1+4);
+                uri = uri.substring(index1 + 4);
             }
 
             index1 = uri.indexOf("sip:");
             if (index1 != -1) {
                 int index2 = uri.indexOf("@", index1);
-                uri = uri.substring(index1+4, index2);
+                uri = uri.substring(index1 + 4, index2);
             }
 
             int index2 = uri.indexOf(";");
@@ -105,7 +109,7 @@
             }
 
             return parseNumToInternational(uri);
-        } catch(Exception e) {
+        } 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
index 07a830d..3e74871 100644
--- 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
@@ -20,6 +20,7 @@
  * 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;
@@ -28,9 +29,12 @@
 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
+ * 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
@@ -38,37 +42,37 @@
  * <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.
+     * @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);
+    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);
+        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
         Editor editor = prefs.edit();
         editor.putString(name, value);
         return editor.commit();
@@ -76,29 +80,29 @@
 
     /**
      * 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.
+     * @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);
+    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);
+        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
         Editor editor = prefs.edit();
         editor.putBoolean(name, value);
         return editor.commit();
@@ -106,42 +110,44 @@
 
     /**
      * 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.
+     * @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);
+        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.
+     * @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);
+        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);
+        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
         Editor editor = prefs.edit();
         editor.putInt(name, value);
         return editor.commit();
@@ -149,14 +155,14 @@
 
     /**
      * 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);
+        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
index af3f30e..04b1042 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -29,16 +30,24 @@
 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>.
- *
+ * <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
-{
+public class MenuInfo implements Parcelable {
 
     /** The command id. */
     private String commandId;
@@ -58,197 +67,176 @@
     /**
      * Instantiates a new menu info.
      */
-    public MenuInfo( )
-    {}
+    public MenuInfo() {
+    }
 
     /**
      * Instantiates a new menu info.
-     *
+     * 
      * @param source the source
      */
-    public MenuInfo( Parcel source )
-    {
-        readFromParcel( source );
+    public MenuInfo(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    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
+     * 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 );
+    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
+     * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    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() );
+        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 );
-                                                                    }
+    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 ];
-                                                                    }
-                                                                };
+        @Override
+        public MenuInfo[] newArray(int size) {
+            return new MenuInfo[size];
+        }
+    };
 
     /**
      * Gets the command id.
-     *
+     * 
      * @return the command id
      */
-    public String getCommandId()
-    {
+    public String getCommandId() {
         return commandId;
     }
 
     /**
      * Sets the command id.
-     *
+     * 
      * @param commandId the new command id
      */
-    public void setCommandId( String commandId )
-    {
+    public void setCommandId(String commandId) {
         this.commandId = commandId;
     }
 
     /**
      * Gets the title.
-     *
+     * 
      * @return the title
      */
-    public String getTitle()
-    {
+    public String getTitle() {
         return title;
     }
 
     /**
      * Sets the title.
-     *
+     * 
      * @param title the new title
      */
-    public void setTitle( String title )
-    {
+    public void setTitle(String title) {
         this.title = title;
     }
 
     /**
      * Gets the type.
-     *
+     * 
      * @return the type
      */
-    public int getType()
-    {
+    public int getType() {
         return type;
     }
 
     /**
      * Sets the type.
-     *
+     * 
      * @param type the new type
      */
-    public void setType( int type )
-    {
+    public void setType(int type) {
         this.type = type;
     }
 
     /**
      * Gets the priority.
-     *
+     * 
      * @return the priority
      */
-    public int getPriority()
-    {
+    public int getPriority() {
         return priority;
     }
 
     /**
      * Sets the priority.
-     *
+     * 
      * @param priority the new priority
      */
-    public void setPriority( int priority )
-    {
+    public void setPriority(int priority) {
         this.priority = priority;
     }
 
     /**
      * Gets the sub menu list.
-     *
+     * 
      * @return the sub menu list
      */
-    public List<MenuInfo> getSubMenuList()
-    {
+    public List<MenuInfo> getSubMenuList() {
         return subMenuList;
     }
 
     /**
      * Sets the sub menu list.
-     *
+     * 
      * @param subMenuList the new sub menu list
      */
-    public void setSubMenuList( List<MenuInfo> subMenuList )
-    {
+    public void setSubMenuList(List<MenuInfo> subMenuList) {
         this.subMenuList = subMenuList;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (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("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){
+            for (MenuInfo menu : this.subMenuList) {
                 sbuffer.append(menu.toString());
             }
             sbuffer.append("]");
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
index c7f032b..a2ea1a4 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -40,17 +41,14 @@
  * <p>
  * Company: pci-suntek
  * </p>
- *
+ * 
  * @author zrq
  * @version 1.0
- *
  */
-public class PhoneList implements Parcelable
-{
-
+public class PhoneList implements Parcelable {
 
     /** The phone list . */
-    private ArrayList<String>    phoneList;
+    private ArrayList<String> phoneList;
 
     public ArrayList<String> getPhoneList() {
         return phoneList;
@@ -63,28 +61,25 @@
     /**
      * Instantiates a new phone list.
      */
-    public PhoneList()
-    {}
+    public PhoneList() {
+    }
 
     /**
      * Instantiates a new phone list.
-     *
-     * @param source
-     *            the source
+     * 
+     * @param source the source
      */
-    public PhoneList( Parcel source )
-    {
-        readFromParcel( source );
+    public PhoneList(Parcel source) {
+        readFromParcel(source);
     }
 
     /**
      * The parcel describe contents, defaul is 0.
-     *
+     * 
      * @return the int
      */
     @Override
-    public int describeContents()
-    {
+    public int describeContents() {
         return 0;
     }
 
@@ -92,15 +87,12 @@
      * 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
+     * 
+     * @param dest the dest parcel stream
+     * @param flags the flags
      */
     @Override
-    public void writeToParcel( Parcel dest, int flags )
-    {
+    public void writeToParcel(Parcel dest, int flags) {
         dest.writeStringList(phoneList);
     }
 
@@ -108,31 +100,24 @@
      * 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
+     * 
+     * @param source The parcel stream
      */
-    public void readFromParcel( Parcel source )
-    {
+    public void readFromParcel(Parcel source) {
         phoneList = source.createStringArrayList();
     }
 
     /** 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 );
+        public PhoneList createFromParcel(Parcel source) {
+            return new PhoneList(source);
         }
 
         @Override
-        public PhoneList[] newArray( int size )
-        {
-            return new PhoneList[ size ];
+        public PhoneList[] newArray(int size) {
+            return new PhoneList[size];
         }
     };
 
-
-
-
 }
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/api/provider/model/CloudFileMessage.java
index 94f1903..c9c17de 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/api/provider/model/CloudFileMessage.java
@@ -20,6 +20,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.provider.model;
 
 import android.os.Parcel;
@@ -28,7 +29,7 @@
 /**
  * The Class CloudFileMessage.
  */
-public class CloudFileMessage implements Parcelable{
+public class CloudFileMessage implements Parcelable {
 
     /** The file name. */
     private String fileName;
@@ -42,12 +43,13 @@
     /**
      * Instantiates a new cloud file message.
      */
-    public CloudFileMessage(){}
+    public CloudFileMessage() {
+    }
 
     /**
      * Instantiates a new cloud file message.
      */
-    public CloudFileMessage(String fileName, long fileSize, String shareUrl){
+    public CloudFileMessage(String fileName, long fileSize, String shareUrl) {
         this.fileName = fileName;
         this.fileSize = fileSize;
         this.shareUrl = shareUrl;
@@ -55,15 +57,15 @@
 
     /**
      * Instantiates a new cloud file message.
-     *
+     * 
      * @param source the source
      */
-    public CloudFileMessage( Parcel source )
-    {
-        readFromParcel( source );
+    public CloudFileMessage(Parcel source) {
+        readFromParcel(source);
     }
 
-    /* (non-Javadoc)
+    /*
+     * (non-Javadoc)
      * @see android.os.Parcelable#describeContents()
      */
     @Override
@@ -71,47 +73,44 @@
         return 0;
     }
 
-    /* (non-Javadoc)
+    /*
+     * (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 );
+        dest.writeString(fileName);
+        dest.writeLong(fileSize);
+        dest.writeString(shareUrl);
     }
 
     /**
      * Read from parcel.
-     *
+     * 
      * @param source the source
      */
-    public void readFromParcel( Parcel 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 );
-                                                                                }
+    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 ];
-                                                                                }
-                                                                            };
-
+        @Override
+        public CloudFileMessage[] newArray(int size) {
+            return new CloudFileMessage[size];
+        }
+    };
 
     /**
      * Gets the file name.
-     *
+     * 
      * @return the file name
      */
     public String getFileName() {
@@ -120,7 +119,7 @@
 
     /**
      * Sets the file name.
-     *
+     * 
      * @param fileName the new file name
      */
     public void setFileName(String fileName) {
@@ -129,7 +128,7 @@
 
     /**
      * Gets the file size.
-     *
+     * 
      * @return the file size
      */
     public long getFileSize() {
@@ -138,7 +137,7 @@
 
     /**
      * Sets the file size.
-     *
+     * 
      * @param fileSize the new file size
      */
     public void setFileSize(long fileSize) {
@@ -147,7 +146,7 @@
 
     /**
      * Gets the share url.
-     *
+     * 
      * @return the share url
      */
     public String getShareUrl() {
@@ -156,7 +155,7 @@
 
     /**
      * Sets the share url.
-     *
+     * 
      * @param shareUrl the new share url
      */
     public void setShareUrl(String shareUrl) {
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 a30d8c5..18e5e96 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
@@ -20,6 +20,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api;
 
 import java.util.List;
@@ -41,12 +42,17 @@
     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) {
@@ -56,6 +62,7 @@
 
     /**
      * judge the bind state about remote service.
+     * 
      * @return true if binded, return false if unbinded.
      */
     public boolean isBinded() {
@@ -69,15 +76,13 @@
     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());
+        if (context.getPackageName() != null && !"".equals(context.getPackageName())) {
+            LogHelper.MYLOG_PATH_SDCARD_DIR = LogHelper.MYLOG_PATH_SDCARD_DIR.replace(
+                    "com.suntek.mway.rcs.service.api", context.getPackageName());
         }
         // TODO Auto-generated constructor stub
         Intent intent = new Intent();
-//        intent.setAction(serviceName);
+        // intent.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);
@@ -89,38 +94,40 @@
                 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.");
+            } 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 {
+            LogHelper.e("unbind " + serviceName + "--> result:" + e.getMessage(), e);
+        } finally {
             isBinded = false;
         }
     }
 
-
     /**
      * check the service is start or not.
+     * 
      * @param ctx android.content.Context
      * @return true if the service is started , false otherwise.
      */
     public static boolean isMainServiceStarted(Context ctx) {
-        ActivityManager activityManager = (ActivityManager)ctx.getSystemService(Context.ACTIVITY_SERVICE);
-        List<ActivityManager.RunningServiceInfo> serviceList = activityManager.getRunningServices(Integer.MAX_VALUE);
-         for(int i = 0; i < serviceList.size(); i++) {
-               ActivityManager.RunningServiceInfo serviceInfo = serviceList.get(i);
-               ComponentName serviceName = serviceInfo.service;
-               if (serviceName.getClassName().equals(APIConstant.MAIN_SERVICE_NAME)) {
-                     if (serviceInfo.pid != 0) {
-                          return true;
-                     } else {
-                          return false;
-                     }
-               }
-         }
-         return false;
+        ActivityManager activityManager = (ActivityManager)ctx
+                .getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningServiceInfo> serviceList = activityManager
+                .getRunningServices(Integer.MAX_VALUE);
+        for (int i = 0; i < serviceList.size(); i++) {
+            ActivityManager.RunningServiceInfo serviceInfo = serviceList.get(i);
+            ComponentName serviceName = serviceInfo.service;
+            if (serviceName.getClassName().equals(APIConstant.MAIN_SERVICE_NAME)) {
+                if (serviceInfo.pid != 0) {
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        }
+        return false;
     }
 
     protected void notifyServiceConnected() {
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
index 5decdd0..9b6db18 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/RCSServiceListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/RCSServiceListener.java
index 54fdfc6..3800d3c 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/RCSServiceListener.java
@@ -20,9 +20,10 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api;
 
 import com.suntek.mway.rcs.client.aidl.IRCSServiceListener;
 
-public abstract class RCSServiceListener extends IRCSServiceListener.Stub{
+public abstract class RCSServiceListener extends IRCSServiceListener.Stub {
 }
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/RcsAccountApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/autoconfig/RcsAccountApi.java
index e2a2f0a..ae85384 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -52,11 +53,11 @@
         public void onServiceConnected(ComponentName className, IBinder service) {
             myApi = IRcsSettingApi.Stub.asInterface(service);
             notifyServiceConnected();
-            LogHelper.d("IRcsSettingApi have success connect, api="+myApi);
+            LogHelper.d("IRcsSettingApi have success connect, api=" + myApi);
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
                 LogHelper.d("IRcsSettingApi api disconnect service");
                 myApi = null;
                 notifyServiceDisconnected();
@@ -79,7 +80,6 @@
         super.initServiceConnect(mConnection);
     }
 
-
     public RcsUserProfileInfo getRcsUserProfileInfo() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         try {
@@ -119,25 +119,28 @@
         return false;
     }
 
-    private void login(LoginUser loginUser,AccountEventListener listener) throws ServiceDisconnectedException {
+    private void login(LoginUser loginUser, AccountEventListener listener)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
     }
 
-    private void logout(LoginUser loginUser,AccountEventListener listener) throws ServiceDisconnectedException {
+    private void logout(LoginUser loginUser, AccountEventListener listener)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
     }
 
-    private void startService(Context context, AccountEventListener listener) throws ServiceDisconnectedException {
+    private void startService(Context context, AccountEventListener listener)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
     }
 
-    private void stopService(Context context, AccountEventListener listener) throws ServiceDisconnectedException {
+    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));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:checkOtp. [otp]=%s", otp));
         try {
             myApi.checkOtp(otp);
         } catch (Exception ex) {
@@ -147,7 +150,7 @@
     }
 
     public void start() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:start. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:start. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             myApi.start();
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
index 779a391..f412b1d 100644
--- 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
@@ -20,10 +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.api.autoconfig.callback;
 
 import com.suntek.mway.rcs.client.aidl.setting.callback.IAccountEventListener;
 
-public abstract class AccountEventListener extends IAccountEventListener.Stub{
+public abstract class AccountEventListener extends IAccountEventListener.Stub {
 
 }
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/blacklist/impl/BlackListApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/blacklist/impl/BlackListApi.java
index 1fedd87..874ee90 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -36,25 +37,29 @@
 import com.suntek.mway.rcs.client.api.util.log.LogHelper;
 
 /**
- * <p>Title: BlackListApi class</p>
+ * <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);
+ * 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 {
 
@@ -69,11 +74,11 @@
         public void onServiceConnected(ComponentName className, IBinder service) {
             myApi = IBlackListApi.Stub.asInterface(service);
             notifyServiceConnected();
-            LogHelper.d("IBlackListApi have success connect, api="+myApi);
+            LogHelper.d("IBlackListApi have success connect, api=" + myApi);
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
                 LogHelper.d("IBlackListApi api disconnect service");
                 myApi = null;
                 notifyServiceDisconnected();
@@ -101,12 +106,12 @@
 
     /**
      * 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));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method add. [number]=%s", number));
         if (!VerificationUtil.isNumber(number)) {
             LogHelper.i("number field value error");
             return false;
@@ -121,12 +126,12 @@
 
     /**
      * 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));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method remove. [number]=%s", number));
         if (!VerificationUtil.isNumber(number)) {
             LogHelper.i("number field value error");
             return false;
@@ -144,7 +149,7 @@
      */
     public void clear() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method clear. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method clear. "));
         try {
             myApi.clear();
         } catch (Exception ex) {
@@ -154,13 +159,14 @@
 
     /**
      * 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));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method checkIsBlack. [number]=%s",
+                number));
         if (!VerificationUtil.isNumber(number)) {
             LogHelper.i("number field value error");
             return false;
@@ -170,7 +176,7 @@
         } catch (Exception ex) {
             LogHelper.e(ex.getMessage(), ex);
         }
-        return false;//default value is non-black user
+        return false;// default value is non-black user
     }
 
     public List<String> getList() throws ServiceDisconnectedException {
@@ -182,4 +188,14 @@
         }
         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_api/src/com/suntek/mway/rcs/client/api/capability/callback/CapabiltyListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/capability/callback/CapabiltyListener.java
index 0e12d30..2033906 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/callback/CapabiltyListener.java
@@ -20,11 +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.api.capability.callback;
 
+package com.suntek.mway.rcs.client.api.capability.callback;
 
 import com.suntek.mway.rcs.client.aidl.plugin.callback.ICapabiltyListener;
 
-public abstract class CapabiltyListener extends ICapabiltyListener.Stub{
+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
index 6f42951..1ac55f4 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -27,6 +28,7 @@
 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;
@@ -37,6 +39,7 @@
 
 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() {
@@ -46,15 +49,13 @@
             myApi = ICapabilityApi.Stub.asInterface(service);
         }
 
-
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            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);
+                LogHelper.d("illegal call client api disconnect service :" + reconnectionTimes);
                 init(context, rcsListener);
                 if (!isBinded()) {
                     // app is uninstalled
@@ -72,9 +73,15 @@
         super.initServiceConnect(mConnection);
     }
 
-    public void findCapabilityByNumber(String number,CapabiltyListener listener) throws ServiceDisconnectedException {
+    public void findCapabilityByNumber(String number, CapabiltyListener listener)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method findCapabilityByNumber. [number]=%s", number));
+
+        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;
@@ -83,7 +90,7 @@
             myApi.findCapabilityByNumber(VerificationUtil.formatNumber(number), listener);
         } catch (Exception e) {
             // TODO Auto-generated catch block
-            LogHelper.e(e.getMessage(),e);
+            LogHelper.e(e.getMessage(), e);
         }
     }
 }
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/emoticon/EmoticonApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/emoticon/EmoticonApi.java
index 2382f99..d7acbc6 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
@@ -20,32 +20,31 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.emoticon;
 
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import 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 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.ClientApi;
-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;
-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.ResultBO;
-import com.suntek.mway.rcs.client.aidl.plugin.entity.emoticon.UserBO;
-import com.suntek.mway.rcs.client.aidl.emoticon.IEmoticonApi;
-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 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";
+
     IEmoticonApi myApi;
 
     private ServiceConnection mConnection = new ServiceConnection() {
@@ -56,13 +55,12 @@
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            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);
+                LogHelper.d("illegal call client api disconnect service :" + reconnectionTimes);
                 init(context, rcsListener);
                 if (!isBinded()) {
                     // app is uninstalled
@@ -81,8 +79,8 @@
 
     public EmoticonBO getEmoticon(String emoticonId) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getEmoticon. [emoticonId]=%s", emoticonId));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getEmoticon. [emoticonId]=%s",
+                emoticonId));
         try {
             return myApi.getEmoticon(emoticonId);
         } catch (Exception ex) {
@@ -93,8 +91,7 @@
 
     public List<EmojiPackageBO> queryEmojiPackages() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:queryEmojiPackages. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:queryEmojiPackages. "));
         try {
             return myApi.queryEmojiPackages();
         } catch (Exception ex) {
@@ -116,7 +113,8 @@
     }
 
     public EmoticonBO decodeEmoticon(String eid) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:decodeEmoticon. [eid]=%s", eid));
+        LogHelper
+                .i(String.format(Locale.getDefault(), "enter method:decodeEmoticon. [eid]=%s", eid));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.decodeEmoticon(eid);
@@ -126,8 +124,11 @@
         return null;
     }
 
-    public byte[] decrypt2Bytes(String emoticonId, int emoFileType) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:decrypt2Bytes. [emoticonId,emoFileType]=%s,%s", emoticonId,emoFileType));
+    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);
@@ -137,8 +138,10 @@
         return null;
     }
 
-    public void doAcceptEmoticon(String emoticonId, IEmoticonCallbackApi callback) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:doAcceptEmoticon. [emoticonId]=%s", 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);
@@ -148,7 +151,8 @@
     }
 
     public boolean emojiPackageExist(String packageId) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:emojiPackageExist. [packageId]=%s", packageId));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:emojiPackageExist. [packageId]=%s", packageId));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.emojiPackageExist(packageId);
@@ -159,7 +163,8 @@
     }
 
     public String encodeEmoticon(String emoticonId) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:encodeEmoticon. [emoticonId]=%s", emoticonId));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:encodeEmoticon. [emoticonId]=%s", emoticonId));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.encodeEmoticon(emoticonId);
@@ -170,7 +175,7 @@
     }
 
     public UserBO getCurrentUser() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getCurrentUser. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getCurrentUser. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getCurrentUser();
@@ -181,7 +186,7 @@
     }
 
     public boolean getCurrentUserState() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getCurrentUserState. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getCurrentUserState. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getCurrentUserState();
@@ -192,7 +197,8 @@
     }
 
     public EmojiPackageBO getEmojiPackage(String packageId) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getEmojiPackage. [packageId]=%s", packageId));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getEmojiPackage. [packageId]=%s", packageId));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getEmojiPackage(packageId);
@@ -202,8 +208,10 @@
         return null;
     }
 
-    public EmojiPackageBO getEmojiPackageWithDetail(String packageId) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getEmojiPackageWithDetail. [packageId]=%s", packageId));
+    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);
@@ -214,7 +222,8 @@
     }
 
     public String getEmoticonId(String emoticonId) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getEmoticonId. [emoticonId]=%s", emoticonId));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getEmoticonId. [emoticonId]=%s", emoticonId));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getEmoticonId(emoticonId);
@@ -225,7 +234,7 @@
     }
 
     public String getStorageRootPath() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getStorageRootPath. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getStorageRootPath. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getStorageRootPath();
@@ -235,18 +244,22 @@
         return null;
     }
 
-    public void isCanSend(String emoticonId, String phone, IEmoticonCanSendCallback cansendCallback) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:isCanSend. [emoticonId, phone]=%s, %s", emoticonId, phone));
+    public boolean isCanSend(String emoticonId) throws ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:isCanSend. [emoticonId]=%s",
+                emoticonId));
         VerificationUtil.ApiIsNull(myApi);
         try {
-            myApi.isCanSend(emoticonId, phone, cansendCallback);
+            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()));
+    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);
@@ -256,7 +269,8 @@
     }
 
     public List<EmojiPackageBO> queryEmojiPackagesWithDetail() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:queryEmojiPackagesWithDetail."));
+        LogHelper
+                .i(String.format(Locale.getDefault(), "enter method:queryEmojiPackagesWithDetail."));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.queryEmojiPackagesWithDetail();
@@ -266,8 +280,10 @@
         return null;
     }
 
-    public List<EmoticonBO> queryEmoticonName(String emoticonName) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:queryEmoticonName. [emoticonName]=%s", emoticonName));
+    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);
@@ -277,8 +293,9 @@
         return null;
     }
 
-    public void setSuccessDownListener(IEmoticonSetSuccessDownListener downListener) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:setSuccessDownListener. "));
+    public void setSuccessDownListener(IEmoticonSetSuccessDownListener downListener)
+            throws ServiceDisconnectedException {
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:setSuccessDownListener. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             myApi.setSuccessDownListener(downListener);
@@ -288,7 +305,7 @@
     }
 
     public void unreSuccessListenter() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:unreSuccessListenter. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:unreSuccessListenter. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             myApi.unreSuccessListenter();
@@ -296,4 +313,28 @@
             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);
+        }
+    }
 }
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
index 51fe1ff..f60527c 100644
--- 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
@@ -20,10 +20,10 @@
  * FROM, 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>
@@ -36,10 +36,9 @@
  * <p>
  * Company:pci-suntek
  * </p>
- *
+ * 
  * @author YFB
  * @version 1.0
- *
  */
 public class MemberFullException extends Exception {
 
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
index 6249910..aaadcdf 100644
--- 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
@@ -20,10 +20,10 @@
  * FROM, 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>
@@ -36,10 +36,9 @@
  * <p>
  * Company:pci-suntek
  * </p>
- *
+ * 
  * @author YFB
  * @version 1.0
- *
  */
 public class OperatorException extends Exception {
 
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
index 71d5eb3..da4b426 100644
--- 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
@@ -23,32 +23,34 @@
 
 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.text.TextUtils;
-
-import com.suntek.mway.rcs.client.api.ClientApi;
 import com.suntek.mway.rcs.client.aidl.constant.APIConstant;
 import com.suntek.mway.rcs.client.aidl.contacts.RCSContact;
-import com.suntek.mway.rcs.client.api.exception.OperatorException;
 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";
@@ -685,6 +687,20 @@
         }
     }
 
+    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(),
@@ -706,6 +722,17 @@
         }
     }
 
+    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);
@@ -1125,6 +1152,30 @@
         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(),
@@ -1584,6 +1635,19 @@
         }
     }
 
+    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(),
@@ -1628,7 +1692,7 @@
                         "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)){
+        if (TextUtils.isEmpty(id)) {
             LogHelper.i("id field value error");
             return;
         }
@@ -1654,9 +1718,8 @@
         }
     }
 
-    public void forwardVideoFile(long thread_id, long sms_id, String number, String id,
-            int length, int burnFlag, int barCycle, boolean isRecord)
-            throws ServiceDisconnectedException {
+    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(
@@ -1664,7 +1727,7 @@
                         "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)){
+        if (TextUtils.isEmpty(id)) {
             LogHelper.i("id field value error");
             return;
         }
@@ -1690,8 +1753,7 @@
     }
 
     public void forwardOne2ManyImageFile(long thread_id, long sms_id, List<String> numbers,
-            String id, int burnFlag, int barCycle)
-            throws ServiceDisconnectedException {
+            String id, int burnFlag, int barCycle) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         LogHelper
                 .i(String.format(
@@ -1699,7 +1761,7 @@
                         "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)){
+        if (TextUtils.isEmpty(id)) {
             LogHelper.i("id field value error");
             return;
         }
@@ -1718,8 +1780,8 @@
         }
 
         try {
-            myApi.forwardOne2ManyImageFile(thread_id, sms_id, VerificationUtil.formatNumbers(numbers),
-                    id, burnFlag, barCycle);
+            myApi.forwardOne2ManyImageFile(thread_id, sms_id,
+                    VerificationUtil.formatNumbers(numbers), id, burnFlag, barCycle);
         } catch (Exception ex) {
             LogHelper.e(ex.getMessage(), ex);
         }
@@ -1733,10 +1795,10 @@
                 .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));
+                        thread_id, sms_id, numbers.toString(), id, length, burnFlag, barCycle,
+                        isRecord));
 
-        if(TextUtils.isEmpty(id)){
+        if (TextUtils.isEmpty(id)) {
             LogHelper.i("id field value error");
             return;
         }
@@ -1754,8 +1816,8 @@
             return;
         }
         try {
-            myApi.forwardOne2ManyVideoFile(thread_id, sms_id, VerificationUtil.formatNumbers(numbers),
-                    id, length, burnFlag, barCycle);
+            myApi.forwardOne2ManyVideoFile(thread_id, sms_id,
+                    VerificationUtil.formatNumbers(numbers), id, length, burnFlag, barCycle);
         } catch (Exception ex) {
             LogHelper.e(ex.getMessage(), ex);
         }
@@ -1770,7 +1832,7 @@
                         "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)){
+        if (TextUtils.isEmpty(id)) {
             LogHelper.i("id field value error");
             return;
         }
@@ -1792,7 +1854,7 @@
                         "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)){
+        if (TextUtils.isEmpty(id)) {
             LogHelper.i("id field value error");
             return;
         }
@@ -1803,4 +1865,80 @@
             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
index 1de322f..c0c6b39 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -40,9 +41,9 @@
 import com.suntek.mway.rcs.client.api.util.VerificationUtil;
 import com.suntek.mway.rcs.client.api.util.log.LogHelper;
 
-public class PaMessageApi extends ClientApi{
+public class PaMessageApi extends ClientApi {
 
-private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.im.PaMessageApiService";
+    private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.im.PaMessageApiService";
 
     IPaMessageApi myApi;
 
@@ -54,7 +55,7 @@
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
                 LogHelper.d("IPaMessageApi api disconnect service");
                 myApi = null;
                 notifyServiceDisconnected();
@@ -79,41 +80,50 @@
 
     /**
      * 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
+     * 
+     * @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 {
+    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{
+        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){
+        } 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.
+     * 
+     * @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 {
+    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));
+        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));
+        // VerificationUtil.isFileSizeToLarge(filepath,
+        // VerificationUtil.getImageFtMaxSize(context));
         if (quality < 0 || quality > 100) {
             LogHelper.i("quality field value must be between 0 to 100");
             return;
@@ -122,119 +132,141 @@
             VerificationUtil.isFileSizeToLarge(filepath, this.getImageFtMaxSize());
         }
 
-        try{
-            myApi.sendImageFile(thread_id, sms_id, uuid , filepath, quality);
-        }catch(Exception e){
+        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
+     * 
+     * @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 {
+    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));
+        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);
+        if (isRecord) {
+            VerificationUtil.isAudioDurationToLong(context, filepath, this.getAudioMaxTime(),
+                    recordTime);
         }
         VerificationUtil.isFileSizeToLarge(filepath, this.getVideoFtMaxSize());
-//        VerificationUtil.isFileSizeToLarge(filepath,
-//                VerificationUtil.getVideoFtMaxSize(context));
+        // VerificationUtil.isFileSizeToLarge(filepath,
+        // VerificationUtil.getVideoFtMaxSize(context));
         try {
             myApi.sendAudioFile(thread_id, sms_id, uuid, filepath, recordTime);
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),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
+     * 
+     * @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 {
+    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));
+        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);
+        if (isRecord) {
+            VerificationUtil.isVedioDurationToLong(context, filepath, this.getVideoMaxTime(),
+                    length);
         }
         VerificationUtil.isFileSizeToLarge(filepath, this.getVideoFtMaxSize());
-//        VerificationUtil.isFileSizeToLarge(filepath,
-//                VerificationUtil.getVideoFtMaxSize(context));
+        // VerificationUtil.isFileSizeToLarge(filepath,
+        // VerificationUtil.getVideoFtMaxSize(context));
         try {
             myApi.sendVideoFile(thread_id, sms_id, uuid, filepath, length);
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),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
+     * 
+     * @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 {
+    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));
+        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);
+            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
+     * 
+     * @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 {
+    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()));
+        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);
+            LogHelper.e(e.getMessage(), e);
         }
     }
 
     /**
      * Send a menu message to the public accounts.
-     *
-     * @param uuid             the public account uuid
-     * @param text             the message info
+     * 
+     * @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 {
@@ -242,27 +274,30 @@
         try {
             myApi.sendMenuMessage(uuid, text);
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),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
+     * 
+     * @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 {
+    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));
+        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);
+            LogHelper.e(e.getMessage(), e);
         }
     }
 
@@ -293,8 +328,11 @@
         }
     }
 
-    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()));
+    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);
@@ -304,7 +342,7 @@
     }
 
     public long getImageFtMaxSize() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getImageFtMaxSize. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getImageFtMaxSize. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getImageFtMaxSize();
@@ -315,7 +353,7 @@
     }
 
     public long getAudioMaxTime() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getAudioMaxTime. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getAudioMaxTime. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getAudioMaxTime();
@@ -326,7 +364,7 @@
     }
 
     public long getVideoMaxTime() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getVideoMaxTime. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getVideoMaxTime. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getVideoMaxTime();
@@ -337,7 +375,7 @@
     }
 
     public long getVideoFtMaxSize() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getVideoFtMaxSize. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getVideoFtMaxSize. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getVideoFtMaxSize();
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
index 5c6150f..2f32a50 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
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
index 6792610..34cc391 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -40,10 +41,12 @@
 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");
@@ -51,15 +54,13 @@
             notifyServiceConnected();
         }
 
-
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            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);
+                LogHelper.d("illegal call client api disconnect service :" + reconnectionTimes);
                 init(context, rcsListener);
                 if (!isBinded()) {
                     // app is uninstalled
@@ -77,214 +78,254 @@
         super.initServiceConnect(mConnection);
     }
 
-    public String createGroupChat(String subject,List<String> users) throws ServiceDisconnectedException {
+    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()));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return null;
     }
 
-    public int agreeToJoinGroup(String conversationId ,String contributionId ,String chatUri ,
-            String subject , String numberData, long inviteTime) throws ServiceDisconnectedException {
+    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));
+        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);
+            return myApi.agreeToJoinGroup(conversationId, contributionId, chatUri, subject,
+                    numberData, inviteTime);
         } catch (Exception ex) {
             // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(),ex);
+            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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return OprResponse.OTHRE_ERROR;
     }
 
-    public int updateGroupSubject(String groupId,String newSubject) throws ServiceDisconnectedException {
+    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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return OprResponse.OTHRE_ERROR;
     }
 
-    public void modifyGroupMemo(String groupId,String memo) throws ServiceDisconnectedException {
+    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));
+        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);
+            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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return OprResponse.OTHRE_ERROR;
     }
 
-    public int kickedOutOfGroupChat(String groupId,String number) throws ServiceDisconnectedException {
+    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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return OprResponse.OTHRE_ERROR;
     }
 
-    public int assignGroupChairman(String groupId,String number) throws ServiceDisconnectedException {
+    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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return OprResponse.OTHRE_ERROR;
     }
-    public int quitGroupChat(String groupId,String number) throws ServiceDisconnectedException {
+
+    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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return OprResponse.OTHRE_ERROR;
     }
 
     @Deprecated
-    public void quitGroupChatEx(String groupId,String oldChairman,String newChairman) throws ServiceDisconnectedException {
+    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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
     }
 
-    public int setMyAlias(String groupId,String alias) throws ServiceDisconnectedException {
+    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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return OprResponse.OTHRE_ERROR;
     }
-    public String getGroupChatMemberDisplayName(String groupId,String number) throws ServiceDisconnectedException {
+
+    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));
+        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);
+            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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return null;
     }
-    public int inviteToJoinGroupChat(String groupId, String number) throws ServiceDisconnectedException {
+
+    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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return OprResponse.OTHRE_ERROR;
     }
 
-    public int inviteToJoinGroupChat(String groupId, List<String> numbers) throws ServiceDisconnectedException {
+    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()));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return OprResponse.OTHRE_ERROR;
     }
 
-    public void queryMemberHeadPic(String groupId, String number,int pixel, ConferenceCallback confCallback) throws ServiceDisconnectedException {
+    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));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method queryMemberHeadPic. [groupId,number]=%s,%s", groupId, number));
         try {
-            myApi.queryMemberHeadPic(groupId, number,pixel, confCallback);
+            myApi.queryMemberHeadPic(groupId, number, pixel, confCallback);
         } catch (Exception ex) {
             // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(),ex);
+            LogHelper.e(ex.getMessage(), ex);
         }
     }
 
-    public void refreshMemberHeadPic(String groupId, String number,int pixel, ConferenceCallback confCallback) throws ServiceDisconnectedException {
+    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));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method refreshMemberHeadPic. [groupId,number]=%s,%s", groupId, number));
         try {
-            myApi.refreshMemberHeadPic(groupId, number,pixel, confCallback);
+            myApi.refreshMemberHeadPic(groupId, number, pixel, confCallback);
         } catch (Exception ex) {
             // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(),ex);
+            LogHelper.e(ex.getMessage(), ex);
         }
 
     }
-    public GroupChatModel  getLastGroupModel()throws ServiceDisconnectedException {
+
+    public GroupChatModel getLastGroupModel() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method getAllGroupId"));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return null;
     }
@@ -302,8 +343,7 @@
             throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getGroupChatUsersAllowChairman. [groupId]=%s",
-                groupId));
+                "enter method:getGroupChatUsersAllowChairman. [groupId]=%s", groupId));
         try {
             return myApi.getGroupChatUsersAllowChairman(groupId);
         } catch (Exception ex) {
@@ -316,8 +356,7 @@
             throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getGroupChatUsersByGroupId. [groupId]=%s",
-                groupId));
+                "enter method:getGroupChatUsersByGroupId. [groupId]=%s", groupId));
         try {
             return myApi.getGroupChatUsersByGroupId(groupId);
         } catch (Exception ex) {
@@ -329,10 +368,8 @@
     public GroupChatModel getGroupChatByThreadId(String threadId)
             throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper
-                .i(String.format(Locale.getDefault(),
-                        "enter method:getGroupChatByThreadId. [threadId]=%s",
-                        threadId));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method:getGroupChatByThreadId. [threadId]=%s", threadId));
         try {
             return myApi.getGroupChatByThreadId(threadId);
         } catch (Exception ex) {
@@ -341,8 +378,7 @@
         return null;
     }
 
-    public GroupChatModel getGroupChatByChatUri(String chatUri)
-            throws ServiceDisconnectedException {
+    public GroupChatModel getGroupChatByChatUri(String chatUri) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         LogHelper.i(String.format(Locale.getDefault(),
                 "enter method:getGroupChatByChatUri. [chatUri]=%s", chatUri));
@@ -355,7 +391,7 @@
     }
 
     public String getGroupChatDomainName() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getGroupChatDomainName. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getGroupChatDomainName. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getGroupChatDomainName();
@@ -366,7 +402,8 @@
     }
 
     public String getPublicAccountDomainName() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:getPublicAccountDomainName. "));
+        LogHelper
+                .i(String.format(Locale.getDefault(), "enter method:getPublicAccountDomainName. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getPublicAccountDomainName();
@@ -376,30 +413,43 @@
         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));
+    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);
+            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));
+    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);
+            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));
+        LogHelper.i(String.format(Locale.getDefault(), "enter rejoinGroupChat. [chatUri]=%s",
+                chatUri));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.rejoinGroupChat(chatUri);
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
index 94fc388..756b1a9 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -35,10 +36,10 @@
 import com.suntek.mway.rcs.client.api.util.VerificationUtil;
 import com.suntek.mway.rcs.client.api.util.log.LogHelper;
 
-
-public class LoginApi extends ClientApi{
+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;
 
@@ -47,17 +48,16 @@
         public void onServiceConnected(ComponentName className, IBinder service) {
             myApi = ILoginApi.Stub.asInterface(service);
             notifyServiceConnected();
-            LogHelper.d("ILoginApi have success connect, api="+myApi);
+            LogHelper.d("ILoginApi have success connect, api=" + myApi);
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            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);
+                LogHelper.d("illegal call ILoginApi api disconnect service :" + reconnectionTimes);
                 init(context, rcsListener);
                 if (!isBinded()) {
                     // app is uninstalled
@@ -74,22 +74,24 @@
         super.initServiceConnect(mConnection);
     }
 
-    public void login(LoginUser loginUser, LoginEventListener listener)throws ServiceDisconnectedException {
+    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{
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method login.loginUser=" + loginUser.toString()));
+        try {
             myApi.login(loginUser, listener);
-        }catch(Exception ex){
+        } 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{
+        LogHelper.i(String.format(Locale.getDefault(), "enter method logout"));
+        try {
             myApi.logout();
-        }catch(Exception ex){
+        } 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
index 487283b..63701f2 100644
--- 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
@@ -20,8 +20,12 @@
  * FROM, 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(){}
+
+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
index 7b55d3f..537401c 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -41,6 +42,7 @@
 
 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() {
@@ -51,13 +53,12 @@
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            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);
+                LogHelper.d("illegal call client api disconnect service :" + reconnectionTimes);
                 init(context, rcsListener);
                 if (!isBinded()) {
                     // app is uninstalled
@@ -74,12 +75,17 @@
         super.initServiceConnect(mConnection);
     }
 
-    public IMcloudOperationCtrl downloadFileFromUrl(String remoteUrl, String fileName, TransNode.TransOper transOper, int chatMessageId) throws ServiceDisconnectedException {
+    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));
+        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);
+            IMcloudOperationCtrl operation = myApi.downloadFileFromUrl(remoteUrl, fileName,
+                    transOper.ordinal(), chatMessageId);
             LogHelper.d("operation=" + operation);
             return operation;
         } catch (Exception ex) {
@@ -90,9 +96,10 @@
 
     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));
+        LogHelper
+                .i(String.format(Locale.getDefault(),
+                        "enter method:getShareFileList. [beginIndex,endIndex]=%d,%d", beginIndex,
+                        endIndex));
         try {
             myApi.getShareFileList(beginIndex, endIndex);
         } catch (Exception ex) {
@@ -100,14 +107,16 @@
         }
     }
 
-    public IMcloudOperationCtrl putFile(String localPath, String remotePath, TransNode.TransOper transOper) throws ServiceDisconnectedException, FileSuffixException {
+    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()));
+                "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());
+            IMcloudOperationCtrl operation = myApi.putFile(localPath, remotePath,
+                    transOper.ordinal());
             LogHelper.d("operation=" + operation);
             return operation;
         } catch (Exception ex) {
@@ -116,11 +125,11 @@
         }
     }
 
-    public void shareFile(String fullPathInID, String shareDesc) throws ServiceDisconnectedException {
+    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));
+                "enter method:shareFile. [fullPathInID,shareDesc]=%s,%s", fullPathInID, shareDesc));
         try {
             myApi.shareFile(fullPathInID, shareDesc);
         } catch (Exception ex) {
@@ -128,9 +137,8 @@
         }
     }
 
-    public void shareFileAndSend(String fullPathInID, String shareDesc,
-            String contact, long threadId, String smsContentTemp)
-            throws ServiceDisconnectedException {
+    public void shareFileAndSend(String fullPathInID, String shareDesc, String contact,
+            long threadId, String smsContentTemp) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         LogHelper
                 .i(String.format(
@@ -144,9 +152,8 @@
         }
     }
 
-    public void shareFileAndSendGroup(String fullPathInID, String shareDesc,
-            long threadId, String conversationId, String groupId)
-            throws ServiceDisconnectedException {
+    public void shareFileAndSendGroup(String fullPathInID, String shareDesc, long threadId,
+            String conversationId, String groupId) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         LogHelper
                 .i(String.format(
@@ -154,15 +161,15 @@
                         "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);
+            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 {
+            List<String> contacts, long threadId, String smsContentTemp)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         LogHelper
                 .i(String.format(
@@ -170,25 +177,28 @@
                         "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);
+            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 {
+    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()));
+        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");
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
index d0e6d85..0c1bc8c 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -39,6 +40,7 @@
 
 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() {
@@ -54,8 +56,7 @@
                 myApi = null;
                 notifyServiceDisconnected();
             } else {
-                LogHelper.d("illegal call client api disconnect service :"
-                        + reconnectionTimes);
+                LogHelper.d("illegal call client api disconnect service :" + reconnectionTimes);
                 init(context, rcsListener);
                 if (!isBinded()) {
                     // app is uninstalled
@@ -74,8 +75,7 @@
 
     public void cancelIntervalSync() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:downloadFileFromUrl. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:downloadFileFromUrl. "));
         try {
             myApi.cancelIntervalSync();
         } catch (Exception ex) {
@@ -85,8 +85,7 @@
 
     public boolean getEnableAutoSync() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getEnableAutoSync. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getEnableAutoSync. "));
         try {
             return myApi.getEnableAutoSync();
         } catch (Exception ex) {
@@ -97,8 +96,7 @@
 
     public int getLocalContactCounts() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getLocalContactCounts. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getLocalContactCounts. "));
         try {
             return myApi.getLocalContactCounts();
         } catch (Exception ex) {
@@ -107,11 +105,9 @@
         return 0;
     }
 
-    public boolean getOnlySyncEnableViaWifi()
-            throws ServiceDisconnectedException {
+    public boolean getOnlySyncEnableViaWifi() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getOnlySyncEnableViaWifi. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getOnlySyncEnableViaWifi. "));
         try {
             return myApi.getOnlySyncEnableViaWifi();
         } catch (Exception ex) {
@@ -122,8 +118,7 @@
 
     public int getRemoteContactCounts() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getRemoteContactCounts. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getRemoteContactCounts. "));
         try {
             return myApi.getRemoteContactCounts();
         } catch (Exception ex) {
@@ -132,8 +127,7 @@
         return 0;
     }
 
-    public void setOnlySyncEnableViaWifi(boolean status)
-            throws ServiceDisconnectedException {
+    public void setOnlySyncEnableViaWifi(boolean status) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         LogHelper.i(String.format(Locale.getDefault(),
                 "enter method:setOnlySyncEnableViaWifi. [status]=%b", status));
@@ -147,8 +141,8 @@
     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()));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:doSync. [action]=%d",
+                action.ordinal()));
         try {
             myApi.doSync(action.ordinal(), listener);
         } catch (Exception ex) {
@@ -158,8 +152,7 @@
 
     public SyncAction getAutoSync() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getAutoSync. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getAutoSync. "));
         try {
             return SyncAction.valueOf(myApi.getAutoSync());
         } catch (Exception ex) {
@@ -172,8 +165,8 @@
             throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:setEnableAutoSync. [status, syncAction]=%b,%d",
-                status, syncAction.ordinal()));
+                "enter method:setEnableAutoSync. [status, syncAction]=%b,%d", status,
+                syncAction.ordinal()));
         try {
             myApi.setEnableAutoSync(status, syncAction.ordinal());
         } catch (Exception ex) {
@@ -181,18 +174,14 @@
         }
     }
 
-    public void startIntervalSync(SyncAction syncAction,
-            IntervalAction intervalAction, long time)
+    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));
+        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);
+            myApi.startIntervalSync(syncAction.ordinal(), intervalAction.ordinal(), time);
         } catch (Exception ex) {
             LogHelper.e(ex.getMessage(), ex);
         }
@@ -200,8 +189,7 @@
 
     public IntervalAction getIntervalSyncMode() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format(Locale.getDefault(),
-                "enter method:getIntervalSyncMode. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:getIntervalSyncMode. "));
         try {
             return IntervalAction.valueOf(myApi.getIntervalSyncMode());
         } catch (Exception ex) {
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
index 0303956..770130b 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -37,6 +38,7 @@
 
 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() {
@@ -52,8 +54,7 @@
                 myApi = null;
                 notifyServiceDisconnected();
             } else {
-                LogHelper.d("illegal call client api disconnect service :"
-                        + reconnectionTimes);
+                LogHelper.d("illegal call client api disconnect service :" + reconnectionTimes);
                 init(context, rcsListener);
                 if (!isBinded()) {
                     // app is uninstalled
@@ -73,8 +74,7 @@
     public void intentApk() throws ServiceDisconnectedException {
         if (RcsSupportApi.isRcsPluginCenterInstalled(context)) {
             VerificationUtil.ApiIsNull(myApi);
-            LogHelper.i(String.format(Locale.getDefault(),
-                    "enter method:intentApk. "));
+            LogHelper.i(String.format(Locale.getDefault(), "enter method:intentApk. "));
             try {
                 myApi.intentApk();
             } catch (Exception ex) {
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/ProfileListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/ProfileListener.java
index 4f532b3..33107dc 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/callback/ProfileListener.java
@@ -20,6 +20,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.profile.callback;
 
 import com.suntek.mway.rcs.client.aidl.plugin.callback.IProfileListener;
@@ -29,9 +30,11 @@
 public abstract class ProfileListener extends IProfileListener.Stub {
 
     /**
-     * The default implementation of this interface, the method did not want to expose upward.
+     * The default implementation of this interface, the method did not want to
+     * expose upward.
      */
-    public void onQRImgGet( QRCardImg qrImgObj, int resultCode, String resultDesc ) {
-        LogHelper.d("onQRImgGet(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);;
+    public void onQRImgGet(QRCardImg qrImgObj, int resultCode, String resultDesc) {
+        LogHelper.d("onQRImgGet(): resultCode --> " + resultCode + "resultDesc = " + resultDesc);
+        ;
     }
 }
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/QRImgListener.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/callback/QRImgListener.java
index 1b762f1..3aa7faa 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/callback/QRImgListener.java
@@ -20,6 +20,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.profile.callback;
 
 import com.suntek.mway.rcs.client.aidl.plugin.callback.IProfileListener;
@@ -30,31 +31,37 @@
 public abstract class QRImgListener extends IProfileListener.Stub {
 
     /**
-     * The default implementation of this interface, the method did not want to expose upward.
+     * The default implementation of this interface, the method did not want to
+     * expose upward.
      */
-    public void onProfileUpdated( int resultCode, String resultDesc ) {
-        LogHelper.d("onProfileUpdated(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);
+    public void onProfileUpdated(int resultCode, String resultDesc) {
+        LogHelper.d("onProfileUpdated(): resultCode --> " + resultCode + "resultDesc = "
+                + resultDesc);
     }
 
     /**
-     * The default implementation of this interface, the method did not want to expose upward.
+     * The default implementation of this interface, the method did not want to
+     * expose upward.
      */
-    public void onAvatarUpdated( int resultCode, String resultDesc ) {
-        LogHelper.d("onAvatarUpdated(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);
+    public void onAvatarUpdated(int resultCode, String resultDesc) {
+        LogHelper.d("onAvatarUpdated(): resultCode --> " + resultCode + "resultDesc = "
+                + resultDesc);
     }
 
     /**
-     * The default implementation of this interface, the method did not want to expose upward.
+     * The default implementation of this interface, the method did not want to
+     * expose upward.
      */
-    public void onAvatarGet( Avatar avatar, int resultCode, String resultDesc ) {
-        LogHelper.d("onAvatarGet(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);
+    public void onAvatarGet(Avatar avatar, int resultCode, String resultDesc) {
+        LogHelper.d("onAvatarGet(): resultCode --> " + resultCode + "resultDesc = " + resultDesc);
     }
 
     /**
-     * The default implementation of this interface, the method did not want to expose upward.
+     * The default implementation of this interface, the method did not want to
+     * expose upward.
      */
-    public void onProfileGet( Profile profile, int resultCode, String resultDesc ) {
-        LogHelper.d("onProfileGet(): resultCode --> "+resultCode + "resultDesc = " + resultDesc);
+    public void onProfileGet(Profile profile, int resultCode, String resultDesc) {
+        LogHelper.d("onProfileGet(): resultCode --> " + resultCode + "resultDesc = " + resultDesc);
     }
 
 }
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/impl/ProfileApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/profile/impl/ProfileApi.java
index b638f75..c777a52 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -41,27 +42,31 @@
 import com.suntek.mway.rcs.client.api.util.log.LogHelper;
 
 /**
- * <p>Title: ProfileApi class</p>
+ * <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);
+ * 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  {
+public class ProfileApi extends ClientApi {
 
     /** The service name. */
     private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.profile.ProfileApiService";
@@ -74,17 +79,17 @@
         public void onServiceConnected(ComponentName className, IBinder service) {
             myApi = IProfileApi.Stub.asInterface(service);
             notifyServiceConnected();
-            LogHelper.d("IProfileApi have success connect, api="+myApi);
+            LogHelper.d("IProfileApi have success connect, api=" + myApi);
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            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);
+                LogHelper
+                        .d("illegal call IProfileApi api disconnect service :" + reconnectionTimes);
                 init(context, rcsListener);
                 if (!isBinded()) {
                     // app is uninstalled
@@ -106,95 +111,103 @@
 
     /**
      * Sets the my profile.
-     *
+     * 
      * @param profile the profile
      * @param listener the listener
      */
-    public void setMyProfile(Profile profile, ProfileListener listener) throws ServiceDisconnectedException {
+    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()));
+        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);
+            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 {
+    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()));
+        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);
+            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. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method getMyProfile. "));
         try {
-            myApi.getMyProfile( listener);
+            myApi.getMyProfile(listener);
         } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(),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. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method getMyHeadPic. "));
         try {
-            myApi.getMyHeadPic( listener);
+            myApi.getMyHeadPic(listener);
         } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(),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 {
+    public void getHeadPicByContact(long contactId, ProfileListener listener)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method getHeadPicByContact. [contactId]=%d", contactId));
+        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);
+            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 {
+    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));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getHeadPicByNumber. [number]=%s", number));
         if (!VerificationUtil.isNumber(number)) {
             LogHelper.i("number field value error");
             return;
@@ -202,52 +215,58 @@
         try {
             myApi.getHeadPicByNumber(VerificationUtil.formatNumber(number), pixel, listener);
         } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(),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 {
+    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));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method refreshMyQRImg. [profile,includeEInfo]=%s,%b", profile.toString(),
+                includeEInfo));
         try {
-            myApi.refreshMyQRImg(profile,includeEInfo, listener);
+            myApi.refreshMyQRImg(profile, includeEInfo, listener);
         } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(),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 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{
+    public void updateContactsHeadPicAtFixedRateEveryDay(String hhmm, IProfileListener listener)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method updateContactsHeadPicAtFixedRateEveryDay. [hhmm]=%s", hhmm));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
     }
 
-    public String getUpdateTimeOfContactsHeadPic() throws ServiceDisconnectedException{
+    public String getUpdateTimeOfContactsHeadPic() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method getUpdateTimeOfContactsHeadPic"));
+        LogHelper.i(String.format(Locale.getDefault(),
+                "enter method getUpdateTimeOfContactsHeadPic"));
         try {
             return myApi.getUpdateTimeOfContactsHeadPic();
         } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(),ex);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return null;
     }
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallback.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallback.java
index 7aeb518..111a901 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/callback/PublicAccountCallback.java
@@ -20,6 +20,7 @@
  * FROM, 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.callback.IPublicAccountCallbackAPI;
@@ -32,30 +33,28 @@
 
 import java.util.List;
 
-public abstract class PublicAccountCallback extends IPublicAccountCallbackAPI.Stub{
+public abstract class PublicAccountCallback extends IPublicAccountCallbackAPI.Stub {
 
-
-//    public void PublicAccountCallback() {
-//
-//    }
-//    @Override
-//    public void respAddSubscribe(boolean arg0) throws RemoteException {
-//        // TODO Auto-generated method stub
-//
-//    }
+    // public void PublicAccountCallback() {
+    //
+    // }
+    // @Override
+    // public void respAddSubscribe(boolean arg0) throws RemoteException {
+    // // TODO Auto-generated method stub
+    //
+    // }
 
     @Override
-    public void respAddSubscribeAccount(boolean arg0, PublicAccounts arg1)
-            throws RemoteException {
+    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 respCancelSubscribe(boolean arg0) throws RemoteException {
+    // // TODO Auto-generated method stub
+    //
+    // }
 
     @Override
     public void respCancelSubscribeAccount(boolean arg0, PublicAccounts arg1)
@@ -64,11 +63,11 @@
 
     }
 
-//    @Override
-//    public void respComplainPublic(boolean result) throws RemoteException {
-//        // TODO Auto-generated method stub
-//        LogHelper.d("result --> "+result );
-//    }
+    // @Override
+    // public void respComplainPublic(boolean result) throws RemoteException {
+    // // TODO Auto-generated method stub
+    // LogHelper.d("result --> "+result );
+    // }
 
     @Override
     public void respComplainPublicAccount(boolean result, PublicAccounts arg1)
@@ -78,29 +77,28 @@
     }
 
     @Override
-    public void respGetPreMessage(boolean arg0, List<MsgContent> arg1)
-            throws RemoteException {
+    public void respGetPreMessage(boolean arg0, List<MsgContent> arg1) throws RemoteException {
         // TODO Auto-generated method stub
 
     }
 
-//    @Override
-//    public void respGetPreMessageAccount(boolean result, PublicAccounts pAccount)
-//            throws RemoteException {
-//        // TODO Auto-generated method stub
-//        LogHelper.d("result --> "+result + "PublicAccounts = " + pAccount.getPaUuid()+" , "+pAccount.getSipUri());
-//    }
+    // @Override
+    // public void respGetPreMessageAccount(boolean result, PublicAccounts
+    // pAccount)
+    // throws RemoteException {
+    // // TODO Auto-generated method stub
+    // LogHelper.d("result --> "+result + "PublicAccounts = " +
+    // pAccount.getPaUuid()+" , "+pAccount.getSipUri());
+    // }
 
     @Override
-    public void respGetPublicDetail(boolean arg0, PublicAccountsDetail arg1)
-            throws RemoteException {
+    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
 
     }
@@ -112,25 +110,27 @@
 
     }
 
-//    @Override
-//    public void respGetPublicMenuInfoAccount(boolean result, PublicAccounts pAccount)
-//            throws RemoteException {
-//        // TODO Auto-generated method stub
-//        LogHelper.d("result --> "+result + "PublicAccounts = " + pAccount.getPaUuid()+" , "+pAccount.getSipUri());
-//
-//    }
+    // @Override
+    // public void respGetPublicMenuInfoAccount(boolean result, PublicAccounts
+    // pAccount)
+    // throws RemoteException {
+    // // TODO Auto-generated method stub
+    // LogHelper.d("result --> "+result + "PublicAccounts = " +
+    // pAccount.getPaUuid()+" , "+pAccount.getSipUri());
+    //
+    // }
 
-//    @Override
-//    public void respGetPublicMenuInfoString(boolean result, String info)
-//            throws RemoteException {
-//        // TODO Auto-generated method stub
-//        LogHelper.d("result --> "+result + "info = " + info);
-//
-//    }
+    // @Override
+    // public void respGetPublicMenuInfoString(boolean result, String info)
+    // throws RemoteException {
+    // // TODO Auto-generated method stub
+    // LogHelper.d("result --> "+result + "info = " + info);
+    //
+    // }
 
     @Override
-    public void respGetUserSubscribePublicList(boolean result,
-            List<PublicAccounts> pubAcctList) throws RemoteException {
+    public void respGetUserSubscribePublicList(boolean result, List<PublicAccounts> pubAcctList)
+            throws RemoteException {
         // TODO Auto-generated method stub
 
     }
@@ -141,10 +141,9 @@
         // TODO Auto-generated method stub
 
     }
-    
+
     @Override
-    public void respSetAcceptStatus(boolean result, String uuid)
-            throws RemoteException {
+    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/callback/PublicAccountCallbackImpl.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/publicaccount/callback/PublicAccountCallbackImpl.java
index a9d0652..377be1b 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -37,24 +38,23 @@
         // TODO Auto-generated constructor stub
     }
 
-//    @Override
-//    public void respAddSubscribe(boolean arg0) throws RemoteException {
-//        // TODO Auto-generated method stub
-//
-//    }
+    // @Override
+    // public void respAddSubscribe(boolean arg0) throws RemoteException {
+    // // TODO Auto-generated method stub
+    //
+    // }
 
     @Override
-    public void respAddSubscribeAccount(boolean arg0, PublicAccounts arg1)
-            throws RemoteException {
+    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 respCancelSubscribe(boolean arg0) throws RemoteException {
+    // // TODO Auto-generated method stub
+    //
+    // }
 
     @Override
     public void respCancelSubscribeAccount(boolean arg0, PublicAccounts arg1)
@@ -63,43 +63,39 @@
 
     }
 
-//    @Override
-//    public void respComplainPublic(boolean arg0) 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 {
+    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 {
+    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 respGetPreMessageAccount(boolean arg0, PublicAccounts arg1)
+    // throws RemoteException {
+    // // TODO Auto-generated method stub
+    //
+    // }
 
     @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
 
     }
@@ -111,23 +107,24 @@
 
     }
 
-//    @Override
-//    public void respGetPublicMenuInfoAccount(boolean arg0, PublicAccounts arg1)
-//            throws RemoteException {
-//        // TODO Auto-generated method stub
-//
-//    }
+    // @Override
+    // public void respGetPublicMenuInfoAccount(boolean arg0, PublicAccounts
+    // arg1)
+    // throws RemoteException {
+    // // TODO Auto-generated method stub
+    //
+    // }
 
-//    @Override
-//    public void respGetPublicMenuInfoString(boolean arg0, String arg1)
-//            throws RemoteException {
-//        // TODO Auto-generated method stub
-//
-//    }
+    // @Override
+    // public void respGetPublicMenuInfoString(boolean arg0, String arg1)
+    // throws RemoteException {
+    // // TODO Auto-generated method stub
+    //
+    // }
 
     @Override
-    public void respGetUserSubscribePublicList(boolean arg0,
-            List<PublicAccounts> arg1) throws RemoteException {
+    public void respGetUserSubscribePublicList(boolean arg0, List<PublicAccounts> arg1)
+            throws RemoteException {
         // TODO Auto-generated method stub
 
     }
@@ -140,8 +137,7 @@
     }
 
     @Override
-    public void respSetAcceptStatus(boolean result, String uuid)
-            throws RemoteException {
+    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
index d88cdee..188e1b0 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -41,9 +42,10 @@
 
 public class PublicAccountApi extends ClientApi {
 
-    private static String  serviceName = "com.suntek.mway.rcs.app.service.pubacct.plugin.service.PublicAccountPluginService";
+    private static String serviceName = "com.suntek.mway.rcs.app.service.pubacct.plugin.service.PublicAccountPluginService";
 
     IPublicAccountAPI myApi;
+
     PublicAccountCallback theCallback;
 
     private ServiceConnection mConnection = new ServiceConnection() {
@@ -54,10 +56,11 @@
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
                 LogHelper.d("client api disconnect service...");
                 try {
-                    if (myApi != null && theCallback != null) myApi.unregisterCallback(theCallback);
+                    if (myApi != null && theCallback != null)
+                        myApi.unregisterCallback(theCallback);
                 } catch (Exception ex) {
                     // TODO Auto-generated catch block
                     LogHelper.e(ex.getMessage(), ex);
@@ -66,8 +69,7 @@
                 myApi = null;
                 notifyServiceDisconnected();
             } else {
-                LogHelper.d("illegal call client api disconnect service :"
-                        + reconnectionTimes);
+                LogHelper.d("illegal call client api disconnect service :" + reconnectionTimes);
                 init(context, rcsListener);
                 if (!isBinded()) {
                     // app is uninstalled
@@ -84,98 +86,110 @@
         super.initServiceConnect(mConnection);
     }
 
-
-    public void unregisterCallback(PublicAccountCallback callback)throws ServiceDisconnectedException {
+    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);
+            LogHelper.e(ex.getMessage(), ex);
         }
     }
 
-    public void getUserSubscribePublicList(PublicAccountCallback callback) throws ServiceDisconnectedException {
+    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;
-        }*/
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
     }
 
-    public void getPublicMenuInfo(String uuid,PublicAccountCallback callback) throws ServiceDisconnectedException {
+    public void getPublicMenuInfo(String uuid, PublicAccountCallback callback)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method getPublicMenuInfo. [uuid]=%s", uuid));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
     }
 
-    public void getPublicDetail(String uuid,PublicAccountCallback callback) throws ServiceDisconnectedException {
+    public void getPublicDetail(String uuid, PublicAccountCallback callback)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method getPublicDetail. [uuid]=%s", uuid));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
     }
 
-    public void addSubscribe(String uuid,PublicAccountCallback callback) throws ServiceDisconnectedException {
+    public void addSubscribe(String uuid, PublicAccountCallback callback)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method addSubscribe. [uuid]=%s", uuid));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
     }
 
-
-    public void cancelSubscribe(String uuid,PublicAccountCallback callback) throws ServiceDisconnectedException {
+    public void cancelSubscribe(String uuid, PublicAccountCallback callback)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
-        LogHelper.i(String.format( Locale.getDefault(),"enter method cancelSubscribe. [uuid]=%s", uuid));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
     }
 
-    public boolean complainPublic(String uuid,String reason, String description, int type, String data ,PublicAccountCallback callback) throws ServiceDisconnectedException {
+    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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return flag;
     }
 
-    public boolean getPreMessage(String uuid, String timestamp, int order, int pageSize, int pageNum,
-            PublicAccountCallback callback) throws ServiceDisconnectedException {
+    public boolean getPreMessage(String uuid, String timestamp, int order, int pageSize,
+            int pageNum, PublicAccountCallback callback) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         boolean flag = false;
         try {
@@ -183,7 +197,7 @@
             flag = myApi.getPreMessage(uuid, timestamp, order, pageSize, pageNum);
         } catch (Exception ex) {
             // TODO Auto-generated catch block
-            LogHelper.e(ex.getMessage(),ex);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return flag;
     }
@@ -191,40 +205,44 @@
     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));
+        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);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return flag;
     }
 
-    public PublicAccountsDetail getPublicDetailCache(String uuid) throws ServiceDisconnectedException {
+    public PublicAccountsDetail getPublicDetailCache(String uuid)
+            throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getPublicDetailCache(uuid);
         } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(),ex);
+            LogHelper.e(ex.getMessage(), ex);
             return null;
         }
     }
 
-    public List<PublicAccounts> getUserSubscribePublicListCache(int order, int pageSize, int pageNum) throws ServiceDisconnectedException {
+    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);
+            LogHelper.e(ex.getMessage(), ex);
             return null;
         }
     }
 
-    public boolean getRecommendPublic(int type, int pageSize, int pageNum, PublicAccountCallback callback)
-            throws ServiceDisconnectedException {
+    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");
@@ -236,7 +254,7 @@
             myApi.registerCallback(callback);
             flag = myApi.getRecommendPublic(type, pageSize, pageNum);
         } catch (Exception ex) {
-            LogHelper.e(ex.getMessage(),ex);
+            LogHelper.e(ex.getMessage(), ex);
         }
         return flag;
     }
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
index 072776c..c3313bf 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -34,7 +35,7 @@
 import com.suntek.mway.rcs.client.api.util.VerificationUtil;
 import com.suntek.mway.rcs.client.api.util.log.LogHelper;
 
-public class SpecialServiceNumApi extends ClientApi{
+public class SpecialServiceNumApi extends ClientApi {
 
     private static String serviceName = "com.suntek.mway.rcs.app.service.api.impl.specialnumber.SpecialServiceNumApiService";
 
@@ -48,7 +49,7 @@
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
                 LogHelper.d("ISpecialServiceNumApi api disconnect service");
                 myApi = null;
                 notifyServiceDisconnected();
@@ -73,57 +74,57 @@
 
     /**
      * Add special number.
-     *
+     * 
      * @param number the number
      */
-    public void add(String number)throws ServiceDisconnectedException {
+    public void add(String number) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         try {
             myApi.add(number);
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),e);
+            LogHelper.e(e.getMessage(), e);
         }
     }
 
     /**
      * Close function, Set status to close.
      */
-    public void closeFunction()throws ServiceDisconnectedException {
+    public void closeFunction() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         try {
             myApi.closeFunction();
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),e);
+            LogHelper.e(e.getMessage(), e);
         }
     }
 
     /**
      * Delete special number prefix.
-     *
+     * 
      * @param number the number
      * @return the string
      */
-    public String delSpecialPreNum(String telephone)throws ServiceDisconnectedException {
+    public String delSpecialPreNum(String telephone) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.delSpecialPreNum(telephone);
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),e);
+            LogHelper.e(e.getMessage(), e);
             return "";
         }
     }
 
     /**
      * Gets the list of special numbers.
-     *
+     * 
      * @return the list
      */
-    public List<String> getList()throws ServiceDisconnectedException {
+    public List<String> getList() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.getList();
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),e);
+            LogHelper.e(e.getMessage(), e);
             return null;
         }
     }
@@ -131,38 +132,38 @@
     /**
      * Open function, Set status to open.
      */
-    public void openFunction()throws ServiceDisconnectedException {
+    public void openFunction() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         try {
             myApi.openFunction();
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),e);
+            LogHelper.e(e.getMessage(), e);
         }
     }
 
     /**
      * Removes a special number.
-     *
+     * 
      * @param number the number
      */
-    public void remove(String number)throws ServiceDisconnectedException {
+    public void remove(String number) throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         try {
             myApi.remove(number);
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),e);
+            LogHelper.e(e.getMessage(), e);
         }
     }
 
     /**
      * Removes all special number.
      */
-    public void removeAll()throws ServiceDisconnectedException {
+    public void removeAll() throws ServiceDisconnectedException {
         VerificationUtil.ApiIsNull(myApi);
         try {
             myApi.removeAll();
         } catch (Exception e) {
-            LogHelper.e(e.getMessage(),e);
+            LogHelper.e(e.getMessage(), e);
         }
     }
 }
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/support/RcsSupportApi.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/support/RcsSupportApi.java
index 6f8a5c0..7d2345e 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/RcsSupportApi.java
@@ -20,6 +20,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.support;
 
 import com.suntek.mway.rcs.client.aidl.constant.BroadcastConstants;
@@ -35,6 +36,7 @@
 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;
@@ -42,9 +44,8 @@
 
 /**
  * Dynamically detect the installation status of RCS components during runtime.
- *
+ * 
  * @author lrb
- *
  */
 public class RcsSupportApi {
     /**
@@ -95,11 +96,20 @@
     public static final int PLUGIN_PLUGIN_CENTER = 6;
 
     private static final String TAG = "RCS_UI";
+
     private static final int DMS_VERSION_UNKNOWN = -999;
 
+    private static final int RCS_DISABLED = 0;
+
+    private static final int RCS_ENABLED = 1;
+
+    private static final String PROPERTY_NAME_RCS_ENABLED = "persist.sys.rcs.enabled";
+
+    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.
      */
@@ -109,7 +119,7 @@
 
     /**
      * Check that the RcsService module is been installed.
-     *
+     * 
      * @param context
      * @return true if RcsService module is installed.
      */
@@ -136,14 +146,14 @@
     }
 
     private RcsAccountApi mAccountApi;
+
     private Context mContext;
 
     private boolean mIsRcsServiceInstalled;
-    private boolean mIsSimAvailableForRcs;
 
     /**
      * Dynamically detect the supported plug-in.
-     *
+     * 
      * @param context
      * @return The plug-in list that is supported.
      */
@@ -187,13 +197,6 @@
         }.start();
     }
 
-    private BroadcastReceiver userStatusChangedReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            mIsSimAvailableForRcs = isSimAvailableForRcs();
-        }
-    };
-
     private void initRcsAccountApi() {
         mAccountApi.init(mContext, new RCSServiceListener() {
             @Override
@@ -204,29 +207,27 @@
             @Override
             public void onServiceConnected() throws RemoteException {
                 Log.d(TAG, "RcsAccountApi connected");
-                mIsSimAvailableForRcs = isSimAvailableForRcs();
-
-                IntentFilter filter = new IntentFilter(BroadcastConstants.ACTION_DMS_USER_STATUS_CHANGED);
-                mContext.registerReceiver(userStatusChangedReceiver, filter);
             }
         });
     }
 
     /**
-     * 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.
+     * 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.
      */
     public boolean isRcsSupported() {
-        return mIsRcsServiceInstalled && mIsSimAvailableForRcs;
-//        return true;
+        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.
+     * 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.
      */
@@ -249,11 +250,18 @@
 
     private int getDmVersion() {
         try {
-            RcsUserProfileInfo userProfile = mAccountApi.getRcsUserProfileInfo();
-            return Integer.valueOf(userProfile.getVersion());
+            int dmVersion = SystemProperties.getInt(PROPERTY_NAME_DM_VERSION, DMS_VERSION_UNKNOWN);
+            return dmVersion;
         } catch (Exception e) {
             Log.w(TAG, "Failed getting DM version. " + e.getMessage());
             return DMS_VERSION_UNKNOWN;
         }
     }
+
+    private boolean isRcsEnabled() {
+        int rcsEnabled = SystemProperties.getInt(PROPERTY_NAME_RCS_ENABLED, RCS_ENABLED);
+        boolean isRcsEnabled = RCS_ENABLED == rcsEnabled;
+        Log.d(TAG, "isRcsEnabled(): " + isRcsEnabled + ", rcsEnabled: " + rcsEnabled);
+        return isRcsEnabled;
+    }
 }
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileDurationException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileDurationException.java
index d898284..f6c55e1 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/util/FileDurationException.java
@@ -20,6 +20,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.util;
 
 public class FileDurationException extends Exception {
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileSuffixException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileSuffixException.java
index 6c8770f..0ebc25a 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/util/FileSuffixException.java
@@ -20,6 +20,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.util;
 
 public class FileSuffixException extends Exception {
diff --git a/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileTransferException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/FileTransferException.java
index 77407bc..9b1af80 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/util/FileTransferException.java
@@ -20,6 +20,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.util;
 
 public class FileTransferException extends Exception {
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
new file mode 100644
index 0000000..cc1e83e
--- /dev/null
+++ b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/OrderTimeAboutExpireException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014 pci-suntektech Technologies, Inc.  All Rights Reserved.
+ * pci-suntektech Technologies Proprietary and Confidential.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+package com.suntek.mway.rcs.client.api.util;
+
+public class 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/ServiceDisconnectedException.java b/rcs_service_api/src/com/suntek/mway/rcs/client/api/util/ServiceDisconnectedException.java
index 38c630e..711dc0d 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/util/ServiceDisconnectedException.java
@@ -20,6 +20,7 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.util;
 
 public class ServiceDisconnectedException extends Exception {
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 0e65079..8b94bc7 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
@@ -20,10 +20,12 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
+
 package com.suntek.mway.rcs.client.api.util;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import android.content.Context;
@@ -36,6 +38,7 @@
 
 public class VerificationUtil {
     private static final String SIP_PREFIX = "sip:";
+
     private static final String TEL_PREFIX = "tel:";
 
     public static void ApiIsNull(Object api) throws ServiceDisconnectedException {
@@ -48,8 +51,7 @@
         if (number == null) {
             return false;
         }
-        return VerificationUtil
-                .formatWithout86(VerificationUtil.getNumberFromUri(number))
+        return VerificationUtil.formatWithout86(VerificationUtil.getNumberFromUri(number))
                 .replaceAll(" ", "").replaceAll("-", "").matches("\\d+");
     }
 
@@ -70,8 +72,10 @@
     public static List<String> formatNumbers(List<String> numbers) {
         List<String> re = new ArrayList<String>();
         for (String number : numbers) {
-            re.add(formatNumber(number));
+            re.add(VerificationUtil.formatWithout86(VerificationUtil.getNumberFromUri(number))
+                    .replaceAll(" ", "").replaceAll("-", ""));
         }
+        Collections.sort(re);
         return re;
     }
 
@@ -82,28 +86,25 @@
 
     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 + "'");
+            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 + "'");
+            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 + "'");
+            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(
@@ -116,39 +117,33 @@
             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.");
+            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 {
+    public static void isAudioDurationToLong(Context context, String filename, long maxDuration,
+            int recordTime) throws FileDurationException {
         File file = new File(filename);
-        if (file.exists() && file.isFile()){
+        if (file.exists() && file.isFile()) {
             int duration = MediaUtils.getAmrFileDuration(context, file);
-            if(duration >= (maxDuration + 1) * 1000 || recordTime > maxDuration){
+            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.");
+                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 {
+    public static void isVedioDurationToLong(Context context, String filename, long maxDuration,
+            int recordTime) throws FileDurationException {
         File file = new File(filename);
-        if (file.exists() && file.isFile()){
+        if (file.exists() && file.isFile()) {
             int duration = MediaUtils.getVideoFileDuration(context, file);
-            if(duration >= (maxDuration + 1) * 1000 || recordTime > maxDuration){
+            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.");
+                throw new FileDurationException("File duration too long " + duration
+                        + " s. Max duration is " + maxDuration + " s.");
             }
         }
     }
@@ -156,8 +151,7 @@
     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);
+        return SettingUtils.getSetting(context, DMS_FT_MAX_SIZE, MediaConstants.FT_MAX_SIZE);
     }
 
     public static final String DMS_IMAGE_FT_MAX_SIZE = "imageFtMaxSize";
@@ -170,7 +164,8 @@
     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);
+        return SettingUtils.getSetting(context, DMS_VIDEO_FT_MAX_SIZE,
+                MediaConstants.VIDEO_FT_MAX_SIZE);
     }
 
     public static final String DMS_VIDEO_MAX_TIME = "videoMaxTime";
@@ -228,9 +223,14 @@
         }
 
         int pos = uriStr.indexOf("@");
-        if(pos != -1){
+        if (pos != -1) {
             uriStr = uriStr.substring(0, pos);
         }
         return uriStr;
     }
+
+    public static boolean isOrderTimeExpired(long orderTime) {
+        return orderTime > System.currentTimeMillis()
+                + SuntekMessageData.ORDER_TIME_EXPIRE_INTERVAL_SECOND * 1000;
+    }
 }
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
index 0f8a69f..b0795bb 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -32,11 +33,19 @@
 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>
- *
+ * <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
  */
@@ -58,7 +67,8 @@
     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";
+    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";
@@ -76,7 +86,7 @@
 
     /**
      * Log.
-     *
+     * 
      * @param str the str
      * @param level the level
      */
@@ -86,7 +96,7 @@
 
     /**
      * Log.
-     *
+     * 
      * @param str the str
      * @param level the level
      * @param throwable the throwable
@@ -94,14 +104,13 @@
     private static void log(String str, int level, Throwable throwable) {
         if (mIsDebugMode) {
             if (logLevel <= level) {
-                //Get the method name from the stackTrace.
+                // 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]);
+                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());
+                        traceElement.getClassName(), traceElement.getMethodName(),
+                        traceElement.getLineNumber(), traceElement.getFileName());
                 // ERROR, WARN, INFO, DEBUG, VERBOSE
                 String logTag = "";
                 if (level == Log.VERBOSE) {
@@ -125,13 +134,12 @@
                     logTag = "[ERROR]";
                 }
                 if (MYLOG_WRITE_TO_FILE
-                        && android.os.Environment.getExternalStorageState()
-                                .equals(android.os.Environment.MEDIA_MOUNTED)) {
+                        && android.os.Environment.getExternalStorageState().equals(
+                                android.os.Environment.MEDIA_MOUNTED)) {
                     if (throwable != null) {
                         str += "\n" + Log.getStackTraceString(throwable);
                     }
-                    writeLogtoFile(MYLOGFILEName, TAG + " " + logTag, logText
-                            + "->" + str);
+                    writeLogtoFile(MYLOGFILEName, TAG + " " + logTag, logText + "->" + str);
                 }
             }
 
@@ -140,7 +148,7 @@
 
     /**
      * Trace.
-     *
+     * 
      * @param str the str
      */
     public static void trace(String str) {
@@ -149,7 +157,7 @@
 
     /**
      * VERBOSE.
-     *
+     * 
      * @param str the str
      */
     public static void v(String str) {
@@ -158,7 +166,7 @@
 
     /**
      * DEBUG.
-     *
+     * 
      * @param str the str
      */
     public static void d(String str) {
@@ -167,7 +175,7 @@
 
     /**
      * WARN.
-     *
+     * 
      * @param str the str
      */
     public static void w(String str) {
@@ -176,7 +184,7 @@
 
     /**
      * INFO.
-     *
+     * 
      * @param str the str
      */
     public static void i(String str) {
@@ -185,7 +193,7 @@
 
     /**
      * ERROR.
-     *
+     * 
      * @param str the str
      */
     public static void e(String str) {
@@ -194,7 +202,7 @@
 
     /**
      * ERROR.
-     *
+     * 
      * @param str the str
      * @param throwable the throwable
      */
@@ -212,46 +220,48 @@
 
     /**
      * 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) {
+    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");
+        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.
+            // 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 {
+        } finally {
             try {
-                if(bufWriter!=null) bufWriter.close();
-            }catch(Exception ex) {}
+                if (bufWriter != null)
+                    bufWriter.close();
+            } catch (Exception ex) {
+            }
             try {
-                if(filerWriter!=null) filerWriter.close();
-            }catch(Exception ex) {}
+                if (filerWriter != null)
+                    filerWriter.close();
+            } catch (Exception ex) {
+            }
         }
     }
 
     /**
      * Prints the stack trace.
-     *
+     * 
      * @param throwable the throwable
      */
     public static void printStackTrace(Throwable 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
index daa2d01..a251fad 100644
--- 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
@@ -20,6 +20,7 @@
  * FROM, 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;
@@ -53,11 +54,11 @@
         public void onServiceConnected(ComponentName className, IBinder service) {
             myApi = IRichScreenApi.Stub.asInterface(service);
             notifyServiceConnected();
-            LogHelper.d("RichScreenApi have success connect, api="+myApi);
+            LogHelper.d("RichScreenApi have success connect, api=" + myApi);
         }
 
         public void onServiceDisconnected(ComponentName className) {
-            if(isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
+            if (isNormallyClosed || reconnectionTimes > MAX_RECONECTION_TIMES) {
                 LogHelper.d("IRichScreenApi api disconnect service");
                 myApi = null;
                 notifyServiceDisconnected();
@@ -82,48 +83,50 @@
 
     @Override
     public void init(Context context, RCSServiceListener listener) {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:init. [context]=%s", context.toString()));
+        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);
-//        }
+        //
+        // // 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
+     * 
+     * @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 {
+    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)) {
+            // 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);
+            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);
+            } else {
+                LogHelper.w("could not get the richScrnShowingObject about number:" + missdn
+                        + " at phone call event " + phoneEvent);
             }
         } catch (Exception ex) {
             // TODO Auto-generated catch block
@@ -134,23 +137,23 @@
 
     /**
      * Download rich screen object.
-     *
-     * @param missdn
-     *            the missdn
-     * @param phoneEvent
-     *            the phone event
+     * 
+     * @param missdn the missdn
+     * @param phoneEvent the phone event
      * @return the result info
      */
-    public boolean downloadRichScrnObj( String missdn, String phoneEvent ) {
+    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);
+            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);
+            } 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);
@@ -160,21 +163,22 @@
 
     /**
      * Clear rich screen local cache.
-     *
-     * @param phoneEvent
-     *            the phone event
+     * 
+     * @param phoneEvent the phone event
      * @return the result info
      */
-    public boolean clearRichScrnLocalCache( String phoneEvent ) throws ServiceDisconnectedException {
+    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);
+            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);
+            } 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);
@@ -182,8 +186,10 @@
         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));
+    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);
@@ -193,8 +199,10 @@
         return null;
     }
 
-    public ResultInfo downloadHomeLocRules(final String phoneEvent) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:downloadHomeLocRules. [phoneEvent]=%s", phoneEvent));
+    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);
@@ -205,7 +213,8 @@
     }
 
     public ResultInfo init(int cacheSize) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:init. [cacheSize]=%d", cacheSize));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:init. [cacheSize]=%d",
+                cacheSize));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.init(cacheSize);
@@ -216,7 +225,7 @@
     }
 
     public ResultInfo richScrnCMCCSSOLogin() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:richScrnCMCCSSOLogin. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:richScrnCMCCSSOLogin. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.richScrnCMCCSSOLogin();
@@ -227,7 +236,7 @@
     }
 
     public ResultInfo richScrnChangeNetWork() throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:richScrnChangeNetWork. "));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:richScrnChangeNetWork. "));
         VerificationUtil.ApiIsNull(myApi);
         try {
             return myApi.richScrnChangeNetWork();
@@ -238,7 +247,8 @@
     }
 
     public void startSiteApk(ArrayList<String> mobile) throws ServiceDisconnectedException {
-        LogHelper.i(String.format( Locale.getDefault(),"enter method:startSiteApk. [mobile]=%s", mobile));
+        LogHelper.i(String.format(Locale.getDefault(), "enter method:startSiteApk. [mobile]=%s",
+                mobile));
         VerificationUtil.ApiIsNull(myApi);
         try {
             PhoneList phoneList = new PhoneList();
@@ -251,23 +261,86 @@
 
     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)
+        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
+        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;
