Feature #169
La feature a été ajouté, à priori c'est bon, a testé.
--- a/src/com/beem/project/beem/service/RosterAdapter.java Sat Jun 20 16:57:30 2009 +0200
+++ b/src/com/beem/project/beem/service/RosterAdapter.java Sat Jun 20 18:01:09 2009 +0200
@@ -271,4 +271,9 @@
mAdaptee.getEntry(jid).setName(name);
}
+ @Override
+ public PresenceAdapter getPresence(String jid) throws RemoteException {
+ return new PresenceAdapter(mAdaptee.getPresence(jid));
+ }
+
}
--- a/src/com/beem/project/beem/service/aidl/IRoster.aidl Sat Jun 20 16:57:30 2009 +0200
+++ b/src/com/beem/project/beem/service/aidl/IRoster.aidl Sat Jun 20 18:01:09 2009 +0200
@@ -2,6 +2,7 @@
import com.beem.project.beem.service.aidl.IBeemRosterListener;
import com.beem.project.beem.service.Contact;
+import com.beem.project.beem.service.PresenceAdapter;
interface IRoster {
@@ -18,6 +19,8 @@
List<String> getGroupsNames();
+ PresenceAdapter getPresence(in String jid);
+
void addRosterListener(in IBeemRosterListener listen);
void removeRosterListener(in IBeemRosterListener listen);
--- a/src/com/beem/project/beem/ui/ContactList.java Sat Jun 20 16:57:30 2009 +0200
+++ b/src/com/beem/project/beem/ui/ContactList.java Sat Jun 20 18:01:09 2009 +0200
@@ -218,7 +218,7 @@
public void onPresenceChanged(PresenceAdapter presence) throws RemoteException {
for (Contact curContact : mListContact) {
if (curContact.getJID().equals(StringUtils.parseBareAddress(presence.getFrom()))) {
- curContact.setStatus(presence);
+ curContact.setStatus(mRoster.getPresence(StringUtils.parseBareAddress(presence.getFrom())));
mHandler.post(new RunnableChange());
return;
}
@@ -330,6 +330,9 @@
}
public void changed() {
+ for (String name : groupName) {
+ Collections.sort(groupMap.get(name), new ComparatorContactListByStatusAndName<Contact>());
+ }
for (DataSetObserver obs : observers) {
obs.onChanged();
}
--- a/src/com/beem/project/beem/ui/SendIM.java Sat Jun 20 16:57:30 2009 +0200
+++ b/src/com/beem/project/beem/ui/SendIM.java Sat Jun 20 18:01:09 2009 +0200
@@ -2,6 +2,8 @@
import java.util.List;
+import org.jivesoftware.smack.util.StringUtils;
+
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
@@ -29,10 +31,13 @@
import com.beem.project.beem.R;
import com.beem.project.beem.service.Contact;
import com.beem.project.beem.service.Message;
+import com.beem.project.beem.service.PresenceAdapter;
+import com.beem.project.beem.service.aidl.IBeemRosterListener;
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.service.aidl.IRoster;
import com.beem.project.beem.service.aidl.IXmppFacade;
/**
@@ -42,332 +47,383 @@
public class SendIM extends Activity implements OnClickListener, OnKeyListener {
- private static final String TAG = "SEND_IM";
- private EditText mToSend;
- private SendIMDialogSmiley mSmyDialog;
- private SharedPreferences mSet;
- private Handler mHandler;
- private Contact mContact;
- private IChatManager mChatManager;
- private IChatManagerListener mChatManagerListener;
- private IMessageListener mMessageListener;
- private IChat mChat;
- private TextView mText;
- private TextView mLogin;
- private ScrollView mScrolling;
- private char mSpeak;
-
- private final ServiceConnection mServConn = new BeemServiceConnection();
- private IXmppFacade xmppFacade;
-
- /**
- * Constructor.
- */
- public SendIM() {
- super();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onClick(View view) {
- sendText();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onCreate(Bundle saveBundle) {
- super.onCreate(saveBundle);
- mHandler = new Handler();
- mChatManagerListener = new OnChatListener();
- mMessageListener = new OnMessageListener();
- setContentView(R.layout.sendim);
- mToSend = (EditText) findViewById(R.id.userText);
- mSet = getSharedPreferences("lol", MODE_PRIVATE);
- mSmyDialog = new SendIMDialogSmiley(this, mSet);
- mToSend.setOnClickListener(this);
- mToSend.setOnKeyListener(this);
- mLogin = (TextView) findViewById(R.id.sendimlogin);
- mContact = new Contact(getIntent().getData());
- setViewHeader();
- mText = (TextView) findViewById(R.id.sendimlist);
- mScrolling = (ScrollView) findViewById(R.id.sendimscroll);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public final boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.sendimmenu, menu);
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onDestroy() {
- super.onDestroy();
- if (mChatManager != null) {
- try {
- mChatManager.removeChatCreationListener(mChatManagerListener);
- // TODO trouver quand detruire le chat
- // mChatManager.destroyChat(mChat);
- } catch (RemoteException e) {
- Log.e(TAG, "mchat manager and SendIM destroy", e);
- }
- }
- }
+ private static final String TAG = "SEND_IM";
+ private EditText mToSend;
+ private SendIMDialogSmiley mSmyDialog;
+ private SharedPreferences mSet;
+ private Handler mHandler;
+ private Contact mContact;
+ private IChatManager mChatManager;
+ private IChatManagerListener mChatManagerListener;
+ private IMessageListener mMessageListener;
+ private IChat mChat;
+ private TextView mText;
+ private TextView mLogin;
+ private ScrollView mScrolling;
+ private char mSpeak;
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (event.getAction() == KeyEvent.ACTION_DOWN) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_DPAD_CENTER:
- case KeyEvent.KEYCODE_ENTER:
- sendText();
- return true;
- default:
- return false;
- }
- }
- return false;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- mContact = new Contact(intent.getData());
- setViewHeader();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public final boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.sendim_smiley:
- mSmyDialog.show();
- return true;
- default:
- return false;
- }
- }
+ private final ServiceConnection mServConn = new BeemServiceConnection();
+ private IXmppFacade xmppFacade;
+ public IRoster mRoster;
+ private TextView mStatusText;
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onPause() {
- super.onPause();
- try {
- mChat.setOpen(false);
- } catch (RemoteException e) {
- Log.d(TAG, "Error while closing chat", e);
- }
- unbindService(mServConn);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onResume() {
- super.onResume();
- bindService(new Intent(this, BeemService.class), mServConn, BIND_AUTO_CREATE);
- mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onStart() {
- super.onStart();
- // TODO cancel the notification if any
- if (mContact == null)
- mContact = getIntent().getParcelableExtra("contact");
- setViewHeader();
-
- }
-
- private class BeemServiceConnection implements ServiceConnection {
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- xmppFacade = IXmppFacade.Stub.asInterface(service);
- try {
- if (mChatManager == null) {
- mChatManager = xmppFacade.getChatManager();
- mChatManager.addChatCreationListener(mChatManagerListener);
- }
- switchChat(mContact);
- } catch (RemoteException e) {
- Log.e(TAG, "Error during chat manager creation", e);
- }
+ /**
+ * Constructor.
+ */
+ public SendIM() {
+ super();
}
- @Override
- public void onServiceDisconnected(ComponentName name) {
- xmppFacade = null;
- }
- }
-
- /**
- * Send a message to the contact over the XMPP connection. Also display it on activity view. TODO : Gerer
- * l'exception si la connexion se coupe pendant la conversation
- */
- private void sendText() {
- String text = mToSend.getText().toString();
- if (!text.equals("")) {
- Message msg = new Message(mContact.getJID(), Message.MSG_TYPE_CHAT);
- msg.setBody(text);
- try {
- // TODO: PAs connecter au serveur BING grosse Error ! INTERDICTION !
- mChat.sendMessage(msg);
- if (mSpeak != 1)
- mText.append(getString(R.string.SendIMYouSay) + text + '\n');
- else
- mText.append(text + "\n");
- mToSend.setText(null);
- mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
- mToSend.requestFocus();
- mSpeak = 1;
- } catch (RemoteException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
-
- /**
- * Set the header information in the window.
- */
- private void setViewHeader() {
- Drawable avatar = getResources().getDrawable(R.drawable.avatar);
- ImageView imgV = (ImageView) findViewById(R.id.sendimavatar);
- imgV.setImageDrawable(avatar);
- mLogin = (TextView) findViewById(R.id.sendimlogin);
- mLogin.setText(mContact.getJID());
- TextView status = (TextView) findViewById(R.id.sendimstatus);
- status.setTextSize(12);
- mLogin.setTextColor(getResources().getColor(R.color.white));
- String statmsg = mContact.getMsgState();
- if (statmsg != null)
- status.setText(statmsg);
- }
-
- /**
- * Show the message history.
- * @param messages list of message to display
- */
- private void showMessageList(List<Message> messages) {
- mText.setText("");
- mSpeak = 0;
- for (Message message : messages) {
- String from = message.getFrom();
- if (from == null) {
- if (mSpeak != 1)
- mText.append(getString(R.string.SendIMYouSay));
- mSpeak = 1;
- } else {
- if (mSpeak != 2) {
- String str = String.format(getString(R.string.SendIMSays), from);
- mText.append(str);
- }
- mSpeak = 2;
- }
- mText.append(message.getBody() + '\n');
- }
- mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
- }
-
- /**
- * Change the correspondant of the chat.
- * @param newContact New contact to chat with
- * @throws RemoteException if an errors occurs in the connection with the service
- */
- private void switchChat(Contact newContact) throws RemoteException {
- if (mChat != null)
- mChat.setOpen(false);
- mChat = mChatManager.createChat(newContact, mMessageListener);
- showMessageList(mChat.getMessages());
- mChat.setOpen(true);
- mContact = newContact;
- mToSend.requestFocus();
- }
-
- /**
- * Listener for chat creation. (maybe not necessary)
- * @author darisk
- */
- private class OnChatListener extends IChatManagerListener.Stub {
/**
* {@inheritDoc}
*/
@Override
- public void chatCreated(IChat chat, boolean locally) throws RemoteException {
- Log.i("LOG", "chatCreated");
+ public void onClick(View view) {
+ sendText();
}
- }
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void onCreate(Bundle saveBundle) {
+ super.onCreate(saveBundle);
+ mHandler = new Handler();
+ mChatManagerListener = new OnChatListener();
+ mMessageListener = new OnMessageListener();
+ setContentView(R.layout.sendim);
+ mToSend = (EditText) findViewById(R.id.userText);
+ mSet = getSharedPreferences("lol", MODE_PRIVATE);
+ mSmyDialog = new SendIMDialogSmiley(this, mSet);
+ mToSend.setOnClickListener(this);
+ mToSend.setOnKeyListener(this);
+ mLogin = (TextView) findViewById(R.id.sendimlogin);
+ mContact = new Contact(getIntent().getData());
+ setViewHeader();
+ mText = (TextView) findViewById(R.id.sendimlist);
+ mScrolling = (ScrollView) findViewById(R.id.sendimscroll);
+ mStatusText = (TextView) findViewById(R.id.sendimstatus);
+ }
- /**
- * Listener for new chat messages.
- * @author darisk
- */
- private class OnMessageListener extends IMessageListener.Stub {
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public final boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.sendimmenu, menu);
+ return true;
+ }
/**
* {@inheritDoc}
*/
@Override
- public void processMessage(IChat chat, Message msg) throws RemoteException {
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mChatManager != null) {
+ try {
+ mChatManager.removeChatCreationListener(mChatManagerListener);
+ // TODO trouver quand detruire le chat
+ // mChatManager.destroyChat(mChat);
+ } catch (RemoteException e) {
+ Log.e(TAG, "mchat manager and SendIM destroy", e);
+ }
+ }
+ }
- if (chat != mChat)
- return;
- final Message m = msg;
- mHandler.post(new Runnable() {
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ case KeyEvent.KEYCODE_ENTER:
+ sendText();
+ return true;
+ default:
+ return false;
+ }
+ }
+ return false;
+ }
- @Override
- public void run() {
- if (m.getBody() != null) {
- if (mSpeak == 2)
- mText.append(m.getBody() + "\n");
- else {
- String str = String.format(getString(R.string.SendIMSays), m.getFrom());
- mText.append(str);
- mText.append(m.getBody() + "\n");
- }
- mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
- mToSend.requestFocus();
- mSpeak = 2;
- }
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ mContact = new Contact(intent.getData());
+ setViewHeader();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public final boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.sendim_smiley:
+ mSmyDialog.show();
+ return true;
+ default:
+ return false;
}
- });
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void onPause() {
+ super.onPause();
+ try {
+ mChat.setOpen(false);
+ } catch (RemoteException e) {
+ Log.d(TAG, "Error while closing chat", e);
+ }
+ unbindService(mServConn);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void onResume() {
+ super.onResume();
+ bindService(new Intent(this, BeemService.class), mServConn, BIND_AUTO_CREATE);
+ mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
}
/**
* {@inheritDoc}
*/
@Override
- public void stateChanged(IChat chat) throws RemoteException {
- // TODO: a integrer dans l'ui
- // Log.d(TAG, "state changed");
+ protected void onStart() {
+ super.onStart();
+ // TODO cancel the notification if any
+ if (mContact == null)
+ mContact = getIntent().getParcelableExtra("contact");
+ setViewHeader();
+
+ }
+
+ private class BeemServiceConnection implements ServiceConnection {
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ xmppFacade = IXmppFacade.Stub.asInterface(service);
+ try {
+ if (mChatManager == null) {
+ mChatManager = xmppFacade.getChatManager();
+ mChatManager.addChatCreationListener(mChatManagerListener);
+ }
+ switchChat(mContact);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error during chat manager creation", e);
+ }
+ try {
+ mRoster = xmppFacade.getRoster();
+ if (mRoster != null) {
+ mRoster.addRosterListener(new BeemRosterListener());
+ mContact.setStatus(mRoster.getPresence(mContact.getJID()));
+ mStatusText.setText(mContact.getMsgState());
+ }
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ xmppFacade = null;
+ }
+ }
+
+ /**
+ * Send a message to the contact over the XMPP connection. Also display it on activity view. TODO : Gerer
+ * l'exception si la connexion se coupe pendant la conversation
+ */
+ private void sendText() {
+ String text = mToSend.getText().toString();
+ if (!text.equals("")) {
+ Message msg = new Message(mContact.getJID(), Message.MSG_TYPE_CHAT);
+ msg.setBody(text);
+ try {
+ // TODO: PAs connecter au serveur BING grosse Error ! INTERDICTION !
+ mChat.sendMessage(msg);
+ if (mSpeak != 1)
+ mText.append(getString(R.string.SendIMYouSay) + text + '\n');
+ else
+ mText.append(text + "\n");
+ mToSend.setText(null);
+ mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
+ mToSend.requestFocus();
+ mSpeak = 1;
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * Set the header information in the window.
+ */
+ private void setViewHeader() {
+ Drawable avatar = getResources().getDrawable(R.drawable.avatar);
+ ImageView imgV = (ImageView) findViewById(R.id.sendimavatar);
+ imgV.setImageDrawable(avatar);
+ mLogin = (TextView) findViewById(R.id.sendimlogin);
+ mLogin.setText(mContact.getJID());
+ TextView status = (TextView) findViewById(R.id.sendimstatus);
+ status.setTextSize(12);
+ mLogin.setTextColor(getResources().getColor(R.color.white));
+ String statmsg = mContact.getMsgState();
+ if (statmsg != null)
+ status.setText(statmsg);
+ }
+
+ /**
+ * Show the message history.
+ * @param messages list of message to display
+ */
+ private void showMessageList(List<Message> messages) {
+ mText.setText("");
+ mSpeak = 0;
+ for (Message message : messages) {
+ String from = message.getFrom();
+ if (from == null) {
+ if (mSpeak != 1)
+ mText.append(getString(R.string.SendIMYouSay));
+ mSpeak = 1;
+ } else {
+ if (mSpeak != 2) {
+ String str = String.format(getString(R.string.SendIMSays), from);
+ mText.append(str);
+ }
+ mSpeak = 2;
+ }
+ mText.append(message.getBody() + '\n');
+ }
+ mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
}
- }
+
+ /**
+ * Change the correspondant of the chat.
+ * @param newContact New contact to chat with
+ * @throws RemoteException if an errors occurs in the connection with the service
+ */
+ private void switchChat(Contact newContact) throws RemoteException {
+ if (mChat != null)
+ mChat.setOpen(false);
+ mChat = mChatManager.createChat(newContact, mMessageListener);
+ showMessageList(mChat.getMessages());
+ mChat.setOpen(true);
+ mContact = newContact;
+ mToSend.requestFocus();
+ }
+
+ /**
+ * Listener for chat creation. (maybe not necessary)
+ * @author darisk
+ */
+ private class OnChatListener extends IChatManagerListener.Stub {
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void chatCreated(IChat chat, boolean locally) throws RemoteException {
+ Log.i("LOG", "chatCreated");
+ }
+
+ }
+ private class BeemRosterListener extends IBeemRosterListener.Stub {
+
+ @Override
+ public void onEntriesAdded(List<String> addresses)
+ throws RemoteException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onEntriesDeleted(List<String> addresses)
+ throws RemoteException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onEntriesUpdated(List<String> addresses)
+ throws RemoteException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onPresenceChanged(PresenceAdapter presence)
+ throws RemoteException {
+ mContact.setStatus(mRoster.getPresence(StringUtils.parseBareAddress(presence.getFrom())));
+ mHandler.post(new RunnableChange());
+ }
+
+ private class RunnableChange implements Runnable {
+ @Override
+ public void run() {
+ mStatusText.setText(mContact.getMsgState());
+ }
+ }
+
+ }
+
+ /**
+ * Listener for new chat messages.
+ * @author darisk
+ */
+ private class OnMessageListener extends IMessageListener.Stub {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void processMessage(IChat chat, Message msg) throws RemoteException {
+
+ if (chat != mChat)
+ return;
+ final Message m = msg;
+ mHandler.post(new Runnable() {
+
+ @Override
+ public void run() {
+ if (m.getBody() != null) {
+ if (mSpeak == 2)
+ mText.append(m.getBody() + "\n");
+ else {
+ String str = String.format(getString(R.string.SendIMSays), m.getFrom());
+ mText.append(str);
+ mText.append(m.getBody() + "\n");
+ }
+ mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
+ mToSend.requestFocus();
+ mSpeak = 2;
+ }
+ }
+ });
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void stateChanged(IChat chat) throws RemoteException {
+ // TODO: a integrer dans l'ui
+ // Log.d(TAG, "state changed");
+ }
+ }
}