# HG changeset patch # User Da Risk # Date 1240228800 -7200 # Node ID 8bbe46055004da96cb9cc46c539cc3b48c1305f7 # Parent ec30f9790f830ddf39a2ff9d2aae2b1d0bea4a76 fix some bugs. When you receive a new chat, a notification appears. Need some improvements cause if the chat was created before, then close no notification appears (nofif only on new created chat). diff -r ec30f9790f83 -r 8bbe46055004 AndroidManifest.xml --- a/AndroidManifest.xml Wed Apr 15 20:09:24 2009 +0200 +++ b/AndroidManifest.xml Mon Apr 20 14:00:00 2009 +0200 @@ -2,7 +2,7 @@ - + diff -r ec30f9790f83 -r 8bbe46055004 src/com/beem/project/beem/BeemService.java --- a/src/com/beem/project/beem/BeemService.java Wed Apr 15 20:09:24 2009 +0200 +++ b/src/com/beem/project/beem/BeemService.java Mon Apr 20 14:00:00 2009 +0200 @@ -38,7 +38,7 @@ /** * The id to use for status notification. */ - public static final int NOTIFICATION_STATUS_ID = 1; + public static final int NOTIFICATION_STATUS_ID = 100; private NotificationManager mNotificationManager; private XmppConnectionAdapter mConnection; @@ -80,7 +80,7 @@ mHost = "10.0.2.2"; initConnectionConfig(); mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); - mConnection = new XmppConnectionAdapter(mConnectionConfiguration, mLogin, mPassword); + mConnection = new XmppConnectionAdapter(mConnectionConfiguration, mLogin, mPassword, this); initRosterRequestListener(); mBind = new XmppFacade(mConnection, this); } @@ -115,7 +115,7 @@ public void sendNotification(int id, Notification notif) { mNotificationManager.notify(id, notif); } - + /** * Initialise la configuration de la connexion. */ @@ -231,7 +231,6 @@ // TODO Auto-generated catch block e.printStackTrace(); } - } /** @@ -242,4 +241,5 @@ mConnection.disconnect(); } + } diff -r ec30f9790f83 -r 8bbe46055004 src/com/beem/project/beem/service/BeemChatManager.java --- a/src/com/beem/project/beem/service/BeemChatManager.java Wed Apr 15 20:09:24 2009 +0200 +++ b/src/com/beem/project/beem/service/BeemChatManager.java Mon Apr 20 14:00:00 2009 +0200 @@ -14,14 +14,20 @@ import org.jivesoftware.smackx.ChatState; import org.jivesoftware.smackx.ChatStateListener; +import android.R; +import android.app.Notification; +import android.app.PendingIntent; +import android.content.Intent; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.util.Log; +import com.beem.project.beem.BeemService; import com.beem.project.beem.service.aidl.IChat; import com.beem.project.beem.service.aidl.IChatManager; import com.beem.project.beem.service.aidl.IChatManagerListener; import com.beem.project.beem.service.aidl.IMessageListener; +import com.beem.project.beem.ui.SendIM; /** * An adapter for smack's ChatManager. This class provides functionnality to handle chats. @@ -36,16 +42,16 @@ private ChatManager mAdaptee; private Map mChats = new HashMap(); private ChatListener mChatListener = new ChatListener(); - private RemoteCallbackList mRemoteChatCreationListeners = - new RemoteCallbackList(); + private RemoteCallbackList mRemoteChatCreationListeners = new RemoteCallbackList(); private RemoteCallbackList mRemoteMessageListeners = new RemoteCallbackList(); + private BeemService mService; /** * Constructor. * @param chatManager the smack ChatManager to adapt */ - public BeemChatManager(final ChatManager chatManager) { - // TODO Auto-generated constructor stub + public BeemChatManager(final ChatManager chatManager, BeemService service) { + mService = service; mAdaptee = chatManager; mAdaptee.addChatListener(mChatListener); } @@ -61,7 +67,9 @@ if (mChats.containsKey(jid)) { return mChats.get(jid); } - return new ChatAdapter( mAdaptee.createChat(jid, mChatListener)); + // create the chat. the adaptee will be add automatically in the map + mAdaptee.createChat(jid, mChatListener); + return mChats.get(jid); } /** @@ -90,7 +98,18 @@ public void removeChatCreationListener(IChatManagerListener listener) throws RemoteException { mRemoteChatCreationListeners.unregister(listener); } - + + /** + * {@inheritDoc} + */ + @Override + public void destroyChat(IChat chat) throws RemoteException { + //TODO gerer les resources egalement + IChat c=mChats.remove(chat.getParticipant().getJID()); + if (c==null) + Log.w(TAG, "CA devrait pas 1!!"); + } + private IChat getChat(Chat chat) { if (mChats.containsKey(chat.getParticipant())) { return mChats.get(chat.getParticipant()); @@ -119,8 +138,8 @@ public void chatCreated(Chat chat, boolean locally) { IChat newchat = getChat(chat); if (!locally) { - mChats.put(chat.getParticipant(), newchat); - // TODO startActivity + chat.addMessageListener(mChatListener); + notifyNewChat(newchat); } final int n = mRemoteChatCreationListeners.beginBroadcast(); @@ -137,6 +156,26 @@ mRemoteChatCreationListeners.finishBroadcast(); } + private void notifyNewChat(IChat chat) { + try { + String text = chat.getParticipant().getJID(); + Notification notif = new Notification(com.beem.project.beem.R.drawable.logo, text, System + .currentTimeMillis()); + notif.defaults = Notification.DEFAULT_ALL; + notif.flags = Notification.FLAG_AUTO_CANCEL; + Intent intent = new Intent(mService, SendIM.class); + // TODO use prefix for name + intent.putExtra("contact", chat.getParticipant()); + notif.setLatestEventInfo(mService, text, "nouveau message", PendingIntent.getActivity(mService, 0, + intent, PendingIntent.FLAG_ONE_SHOT)); + int id = chat.hashCode(); + mService.sendNotification(id, notif); + } catch (RemoteException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + @Override public void processMessage(Chat chat, Message message) { IChat newchat = getChat(chat); @@ -145,7 +184,7 @@ IMessageListener listener = mRemoteMessageListeners.getBroadcastItem(i); try { listener.processMessage(newchat, new com.beem.project.beem.service.Message(message)); - //listener.chatCreated(newchat, locally); + // listener.chatCreated(newchat, locally); } catch (RemoteException e) { // The RemoteCallbackList will take care of removing the // dead listeners. @@ -165,4 +204,6 @@ } } + + } diff -r ec30f9790f83 -r 8bbe46055004 src/com/beem/project/beem/service/ChatAdapter.java --- a/src/com/beem/project/beem/service/ChatAdapter.java Wed Apr 15 20:09:24 2009 +0200 +++ b/src/com/beem/project/beem/service/ChatAdapter.java Mon Apr 20 14:00:00 2009 +0200 @@ -67,4 +67,8 @@ mState = state; } + public Chat getAdaptee() { + return mAdaptee; + } + } diff -r ec30f9790f83 -r 8bbe46055004 src/com/beem/project/beem/service/Contact.java --- a/src/com/beem/project/beem/service/Contact.java Wed Apr 15 20:09:24 2009 +0200 +++ b/src/com/beem/project/beem/service/Contact.java Mon Apr 20 14:00:00 2009 +0200 @@ -200,4 +200,11 @@ public List getMRes() { return mRes; } + + @Override + public String toString() { + if (mJID != null) + return mJID; + return super.toString(); + } } diff -r ec30f9790f83 -r 8bbe46055004 src/com/beem/project/beem/service/XmppConnectionAdapter.java --- a/src/com/beem/project/beem/service/XmppConnectionAdapter.java Wed Apr 15 20:09:24 2009 +0200 +++ b/src/com/beem/project/beem/service/XmppConnectionAdapter.java Mon Apr 20 14:00:00 2009 +0200 @@ -16,6 +16,7 @@ import android.os.RemoteException; import android.util.Log; import com.beem.project.beem.BeemException; +import com.beem.project.beem.BeemService; import com.beem.project.beem.service.aidl.IBeemConnectionListener; import com.beem.project.beem.service.aidl.IChatManager; import com.beem.project.beem.service.aidl.IRoster; @@ -34,6 +35,7 @@ private String mPassword; private RosterAdapter mRoster; private Object mLastException; + private BeemService mService; private RemoteCallbackList mRemoteConnListeners = new RemoteCallbackList(); private ConnexionListenerAdapter mConListener = new ConnexionListenerAdapter(); @@ -44,10 +46,11 @@ * @param login The login to use * @param password The password to use */ - public XmppConnectionAdapter(final XMPPConnection con, final String login, final String password) { + public XmppConnectionAdapter(final XMPPConnection con, final String login, final String password, BeemService service) { mAdaptee = con; mLogin = login; mPassword = password; + mService = service; } /** @@ -56,8 +59,8 @@ * @param login login to use on connect * @param password password to use on connect */ - public XmppConnectionAdapter(final String serviceName, final String login, final String password) { - this(new XMPPConnection(serviceName), login, password); + public XmppConnectionAdapter(final String serviceName, final String login, final String password, BeemService service) { + this(new XMPPConnection(serviceName), login, password, service); } /** @@ -66,8 +69,8 @@ * @param login login to use on connect * @param password password to use on connect */ - public XmppConnectionAdapter(final ConnectionConfiguration config, final String login, final String password) { - this(new XMPPConnection(config), login, password); + public XmppConnectionAdapter(final ConnectionConfiguration config, final String login, final String password, BeemService service) { + this(new XMPPConnection(config), login, password, service); } /** @@ -79,7 +82,7 @@ mAdaptee.connect(); mAdaptee.addConnectionListener(mConListener); mAdaptee.login(mLogin, mPassword, "BEEM"); - mChatManager = new BeemChatManager(mAdaptee.getChatManager()); + mChatManager = new BeemChatManager(mAdaptee.getChatManager(), mService); // TODO find why this cause a null pointer exception // this.initFeatures(); // pour declarer les features xmpp qu'on supporte mLastException = null; @@ -343,4 +346,8 @@ return mAdaptee; } + public BeemService getContext() { + return mService; + } + } diff -r ec30f9790f83 -r 8bbe46055004 src/com/beem/project/beem/service/aidl/IChatManager.aidl --- a/src/com/beem/project/beem/service/aidl/IChatManager.aidl Wed Apr 15 20:09:24 2009 +0200 +++ b/src/com/beem/project/beem/service/aidl/IChatManager.aidl Mon Apr 20 14:00:00 2009 +0200 @@ -22,6 +22,12 @@ IChat createChat(in Contact contact, in IMessageListener listener); /** + * Destroy a chat session with a contact. + * @param chat the chat session + */ + void destroyChat(in IChat chat); + + /** * Register a callback to call when a new chat session is created. * @param listener the callback to add */ diff -r ec30f9790f83 -r 8bbe46055004 src/com/beem/project/beem/ui/SendIM.java --- a/src/com/beem/project/beem/ui/SendIM.java Wed Apr 15 20:09:24 2009 +0200 +++ b/src/com/beem/project/beem/ui/SendIM.java Mon Apr 20 14:00:00 2009 +0200 @@ -32,8 +32,9 @@ import com.beem.project.beem.service.aidl.IXmppFacade; /** - * @author barbu This activity class provides the view for instant messaging + * This activity class provides the view for instant messaging * after selecting a correspondant. + * @author barbu */ public class SendIM extends Activity implements OnClickListener, @@ -88,16 +89,13 @@ mToSend.setOnClickListener(this); mToSend.setOnKeyListener(this); - - mContact = getIntent().getParcelableExtra("contact"); - setViewHeader(); + mLogin = (TextView) findViewById(R.id.sendimlogin); mText = (TextView) findViewById(R.id.sendimlist); mScrolling = (ScrollView) findViewById(R.id.sendimscroll); } private void setViewHeader() { - mLogin = (TextView) findViewById(R.id.sendimlogin); String status = mContact.getMsgState(); if (status == null) status = getString(R.string.SendIMNoStatusSet); @@ -109,6 +107,9 @@ @Override public void onStart() { super.onStart(); + if (mContact == null) + mContact = getIntent().getParcelableExtra("contact"); + setViewHeader(); mBeemApplication.startBeemService(); mService = mBeemApplication.getXmppFacade(); try { @@ -121,6 +122,18 @@ } } + @Override + protected void onDestroy() { + super.onDestroy(); + try { + mChatManager.removeChatCreationListener(mChatManagerListener); + mChatManager.destroyChat(mChat); + } catch (RemoteException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + /** * Abstract method inherited from OnClickListener */