--- a/AndroidManifest.xml Thu Dec 29 22:40:40 2011 +0100
+++ b/AndroidManifest.xml Thu Jan 05 22:12:25 2012 +0100
@@ -146,6 +146,10 @@
android:authorities="com.beem.project.beem.providers.messageprovider"
android:label="Message Provider"
android:name=".providers.MessageProvider" />
+ <provider
+ android:authorities="com.beem.project.beem.providers.mucsprovider"
+ android:label="MUCs Provider"
+ android:name=".providers.MUCsProvider" />
<service
android:exported="true"
--- a/src/com/beem/project/beem/BeemService.java Thu Dec 29 22:40:40 2011 +0100
+++ b/src/com/beem/project/beem/BeemService.java Thu Jan 05 22:12:25 2012 +0100
@@ -43,14 +43,22 @@
*/
package com.beem.project.beem;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
+import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.Roster.SubscriptionMode;
+import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.provider.ProviderManager;
+import org.jivesoftware.smackx.PrivateDataManager;
+import org.jivesoftware.smackx.bookmark.BookmarkManager;
+import org.jivesoftware.smackx.bookmark.BookmarkedConference;
+import org.jivesoftware.smackx.muc.DiscussionHistory;
+import org.jivesoftware.smackx.muc.MultiUserChat;
import org.jivesoftware.smackx.packet.ChatStateExtension;
import org.jivesoftware.smackx.provider.DelayInfoProvider;
import org.jivesoftware.smackx.provider.DiscoverInfoProvider;
@@ -285,43 +293,66 @@
// 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 for Bookmarks
+ 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());
}
/**
@@ -535,7 +566,32 @@
}
}
- //TODO: ADD MESSAGE TO CONFIRM CONNECTION OF THE ACCOUNT
+ if (mConnection.containsKey(accountName)) {
+ Connection xmppCo = mConnection.get(accountName).getAdaptee();
+ Collection<BookmarkedConference> list = null;
+ try {
+ BookmarkManager bm = BookmarkManager.getBookmarkManager(xmppCo);
+ list = bm.getBookmarkedConferences();
+ } catch (XMPPException e) {
+ Log.e(TAG, "BookmarkManager", e);
+ }
+ for (BookmarkedConference bookmarkedConference : list) {
+ Log.e("TAG + BOOKMARK", bookmarkedConference.getName());
+ // Create a MultiUserChat using a Connection for a room
+ MultiUserChat muc2 = new MultiUserChat(xmppCo, bookmarkedConference.getJid());
+
+ // User2 joins the new room using a password and specifying
+ // the amount of history to receive. In this example we are requesting the last 5 messages.
+ DiscussionHistory history = new DiscussionHistory();
+ history.setMaxStanzas(5);
+ try {
+ muc2.join(bookmarkedConference.getNickname(), bookmarkedConference.getPassword(), history, SmackConfiguration.getPacketReplyTimeout());
+ } catch (XMPPException e) {
+ Log.e(TAG, "MUC Join Problem", e);
+ }
+ }
+ }
+ //TODO: ADD MESSAGE || TOAST TO CONFIRM CONNECTION OF THE ACCOUNT
sendBroadcast(res);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/providers/MUCs.java Thu Jan 05 22:12:25 2012 +0100
@@ -0,0 +1,55 @@
+/*
+ BEEM is a videoconference application on the Android Platform.
+
+ Copyright (C) 2009 by Frederic-Charles Barthelery,
+ Jean-Manuel Da Silva,
+ Nikita Kozlov,
+ Philippe Lago,
+ Jean Baptiste Vergely,
+ Vincent Veronis.
+
+ This file is part of BEEM.
+
+ BEEM is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ BEEM is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with BEEM. If not, see <http://www.gnu.org/licenses/>.
+
+ Please send bug reports with examples or suggestions to
+ contact@beem-project.com or http://dev.beem-project.com/
+ */
+
+package com.beem.project.beem.providers;
+
+import android.net.Uri;
+import android.provider.BaseColumns;
+
+public class MUCs implements BaseColumns {
+
+ /**
+ * Constructor.
+ */
+ public MUCs() {
+
+ }
+
+ public static final Uri CONTENT_URI = Uri.parse("content://"
+ + MessageProvider.AUTHORITY + "/mucs");
+ public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.com.beem.project.beem.provider.mucs";
+
+ public static final String _ID = "_id";
+ public static final String NAME = "_NAME";
+ public static final String JID = "_JID";
+ public static final String AUTO_JOIN = "_AUTO_JOIN";
+ public static final String SHARED = "_SHARED";
+ public static final String NICKNAME = "_NICKNAME";
+ public static final String PASSWORD = "_PASSWORD";
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/com/beem/project/beem/providers/MUCsProvider.java Thu Jan 05 22:12:25 2012 +0100
@@ -0,0 +1,207 @@
+/*
+ BEEM is a videoconference application on the Android Platform.
+
+ Copyright (C) 2009 by Frederic-Charles Barthelery,
+ Jean-Manuel Da Silva,
+ Nikita Kozlov,
+ Philippe Lago,
+ Jean Baptiste Vergely,
+ Vincent Veronis.
+
+ This file is part of BEEM.
+
+ BEEM is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ BEEM is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with BEEM. If not, see <http://www.gnu.org/licenses/>.
+
+ Please send bug reports with examples or suggestions to
+ contact@beem-project.com or http://dev.beem-project.com/
+ */
+
+package com.beem.project.beem.providers;
+
+import java.util.HashMap;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.util.Log;
+
+/**
+ * Provider to store mucs.
+ * @author marseille
+ */
+public class MUCsProvider extends ContentProvider {
+
+ private static final String TAG = "MUCsProvider";
+ private static final String DATABASE_NAME = "mucs.db";
+ private static final int DATABASE_VERSION = 1;
+ private static final int MUCS = 1;
+ private static final String MUCS_TABLE_NAME = "mucs";
+ private static final UriMatcher sUriMatcher;
+
+ public static final String AUTHORITY = "com.beem.project.beem.providers.mucprovider";
+
+ private static HashMap<String, String> mucsProjectionMap;
+ private DatabaseHelper mDbHelper;
+
+ /**
+ * Constructor.
+ */
+ public MUCsProvider() {
+ }
+
+ @Override
+ public boolean onCreate() {
+ mDbHelper = new DatabaseHelper(getContext());
+ return true;
+
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues initialValues) {
+ if (sUriMatcher.match(uri) != MUCS) {
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ ContentValues values;
+ if (initialValues != null)
+ values = new ContentValues(initialValues);
+ else
+ values = new ContentValues();
+ SQLiteDatabase db = null;
+ db = mDbHelper.getWritableDatabase();
+ long rowId = db.insert(MUCS_TABLE_NAME, null, values);
+ if (rowId == -1)
+ throw new SQLException("Failed to insert row into " + uri);
+ Uri mucUri = ContentUris.withAppendedId(MUCs.CONTENT_URI, rowId);
+ getContext().getContentResolver().notifyChange(mucUri, null);
+ return mucUri;
+
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
+ SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+
+ switch (sUriMatcher.match(uri)) {
+ case MUCS:
+ qb.setTables(MUCS_TABLE_NAME);
+ qb.setProjectionMap(mucsProjectionMap);
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ SQLiteDatabase db = mDbHelper.getReadableDatabase();
+ Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
+ c.setNotificationUri(getContext().getContentResolver(), uri);
+ return c;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ int count;
+ SQLiteDatabase db = mDbHelper.getWritableDatabase();
+ switch (sUriMatcher.match(uri)) {
+ case MUCS:
+ count = db.update(MUCS_TABLE_NAME, values, selection, selectionArgs);
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ getContext().getContentResolver().notifyChange(uri, null);
+ return count;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ int count;
+ SQLiteDatabase db = mDbHelper.getWritableDatabase();
+ switch (sUriMatcher.match(uri)) {
+ case MUCS:
+ count = db.delete(MUCS_TABLE_NAME, selection, selectionArgs);
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ getContext().getContentResolver().notifyChange(uri, null);
+ return count;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ switch (sUriMatcher.match(uri)) {
+ case MUCS:
+ return Messages.CONTENT_TYPE;
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ }
+
+ private class DatabaseHelper extends SQLiteOpenHelper {
+
+ DatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ String createDatabase = "CREATE TABLE " + MUCS_TABLE_NAME + " (";
+ createDatabase += MUCs._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,";
+ createDatabase += MUCs.NAME + " VARCHAR(255),";
+ createDatabase += MUCs.JID + " VARCHAR(255),";
+ createDatabase += MUCs.AUTO_JOIN + " BOOLEAN,";
+ createDatabase += MUCs.SHARED + " BOOLEAN,";
+ createDatabase += MUCs.NICKNAME + " VARCHAR(255),";
+ createDatabase += MUCs.PASSWORD + " VARCHAR(255)";
+ createDatabase += ");";
+ try {
+ db.execSQL(createDatabase);
+ } catch (SQLException e) {
+ Log.e(TAG, "CREATE DB (MUC) PROBLEM", e);
+ }
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion
+ + ", which will destroy all old data");
+ db.execSQL("DROP TABLE IF EXISTS " + MUCS_TABLE_NAME);
+ onCreate(db);
+ }
+ }
+
+ static {
+ sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ sUriMatcher.addURI(AUTHORITY, MUCS_TABLE_NAME, MUCS);
+
+ mucsProjectionMap = new HashMap<String, String>();
+ mucsProjectionMap.put(MUCs._ID, MUCs._ID);
+ mucsProjectionMap.put(MUCs.NAME, MUCs.NAME);
+ mucsProjectionMap.put(MUCs.JID, MUCs.JID);
+ mucsProjectionMap.put(MUCs.AUTO_JOIN, MUCs.AUTO_JOIN);
+ mucsProjectionMap.put(MUCs.SHARED, MUCs.SHARED);
+ mucsProjectionMap.put(MUCs.NICKNAME, MUCs.NICKNAME);
+ mucsProjectionMap.put(MUCs.PASSWORD, MUCs.PASSWORD);
+ }
+
+}