• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 package com.android.im.engine;
19 
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.Vector;
23 import java.util.concurrent.CopyOnWriteArrayList;
24 
25 import android.util.Log;
26 
27 /**
28  * A ChatSession represents a conversation between two users. A ChatSession has
29  * a unique participant which is either another user or a group.
30  */
31 public class ChatSession {
32     private ImEntity mParticipant;
33     private ChatSessionManager mManager;
34     private CopyOnWriteArrayList<MessageListener> mListeners;
35     private Vector<Message> mHistoryMessages;
36 
37     /**
38      * Creates a new ChatSession with a particular participant.
39      *
40      * @param participant the participant with who the user communicates.
41      * @param connection the underlying network connection.
42      */
ChatSession(ImEntity participant, ChatSessionManager manager)43     ChatSession(ImEntity participant, ChatSessionManager manager) {
44         mParticipant = participant;
45         mManager = manager;
46         mListeners = new CopyOnWriteArrayList<MessageListener>();
47         mHistoryMessages = new Vector<Message>();
48     }
49 
getParticipant()50     public ImEntity getParticipant() {
51         return mParticipant;
52     }
53 
setParticipant(ImEntity participant)54     public void setParticipant(ImEntity participant) {
55         mParticipant = participant;
56     }
57 
58     /**
59      * Adds a MessageListener so that it can be notified of any new message in
60      * this session.
61      *
62      * @param listener
63      */
addMessageListener(MessageListener listener)64     public synchronized void addMessageListener(MessageListener listener) {
65         if ((listener != null) && !mListeners.contains(listener)) {
66             mListeners.add(listener);
67         }
68     }
69 
70     /**
71      * Removes a listener from this session.
72      *
73      * @param listener
74      */
removeMessageListener(MessageListener listener)75     public synchronized void removeMessageListener(MessageListener listener) {
76         mListeners.remove(listener);
77     }
78 
79     /**
80      * Sends a text message to other participant(s) in this session
81      * asynchronously.
82      * TODO: more docs on async callbacks.
83      *
84      * @param text the text to send.
85      */
sendMessageAsync(String text)86     public void sendMessageAsync(String text) {
87         Message message = new Message(text);
88         sendMessageAsync(message);
89     }
90 
91     /**
92      * Sends a message to other participant(s) in this session asynchronously.
93      * TODO: more docs on async callbacks.
94      *
95      * @param msg the message to send.
96      */
sendMessageAsync(Message msg)97     public void sendMessageAsync(Message msg) {
98         msg.setTo(mParticipant.getAddress());
99 
100         mHistoryMessages.add(msg);
101         mManager.sendMessageAsync(this, msg);
102     }
103 
104     /**
105      * Called by ChatSessionManager when received a message of the ChatSession.
106      * All the listeners registered in this session will be notified.
107      *
108      * @param msg the received message.
109      */
onReceiveMessage(Message msg)110     public void onReceiveMessage(Message msg) {
111         mHistoryMessages.add(msg);
112 
113         for (MessageListener listener : mListeners) {
114             listener.onIncomingMessage(this, msg);
115         }
116     }
117 
118     /**
119      * Called by ChatSessionManager when an error occurs to send a message.
120      * @param message
121      *
122      * @param error the error information.
123      */
onSendMessageError(Message message, ImErrorInfo error)124     public void onSendMessageError(Message message, ImErrorInfo error) {
125         for (MessageListener listener : mListeners) {
126             listener.onSendMessageError(this, message, error);
127         }
128     }
129 
onSendMessageError(String msgId, ImErrorInfo error)130     public void onSendMessageError(String msgId, ImErrorInfo error) {
131         for(Message msg : mHistoryMessages){
132             if(msgId.equals(msg.getID())){
133                 onSendMessageError(msg, error);
134                 return;
135             }
136         }
137         Log.i("ChatSession", "Message has been removed when we get delivery error:"
138                 + error);
139     }
140 
141     /**
142      * Returns a unmodifiable list of the history messages in this session.
143      *
144      * @return a unmodifiable list of the history messages in this session.
145      */
getHistoryMessages()146     public List<Message> getHistoryMessages() {
147         return Collections.unmodifiableList(mHistoryMessages);
148     }
149 }
150