Debut multi account
author"Vincent Veronis"
Sat, 19 Mar 2011 20:04:33 +0100
changeset 872 11a7b9c1c500
parent 871 be08c9157636
child 873 cdf001e43dce
Debut multi account
AndroidManifest.xml
res/xml/authenticator.xml
src/com/beem/project/beem/BeemService.java
--- a/AndroidManifest.xml	Sat Mar 19 19:31:31 2011 +0100
+++ b/AndroidManifest.xml	Sat Mar 19 20:04:33 2011 +0100
@@ -76,10 +76,9 @@
 			android:name="android.intent.action.BOOT_COMPLETED" />
 			</intent-filter> </receiver>
 		-->
-	<provider android:name=".providers.AvatarProvider"
-		    android:authorities="com.beem.project.beem.providers.avatarprovider"
-		    android:exported="false" />
-
+		<provider android:name=".providers.AvatarProvider"
+			android:authorities="com.beem.project.beem.providers.avatarprovider"
+			android:exported="false" />
 		<service android:name=".account.AuthenticatorService"
 			android:exported="true" android:process=":auth">
 			<intent-filter>
@@ -110,4 +109,4 @@
 	<supports-screens android:largeScreens="true"
 		android:normalScreens="true" android:smallScreens="true"
 		android:anyDensity="true" />
-</manifest>
+</manifest>
\ No newline at end of file
--- a/res/xml/authenticator.xml	Sat Mar 19 19:31:31 2011 +0100
+++ b/res/xml/authenticator.xml	Sat Mar 19 20:04:33 2011 +0100
@@ -4,5 +4,6 @@
 	android:accountType="com.beem.project.com"
 	android:icon="@drawable/beem_launcher_icon_silver"
 	android:smallIcon="@drawable/beem_status_icon"
-	android:label="@string/app_name"
-	android:accountPreferences="@xml/preferences" />
\ No newline at end of file
+	android:label="@string/app_name" />
+<!--	android:accountPreferences="@xml/preferences" -->
+	
\ No newline at end of file
--- a/src/com/beem/project/beem/BeemService.java	Sat Mar 19 19:31:31 2011 +0100
+++ b/src/com/beem/project/beem/BeemService.java	Sat Mar 19 20:04:33 2011 +0100
@@ -40,26 +40,29 @@
     Flavien Astraud, November 26, 2009
     Head of the EIP Laboratory.
 
-*/
+ */
 package com.beem.project.beem;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.jivesoftware.smack.ConnectionConfiguration;
 import org.jivesoftware.smack.Roster;
 import org.jivesoftware.smack.XMPPConnection;
 import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
 import org.jivesoftware.smack.Roster.SubscriptionMode;
 import org.jivesoftware.smack.provider.ProviderManager;
+import org.jivesoftware.smack.proxy.ProxyInfo;
+import org.jivesoftware.smack.proxy.ProxyInfo.ProxyType;
+import org.jivesoftware.smack.util.StringUtils;
+import org.jivesoftware.smackx.packet.ChatStateExtension;
 import org.jivesoftware.smackx.provider.DelayInfoProvider;
 import org.jivesoftware.smackx.provider.DiscoverInfoProvider;
 import org.jivesoftware.smackx.provider.DiscoverItemsProvider;
-import org.jivesoftware.smackx.packet.ChatStateExtension;
-import org.jivesoftware.smack.proxy.ProxyInfo;
-import org.jivesoftware.smack.proxy.ProxyInfo.ProxyType;
-import org.jivesoftware.smack.util.StringUtils;
+import org.jivesoftware.smackx.pubsub.provider.EventProvider;
+import org.jivesoftware.smackx.pubsub.provider.ItemProvider;
+import org.jivesoftware.smackx.pubsub.provider.ItemsProvider;
 import org.jivesoftware.smackx.pubsub.provider.PubSubProvider;
