src/com/beem/project/beem/ui/Chat.java
changeset 584 72d9d76900af
parent 577 29ac85113420
child 585 ce60e3c1347d
--- a/src/com/beem/project/beem/ui/Chat.java	Thu Dec 17 16:15:02 2009 +0100
+++ b/src/com/beem/project/beem/ui/Chat.java	Fri Dec 18 20:32:43 2009 +0100
@@ -111,7 +111,7 @@
     static {
 	SERVICE_INTENT.setComponent(new ComponentName("com.beem.project.beem", "com.beem.project.beem.BeemService"));
     }
-    private Handler mHandler;
+    private Handler mHandler = new Handler();
 
     private IRoster mRoster;
     private Contact mContact;
@@ -128,12 +128,13 @@
 
     private IChat mChat;
     private IChatManager mChatManager;
-    private IChatManagerListener mChatManagerListener;
-    private IMessageListener mMessageListener;
-    private MessagesListAdapter mMessagesListAdapter;
+    private final IMessageListener mMessageListener = new OnMessageListener();
+    private MessagesListAdapter mMessagesListAdapter = new MessagesListAdapter();
 
     private final ServiceConnection mConn = new BeemServiceConnection();
-    private BeemBroadcastReceiver mBroadcastReceiver;
+    private final BeemBroadcastReceiver mBroadcastReceiver = new BeemBroadcastReceiver();
+    private final BeemRosterListener mBeemRosterListener = new BeemRosterListener();
+    private IXmppFacade mXmppFacade;
 
     /**
      * Constructor.
@@ -148,21 +149,7 @@
     @Override
     protected void onCreate(Bundle savedBundle) {
 	super.onCreate(savedBundle);
-
-	Log.v(TAG, "BEGIN onCreate.");
 	setContentView(R.layout.chat);
-	mMessagesListAdapter = new MessagesListAdapter(this);
-
-	mHandler = new Handler();
-
-	// SVC Bind
-	bindService(SERVICE_INTENT, mConn, BIND_AUTO_CREATE);
-	
-	// Listeners
-	mMessageListener = new OnMessageListener();
-	mChatManagerListener = new OnChatManagerListener();
-
-	mBroadcastReceiver = new BeemBroadcastReceiver(mConn);
 	this.registerReceiver(mBroadcastReceiver, new IntentFilter(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED));
 	
 	// UI
@@ -182,8 +169,13 @@
 	});
 
 	prepareIconsStatus();
+    }
 
-	Log.v(TAG, "END onCreate.");
+    @Override
+    protected void onStart() {
+	super.onStart();
+	if (mXmppFacade == null)
+	    bindService(SERVICE_INTENT, mConn, BIND_AUTO_CREATE);
     }
 
     /**
@@ -192,32 +184,7 @@
     @Override
     protected void onDestroy() {
 	super.onDestroy();
-
-	Log.v(TAG, "BEGIN onDestroy.");
-	
-	if (mChatManager != null) {
-	    try {
-		mChatManager.removeChatCreationListener(mChatManagerListener);
-	    } catch (RemoteException e) {
-		Log.e(TAG, e.getMessage());
-	    }
-	}
-	
 	this.unregisterReceiver(mBroadcastReceiver);
-	unbindService(mConn);
-	
-	Log.v(TAG, "END onDestroy.");
-    }
-
-    /**
-     * {@inheritDoc}.
-     */
-    @Override
-    protected void onStart() {
-	super.onStart();
-
-	Log.v(TAG, "BEGIN onStart.");
-	Log.v(TAG, "END onStart.");
     }
 
     /**
@@ -227,23 +194,21 @@
     protected void onStop() {
 	super.onStop();
 
-	Log.v(TAG, "BEGIN onStop.");
-	if (mChat != null) {
-	    try {
+	try {
+	    if (mChat != null) {
 		mChat.setOpen(false);
-	    } catch (RemoteException e) {
-		Log.e(TAG, e.getMessage());
+		mChat.removeMessageListener(mMessageListener);
 	    }
+	    if (mRoster != null)
+		mRoster.removeRosterListener(mBeemRosterListener);
+	} catch (RemoteException e) {
+	    Log.e(TAG, e.getMessage());
 	}
-	Log.v(TAG, "END onStop.");
-    }
-
-    /**
-     * {@inheritDoc}.
-     */
-    @Override
-    protected void onResume() {
-	super.onResume();
+	unbindService(mConn);
+	mXmppFacade = null;
+	mRoster = null;
+	mChat = null;
+	mChatManager = null;
     }
 
     /**
@@ -260,15 +225,12 @@
     @Override
     protected void onNewIntent(Intent intent) {
 	super.onNewIntent(intent);
-
-	Log.v(TAG, "BEGIN onNewIntent.");
 	try {
 	    mContact = new Contact(intent.getData());
 	    changeCurrentChat(mContact);
 	} catch (RemoteException e) {
 	    Log.e(TAG, e.getMessage());
 	}
-	Log.v(TAG, "END onNewIntent.");
     }
 
     /**
@@ -295,7 +257,6 @@
     @Override
     public final boolean onCreateOptionsMenu(Menu menu) {
 	super.onCreateOptionsMenu(menu);
-
 	MenuInflater inflater = getMenuInflater();
 	inflater.inflate(R.menu.chat, menu);
 	return true;
@@ -315,7 +276,6 @@
 	    case R.id.chat_menu_change_chat:
 		try {
 		    final List<Contact> openedChats = mChatManager.getOpenedChatList();
-
 		    if (openedChats.size() > 0)
 			createChatSwitcherDialog(openedChats);
 		    else
@@ -378,20 +338,21 @@
      * @throws RemoteException If a Binder remote-invocation error occurred.
      */
     private void changeCurrentChat(Contact contact) throws RemoteException {
-	Log.v(TAG, "BEGIN changeCurrentChat.");
-	if (mChat != null)
+	if (mChat != null) {
 	    mChat.setOpen(false);
+	    mChat.removeMessageListener(mMessageListener);
+	}
 	mChat = mChatManager.createChat(contact, mMessageListener);
 	mChat.setOpen(true);
-
 	mChatManager.deleteChatNotification(mChat);
 
+	// TODO thecontact isnotnecesarrely ubn the roseter.
+	// this can leadtoa null exception
 	mContact = mRoster.getContact(contact.getJID());
 	updateContactInformations();
 	updateContactStatusIcon();
 
 	playRegisteredTranscript();
-	Log.v(TAG, "END changeCurrentChat.");
     }
 
     /**
@@ -402,35 +363,26 @@
 	String fromBareJid = null;
 	String fromName = null;
 	List<Message> chatMessages = mChat.getMessages();
+	mListMessages.clear();
+	MessageText lastMessage = null;
 
-	Log.v(TAG, "BEGIN playRegisteredTranscript.");
-	mListMessages.clear();
-	if (chatMessages.size() > 0) {
-	    MessageText lastMessage = null;
-	    for (Message m : chatMessages) {
-		fromBareJid = StringUtils.parseBareAddress(m.getFrom());
-		fromName = mContact.getName();
-
-		if (fromBareJid == null) {
-		    fromBareJid = getString(R.string.chat_self);
-		    fromName = getString(R.string.chat_self);
+	for (Message m : chatMessages) {
+	    fromBareJid = StringUtils.parseBareAddress(m.getFrom());
+	    fromName = mContact.getName();
+	    if (fromBareJid == null) {
+		fromBareJid = getString(R.string.chat_self);
+		fromName = getString(R.string.chat_self);
+	    }
+	    if (m.getBody() != null) {
+		if (lastMessage == null || !lastMessage.getBareJid().equals(fromBareJid)) {
+		    lastMessage = new MessageText(fromBareJid, fromName, m.getBody());
+		    mListMessages.add(lastMessage);
+		} else {
+		    lastMessage.setMessage(lastMessage.getMessage().concat("\n" + m.getBody()));
 		}
-
-		if (lastMessage == null) {
-		    lastMessage = new MessageText(fromBareJid, fromName, m.getBody());
-		    continue;
-		}
-
-		if (!lastMessage.getBareJid().equals(fromBareJid)) {
-		    mListMessages.add(lastMessage);
-		    lastMessage = new MessageText(fromBareJid, fromName, m.getBody());
-		} else
-		    lastMessage.setMessage(lastMessage.getMessage().concat("\n" + m.getBody()));
 	    }
-	    mListMessages.add(lastMessage);
 	}
 	mMessagesListAdapter.notifyDataSetChanged();
-	Log.v(TAG, "END playRegisteredTranscript.");
     }
 
     /**
@@ -438,44 +390,36 @@
      */
     private final class BeemServiceConnection implements ServiceConnection {
 
-	private IXmppFacade mXmppFacade;
-	private final BeemRosterListener mBeemRosterListener = new BeemRosterListener();
 
 	/**
 	 * {@inheritDoc}.
 	 */
 	@Override
-	public void onServiceConnected(ComponentName name, IBinder service) {
-	    Log.v(TAG, "BEGIN onServiceConnected.");
-	    mXmppFacade = IXmppFacade.Stub.asInterface(service);
-	    mBroadcastReceiver.setBinded(true);
-	    try {
-		mChatManager = mXmppFacade.getChatManager();
-		mRoster = mXmppFacade.getRoster();
-		mRoster.addRosterListener(mBeemRosterListener);
-		mContact = new Contact(getIntent().getData());
-		changeCurrentChat(mContact);
-	    } catch (RemoteException e) {
-		Log.e(TAG, e.getMessage());
+	    public void onServiceConnected(ComponentName name, IBinder service) {
+		mXmppFacade = IXmppFacade.Stub.asInterface(service);
+		try {
+		    mChatManager = mXmppFacade.getChatManager();
+		    mRoster = mXmppFacade.getRoster();
+		    mRoster.addRosterListener(mBeemRosterListener);
+		    mContact = new Contact(getIntent().getData());
+		    changeCurrentChat(mContact);
+		} catch (RemoteException e) {
+		    Log.e(TAG, e.getMessage());
+		}
 	    }
-	    Log.v(TAG, "END onServiceConnected.");
-	}
 
 	/**
 	 * {@inheritDoc}.
 	 */
 	@Override
-	public void onServiceDisconnected(ComponentName name) {
-	    Log.v(TAG, "BEGIN onServiceDisconnected.");
-	    mXmppFacade = null;
-	    mBroadcastReceiver.setBinded(false);
-	    try {
-		mRoster.removeRosterListener(mBeemRosterListener);
-	    } catch (RemoteException e) {
-		Log.e(TAG, e.getMessage());
+	    public void onServiceDisconnected(ComponentName name) {
+		mXmppFacade = null;
+		try {
+		    mRoster.removeRosterListener(mBeemRosterListener);
+		} catch (RemoteException e) {
+		    Log.e(TAG, e.getMessage());
+		}
 	    }
-	    Log.v(TAG, "END onServiceDisconnected.");
-	}
     }
 
     /**
@@ -488,8 +432,6 @@
 	 */
 	@Override
 	public void onEntriesAdded(List<String> addresses) throws RemoteException {
-	    Log.v(TAG, "BEGIN onEntriesAdded.");
-	    Log.v(TAG, "END onEntriesAdded.");
 	}
 
 	/**
@@ -497,8 +439,6 @@
 	 */
 	@Override
 	public void onEntriesDeleted(List<String> addresses) throws RemoteException {
-	    Log.v(TAG, "BEGIN onEntriesDeleted.");
-	    Log.v(TAG, "END onEntriesDeleted.");
 	}
 
 	/**
@@ -506,8 +446,6 @@
 	 */
 	@Override
 	public void onEntriesUpdated(List<String> addresses) throws RemoteException {
-	    Log.v(TAG, "BEGIN onEntriesUpdated.");
-	    Log.v(TAG, "END onEntriesUpdated.");
 	}
 
 	/**
@@ -515,8 +453,6 @@
 	 */
 	@Override
 	public void onEntryDeleteFromGroup(String group, String jid) throws RemoteException {
-	    Log.v(TAG, "BEGIN onEntryDeleteFromGroup.");
-	    Log.v(TAG, "END onEntryDeleteFromGroup.");
 	}
 
 	/**
@@ -524,20 +460,17 @@
 	 */
 	@Override
 	public void onPresenceChanged(final PresenceAdapter presence) throws RemoteException {
-	    Log.v(TAG, "BEGIN onPresenceChanged.");
 	    if (mContact.getJID().equals(StringUtils.parseBareAddress(presence.getFrom()))) {
 		mHandler.post(new Runnable() {
 		    @Override
 		    public void run() {
 			mContact.setStatus(presence.getStatus());
 			mContact.setMsgState(presence.getStatusText());
-
 			updateContactInformations();
 			updateContactStatusIcon();
 		    }
 		});
 	    }
-	    Log.v(TAG, "END onPresenceChanged.");
 	}
     }
 
@@ -551,16 +484,11 @@
 	 */
 	@Override
 	public void processMessage(IChat chat, final Message msg) throws RemoteException {
-	    Log.v(TAG, "BEGIN processMessage.");
-
 	    final String fromBareJid = StringUtils.parseBareAddress(msg.getFrom());
 
 	    if (mContact.getJID().equals(fromBareJid)) {
 		mHandler.post(new Runnable() {
 
-		    /**
-		     * {@inheritDoc}.
-		     */
 		    @Override
 		    public void run() {
 			if (msg.getBody() != null && msg.getType() != Message.MSG_TYPE_ERROR) {
@@ -570,14 +498,13 @@
 			    if (lastMessage != null && lastMessage.getBareJid().equals(fromBareJid)) {
 				lastMessage.setMessage(lastMessage.getMessage().concat("\n" + msg.getBody()));
 				mListMessages.set(mListMessages.size() - 1, lastMessage);
-			    } else
+			    } else if (msg.getBody() != null)
 				mListMessages.add(new MessageText(fromBareJid, mContact.getName(), msg.getBody()));
 			    mMessagesListAdapter.notifyDataSetChanged();
 			}
 		    }
 		});
 	    }
-	    Log.v(TAG, "END processMessage.");
 	}
 
 	/**
@@ -585,38 +512,7 @@
 	 */
 	@Override
 	public void stateChanged(IChat chat) throws RemoteException {
-	    Log.v(TAG, "BEGIN stateChanged.");
-	    mHandler.post(new Runnable() {
-
-		/**
-		 * {@inheritDoc}.
-		 */
-		@Override
-		public void run() {
-		}
-	    });
-	    Log.v(TAG, "END stateChanged.");
-	}
-    }
-
-    /**
-     * This class serve to listen on ChatManager events.
-     * @author Jean-Manuel Da Silva <dasilvj at beem-project dot com>
-     */
-    private class OnChatManagerListener extends IChatManagerListener.Stub {
-	/**
-	 * Constructor.
-	 */
-	public OnChatManagerListener() {
-	    Log.v(TAG, "OnChatManagerListener constructor.");
-	}
-
-	/**
-	 * {@inheritDoc}.
-	 */
-	@Override
-	public void chatCreated(IChat chat, boolean locally) throws RemoteException {
-	    Log.i(TAG, "Chat has been created.");
+	    //TODO
 	}
     }
 
