src/com/beem/project/beem/service/BeemChatManager.java
author Da Risk <darisk972@gmail.com>
Mon, 06 Apr 2009 21:52:03 +0200
changeset 75 b2500e2392f7
parent 55 66732dd2cb77
child 96 e0eabd2266fe
permissions -rw-r--r--
complete chat manager
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
     1
/**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
     2
 * 
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
     3
 */
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
     4
package com.beem.project.beem.service;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
     5
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
     6
import java.util.HashMap;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
     7
import java.util.Map;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
     8
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
     9
import org.jivesoftware.smack.Chat;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    10
import org.jivesoftware.smack.ChatManager;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    11
import org.jivesoftware.smack.ChatManagerListener;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    12
import org.jivesoftware.smack.MessageListener;
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    13
import org.jivesoftware.smack.packet.Message;
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    14
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    15
import android.os.RemoteCallbackList;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    16
import android.os.RemoteException;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    17
import android.util.Log;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    18
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    19
import com.beem.project.beem.service.aidl.IChat;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    20
import com.beem.project.beem.service.aidl.IChatManager;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    21
import com.beem.project.beem.service.aidl.IChatManagerListener;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    22
import com.beem.project.beem.service.aidl.IMessageListener;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    23
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    24
/**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    25
 * An adapter for smack's ChatManager. This class provides functionnality to handle chats.
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    26
 * @author darisk
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    27
 */
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    28
public class BeemChatManager extends IChatManager.Stub {
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    29
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    30
    /**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    31
     * Tag to use with log methods.
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    32
     */
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    33
    public static final String TAG = "BeemChatManager";
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    34
    private ChatManager mAdaptee;
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    35
    private Map<String, IChat> mChats = new HashMap<String, IChat>();
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    36
    private ChatListener mChatListener = new ChatListener();
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    37
    private RemoteCallbackList<IChatManagerListener> mRemoteChatCreationListeners =
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    38
	new RemoteCallbackList<IChatManagerListener>();
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    39
    private RemoteCallbackList<IMessageListener> mRemoteMessageListeners = new RemoteCallbackList<IMessageListener>();
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    40
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    41
    /**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    42
     * Constructor.
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    43
     * @param chatManager the smack ChatManager to adapt
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    44
     */
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    45
    public BeemChatManager(final ChatManager chatManager) {
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    46
	// TODO Auto-generated constructor stub
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    47
	mAdaptee = chatManager;
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    48
	mAdaptee.addChatListener(mChatListener);
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    49
    }
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    50
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    51
    /**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    52
     * Create a chat session.
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    53
     * @param jid the jid of the contact you want to chat with
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    54
     * @param listener listener to use for chat events on this chat session
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    55
     * @return the chat session
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    56
     */
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    57
    public IChat createChat(String jid, IMessageListener listener) {
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    58
	mRemoteMessageListeners.register(listener);
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    59
	if (mChats.containsKey(jid)) {
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    60
	    return mChats.get(jid);
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    61
	}
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    62
	return new ChatAdapter( mAdaptee.createChat(jid, mChatListener));
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    63
    }
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    64
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    65
    /**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    66
     * Create a chat session.
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    67
     * @param contact the contact you want to chat with
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    68
     * @param listener listener to use for chat events on this chat session
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    69
     * @return the chat session
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    70
     */
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    71
    public IChat createChat(Contact contact, IMessageListener listener) {
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    72
	String jid = contact.getJID();
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    73
	return createChat(jid, listener);
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    74
    }
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    75
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    76
    /**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    77
     * {@inheritDoc}
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    78
     */
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    79
    @Override
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    80
    public void addChatCreationListener(IChatManagerListener listener) throws RemoteException {
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    81
	mRemoteChatCreationListeners.register(listener);
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    82
    }
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    83
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    84
    /**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    85
     * {@inheritDoc}
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    86
     */
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    87
    @Override
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    88
    public void removeChatCreationListener(IChatManagerListener listener) throws RemoteException {
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    89
	mRemoteChatCreationListeners.unregister(listener);
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    90
    }
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    91
    
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    92
    private IChat getChat(Chat chat) {
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    93
	if (mChats.containsKey(chat.getParticipant())) {
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    94
	    return mChats.get(chat.getParticipant());
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    95
	}
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    96
	IChat res = new ChatAdapter(chat);
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    97
	mChats.put(chat.getParticipant(), res);
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
    98
	return res;
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
    99
    }
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   100
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   101
    /**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   102
     * A listener for all the chat creation event that happens on the connection.
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   103
     * @author darisk
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   104
     */
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   105
    private class ChatListener implements ChatManagerListener, MessageListener {
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   106
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   107
	/**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   108
	 * Constructor.
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   109
	 */
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   110
	public ChatListener() {
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   111
	    // TODO Auto-generated constructor stub
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   112
	}
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   113
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   114
	/**
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   115
	 * {@inheritDoc}
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   116
	 */
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   117
	@Override
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   118
	public void chatCreated(Chat chat, boolean locally) {
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   119
	    IChat newchat = getChat(chat);
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   120
	    if (!locally) {
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   121
		mChats.put(chat.getParticipant(), newchat);
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   122
	    }
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   123
	    final int n = mRemoteChatCreationListeners.beginBroadcast();
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   124
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   125
	    for (int i = 0; i < n; i++) {
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   126
		IChatManagerListener listener = mRemoteChatCreationListeners.getBroadcastItem(i);
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   127
		try {
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   128
		    listener.chatCreated(newchat, locally);
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   129
		} catch (RemoteException e) {
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   130
		    // The RemoteCallbackList will take care of removing the
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   131
		    // dead listeners.
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   132
		    Log.w(TAG, "Error while triggering remote connection listeners", e);
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   133
		}
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   134
	    }
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   135
	    mRemoteChatCreationListeners.finishBroadcast();
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   136
	}
75
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   137
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   138
	@Override
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   139
	public void processMessage(Chat chat, Message message) {
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   140
	    IChat newchat = getChat(chat);
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   141
	   final int n = mRemoteMessageListeners.beginBroadcast();
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   142
	   for (int i = 0; i < n; i++) {
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   143
		IMessageListener listener = mRemoteMessageListeners.getBroadcastItem(i);
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   144
		try {
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   145
		    listener.processMessage(newchat, new com.beem.project.beem.service.Message(message));
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   146
		    //listener.chatCreated(newchat, locally);
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   147
		} catch (RemoteException e) {
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   148
		    // The RemoteCallbackList will take care of removing the
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   149
		    // dead listeners.
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   150
		    Log.w(TAG, "Error while triggering remote connection listeners", e);
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   151
		}
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   152
	    }
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   153
	    mRemoteMessageListeners.finishBroadcast();
b2500e2392f7 complete chat manager
Da Risk <darisk972@gmail.com>
parents: 55
diff changeset
   154
	}
55
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   155
    }
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   156
66732dd2cb77 Add an interface for sending im message.
Da Risk <darisk972@gmail.com>
parents:
diff changeset
   157
}