-import org.jivesoftware.smackx.pubsub.provider.ItemsProvider;
-import org.jivesoftware.smackx.pubsub.provider.ItemProvider;
-import org.jivesoftware.smackx.pubsub.provider.EventProvider;
 
 import android.app.Notification;
 import android.app.NotificationManager;
@@ -80,18 +83,16 @@
 import com.beem.project.beem.service.XmppConnectionAdapter;
 import com.beem.project.beem.service.XmppFacade;
 import com.beem.project.beem.service.aidl.IXmppFacade;
-import com.beem.project.beem.utils.BeemBroadcastReceiver;
-import com.beem.project.beem.utils.BeemConnectivity;
-import com.beem.project.beem.utils.Status;
 import com.beem.project.beem.smack.avatar.AvatarMetadataProvider;
 import com.beem.project.beem.smack.avatar.AvatarProvider;
 import com.beem.project.beem.smack.caps.CapsProvider;
+import com.beem.project.beem.utils.BeemBroadcastReceiver;
+import com.beem.project.beem.utils.BeemConnectivity;
+import com.beem.project.beem.utils.Status;
 
 /**
- * This class is for the Beem service.
- * It must contains every global informations needed to maintain the background service.
- * The connection to the xmpp server will be made asynchronously when the service
- * will start.
+ * This class is for the Beem service. It must contains every global informations needed to maintain the background
+ * service. The connection to the xmpp server will be made asynchronously when the service will start.
  * @author darisk
  */
 public class BeemService extends Service {
@@ -104,7 +105,7 @@
     //private static final String COMMAND_NAMESPACE = "http://jabber.org/protocol/commands";
 
     private NotificationManager mNotificationManager;
-    private XmppConnectionAdapter mConnection;
+    private List<XmppConnectionAdapter> mConnection = new ArrayList<XmppConnectionAdapter>();
     private SharedPreferences mSettings;
     private String mLogin;
     private String mPassword;
@@ -114,7 +115,7 @@
     private ConnectionConfiguration mConnectionConfiguration;
     private ProxyInfo mProxyInfo;
     private boolean mUseProxy;
-    private IXmppFacade.Stub mBind;
+    private ArrayList<XmppFacade> mBind = new ArrayList<XmppFacade>();
 
     private BeemBroadcastReceiver mReceiver = new BeemBroadcastReceiver();
     private BeemServiceBroadcastReceiver mOnOffReceiver = new BeemServiceBroadcastReceiver();
@@ -167,19 +168,24 @@
     @Override
     public IBinder onBind(Intent intent) {
 	Log.d(TAG, "ONBIND()");
-	return mBind;
+	//TODO: Prendre le bon mbind dans le tableau
+	return mBind.get(0);
     }
 
     @Override
     public boolean onUnbind(Intent intent) {
 	Log.d(TAG, "ONUNBIND()");
-	if (!mConnection.getAdaptee().isConnected()) {
+	boolean isConnected = true;
+	for (XmppConnectionAdapter connection : mConnection) {
+	    if (!connection.getAdaptee().isConnected())
+		isConnected = false;
+	}
+	if (!isConnected) {
 	    this.stopSelf();
 	}
 	return true;
     }
 
-
     /**
      * {@inheritDoc}
      */
@@ -208,8 +214,8 @@
 	    String tmpPort = mSettings.getString("settings_key_xmpp_port", "5222");
 	    mPort = ("".equals(tmpPort)) ? DEFAULT_XMPP_PORT : Integer.parseInt(tmpPort);
 	}
-	if (mSettings.getBoolean(BeemApplication.FULL_JID_LOGIN_KEY, false) ||
-	    "gmail.com".equals(mService) || "googlemail.com".equals(mService))  {
+	if (mSettings.getBoolean(BeemApplication.FULL_JID_LOGIN_KEY, false) || "gmail.com".equals(mService)
+	    || "googlemail.com".equals(mService)) {
 	    mLogin = tmpJid;
 	}
 
@@ -217,10 +223,13 @@
 	configure(ProviderManager.getInstance());
 
 	mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
-	mConnection = new XmppConnectionAdapter(mConnectionConfiguration, mLogin, mPassword, this);
+	//TODO: Faire la liste des accounts et ajouter leur connection
+	mConnection.add(new XmppConnectionAdapter(mConnectionConfiguration, mLogin, mPassword, this));
 
 	Roster.setDefaultSubscriptionMode(SubscriptionMode.manual);
-	mBind = new XmppFacade(mConnection);
+
+	for (XmppConnectionAdapter connection : mConnection)
+	    mBind.add(new XmppFacade(connection));
 	Log.d(TAG, "ONCREATE");
     }
 
@@ -235,8 +244,10 @@
 	mSettings.unregisterOnSharedPreferenceChangeListener(mPreferenceListener);
 	if (mOnOffReceiverIsRegistered)
 	    unregisterReceiver(mOnOffReceiver);
-	if (mConnection.isAuthentificated() && BeemConnectivity.isConnected(this))
-	    mConnection.disconnect();
+	for (XmppConnectionAdapter connection : mConnection) {
+	    if (connection.isAuthentificated() && BeemConnectivity.isConnected(this))
+		connection.disconnect();
+	}
 	Log.d(TAG, "ONDESTROY");
     }
 
