package com.fiteclub.android.smack; import org.jivesoftware.smack.AccountManager; import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.provider.IQProvider; import org.jivesoftware.smack.provider.PacketExtensionProvider; import org.jivesoftware.smack.provider.ProviderManager; import org.jivesoftware.smackx.muc.MultiUserChat; import android.util.Log; public class SmackUtil { private static final String TAG = "SmackUtil"; static { Log.d(TAG, "init start"); try { initSmack(SmackUtil.class.getClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } Log.d(TAG, "init end"); } private static void initSmack(ClassLoader classLoader) throws ClassNotFoundException { String[] classNames = { "org.jivesoftware.smackx.ServiceDiscoveryManager", "org.jivesoftware.smack.PrivacyListManager", //"org.jivesoftware.smackx.XHTMLManager", "org.jivesoftware.smackx.muc.MultiUserChat", //"org.jivesoftware.smackx.filetransfer.FileTransferManager", //"org.jivesoftware.smackx.LastActivityManager", "org.jivesoftware.smack.ReconnectionManager" }; for (String className : classNames) { classLoader.loadClass(className); } initProviders(classLoader); } private static void initProviders(ClassLoader classLoader) throws ClassNotFoundException { String[][] providers = { //{"iqProvider", "query", "jabber:iq:private", "org.jivesoftware.smackx.PrivateDataManager$PrivateDataIQProvider"}, //{"iqProvider", "query", "jabber:iq:time", "org.jivesoftware.smackx.packet.Time"}, //{"extensionProvider", "x", "jabber:x:roster", "org.jivesoftware.smackx.provider.RosterExchangeProvider"}, //{"extensionProvider", "x", "jabber:x:event", "org.jivesoftware.smackx.provider.MessageEventProvider"}, //{"extensionProvider", "active", "http://jabber.org/protocol/chatstates", "org.jivesoftware.smackx.packet.ChatStateExtension$Provider"}, //{"extensionProvider", "composing", "http://jabber.org/protocol/chatstates", "org.jivesoftware.smackx.packet.ChatStateExtension$Provider"}, //{"extensionProvider", "paused", "http://jabber.org/protocol/chatstates", "org.jivesoftware.smackx.packet.ChatStateExtension$Provider"}, //{"extensionProvider", "inactive", "http://jabber.org/protocol/chatstates", "org.jivesoftware.smackx.packet.ChatStateExtension$Provider"}, //{"extensionProvider", "gone", "http://jabber.org/protocol/chatstates", "org.jivesoftware.smackx.packet.ChatStateExtension$Provider"}, //{"extensionProvider", "html", "http://jabber.org/protocol/xhtml-im", "org.jivesoftware.smackx.provider.XHTMLExtensionProvider"}, //{"extensionProvider", "x", "jabber:x:conference", "org.jivesoftware.smackx.GroupChatInvitation$Provider"}, //{"iqProvider", "query", "http://jabber.org/protocol/disco#items", "org.jivesoftware.smackx.provider.DiscoverItemsProvider"}, //{"iqProvider", "query", "http://jabber.org/protocol/disco#info", "org.jivesoftware.smackx.provider.DiscoverInfoProvider"}, //{"extensionProvider", "x", "jabber:x:data", "org.jivesoftware.smackx.provider.DataFormProvider"}, {"extensionProvider", "x", "http://jabber.org/protocol/muc#user", "org.jivesoftware.smackx.provider.MUCUserProvider"}, {"iqProvider", "query", "http://jabber.org/protocol/muc#admin", "org.jivesoftware.smackx.provider.MUCAdminProvider"}, {"iqProvider", "query", "http://jabber.org/protocol/muc#owner", "org.jivesoftware.smackx.provider.MUCOwnerProvider"}, //{"extensionProvider", "x", "jabber:x:delay", "org.jivesoftware.smackx.provider.DelayInformationProvider"}, //{"iqProvider", "query", "jabber:iq:version", "org.jivesoftware.smackx.packet.Version"}, //{"iqProvider", "vCard", "vcard-temp", "org.jivesoftware.smackx.provider.VCardProvider"}, //{"iqProvider", "offline", "http://jabber.org/protocol/offline", "org.jivesoftware.smackx.packet.OfflineMessageRequest$Provider"}, //{"extensionProvider", "offline", "http://jabber.org/protocol/offline", "org.jivesoftware.smackx.packet.OfflineMessageInfo$Provider"}, //{"iqProvider", "query", "jabber:iq:last", "org.jivesoftware.smackx.packet.LastActivity$Provider"}, //{"iqProvider", "query", "jabber:iq:search", "org.jivesoftware.smackx.search.UserSearch$Provider"}, //{"iqProvider", "sharedgroup", "http://www.jivesoftware.org/protocol/sharedgroup", "org.jivesoftware.smackx.packet.SharedGroupsInfo$Provider"}, //{"extensionProvider", "addresses", "http://jabber.org/protocol/address", "org.jivesoftware.smackx.provider.MultipleAddressesProvider"}, //{"iqProvider", "si", "http://jabber.org/protocol/si", "org.jivesoftware.smackx.provider.StreamInitiationProvider"}, //{"iqProvider", "query", "http://jabber.org/protocol/bytestreams", "org.jivesoftware.smackx.provider.BytestreamsProvider"}, //{"iqProvider", "open", "http://jabber.org/protocol/ibb", "org.jivesoftware.smackx.provider.IBBProviders$Open"}, //{"iqProvider", "close", "http://jabber.org/protocol/ibb", "org.jivesoftware.smackx.provider.IBBProviders$Close"}, //{"extensionProvider", "data", "http://jabber.org/protocol/ibb", "org.jivesoftware.smackx.provider.IBBProviders$Data"}, //{"iqProvider", "query", "jabber:iq:privacy", "org.jivesoftware.smack.provider.PrivacyProvider"} }; ProviderManager manager = ProviderManager.getInstance(); for (String[] info : providers) { String tag = info[0]; String elementName = info[1]; String namespace = info[2]; String className = info[3]; Class<?> provider = classLoader.loadClass(className); if (tag.equals("iqProvider")) { if (IQProvider.class.isAssignableFrom(provider)) { try { manager.addIQProvider(elementName, namespace, provider.newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } else if (IQ.class.isAssignableFrom(provider)) { manager.addIQProvider(elementName, namespace, provider); } } else if (tag.equals("extensionProvider")) { if (PacketExtensionProvider.class.isAssignableFrom(provider)) { try { manager.addExtensionProvider(elementName, namespace, provider.newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } else if (PacketExtension.class.isAssignableFrom(provider)) { manager.addExtensionProvider(elementName, namespace, provider); } } } } public static XMPPConnection getConnection(XMPPConnection conn, String host, int port, String serviceName, int timeout) { Log.d(TAG, "connect start"); for (int i=0; i<3; i++) //retry count=3 { if (conn == null) { ConnectionConfiguration config = new ConnectionConfiguration( host, port, serviceName); config.setDebuggerEnabled(true); config.setReconnectionAllowed(true); SmackConfiguration.setPacketReplyTimeout(timeout*1000); conn = new XMPPConnection(config); } try { conn.connect(); Log.d(TAG, "connect success"); return conn; } catch (Exception e) { e.printStackTrace(); } try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } } Log.d(TAG, "connect fail"); return null; } public static boolean doLogin(XMPPConnection conn, String loginName, String password) { if (conn.isAuthenticated()) return true; for (int i=0; i<3; i++) //retry count=3 { try { if (!conn.isConnected()) conn.connect(); Log.d(TAG, "login start: " + loginName); conn.login(loginName, password); Log.d(TAG, "login success"); return true; } catch (Exception e) { e.printStackTrace(); } try { if (conn.isConnected()) conn.disconnect(); //must disconnect, or login failed always coz last login failure change the internal state conn.connect(); AccountManager manager = conn.getAccountManager(); Log.d(TAG, "create account start"); manager.createAccount(loginName, password); Log.d(TAG, "create account end"); } catch (Exception e) { e.printStackTrace(); } } Log.d(TAG, "login fail"); return false; } public static MultiUserChat joinChatRoom(XMPPConnection conn, String roomName, String userName) { Log.d(TAG, "open chat room start: " + roomName); MultiUserChat muc = new MultiUserChat(conn, roomName); for (int i=0; i<3; i++) //retry count=3 { try { muc.join(userName); if (muc.isJoined()) { Log.d(TAG, "open chat room success"); return muc; } } catch (Exception e) { e.printStackTrace(); } } Log.d(TAG, "open chat room fail"); return null; } public static boolean sendMessage(MultiUserChat muc, String message) { for (int i=0; i<3; i++) //retry count=3 { try { muc.sendMessage(message); return true; } catch (Exception e) { e.printStackTrace(); } } return false; } }