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

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2007 Esmertec AG.
  3.  * Copyright (C) 2007 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.engine;
  18. import java.util.ArrayList;
  19. import java.util.HashMap;
  20. import java.util.concurrent.CopyOnWriteArrayList;
  21. /**
  22.  * ChatGroupManager manages the creating, removing and the member of ChatGroups.
  23.  */
  24. public abstract class ChatGroupManager {
  25.     protected HashMap<Address, ChatGroup> mGroups;
  26.     protected HashMap<String, Invitation> mInvitations;
  27.     protected CopyOnWriteArrayList<GroupListener> mGroupListeners;
  28.     protected InvitationListener mInvitationListener;
  29.     protected ChatGroupManager() {
  30.         mGroups = new HashMap<Address, ChatGroup>();
  31.         mInvitations = new HashMap<String, Invitation>();
  32.         mGroupListeners = new CopyOnWriteArrayList<GroupListener>();
  33.     }
  34.     /**
  35.      * Adds a GroupListener to this manager so that it will be notified when a
  36.      * certain group changes.
  37.      *
  38.      * @param listener the listener to be notified.
  39.      */
  40.     public void addGroupListener(GroupListener listener) {
  41.         mGroupListeners.add(listener);
  42.     }
  43.     /**
  44.      * Removes a GroupListener from this manager so that it won't be notified
  45.      * any more.
  46.      *
  47.      * @param listener the listener to remove.
  48.      */
  49.     public void removeGroupListener(GroupListener listener) {
  50.         mGroupListeners.remove(listener);
  51.     }
  52.     /**
  53.      * Sets the InvitationListener to the manager so that it will be notified
  54.      * when an invitation from another users received.
  55.      *
  56.      * @param listener the InvitationListener.
  57.      */
  58.     public synchronized void setInvitationListener(InvitationListener listener) {
  59.         mInvitationListener = listener;
  60.     }
  61.     /**
  62.      * Creates a new ChatGroup with specified name. This method returns
  63.      * immediately and the registered GroupListeners will be notified when the
  64.      * group is created or any error occurs. The newly created group is a
  65.      * temporary group and will be automatically deleted when all joined users
  66.      * have left.
  67.      *
  68.      * @param name the name of the ChatGroup to be created.
  69.      */
  70.     public abstract void createChatGroupAsync(String name);
  71.     /**
  72.      * Deletes a certain ChatGroup. This method returns immediately and the
  73.      * registered GroupListeners will be notified when the group is deleted or
  74.      * any error occurs. Only the administrator of the ChatGroup can delete it.
  75.      *
  76.      * @param group the ChatGroup to be deleted.
  77.      */
  78.     public abstract void deleteChatGroupAsync(ChatGroup group);
  79.     /**
  80.      * Adds a member to a certain ChatGroup. This method returns immediately and
  81.      * the GroupGroupListeners registered on the group will be notified when the
  82.      * member is added or any error occurs. Only the administrator of the
  83.      * ChatGroup can add member to it.
  84.      *
  85.      * @param group the ChatGroup to which the member will add.
  86.      * @param contact the member to add.
  87.      */
  88.     protected abstract void addGroupMemberAsync(ChatGroup group, Contact contact);
  89.     /**
  90.      * Removes a member from certain ChatGroup. This method returns immediately
  91.      * and the GroupGroupListeners registered on the group will be notified when
  92.      * the member is added or any error occurs. Only the administrator of the
  93.      * ChatGroup can remove its members.
  94.      *
  95.      * @param group the ChatGroup whose member will be removed.
  96.      * @param contact the member to be removed.
  97.      */
  98.     protected abstract void removeGroupMemberAsync(ChatGroup group, Contact contact);
  99.     /**
  100.      * Joins into a certain ChatGroup. This method returns immediately and the
  101.      * registered GroupListeners will be notified when the user joined into the
  102.      * group or any error occurs.
  103.      *
  104.      * @param address the address of the ChatGroup.
  105.      */
  106.     public abstract void joinChatGroupAsync(Address address);
  107.     /**
  108.      * Leaves a certain ChatGroup.This method returns immediately and the
  109.      * registered GroupListeners will be notified when the the user left the
  110.      * group or any error occurs.
  111.      *
  112.      * @param group the ChatGroup.
  113.      */
  114.     public abstract void leaveChatGroupAsync(ChatGroup group);
  115.     /**
  116.      * Invites a user to join a certain ChatGroup. If success, the invitee will
  117.      * receive an invitation with information of the group. Otherwise, the
  118.      * registered GroupListeners will be notified if any error occurs.
  119.      *
  120.      * @param group the ChatGroup.
  121.      * @param invitee the invitee.
  122.      */
  123.     public abstract void inviteUserAsync(ChatGroup group, Contact invitee);
  124.     /**
  125.      * Accepts an invitation. The user will join the group automatically after
  126.      * accept the invitation.
  127.      *
  128.      * @param invitation the invitation to accept.
  129.      */
  130.     public abstract void acceptInvitationAsync(Invitation invitation);
  131.     /**
  132.      * Accepts an invitation. The user can only accept or reject the same
  133.      * invitation only once.
  134.      *
  135.      * @param inviteId the id of the invitation to accept.
  136.      * @see #acceptInvitationAsync(Invitation)
  137.      */
  138.     public void acceptInvitationAsync(String inviteId) {
  139.         Invitation invitation = mInvitations.remove(inviteId);
  140.         if (invitation != null) {
  141.             acceptInvitationAsync(invitation);
  142.         }
  143.     }
  144.     /**
  145.      * Rejects an invitation.
  146.      *
  147.      * @param inviteId the id of the invitation to reject.
  148.      * @see #rejectInvitationAsync(Invitation)
  149.      */
  150.     public void rejectInvitationAsync(String inviteId) {
  151.         Invitation invitation = mInvitations.remove(inviteId);
  152.         if (invitation != null) {
  153.             rejectInvitationAsync(invitation);
  154.         }
  155.     }
  156.     /**
  157.      * Rejects an invitation.
  158.      *
  159.      * @param invitation the invitation to reject.
  160.      */
  161.     public abstract void rejectInvitationAsync(Invitation invitation);
  162.     /**
  163.      * Gets a ChatGroup by address.
  164.      *
  165.      * @param address the address of the ChatGroup.
  166.      * @return a ChatGroup.
  167.      */
  168.     public ChatGroup getChatGroup(Address address) {
  169.         return mGroups.get(address);
  170.     }
  171.     /**
  172.      * Notifies the GroupListeners that a ChatGroup has changed.
  173.      *
  174.      * @param groupAddress the address of group which has changed.
  175.      * @param joined a list of users that have joined the group.
  176.      * @param left a list of users that have left the group.
  177.      */
  178.     protected void notifyGroupChanged(Address groupAddress, ArrayList<Contact> joined,
  179.             ArrayList<Contact> left) {
  180.         ChatGroup group = mGroups.get(groupAddress);
  181.         if (group == null) {
  182.             group = new ChatGroup(groupAddress, groupAddress.getScreenName(), this);
  183.             mGroups.put(groupAddress, group);
  184.         }
  185.         if (joined != null) {
  186.             for (Contact contact : joined) {
  187.                 notifyMemberJoined(group, contact);
  188.             }
  189.         }
  190.         if (left != null) {
  191.             for (Contact contact : left) {
  192.                 notifyMemberLeft(group, contact);
  193.             }
  194.         }
  195.     }
  196.     protected synchronized void notifyGroupCreated(ChatGroup group) {
  197.         mGroups.put(group.getAddress(), group);
  198.         for (GroupListener listener : mGroupListeners) {
  199.             listener.onGroupCreated(group);
  200.         }
  201.     }
  202.     protected synchronized void notifyGroupDeleted(ChatGroup group) {
  203.         mGroups.remove(group.getAddress());
  204.         for (GroupListener listener : mGroupListeners) {
  205.             listener.onGroupDeleted(group);
  206.         }
  207.     }
  208.     protected synchronized void notifyJoinedGroup(ChatGroup group) {
  209.         mGroups.put(group.getAddress(), group);
  210.         for (GroupListener listener : mGroupListeners) {
  211.             listener.onJoinedGroup(group);
  212.         }
  213.     }
  214.     /**
  215.      * Notifies the GroupListeners that the user has left a certain group.
  216.      *
  217.      * @param groupAddress the address of the group.
  218.      */
  219.     protected synchronized void notifyLeftGroup(ChatGroup group) {
  220.         mGroups.remove(group.getAddress());
  221.         for (GroupListener listener : mGroupListeners) {
  222.             listener.onLeftGroup(group);
  223.         }
  224.     }
  225.     protected synchronized void notifyGroupError(int errorType, String groupName, ImErrorInfo error) {
  226.         for (GroupListener listener : mGroupListeners) {
  227.             listener.onGroupError(errorType, groupName, error);
  228.         }
  229.     }
  230.     /**
  231.      * Notifies the InvitationListener that another user invited the current
  232.      * logged user to join a group chat.
  233.      */
  234.     protected synchronized void notifyGroupInvitation(Invitation invitation) {
  235.         mInvitations.put(invitation.getInviteID(), invitation);
  236.         if (mInvitationListener != null) {
  237.             mInvitationListener.onGroupInvitation(invitation);
  238.         }
  239.     }
  240.     /**
  241.      * Notifies that a contact has joined into this group.
  242.      *
  243.      * @param group the group into which the contact has joined.
  244.      * @param contact the contact who has joined into the group.
  245.      */
  246.     protected void notifyMemberJoined(ChatGroup group, Contact contact) {
  247.         group.notifyMemberJoined(contact);
  248.     }
  249.     /**
  250.      * Notifies that a contact has left this group.
  251.      *
  252.      * @param group the group which the contact has left.
  253.      * @param contact the contact who has left this group.
  254.      */
  255.     protected void notifyMemberLeft(ChatGroup group, Contact contact) {
  256.         group.notifyMemberLeft(contact);
  257.     }
  258.     /**
  259.      * Notifies that previous operation on this group has failed.
  260.      *
  261.      * @param error the error information.
  262.      */
  263.     protected void notifyGroupMemberError(ChatGroup group, ImErrorInfo error) {
  264.         group.notifyGroupMemberError(error);
  265.     }
  266. }