# HG changeset patch # User nikita@nikita-rack # Date 1238831980 -7200 # Node ID fcafa1e28942a825162e2676781c1b5473c21395 # Parent 41ceca987a6ca57d106250a530e2349e6a5ce282# Parent aa70a805da1760c776d72c02ddeea0efddbf3d4f ajout de quelques petites modifs diff -r 41ceca987a6c -r fcafa1e28942 AndroidManifest.xml --- a/AndroidManifest.xml Sat Apr 04 08:41:51 2009 +0200 +++ b/AndroidManifest.xml Sat Apr 04 09:59:40 2009 +0200 @@ -3,13 +3,12 @@ package="com.beem.project.beem" android:versionCode="1" android:versionName="1.0"> - + - @@ -24,5 +23,5 @@ - + diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/away.png Binary file res/drawable/away.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/chat.png Binary file res/drawable/chat.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/closed.png Binary file res/drawable/closed.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/connecting.png Binary file res/drawable/connecting.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/dnd.png Binary file res/drawable/dnd.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/error.png Binary file res/drawable/error.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/invisible.png Binary file res/drawable/invisible.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/message.png Binary file res/drawable/message.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/not_in_the_roster.png Binary file res/drawable/not_in_the_roster.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/offline.png Binary file res/drawable/offline.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/online.png Binary file res/drawable/online.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/drawable/requested.png Binary file res/drawable/requested.png has changed diff -r 41ceca987a6c -r fcafa1e28942 res/layout/beem.xml --- a/res/layout/beem.xml Sat Apr 04 08:41:51 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff -r 41ceca987a6c -r fcafa1e28942 res/layout/contactlistcontact.xml --- a/res/layout/contactlistcontact.xml Sat Apr 04 08:41:51 2009 +0200 +++ b/res/layout/contactlistcontact.xml Sat Apr 04 09:59:40 2009 +0200 @@ -2,25 +2,34 @@ - + + - - + + - - + + \ No newline at end of file diff -r 41ceca987a6c -r fcafa1e28942 res/layout/contactlistdialogsettings.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/res/layout/contactlistdialogsettings.xml Sat Apr 04 09:59:40 2009 +0200 @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 41ceca987a6c -r fcafa1e28942 res/menu/beemmenu.xml --- a/res/menu/beemmenu.xml Sat Apr 04 08:41:51 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ - - - - diff -r 41ceca987a6c -r fcafa1e28942 res/menu/contactlistmenu.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/res/menu/contactlistmenu.xml Sat Apr 04 09:59:40 2009 +0200 @@ -0,0 +1,4 @@ + + + + diff -r 41ceca987a6c -r fcafa1e28942 res/values/strings.xml --- a/res/values/strings.xml Sat Apr 04 08:41:51 2009 +0200 +++ b/res/values/strings.xml Sat Apr 04 09:59:40 2009 +0200 @@ -3,7 +3,7 @@ Beem - Creer un compte + Jabber ID @@ -13,9 +13,9 @@ Beem - login + host - password + Jabber IDloginpassword port @@ -24,4 +24,5 @@ Is : and is speaking from : Insert a smiley + diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/BeemApplication.java --- a/src/com/beem/project/beem/BeemApplication.java Sat Apr 04 08:41:51 2009 +0200 +++ b/src/com/beem/project/beem/BeemApplication.java Sat Apr 04 09:59:40 2009 +0200 @@ -29,11 +29,14 @@ private static BeemApplication mBeemApp; private IXMPPFacade mFacade; + private Context mApplicationContext; private Resources mPrivateResources; private List mQueue = new LinkedList(); private boolean mIsConnected; + + private ServiceConnection mServConn = new ServiceConnection() { @Override @@ -132,9 +135,14 @@ * Stop the Beem service. */ public synchronized void stopBeemService() { - Intent intent = new Intent(this, BeemService.class); - mApplicationContext.unbindService(mServConn); - mApplicationContext.stopService(intent); + if (mIsConnected) { + Intent intent = new Intent(); + intent.setComponent(new ComponentName("com.beem.project.beem", + "com.beem.project.beem.BeemService")); + mApplicationContext.unbindService(mServConn); + mApplicationContext.stopService(intent); + mIsConnected = false; + } } /** @@ -145,6 +153,7 @@ return mFacade; } + /** * Add a methode to execute when the application is connected to the Beem service. * @param target the handler which will execute the callback @@ -161,4 +170,12 @@ } } } + + /** + * Indique si on est connecte au service. + */ + public boolean isConnected() { + return mIsConnected; + } + } diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/service/Contact.java --- a/src/com/beem/project/beem/service/Contact.java Sat Apr 04 08:41:51 2009 +0200 +++ b/src/com/beem/project/beem/service/Contact.java Sat Apr 04 09:59:40 2009 +0200 @@ -3,8 +3,13 @@ */ package com.beem.project.beem.service; +import org.jivesoftware.smack.RosterEntry; +import org.jivesoftware.smack.packet.Presence; +import org.jivesoftware.smack.packet.Presence.Mode; + import android.os.Parcel; import android.os.Parcelable; +import android.util.Log; /** * This class contains informations on a jabber contact. @@ -12,140 +17,179 @@ */ public class Contact implements Parcelable { - public static final int CONTACT_STATUS_DISCONNECT = 100; - public static final int CONTACT_STATUS_UNAVAILABLE = 200; - public static final int CONTACT_STATUS_AWAY = 300; - public static final int CONTACT_STATUS_BUSY = 400; - public static final int CONTACT_STATUS_AVAILABLE = 500; - public static final int CONTACT_STATUS_AVAILABLE_FOR_CHAT = 600; - - - /** - * Parcelable.Creator needs by Android. - */ - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public static final int CONTACT_STATUS_DISCONNECT = 100; + public static final int CONTACT_STATUS_UNAVAILABLE = 200; + public static final int CONTACT_STATUS_AWAY = 300; + public static final int CONTACT_STATUS_BUSY = 400; + public static final int CONTACT_STATUS_AVAILABLE = 500; + public static final int CONTACT_STATUS_AVAILABLE_FOR_CHAT = 600; + + + /** + * Parcelable.Creator needs by Android. + */ + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + + @Override + public Contact createFromParcel(Parcel source) { + return new Contact(source); + } + + @Override + public Contact[] newArray(int size) { + return new Contact[size]; + } + }; + private static final String TAG = "Contact"; + + private String mJID; + private int mID; + private int mStatus; + + /** + * @return the mID + */ + public int getID() { + return mID; + } - @Override - public Contact createFromParcel(Parcel source) { - return new Contact(source); + /** + * @param mid the mID to set + */ + public void setID(int mid) { + mID = mid; + } + + /** + * @return the mStatus + */ + public int getStatus() { + return mStatus; + } + + /** + * @param status the mStatus to set + */ + public void setStatus(int status) { + mStatus = status; + } + + /** + * @return the mMsgState + */ + public String getMMsgState() { + return mMsgState; + } + + /** + * @param msgState the mMsgState to set + */ + public void setMMsgState(String msgState) { + mMsgState = msgState; + } + + private String mMsgState; + + /** + * Constructor. + */ + public Contact() { + // TODO Auto-generated constructor stub } - @Override - public Contact[] newArray(int size) { - return new Contact[size]; + /** + * Constructor. + * @param jid JID of the contact + */ + public Contact(final String jid) { + mJID = jid; } - }; - - private String mJID; - private int mID; - private int mStatus; - /** - * @return the mID - */ - public int getID() { - return mID; - } - - /** - * @param mid the mID to set - */ - public void setID(int mid) { - mID = mid; - } + public Contact(RosterEntry entry, Presence presence) { + mJID = entry.getUser(); + Log.w(TAG, "Contact Name: " + entry.getUser()); + if (presence.getType().equals(Presence.Type.unavailable)) { + mStatus = Contact.CONTACT_STATUS_DISCONNECT; + Log.w(TAG, "Error while creating Contact"); + } else { + setStatus(presence.getMode()); + } + } - /** - * @return the mStatus - */ - public int getStatus() { - return mStatus; - } - - /** - * @param status the mStatus to set - */ - public void setStatus(int status) { - mStatus = status; - } - - /** - * @return the mMsgState - */ - public String getMMsgState() { - return mMsgState; - } - - /** - * @param msgState the mMsgState to set - */ - public void setMMsgState(String msgState) { - mMsgState = msgState; - } - - private String mMsgState; + /** + * @param status the XMPP presence mode + */ + public void setStatus(Mode mode) { + switch (mode) { + case available: + mStatus = Contact.CONTACT_STATUS_AVAILABLE; + break; + case away: + mStatus = Contact.CONTACT_STATUS_AWAY; + break; + case chat: + mStatus = Contact.CONTACT_STATUS_AVAILABLE_FOR_CHAT; + break; + case dnd: + mStatus = Contact.CONTACT_STATUS_BUSY; + break; + case xa: + mStatus = Contact.CONTACT_STATUS_UNAVAILABLE; + break; + default: + Log.e("RosterAdapter", "Status mode non gere"); + mStatus = Contact.CONTACT_STATUS_DISCONNECT; + break; + } + } - /** - * Constructor. - */ - public Contact() { - // TODO Auto-generated constructor stub - } + /** + * Construct a contact from a parcel. + * @param in parcel to use for construction + */ + private Contact(final Parcel in) { + mID = in.readInt(); + mStatus = in.readInt(); + mJID = in.readString(); + mMsgState = in.readString(); + } - /** - * Constructor. - * @param jid JID of the contact - */ - public Contact(final String jid) { - mJID = jid; - } - - /** - * Construct a contact from a parcel. - * @param in parcel to use for construction - */ - private Contact(final Parcel in) { - mID = in.readInt(); - mStatus = in.readInt(); - mJID = in.readString(); - mMsgState = in.readString(); - } + /** + * {@inheritDoc} + */ + @Override + public void writeToParcel(Parcel dest, int flags) { + // TODO Auto-generated method stub + dest.writeInt(mID); + dest.writeInt(mStatus); + dest.writeString(mJID); + dest.writeString(mMsgState); + } - /** - * {@inheritDoc} - */ - @Override - public void writeToParcel(Parcel dest, int flags) { - // TODO Auto-generated method stub - dest.writeInt(mID); - dest.writeInt(mStatus); - dest.writeString(mJID); - dest.writeString(mMsgState); - } + /** + * Get the Jabber ID of the contact. + * @return the Jabber ID + */ + public String getJID() { + return mJID; + } - /** - * Get the Jabber ID of the contact. - * @return the Jabber ID - */ - public String getJID() { - return mJID; - } + /** + * Set the Jabber ID of the contact. + * @param mjid the jabber ID to set + */ + public void setJID(String mjid) { + mJID = mjid; + } - /** - * Set the Jabber ID of the contact. - * @param mjid the jabber ID to set - */ - public void setJID(String mjid) { - mJID = mjid; - } - - /** - * {@inheritDoc} - */ - @Override - public int describeContents() { - // TODO Auto-generated method stub - return 0; - } + /** + * {@inheritDoc} + */ + @Override + public int describeContents() { + // TODO Auto-generated method stub + return 0; + } } diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/service/RosterAdapter.java --- a/src/com/beem/project/beem/service/RosterAdapter.java Sat Apr 04 08:41:51 2009 +0200 +++ b/src/com/beem/project/beem/service/RosterAdapter.java Sat Apr 04 09:59:40 2009 +0200 @@ -46,7 +46,7 @@ for (RosterEntry entry : roster.getEntries()) { String user = entry.getUser(); if ( !mContacts.containsKey(user)) - mContacts.put(user, new Contact(user)); + mContacts.put(user, new Contact(entry, roster.getPresence(user))); } } @@ -164,20 +164,20 @@ @Override public void presenceChanged(Presence presence) { - + Log.w(TAG, "Changement de Presence"); /* gestion du roster coter service */ String user = presence.getFrom(); - Presence bestPresence = mAdaptee.getPresence(user); + //Presence bestPresence = mAdaptee.getPresence(user); Contact c = mContacts.get(user); if (c == null) { c = new Contact(user); mContacts.put(user, c); } int status; - if (bestPresence.getType().equals(Presence.Type.unavailable)) + if (presence.getType().equals(Presence.Type.unavailable)) status = Contact.CONTACT_STATUS_DISCONNECT; else { - switch (bestPresence.getMode()) { + switch (presence.getMode()) { case available: status = Contact.CONTACT_STATUS_AVAILABLE; break; diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/service/XMPPConnectionAdapter.java --- a/src/com/beem/project/beem/service/XMPPConnectionAdapter.java Sat Apr 04 08:41:51 2009 +0200 +++ b/src/com/beem/project/beem/service/XMPPConnectionAdapter.java Sat Apr 04 09:59:40 2009 +0200 @@ -56,7 +56,9 @@ * @param password password to use on connect */ public XMPPConnectionAdapter(final String serviceName, final String login, final String password) { + this(new XMPPConnection(serviceName), login, password); + XMPPConnection.DEBUG_ENABLED = true; } /** @@ -80,7 +82,7 @@ mAdaptee.login(mLogin, mPassword, "BEEM"); mChatManager = new BeemChatManager(mAdaptee.getChatManager()); // TODO find why this cause a null pointer exception - this.initFeatures(); // pour declarer les features xmpp qu'on supporte + //this.initFeatures(); // pour declarer les features xmpp qu'on supporte mLastException = null; triggerAsynchronousConnectEvent(); return true; @@ -308,5 +310,10 @@ } mRemoteConnListeners.finishBroadcast(); } + } + public boolean isAuthentificated() throws RemoteException { + return mAdaptee.isAuthenticated(); + } + } diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/service/XMPPFacade.java --- a/src/com/beem/project/beem/service/XMPPFacade.java Sat Apr 04 08:41:51 2009 +0200 +++ b/src/com/beem/project/beem/service/XMPPFacade.java Sat Apr 04 09:59:40 2009 +0200 @@ -27,7 +27,6 @@ */ @Override public void connectAsync() throws RemoteException { - // TODO Auto-generated method stub mConnexion.connectAsync(); } @@ -36,7 +35,6 @@ */ @Override public void connectSync() throws RemoteException { - // TODO Auto-generated method stub mConnexion.connectSync(); } @@ -45,7 +43,6 @@ */ @Override public IXmppConnection createConnection() throws RemoteException { - // TODO Auto-generated method stub return mConnexion; } @@ -54,7 +51,6 @@ */ @Override public void disconnect() throws RemoteException { - // TODO Auto-generated method stub mConnexion.disconnect(); } diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/service/aidl/IXmppConnection.aidl --- a/src/com/beem/project/beem/service/aidl/IXmppConnection.aidl Sat Apr 04 08:41:51 2009 +0200 +++ b/src/com/beem/project/beem/service/aidl/IXmppConnection.aidl Sat Apr 04 09:59:40 2009 +0200 @@ -17,5 +17,7 @@ void addConnectionListener(in IBeemConnectionListener listen); void removeConnectionListener(in IBeemConnectionListener listen); + boolean isAuthentificated(); + IChatManager getChatManager(); } \ No newline at end of file diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/ui/Beem.java --- a/src/com/beem/project/beem/ui/Beem.java Sat Apr 04 08:41:51 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -package com.beem.project.beem.ui; - -import android.app.Activity; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.os.Handler; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; - -import com.beem.project.beem.BeemApplication; -import com.beem.project.beem.R; - -/** - * La principale activite to be continuous. - */ -public class Beem extends Activity { - - private SharedPreferences mSettings; - private BeemDialogSettings mDialog; - private Button mButton; - private Handler mHandler; - private BeemApplication mBeemApplication; - - /** - * Default constructor. - */ - public Beem() { - super(); - mHandler = new Handler(); - } - - /** - * Called when the activity is first created. - * @param savedInstanceState - * previous state. - */ - @Override - public final void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mBeemApplication = BeemApplication.getApplication(this); - setContentView(R.layout.beem); - mSettings = getSharedPreferences( - getString(R.string.PreferenceFileName), MODE_PRIVATE); - mDialog = new BeemDialogSettings(this, mSettings); - - mButton = (Button) findViewById(R.id.connection); - mButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if (mButton.getText() == getString(R.string.BeemCreateAccount)) - mDialog.show(); - else - startActivity(new Intent(Beem.this, ContactList.class)); - } - }); - showJID(); - } - - /** - * Callback for menu creation. - * @param menu - * the menu created - * @return true on success, false otherwise - */ - @Override - public final boolean onCreateOptionsMenu(Menu menu) { - super.onCreateOptionsMenu(menu); - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.beemmenu, menu); - return true; - } - - /** - * Callback for menu item selected. - * @param item - * the item selected - * @return true on success, false otherwise - */ - @Override - public final boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.account_edit: - mDialog.show(); - return true; - case R.id.account_about: - return true; - default: - return false; - } - } - - /** - * Show jabber id in button. - */ - public final void showJID() { - String jid = mSettings.getString( - getString(R.string.PreferenceLoginKey), "") - + "@" - + mSettings - .getString(getString(R.string.PreferenceHostKey), ""); - if (jid.length() == 1) - jid = getString(R.string.BeemCreateAccount); - mButton.setText(jid); - } - -} diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/ui/BeemDialogSettings.java --- a/src/com/beem/project/beem/ui/BeemDialogSettings.java Sat Apr 04 08:41:51 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -package com.beem.project.beem.ui; - -import android.app.Dialog; -import android.content.Context; -import android.content.SharedPreferences; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; - -import com.beem.project.beem.R; - -/** - * - */ -public class BeemDialogSettings extends Dialog implements - android.view.View.OnClickListener { - - private Beem mbeem; - - private SharedPreferences mSettings; - - public BeemDialogSettings(Beem beem, SharedPreferences settings) { - super(beem); - this.mbeem = beem; - this.mSettings = settings; - } - - @Override - protected void onStart() { - super.onStart(); - setContentView(R.layout.beemdialogsettings); - getWindow().setFlags(4, 4); - setTitle("Jabber Account Settings"); - showSettings(); - Button ok = (Button) findViewById(R.id.ok); - ok.setOnClickListener(this); - } - - @Override - public void onClick(View v) { - SharedPreferences.Editor editor = mSettings.edit(); - Context ctx = getContext(); - editor.putString(ctx.getString(R.string.PreferenceHostKey), - getWidgetText(R.id.host)); - editor.putString(ctx.getString(R.string.PreferencePortKey), - getWidgetText(R.id.port)); - editor.putString(ctx.getString(R.string.PreferenceLoginKey), - getWidgetText(R.id.userid)); - editor.putString(ctx.getString(R.string.PreferencePasswordKey), - getWidgetText(R.id.password)); - editor.commit(); - this.mbeem.showJID(); - dismiss(); - } - - private void showSettings() { - String tmp; - EditText eHost = (EditText) findViewById(R.id.host); - if ((tmp = mSettings.getString("host", "")) != "") - eHost.setText(tmp); - EditText ePort = (EditText) findViewById(R.id.port); - if ((tmp = mSettings.getString("port", "")) != "") - ePort.setText(tmp); - EditText eLogin = (EditText) findViewById(R.id.userid); - if ((tmp = mSettings.getString("login", "")) != "") - eLogin.setText(tmp); - EditText ePwd = (EditText) findViewById(R.id.password); - if ((tmp = mSettings.getString("password", "")) != "") - ePwd.setText(tmp); - } - - private String getWidgetText(int id) { - EditText widget = (EditText) this.findViewById(id); - return widget.getText().toString(); - } -} diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/ui/ContactList.java --- a/src/com/beem/project/beem/ui/ContactList.java Sat Apr 04 08:41:51 2009 +0200 +++ b/src/com/beem/project/beem/ui/ContactList.java Sat Apr 04 09:59:40 2009 +0200 @@ -4,14 +4,20 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + import android.app.ExpandableListActivity; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ExpandableListAdapter; @@ -19,95 +25,195 @@ import android.widget.ImageView; import android.widget.SimpleExpandableListAdapter; import android.widget.TextView; + import com.beem.project.beem.BeemApplication; import com.beem.project.beem.R; import com.beem.project.beem.service.Contact; +import com.beem.project.beem.service.aidl.IRoster; import com.beem.project.beem.service.aidl.IXMPPFacade; public class ContactList extends ExpandableListActivity { private static final String TAG = "CONTACTLIST_ACT"; + private SharedPreferences mSettings; private IXMPPFacade mService = null; private Handler mHandler; private BeemApplication mBeemApplication; + private ContactListDialogSettings mDialog; + + @SuppressWarnings("unchecked") + @Override + public boolean onChildClick(ExpandableListView parent, View v, + int groupPosition, int childPosition, long id) { + Intent i = new Intent(this, SendIM.class); + Map child = (HashMap) parent + .getExpandableListAdapter().getChild(groupPosition, + childPosition); + i.putExtra("contact", child.values().toArray()); + startActivity(i); + return true; + } @Override - public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { - startActivity(new Intent(this, SendIM.class)); - return true; - - }; - - @Override - public void onCreate(Bundle saveBundle) { + protected void onCreate(Bundle saveBundle) { super.onCreate(saveBundle); mHandler = new Handler(); mBeemApplication = BeemApplication.getApplication(this); + mSettings = getSharedPreferences( + getString(R.string.PreferenceFileName), MODE_PRIVATE); + mDialog = new ContactListDialogSettings(this, mSettings); + + mSettings + .registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged( + SharedPreferences sharedPreferences, String key) { + /* + * TODO : A faire apres listener nikita + * + * mBeemApplication.stopBeemService(); + * mBeemApplication.startBeemService(); + * mBeemApplication.callWhenServiceConnected(mHandler, + * new Runnable() { + * + * @Override public void run() { + * callbackShowContactList(); } }); + */ + } + }); } @Override - public void onStart() { + protected void onStart() { super.onStart(); - mBeemApplication.startBeemService(); + Log.i(TAG, "onStart"); + } + + @Override + protected void onResume() { + super.onResume(); + /* + * @TODO: A ameliorer apres listener de nikita + */ + Log.i(TAG, "onResume"); + if (!mBeemApplication.isConnected()) + mBeemApplication.startBeemService(); + else { + callbackShowContactList(); + } mBeemApplication.callWhenServiceConnected(mHandler, new Runnable() { @Override public void run() { - mService = mBeemApplication.getXmppFacade(); - try { - showContactList(mService.getRoster().getContactList(), mService.getRoster().getContactList()); - } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - + callbackShowContactList(); } }); } - private void showContactList(List listGroup, List listContact) { + private void callbackShowContactList() { + /* + * @TODO: A ameliorer apres listener de nikita + */ + mService = mBeemApplication.getXmppFacade(); + if (mService != null) { + try { + IRoster r = mService.getRoster(); + if (r != null) + showContactList(r.getGroupsNames(), r.getContactList()); + } catch (RemoteException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + /** + * Callback for menu creation. + * + * @param menu + * the menu created + * @return true on success, false otherwise + */ + @Override + public final boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.contactlistmenu, menu); + return true; + } + + /** + * Callback for menu item selected. + * + * @param item + * the item selected + * @return true on success, false otherwise + */ + @Override + public final boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.account_edit: + mDialog.show(); + return true; + case R.id.account_about: + return true; + default: + return false; + } + } + + private void showContactList(List listGroup, + List listContact) { ExpandableListAdapter Adapter; List> groupData = new ArrayList>(); - List>> childData = new ArrayList>>(); + List>> childData = new ArrayList>>(); if (listGroup.size() == 0) - listGroup.add(new Contact()); + listGroup.add("Default"); for (int i = 0; i < listGroup.size(); i++) { Map curGroupMap = new HashMap(); groupData.add(curGroupMap); - curGroupMap.put("NAME", "Default"); + curGroupMap.put("GROUP", listGroup.get(i)); - List> children = new ArrayList>(); + List> children = new ArrayList>(); for (int j = 0; j < listContact.size(); ++j) { - Map curChildMap = new HashMap(); + Map curChildMap = new HashMap(); children.add(curChildMap); - curChildMap.put("NAME_CHILD", listContact.get(j).getJID()); - curChildMap.put("MSG", "Taper votre message perso"); + Contact c = listContact.get(j); + curChildMap.put("CHILD", c); } childData.add(children); } - Adapter = new ContactExpandableListAdapter(this, groupData, R.layout.contactlistgroup, new String[] { "NAME" }, - new int[] { R.id.textgroup }, childData, R.layout.contactlistcontact, new String[] { "NAME_CHILD", "MSG" }, - new int[] { R.id.textchild1, R.id.textchild2, R.id.avatar }); + Adapter = new ContactExpandableListAdapter(this, groupData, + R.layout.contactlistgroup, new String[] { "GROUP" }, + new int[] { R.id.textgroup }, childData, + R.layout.contactlistcontact, new String[] { "CHILD" }, + new int[] { R.id.contactliststatus, R.id.contactlistpseudo, + R.id.contactlistmsgperso, R.id.contactlistavatar }); setListAdapter(Adapter); } /** - * A simple adapter which allows you to bind data to specific Views defined within the layout of an Expandable Lists - * children (Implement getGroupView() to define the layout of parents) + * A simple adapter which allows you to bind data to specific Views defined + * within the layout of an Expandable Lists children (Implement + * getGroupView() to define the layout of parents) */ - public class ContactExpandableListAdapter extends SimpleExpandableListAdapter { + private class ContactExpandableListAdapter extends + SimpleExpandableListAdapter { private List>> mChildData; private String[] mChildFrom; private int[] mChildTo; - public ContactExpandableListAdapter(Context context, List> groupData, int groupLayout, - String[] groupFrom, int[] groupTo, List>> childData, - int childLayout, String[] childFrom, int[] childTo) { - super(context, groupData, groupLayout, groupFrom, groupTo, childData, childLayout, childFrom, childTo); + public ContactExpandableListAdapter(Context context, + List> groupData, int groupLayout, + String[] groupFrom, int[] groupTo, + List>> childData, + int childLayout, String[] childFrom, int[] childTo) { + super(context, groupData, groupLayout, groupFrom, groupTo, + childData, childLayout, childFrom, childTo); mChildData = childData; mChildFrom = childFrom; @@ -116,8 +222,8 @@ } @Override - public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, - ViewGroup parent) { + public View getChildView(int groupPosition, int childPosition, + boolean isLastChild, View convertView, ViewGroup parent) { View v; if (convertView == null) { @@ -125,33 +231,67 @@ } else { v = convertView; } - bindView(v, mChildData.get(groupPosition).get(childPosition), mChildFrom, mChildTo, groupPosition, - childPosition); + bindView(v, mChildData.get(groupPosition).get(childPosition), + mChildFrom, mChildTo, groupPosition, childPosition); return v; } - // This method binds my data to the Views specified in the child - // xmllayout - private void bindView(View view, Map data, String[] from, int[] to, int groupPosition, - int childPosition) { - // Apply TextViews - TextView v1 = (TextView) view.findViewById(to[0]); - if (v1 != null) { - Log.i("CONTACT LIST 1", (String) data.get(from[0]) + " " + to[0]); - v1.setText((String) data.get(from[0])); - } - TextView v2 = (TextView) view.findViewById(to[1]); - if (v2 != null) { - Log.i("CONTACT LIST 2", (String) data.get(from[1]) + " " + to[1]); - v2.setText((String) data.get(from[1])); - } - // Apply ImageView - ImageView imgV = (ImageView) view.findViewById(to[2]); - if (imgV != null) { - Drawable avatar = (Drawable) getResources().getDrawable(R.drawable.avatar); - imgV.setImageDrawable(avatar); + private void bindView(View view, Map data, String[] from, + int[] to, int groupPosition, int childPosition) { + Contact c = (Contact) data.get(from[0]); + + if (c != null) { + + ImageView imgV = (ImageView) view.findViewById(to[0]); + Drawable imageDrawable = null; + switch (c.getStatus()) { + case Contact.CONTACT_STATUS_AVAILABLE: + imageDrawable = (Drawable) getResources().getDrawable( + R.drawable.avatar); + case Contact.CONTACT_STATUS_AVAILABLE_FOR_CHAT: + imageDrawable = (Drawable) getResources().getDrawable( + R.drawable.chat); + case Contact.CONTACT_STATUS_AWAY: + imageDrawable = (Drawable) getResources().getDrawable( + R.drawable.away); + case Contact.CONTACT_STATUS_BUSY: + imageDrawable = (Drawable) getResources().getDrawable( + R.drawable.dnd); + case Contact.CONTACT_STATUS_DISCONNECT: + imageDrawable = (Drawable) getResources().getDrawable( + R.drawable.offline); + case Contact.CONTACT_STATUS_UNAVAILABLE: + imageDrawable = (Drawable) getResources().getDrawable( + R.drawable.requested); + default: + imageDrawable = (Drawable) getResources().getDrawable( + R.drawable.error); + } + imgV.setImageDrawable(imageDrawable); + + TextView v = (TextView) view.findViewById(to[1]); + if (v != null) { + v.setText(c.getJID()); + } + /* + * @TODO: Rajouter le message perso du contact v = (TextView) + */ + v = (TextView) view.findViewById(to[2]); + if (v != null) { + v.setText(c.getMMsgState()); + } + + /* + * @TODO: Rajouter l'avatar du contact getAvatar() dans la + * classe + */ + imgV = (ImageView) view.findViewById(to[3]); + if (imgV != null) { + imageDrawable = (Drawable) getResources().getDrawable( + R.drawable.avatar); + imgV.setImageDrawable(imageDrawable); + } } } } - -} +} \ No newline at end of file diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/ui/ContactListDialogSettings.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/com/beem/project/beem/ui/ContactListDialogSettings.java Sat Apr 04 09:59:40 2009 +0200 @@ -0,0 +1,81 @@ +package com.beem.project.beem.ui; + +import android.app.Dialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.RemoteException; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; + +import com.beem.project.beem.BeemApplication; +import com.beem.project.beem.R; + +/** + * + */ +public class ContactListDialogSettings extends Dialog implements + android.view.View.OnClickListener { + + private SharedPreferences mSettings; + private ContactList mContactList; + + public ContactListDialogSettings(ContactList contactList, + SharedPreferences settings) { + super(contactList); + this.mContactList = contactList; + this.mSettings = settings; + } + + @Override + protected void onStart() { + super.onStart(); + setContentView(R.layout.contactlistdialogsettings); + getWindow().setFlags(4, 4); + setTitle("Jabber Account Settings"); + showSettings(); + Button ok = (Button) findViewById(R.id.ok); + ok.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + SharedPreferences.Editor editor = mSettings.edit(); + Context ctx = getContext(); + editor.putString(ctx.getString(R.string.PreferenceHostKey), + getWidgetText(R.id.host)); + editor.putString(ctx.getString(R.string.PreferencePortKey), + getWidgetText(R.id.port)); + editor.putString(ctx.getString(R.string.PreferenceLoginKey), + getWidgetText(R.id.userid)); + editor.putString(ctx.getString(R.string.PreferencePasswordKey), + getWidgetText(R.id.password)); + String JID = ctx.getString(R.string.PreferenceLoginKey) + "@" + + ctx.getString(R.string.PreferenceHostKey); + editor.putString(ctx.getString(R.string.PreferenceJID), JID); + editor.commit(); + dismiss(); + } + + private void showSettings() { + Context ctx = getContext(); + EditText e = (EditText) findViewById(R.id.host); + e.setText(mSettings.getString( + ctx.getString(R.string.PreferenceHostKey), "")); + e = (EditText) findViewById(R.id.port); + e.setText(mSettings.getString( + ctx.getString(R.string.PreferencePortKey), "")); + e = (EditText) findViewById(R.id.userid); + e.setText(mSettings.getString(ctx + .getString(R.string.PreferenceLoginKey), "")); + e = (EditText) findViewById(R.id.password); + e.setText(mSettings.getString(ctx + .getString(R.string.PreferencePasswordKey), "")); + } + + private String getWidgetText(int id) { + EditText widget = (EditText) this.findViewById(id); + return widget.getText().toString(); + } +} diff -r 41ceca987a6c -r fcafa1e28942 src/com/beem/project/beem/ui/SendIM.java --- a/src/com/beem/project/beem/ui/SendIM.java Sat Apr 04 08:41:51 2009 +0200 +++ b/src/com/beem/project/beem/ui/SendIM.java Sat Apr 04 09:59:40 2009 +0200 @@ -5,6 +5,7 @@ import android.app.ListActivity; import android.content.SharedPreferences; import android.os.Bundle; +import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; @@ -16,107 +17,120 @@ import android.widget.EditText; import com.beem.project.beem.R; +import com.beem.project.beem.service.Contact; /** - * @author barbu - * This activity class provide the view for instant messaging - * after selecting a correspondant. + * @author barbu This activity class provide the view for instant messaging + * after selecting a correspondant. */ -public class SendIM extends ListActivity implements OnClickListener, OnKeyListener { - private EditText mToSend; - private ArrayList mMessages = new ArrayList(); - private ArrayAdapter mAdapter; - private SendIMDialogSmiley mSmyDialog; - private SharedPreferences mSet; +public class SendIM extends ListActivity implements OnClickListener, + OnKeyListener { + private EditText mToSend; + private ArrayList mMessages = new ArrayList(); + private ArrayAdapter mAdapter; + private SendIMDialogSmiley mSmyDialog; + private SharedPreferences mSet; + private Contact mContact; - /** - * Constructor. - */ - public SendIM() { - super(); - } + /** + * Constructor. + */ + public SendIM() { + super(); + } - /** - * Overload of onCreate() Activity inherited function - */ - @Override - public void onCreate(Bundle saveBundle) { - super.onCreate(saveBundle); - setContentView(R.layout.sendim); - mToSend = (EditText) findViewById(R.id.userText); - mSet = getSharedPreferences("lol", MODE_PRIVATE); - mSmyDialog = new SendIMDialogSmiley(this, mSet); + /** + * Overload of onCreate() Activity inherited function + */ + @Override + public void onCreate(Bundle saveBundle) { + super.onCreate(saveBundle); + + setContentView(R.layout.sendim); + mToSend = (EditText) findViewById(R.id.userText); + mSet = getSharedPreferences("lol", MODE_PRIVATE); + mSmyDialog = new SendIMDialogSmiley(this, mSet); - mAdapter = new ArrayAdapter(this, R.layout.messagelist, mMessages); - setListAdapter(mAdapter); - - mToSend.setOnClickListener(this); - mToSend.setOnKeyListener(this); - } + mAdapter = new ArrayAdapter(this, R.layout.messagelist, + mMessages); + setListAdapter(mAdapter); - /** - * Abstract method inherited from OnClickListener - */ - public void onClick(View view) { - sendText(); - } + mToSend.setOnClickListener(this); + mToSend.setOnKeyListener(this); + + mContact = getIntent().getParcelableExtra("contact"); + } - /** - * This method send a message to the server over the XMPP - * connection and display it on activity view - * TODO : Exception si la connexion se coupe pendant la conversation - */ - private void sendText() { - String text = mToSend.getText().toString(); - if (!text.equals("")) { - /* - * Prepare the message to be send - * */ - /*Message msg = new Message("barbu", Message.Type.chat);*/ - /*msg.setBody(text);*/ - mAdapter.add("Barbu " + getString(R.string.SendIMSays) + text); - mToSend.setText(null); + @Override + public void onStart() { + super.onStart(); + } - } + + /** + * Abstract method inherited from OnClickListener + */ + public void onClick(View view) { + sendText(); + } - /** - * Abstract method inherited from OnKeyListener - */ - 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; - } + /** + * This method send a message to the server over the XMPP connection and + * display it on activity view TODO : Exception si la connexion se coupe + * pendant la conversation + */ + private void sendText() { + String text = mToSend.getText().toString(); + if (!text.equals("")) { + /* + * Prepare the message to be send + */ + /* Message msg = new Message("barbu", Message.Type.chat); */ + /* msg.setBody(text); */ + mAdapter.add(getString(R.string.PreferenceJID) + " " + getString(R.string.SendIMSays) + text); + mToSend.setText(null); + } } - return false; - } - - /** - * Callback for menu creation. - * @param menu - * the menu created - * @return true on success, false otherwise - */ - @Override - public final boolean onCreateOptionsMenu(Menu menu) { - super.onCreateOptionsMenu(menu); - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.sendimmenu, menu); - return true; - } - - @Override - public final boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.sendim_smiley: - mSmyDialog.show(); - return true; - default: + + /** + * Abstract method inherited from OnKeyListener + */ + 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; + } + } return false; } - } + + /** + * Callback for menu creation. + * + * @param menu + * the menu created + * @return true on success, false otherwise + */ + @Override + public final boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.sendimmenu, menu); + return true; + } + + @Override + public final boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.sendim_smiley: + mSmyDialog.show(); + return true; + default: + return false; + } + } }