@@ -248,7 +259,8 @@
 	super.onStart(intent, startId);
 	Log.d(TAG, "onStart");
 	try {
-	    mConnection.connectAsync();
+	    for (XmppConnectionAdapter connection : mConnection)
+		connection.connectAsync();
 	} catch (RemoteException e) {
 	    e.printStackTrace();
 	}
@@ -297,7 +309,8 @@
      * @return IXmppFacade a bind to an XmppFacade instance
      */
     public IXmppFacade getBind() {
-	return mBind;
+	//TODO: Prendre le bon mbind dans le tableau
+	return mBind.get(0);
     }
 
     /**
@@ -310,7 +323,6 @@
 
     /**
      * Get the notification manager system service.
-     *
      * @return the notification manager service.
      */
     public NotificationManager getNotificationManager() {
@@ -342,8 +354,7 @@
 	// Chat State
 	ChatStateExtension.Provider chatState = new ChatStateExtension.Provider();
 	pm.addExtensionProvider("active", "http://jabber.org/protocol/chatstates", chatState);
-	pm.addExtensionProvider("composing", "http://jabber.org/protocol/chatstates",
-	    chatState);
+	pm.addExtensionProvider("composing", "http://jabber.org/protocol/chatstates", chatState);
 	pm.addExtensionProvider("paused", "http://jabber.org/protocol/chatstates", chatState);
 	pm.addExtensionProvider("inactive", "http://jabber.org/protocol/chatstates", chatState);
 	pm.addExtensionProvider("gone", "http://jabber.org/protocol/chatstates", chatState);
@@ -360,81 +371,51 @@
 	pm.addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", new EventProvider());
 	//TODO rajouter les manquants pour du full pubsub
 
-
 	//PEP avatar
 	pm.addExtensionProvider("metadata", "urn:xmpp:avatar:metadata", new AvatarMetadataProvider());
 	pm.addExtensionProvider("data", "urn:xmpp:avatar:data", new AvatarProvider());
 
-//         PEPProvider pep  = new PEPProvider();
-//         AvatarMetadataProvider avaMeta  = new AvatarMetadataProvider();
-//         pep.registerPEPParserExtension("urn:xmpp:avatar:metadata", avaMeta);
-//         pm.addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", pep);
+	//         PEPProvider pep  = new PEPProvider();
+	//         AvatarMetadataProvider avaMeta  = new AvatarMetadataProvider();
+	//         pep.registerPEPParserExtension("urn:xmpp:avatar:metadata", avaMeta);
+	//         pm.addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", pep);
 
 	/*
-	// Private Data Storage
-	pm.addIQProvider("query", "jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider());
-	// Time
-	try {
-	    pm.addIQProvider("query", "jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time"));
-	} catch (ClassNotFoundException e) {
-	    Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Time");
-	}
-	// Roster Exchange
-	pm.addExtensionProvider("x", "jabber:x:roster", new RosterExchangeProvider());
-	// Message Events
-	pm.addExtensionProvider("x", "jabber:x:event", new MessageEventProvider());
-	// XHTML
-	pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider());
-	// Group Chat Invitations
-	pm.addExtensionProvider("x", "jabber:x:conference", new GroupChatInvitation.Provider());
-	// Data Forms
-	pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
-	// MUC User
-	pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user", new MUCUserProvider());
-	// MUC Admin
-	pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin", new MUCAdminProvider());
-	// MUC Owner
-	pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner", new MUCOwnerProvider());
-	// Version
-	try {
-	    pm.addIQProvider("query", "jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version"));
-	} catch (ClassNotFoundException e) {
-	    // Not sure what's happening here.
-	    Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Version");
-	}
-	// VCard
-	pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());
-	// Offline Message Requests
-	pm.addIQProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider());
-	// Offline Message Indicator
-	pm.addExtensionProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider());
-	// Last Activity
-	pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());
-	// User Search
-	pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());
-	// SharedGroupsInfo
-	pm.addIQProvider("sharedgroup", "http://www.jivesoftware.org/protocol/sharedgroup",
-	    new SharedGroupsInfo.Provider());
-	// JEP-33: Extended Stanza Addressing
-	pm.addExtensionProvider("addresses", "http://jabber.org/protocol/address", new MultipleAddressesProvider());
-	// FileTransfer
-	pm.addIQProvider("si", "http://jabber.org/protocol/si", new StreamInitiationProvider());
-	pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams", new BytestreamsProvider());
-	pm.addIQProvider("open", "http://jabber.org/protocol/ibb", new IBBProviders.Open());
-	pm.addIQProvider("close", "http://jabber.org/protocol/ibb", new IBBProviders.Close());
-	pm.addExtensionProvider("data", "http://jabber.org/protocol/ibb", new IBBProviders.Data());
-
-	pm.addIQProvider("command", COMMAND_NAMESPACE, new AdHocCommandDataProvider());
-	pm.addExtensionProvider("malformed-action", COMMAND_NAMESPACE,
-	    new AdHocCommandDataProvider.MalformedActionError());
-	pm.addExtensionProvider("bad-locale", COMMAND_NAMESPACE,
-	    new AdHocCommandDataProvider.BadLocaleError());
-	pm.addExtensionProvider("bad-payload", COMMAND_NAMESPACE,
-	    new AdHocCommandDataProvider.BadPayloadError());
-	pm.addExtensionProvider("bad-sessionid", COMMAND_NAMESPACE,
-	    new AdHocCommandDataProvider.BadSessionIDError());
-	pm.addExtensionProvider("session-expired", COMMAND_NAMESPACE,
-	    new AdHocCommandDataProvider.SessionExpiredError());
+	 * // Private Data Storage pm.addIQProvider("query", "jabber:iq:private", new
+	 * PrivateDataManager.PrivateDataIQProvider()); // Time try { pm.addIQProvider("query", "jabber:iq:time",
+	 * Class.forName("org.jivesoftware.smackx.packet.Time")); } catch (ClassNotFoundException e) {
+	 * Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Time"); } // Roster Exchange
+	 * pm.addExtensionProvider("x", "jabber:x:roster", new RosterExchangeProvider()); // Message Events
+	 * pm.addExtensionProvider("x", "jabber:x:event", new MessageEventProvider()); // XHTML
+	 * pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider()); //
+	 * Group Chat Invitations pm.addExtensionProvider("x", "jabber:x:conference", new
+	 * GroupChatInvitation.Provider()); // Data Forms pm.addExtensionProvider("x", "jabber:x:data", new
+	 * DataFormProvider()); // MUC User pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user", new
+	 * MUCUserProvider()); // MUC Admin pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin", new
+	 * MUCAdminProvider()); // MUC Owner pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner", new
+	 * MUCOwnerProvider()); // Version try { pm.addIQProvider("query", "jabber:iq:version",
+	 * Class.forName("org.jivesoftware.smackx.packet.Version")); } catch (ClassNotFoundException e) { // Not sure
+	 * what's happening here. Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Version"); }
+	 * // VCard pm.addIQProvider("vCard", "vcard-temp", new VCardProvider()); // Offline Message Requests
+	 * pm.addIQProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider()); //
+	 * Offline Message Indicator pm.addExtensionProvider("offline", "http://jabber.org/protocol/offline", new
+	 * OfflineMessageInfo.Provider()); // Last Activity pm.addIQProvider("query", "jabber:iq:last", new
+	 * LastActivity.Provider()); // User Search pm.addIQProvider("query", "jabber:iq:search", new
+	 * UserSearch.Provider()); // SharedGroupsInfo pm.addIQProvider("sharedgroup",
+	 * "http://www.jivesoftware.org/protocol/sharedgroup", new SharedGroupsInfo.Provider()); // JEP-33: Extended
+	 * Stanza Addressing pm.addExtensionProvider("addresses", "http://jabber.org/protocol/address", new
+	 * MultipleAddressesProvider()); // FileTransfer pm.addIQProvider("si", "http://jabber.org/protocol/si", new
+	 * StreamInitiationProvider()); pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams", new
+	 * BytestreamsProvider()); pm.addIQProvider("open", "http://jabber.org/protocol/ibb", new IBBProviders.Open());
+	 * pm.addIQProvider("close", "http://jabber.org/protocol/ibb", new IBBProviders.Close());
+	 * pm.addExtensionProvider("data", "http://jabber.org/protocol/ibb", new IBBProviders.Data());
+	 * pm.addIQProvider("command", COMMAND_NAMESPACE, new AdHocCommandDataProvider());
+	 * pm.addExtensionProvider("malformed-action", COMMAND_NAMESPACE, new
+	 * AdHocCommandDataProvider.MalformedActionError()); pm.addExtensionProvider("bad-locale", COMMAND_NAMESPACE,
+	 * new AdHocCommandDataProvider.BadLocaleError()); pm.addExtensionProvider("bad-payload", COMMAND_NAMESPACE, new
+	 * AdHocCommandDataProvider.BadPayloadError()); pm.addExtensionProvider("bad-sessionid", COMMAND_NAMESPACE, new
+	 * AdHocCommandDataProvider.BadSessionIDError()); pm.addExtensionProvider("session-expired", COMMAND_NAMESPACE,
+	 * new AdHocCommandDataProvider.SessionExpiredError());
 	 */
     }
 