@@ -624,7 +520,6 @@
      * Update the contact informations.
      */
     private void updateContactInformations() {
-	Log.v(TAG, "BEGIN updateContactInformations.");
 	// Check for a contact name update
 	if (!(mContactNameTextView.getText().toString().equals(mContact.getName())))
 	    mContactNameTextView.setText(mContact.getName());
@@ -635,16 +530,13 @@
 	    mContactStatusMsgTextView.setText(mContact.getMsgState());
 	    Linkify.addLinks(mContactStatusMsgTextView, Linkify.WEB_URLS);
 	}
-	Log.v(TAG, "END updateContactInformations.");
     }
 
     /**
      * Update the contact status icon.
      */
     private void updateContactStatusIcon() {
-	Log.v(TAG, "BEGIN updateContactStatusIcon.");
 	mContactStatusIcon.setImageBitmap(mStatusIconsMap.get(mContact.getStatus()));
-	Log.v(TAG, "END updateContactStatusIcon.");
     }
 
     /**
@@ -670,14 +562,11 @@
      */
     private class MessagesListAdapter extends BaseAdapter {
 
-	private final Context mContext;
-
 	/**
 	 * Constructor.
 	 * @param context The MessagesListAdapter context.
 	 */
-	public MessagesListAdapter(final Context context) {
-	    mContext = context;
+	public MessagesListAdapter() {
 	}
 
 	/**
@@ -716,7 +605,7 @@
 	public View getView(int position, View convertView, ViewGroup parent) {
 	    MessageView sv;
 	    if (convertView == null) {
-		sv = new MessageView(mContext, mListMessages.get(position).getName(), mListMessages.get(position)
+		sv = new MessageView(Chat.this, mListMessages.get(position).getName(), mListMessages.get(position)
 		    .getMessage());
 	    } else {
 		sv = (MessageView) convertView;
@@ -724,6 +613,7 @@
 		sv.setMessage(mListMessages.get(position).getMessage());
 	    }
 
+	    //TODO Put this un the xml layout
 	    sv.setPadding(2, 2, 2, 4);
 
 	    sv.mName.setTextSize(16);
@@ -859,7 +749,6 @@
      */
     @Override
     public boolean onKey(View v, int keyCode, KeyEvent event) {
-	Log.d(TAG, "KeyEvent = " + event.getAction());
 	if (event.getAction() == KeyEvent.ACTION_DOWN) {
 	    switch (keyCode) {
 		case KeyEvent.KEYCODE_ENTER:
@@ -878,7 +767,6 @@
     private void sendMessage() {
 	final String inputContent = mInputField.getText().toString();
 
-	Log.v(TAG, "BEGIN sendMessage.");
 	if (!"".equals(inputContent)) {
 	    Message msgToSend = new Message(mContact.getJID(), Message.MSG_TYPE_CHAT);
 	    msgToSend.setBody(inputContent);
@@ -900,6 +788,9 @@
 	    mMessagesListAdapter.notifyDataSetChanged();
 	    mInputField.setText(null);
 	}
-	Log.v(TAG, "END sendMessage.");
+    }
+
+    protected void finalize() {
+	Log.e("CHATFIN", "FINALIZE");
     }
 }