ImpsPresenceUtils.java
上传用户:szyujian
上传日期:2016-09-20
资源大小:320k
文件大小:9k
源码类别:

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2008 Esmertec AG.
  3.  * Copyright (C) 2008 The Android Open Source Project
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package com.android.im.imps;
  18. import com.android.im.engine.Presence;
  19. import org.apache.commons.codec.binary.Base64;
  20. import android.os.Base64Utils;
  21. import java.util.ArrayList;
  22. import java.util.Arrays;
  23. import java.util.HashMap;
  24. import java.util.Map;
  25. /**
  26.  * A helper class used to extract presence values from the primitive received
  27.  * from the server and create the primitive for updating the presence.
  28.  */
  29. public class ImpsPresenceUtils {
  30.     private ImpsPresenceUtils() {
  31.     }
  32.     /**
  33.      * Extract the <code>Presence</code> from the <code>PrimitiveElement</code>
  34.      * which contains the <code>PresenceSubList</code>.
  35.      *
  36.      * @param presenceListElem the <code>PrimitiveElement</code>
  37.      * @return A new <code>Presence</code> containing the info extracted from the
  38.      *          <code>PrimitiveElement</code>
  39.      */
  40.     public static Presence extractPresence(PrimitiveElement presenceListElem,
  41.             PresenceMapping mapping){
  42.         int status = extractPresenceStatus(presenceListElem, mapping);
  43.         String statusText = extractStatusText(presenceListElem);
  44.         byte[] avatarData = extractAvatarBytes(presenceListElem);
  45.         String avatarType = extractAvatarType(presenceListElem);
  46.         int clientType = Presence.CLIENT_TYPE_DEFAULT;
  47.         HashMap<String, String> clientInfo = extractClientInfo(presenceListElem);
  48.         if (ImpsConstants.PRESENCE_MOBILE_PHONE.equals(clientInfo.get(ImpsTags.ClientType))) {
  49.             clientType = Presence.CLIENT_TYPE_MOBILE;
  50.         }
  51.         return new Presence(status, statusText, avatarData, avatarType, clientType);
  52.     }
  53.     /**
  54.      * Builds a list of PrimitiveElement need be sent to the server to update
  55.      * the user's presence.
  56.      *
  57.      * @param oldPresence
  58.      * @param newPresence
  59.      * @return
  60.      */
  61.     public static ArrayList<PrimitiveElement> buildUpdatePresenceElems(
  62.             Presence oldPresence, Presence newPresence, PresenceMapping mapping) {
  63.         int status = newPresence.getStatus();
  64.         ArrayList<PrimitiveElement> elems = new ArrayList<PrimitiveElement>();
  65.         boolean newOnlineStatus = mapping.getOnlineStatus(status);
  66.         PrimitiveElement onlineElem = new PrimitiveElement(ImpsTags.OnlineStatus);
  67.         onlineElem.addChild(ImpsTags.Qualifier, true);
  68.         onlineElem.addChild(ImpsTags.PresenceValue, newOnlineStatus);
  69.         elems.add(onlineElem);
  70.         String newUserAvailablity = mapping.getUserAvaibility(status);
  71.         PrimitiveElement availElem = new PrimitiveElement(ImpsTags.UserAvailability);
  72.         availElem.addChild(ImpsTags.Qualifier, true);
  73.         availElem.addChild(ImpsTags.PresenceValue, newUserAvailablity);
  74.         elems.add(availElem);
  75.         Map<String, Object> extra = mapping.getExtra(status);
  76.         if (extra != null) {
  77.             mapToPrimitives(extra, elems);
  78.         }
  79.         String statusText = newPresence.getStatusText();
  80.         if (statusText == null) {
  81.             statusText = "";
  82.         }
  83.         if (!statusText.equals(oldPresence.getStatusText())) {
  84.             PrimitiveElement statusElem = new PrimitiveElement(ImpsTags.StatusText);
  85.             statusElem.addChild(ImpsTags.Qualifier, true);
  86.             statusElem.addChild(ImpsTags.PresenceValue, statusText);
  87.             elems.add(statusElem);
  88.         }
  89.         byte[] avatar = newPresence.getAvatarData();
  90.         if (avatar != null && !Arrays.equals(avatar, oldPresence.getAvatarData())) {
  91.             String base64Avatar = new String(Base64.encodeBase64(avatar));
  92.             PrimitiveElement statusContent = new PrimitiveElement(ImpsTags.StatusContent);
  93.             statusContent.addChild(ImpsTags.Qualifier, true);
  94.             statusContent.addChild(ImpsTags.DirectContent, base64Avatar);
  95.             statusContent.addChild(ImpsTags.ContentType, newPresence.getAvatarType());
  96.             elems.add(statusContent);
  97.         }
  98.         return elems;
  99.     }
  100.     private static int extractPresenceStatus(PrimitiveElement presenceListElem,
  101.             PresenceMapping mapping) {
  102.         PrimitiveElement onlineStatusElem = presenceListElem.getChild(ImpsTags.OnlineStatus);
  103.         boolean onlineStatus = ImpsUtils.isQualifiedPresence(onlineStatusElem)
  104.             && ImpsUtils.isTrue(onlineStatusElem.getChildContents(ImpsTags.PresenceValue));
  105.         PrimitiveElement availabilityElem = presenceListElem.getChild(ImpsTags.UserAvailability);
  106.         String userAvailability = ImpsUtils.isQualifiedPresence(availabilityElem) ?
  107.                 availabilityElem.getChildContents(ImpsTags.PresenceValue) : null;
  108.         HashMap<String, Object> all = null;
  109.         if (mapping.requireAllPresenceValues()) {
  110.             all = new HashMap<String, Object>();
  111.             primitivetoMap(presenceListElem, all);
  112.         }
  113.         return mapping.getPresenceStatus(onlineStatus, userAvailability, all);
  114.     }
  115.     private static void primitivetoMap(PrimitiveElement elem, HashMap<String, Object> map) {
  116.         String key = elem.getTagName();
  117.         int childrenCount = elem.getChildCount();
  118.         if (childrenCount > 0) {
  119.             HashMap<String, Object> childrenMap = new HashMap<String, Object>();
  120.             for (PrimitiveElement child : elem.getChildren()) {
  121.                 primitivetoMap(child, childrenMap);
  122.             }
  123.             map.put(key, childrenMap);
  124.         } else {
  125.             map.put(key, elem.getContents());
  126.         }
  127.     }
  128.     private static void mapToPrimitives(Map<String, Object> map, ArrayList<PrimitiveElement> elems) {
  129.         for (Map.Entry<String, Object> entry : map.entrySet()) {
  130.             String tag = entry.getKey();
  131.             Object value = entry.getValue();
  132.             PrimitiveElement elem = new PrimitiveElement(tag);
  133.             if (value instanceof String) {
  134.                 elem.setContents((String)value);
  135.             } else if (value instanceof Map) {
  136.                 mapToPrimitives((Map)value, elem.getChildren());
  137.             }
  138.             elems.add(elem);
  139.         }
  140.     }
  141.     private static HashMap<String, String> extractClientInfo(PrimitiveElement presenceListElem) {
  142.         HashMap<String, String> clientInfo = new HashMap<String, String>();
  143.         PrimitiveElement clientInfoElem = presenceListElem.getChild(ImpsTags.ClientInfo);
  144.         if (ImpsUtils.isQualifiedPresence(clientInfoElem)) {
  145.             String clientType = clientInfoElem.getChildContents(ImpsTags.ClientType);
  146.             if (clientType != null) {
  147.                 clientInfo.put(ImpsTags.ClientType, clientType);
  148.             }
  149.             String clientProducer = clientInfoElem.getChildContents(ImpsTags.ClientProducer);
  150.             if (clientProducer != null) {
  151.                 clientInfo.put(ImpsTags.ClientProducer, clientProducer);
  152.             }
  153.             String clientVersion = clientInfoElem.getChildContents(ImpsTags.ClientVersion);
  154.             if (clientVersion != null) {
  155.                 clientInfo.put(ImpsTags.ClientVersion, clientVersion);
  156.             }
  157.         }
  158.         return clientInfo;
  159.     }
  160.     private static String extractStatusText(PrimitiveElement presenceListElem) {
  161.         String statusText = null;
  162.         PrimitiveElement statusTextElem = presenceListElem.getChild(ImpsTags.StatusText);
  163.         if (ImpsUtils.isQualifiedPresence(statusTextElem)) {
  164.             statusText = statusTextElem.getChildContents(ImpsTags.PresenceValue);
  165.         }
  166.         return statusText;
  167.     }
  168.     private static byte[] extractAvatarBytes(PrimitiveElement presenceListElem) {
  169.         PrimitiveElement statusContentElem = presenceListElem.getChild(ImpsTags.StatusContent);
  170.         if(ImpsUtils.isQualifiedPresence(statusContentElem)) {
  171.             String avatarStr = statusContentElem.getChildContents(ImpsTags.DirectContent);
  172.             if(avatarStr != null){
  173.                 return Base64Utils.decodeBase64(avatarStr);
  174.             }
  175.         }
  176.         return null;
  177.     }
  178.     private static String extractAvatarType(PrimitiveElement presenceListElem) {
  179.         PrimitiveElement statusContentElem = presenceListElem.getChild(ImpsTags.StatusContent);
  180.         if(ImpsUtils.isQualifiedPresence(statusContentElem)) {
  181.             return statusContentElem.getChildContents(ImpsTags.ContentType);
  182.         }
  183.         return null;
  184.     }
  185. }