@@ -482,16 +463,19 @@
 	public void onReceive(final Context context, final Intent intent) {
 	    String intentAction = intent.getAction();
 	    if (intentAction.equals(Intent.ACTION_SCREEN_OFF)) {
-		mOldMode = mConnection.getPreviousMode();
-		mOldStatus = mConnection.getPreviousStatus();
-		if (mConnection.isAuthentificated())
-		    mConnection.changeStatus(Status.CONTACT_STATUS_AWAY,
-			    mSettings.getString("settings_away_message", "Away"));
+		for (XmppConnectionAdapter connection : mConnection) {
+		    mOldMode = connection.getPreviousMode();
+		    mOldStatus = connection.getPreviousStatus();
+		    if (connection.isAuthentificated())
+			connection.changeStatus(Status.CONTACT_STATUS_AWAY, mSettings.getString(
+			    "settings_away_message", "Away"));
+		}
 	    } else if (intentAction.equals(Intent.ACTION_SCREEN_ON)) {
-		if (mConnection.isAuthentificated())
-		    mConnection.changeStatus(mOldMode, mOldStatus);
+		for (XmppConnectionAdapter connection : mConnection) {
+		    if (connection.isAuthentificated())
+			connection.changeStatus(mOldMode, mOldStatus);
+		}
 	    }
 	}
     }
 }
-