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

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2007-2008 Esmertec AG.
  3.  * Copyright (C) 2007-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.service;
  18. import java.util.ArrayList;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import android.os.RemoteException;
  22. import com.android.im.IChatSession;
  23. import com.android.im.IChatSessionListener;
  24. import com.android.im.IChatSessionManager;
  25. import com.android.im.engine.Address;
  26. import com.android.im.engine.ChatGroup;
  27. import com.android.im.engine.ChatGroupManager;
  28. import com.android.im.engine.ChatSession;
  29. import com.android.im.engine.ChatSessionListener;
  30. import com.android.im.engine.ChatSessionManager;
  31. import com.android.im.engine.Contact;
  32. import com.android.im.engine.GroupListener;
  33. import com.android.im.engine.ImConnection;
  34. import com.android.im.engine.ImErrorInfo;
  35. public class ChatSessionManagerAdapter extends IChatSessionManager.Stub {
  36.     static final String TAG = RemoteImService.TAG;
  37.     ImConnectionAdapter mConnection;
  38.     ChatSessionManager mSessionManager;
  39.     ChatGroupManager mGroupManager;
  40.     HashMap<String, ChatSessionAdapter> mActiveSessions;
  41.     ChatSessionListenerAdapter mSessionListenerAdapter;
  42.     public ChatSessionManagerAdapter(ImConnectionAdapter connection) {
  43.         mConnection = connection;
  44.         ImConnection connAdaptee = connection.getAdaptee();
  45.         mSessionManager = connAdaptee.getChatSessionManager();
  46.         mActiveSessions = new HashMap<String, ChatSessionAdapter>();
  47.         mSessionListenerAdapter = new ChatSessionListenerAdapter();
  48.         mSessionManager.addChatSessionListener(mSessionListenerAdapter);
  49.         if((connAdaptee.getCapability() & ImConnection.CAPABILITY_GROUP_CHAT) != 0) {
  50.             mGroupManager = connAdaptee.getChatGroupManager();
  51.             mGroupManager.addGroupListener(new ChatGroupListenerAdpater());
  52.         }
  53.     }
  54.     public IChatSession createChatSession(String contactAddress) {
  55.         ContactListManagerAdapter listManager =
  56.             (ContactListManagerAdapter) mConnection.getContactListManager();
  57.         Contact contact = listManager.getContactByAddress(contactAddress);
  58.         if(contact == null) {
  59.             try {
  60.                 contact = listManager.createTemporaryContact(contactAddress);
  61.             } catch (IllegalArgumentException e) {
  62.                 mSessionListenerAdapter.notifyChatSessionCreateFailed(contactAddress,
  63.                         new ImErrorInfo(ImErrorInfo.ILLEGAL_CONTACT_ADDRESS,
  64.                                 "Invalid contact address:" + contactAddress));
  65.                 return null;
  66.             }
  67.         }
  68.         ChatSession session = mSessionManager.createChatSession(contact);
  69.         return getChatSessionAdapter(session);
  70.     }
  71.     public void closeChatSession(ChatSessionAdapter adapter) {
  72.         synchronized (mActiveSessions) {
  73.             ChatSession session = adapter.getAdaptee();
  74.             mSessionManager.closeChatSession(session);
  75.             mActiveSessions.remove(adapter.getAddress());
  76.         }
  77.     }
  78.     public void closeAllChatSessions() {
  79.         synchronized (mActiveSessions) {
  80.             ArrayList<ChatSessionAdapter> sessions =
  81.                 new ArrayList<ChatSessionAdapter>(mActiveSessions.values());
  82.             for (ChatSessionAdapter ses : sessions) {
  83.                 ses.leave();
  84.             }
  85.         }
  86.     }
  87.     public void updateChatSession(String oldAddress, ChatSessionAdapter adapter) {
  88.         synchronized (mActiveSessions) {
  89.             mActiveSessions.remove(oldAddress);
  90.             mActiveSessions.put(adapter.getAddress(), adapter);
  91.         }
  92.     }
  93.     public IChatSession getChatSession(String address) {
  94.         synchronized (mActiveSessions) {
  95.             return mActiveSessions.get(address);
  96.         }
  97.     }
  98.     public List getActiveChatSessions() {
  99.         synchronized (mActiveSessions) {
  100.             return new ArrayList<ChatSessionAdapter>(mActiveSessions.values());
  101.         }
  102.     }
  103.     public int getChatSessionCount() {
  104.         synchronized (mActiveSessions) {
  105.             return mActiveSessions.size();
  106.         }
  107.     }
  108.     public void registerChatSessionListener(IChatSessionListener listener) {
  109.         if (listener != null) {
  110.             mSessionListenerAdapter.addRemoteListener(listener);
  111.         }
  112.     }
  113.     public void unregisterChatSessionListener(IChatSessionListener listener) {
  114.         mSessionListenerAdapter.removeRemoteListener(listener);
  115.     }
  116.     ChatSessionAdapter getChatSessionAdapter(ChatSession session) {
  117.         synchronized (mActiveSessions) {
  118.             Address participantAddress = session.getParticipant().getAddress();
  119.             String key = participantAddress.getFullName();
  120.             ChatSessionAdapter adapter = mActiveSessions.get(key);
  121.             if (adapter == null) {
  122.                 adapter = new ChatSessionAdapter(session, mConnection);
  123.                 mActiveSessions.put(key, adapter);
  124.             }
  125.             return adapter;
  126.         }
  127.     }
  128.     class ChatSessionListenerAdapter
  129.             extends RemoteListenerManager<IChatSessionListener>
  130.             implements ChatSessionListener {
  131.         public void onChatSessionCreated(ChatSession session) {
  132.             final IChatSession sessionAdapter = getChatSessionAdapter(session);
  133.             notifyRemoteListeners(new ListenerInvocation<IChatSessionListener>() {
  134.                 public void invoke(IChatSessionListener remoteListener)
  135.                         throws RemoteException {
  136.                     remoteListener.onChatSessionCreated(sessionAdapter);
  137.                 }
  138.             });
  139.         }
  140.         public void notifyChatSessionCreateFailed(final String name, final ImErrorInfo error) {
  141.             notifyRemoteListeners(new ListenerInvocation<IChatSessionListener>() {
  142.                 public void invoke(IChatSessionListener remoteListener)
  143.                         throws RemoteException {
  144.                     remoteListener.onChatSessionCreateError(name, error);
  145.                 }
  146.             });
  147.         }
  148.     }
  149.     class ChatGroupListenerAdpater implements GroupListener {
  150.         public void onGroupCreated(ChatGroup group) {
  151.         }
  152.         public void onGroupDeleted(ChatGroup group) {
  153.             closeSession(group);
  154.         }
  155.         public void onGroupError(int errorType, String name, ImErrorInfo error) {
  156.             if(errorType == ERROR_CREATING_GROUP) {
  157.                 mSessionListenerAdapter.notifyChatSessionCreateFailed(name, error);
  158.             }
  159.         }
  160.         public void onJoinedGroup(ChatGroup group) {
  161.             mSessionManager.createChatSession(group);
  162.         }
  163.         public void onLeftGroup(ChatGroup group) {
  164.             closeSession(group);
  165.         }
  166.         private void closeSession(ChatGroup group) {
  167.             String address = group.getAddress().getFullName();
  168.             IChatSession session = getChatSession(address);
  169.             if(session != null) {
  170.                 closeChatSession((ChatSessionAdapter) session);
  171.             }
  172.         }
  173.     }
  174. }