aboutsummaryrefslogtreecommitdiffstats
path: root/src/de/gultsch/chat/services/XmppConnectionService.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/gultsch/chat/services/XmppConnectionService.java')
-rw-r--r--src/de/gultsch/chat/services/XmppConnectionService.java944
1 files changed, 0 insertions, 944 deletions
diff --git a/src/de/gultsch/chat/services/XmppConnectionService.java b/src/de/gultsch/chat/services/XmppConnectionService.java
deleted file mode 100644
index 7ff09957..00000000
--- a/src/de/gultsch/chat/services/XmppConnectionService.java
+++ /dev/null
@@ -1,944 +0,0 @@
-package de.gultsch.chat.services;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Hashtable;
-import java.util.List;
-
-import org.json.JSONException;
-import org.openintents.openpgp.util.OpenPgpApi;
-import org.openintents.openpgp.util.OpenPgpServiceConnection;
-
-import net.java.otr4j.OtrException;
-import net.java.otr4j.session.Session;
-import net.java.otr4j.session.SessionStatus;
-
-import de.gultsch.chat.crypto.PgpEngine;
-import de.gultsch.chat.crypto.PgpEngine.OpenPgpException;
-import de.gultsch.chat.entities.Account;
-import de.gultsch.chat.entities.Contact;
-import de.gultsch.chat.entities.Conversation;
-import de.gultsch.chat.entities.Message;
-import de.gultsch.chat.entities.Presences;
-import de.gultsch.chat.persistance.DatabaseBackend;
-import de.gultsch.chat.persistance.OnPhoneContactsMerged;
-import de.gultsch.chat.ui.OnAccountListChangedListener;
-import de.gultsch.chat.ui.OnConversationListChangedListener;
-import de.gultsch.chat.ui.OnRosterFetchedListener;
-import de.gultsch.chat.utils.MessageParser;
-import de.gultsch.chat.utils.OnPhoneContactsLoadedListener;
-import de.gultsch.chat.utils.PhoneHelper;
-import de.gultsch.chat.utils.UIHelper;
-import de.gultsch.chat.xml.Element;
-import de.gultsch.chat.xmpp.IqPacket;
-import de.gultsch.chat.xmpp.MessagePacket;
-import de.gultsch.chat.xmpp.OnIqPacketReceived;
-import de.gultsch.chat.xmpp.OnMessagePacketReceived;
-import de.gultsch.chat.xmpp.OnPresencePacketReceived;
-import de.gultsch.chat.xmpp.OnStatusChanged;
-import de.gultsch.chat.xmpp.PresencePacket;
-import de.gultsch.chat.xmpp.XmppConnection;
-import android.app.NotificationManager;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.database.ContentObserver;
-import android.database.DatabaseUtils;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.PowerManager;
-import android.preference.PreferenceManager;
-import android.provider.ContactsContract;
-import android.util.Log;
-
-public class XmppConnectionService extends Service {
-
- protected static final String LOGTAG = "xmppService";
- public DatabaseBackend databaseBackend;
-
- public long startDate;
-
- private List<Account> accounts;
- private List<Conversation> conversations = null;
-
- public OnConversationListChangedListener convChangedListener = null;
- private OnAccountListChangedListener accountChangedListener = null;
-
- private ContentObserver contactObserver = new ContentObserver(null) {
- @Override
- public void onChange(boolean selfChange) {
- super.onChange(selfChange);
- Log.d(LOGTAG, "contact list has changed");
- mergePhoneContactsWithRoster(null);
- }
- };
-
- private XmppConnectionService service = this;
-
- private final IBinder mBinder = new XmppConnectionBinder();
- private OnMessagePacketReceived messageListener = new OnMessagePacketReceived() {
-
- @Override
- public void onMessagePacketReceived(Account account,
- MessagePacket packet) {
- Message message = null;
- boolean notify = false;
- if ((packet.getType() == MessagePacket.TYPE_CHAT)) {
- String pgpBody = MessageParser.getPgpBody(packet);
- if (pgpBody != null) {
- message = MessageParser.parsePgpChat(pgpBody, packet,
- account, service);
- notify = false;
- } else if (packet.hasChild("body")
- && (packet.getBody().startsWith("?OTR"))) {
- message = MessageParser.parseOtrChat(packet, account,
- service);
- notify = true;
- } else if (packet.hasChild("body")) {
- message = MessageParser.parsePlainTextChat(packet, account,
- service);
- notify = true;
- } else if (packet.hasChild("received")
- || (packet.hasChild("sent"))) {
- message = MessageParser.parseCarbonMessage(packet, account,
- service);
- }
-
- } else if (packet.getType() == MessagePacket.TYPE_GROUPCHAT) {
- message = MessageParser
- .parseGroupchat(packet, account, service);
- if (message != null) {
- notify = (message.getStatus() == Message.STATUS_RECIEVED);
- }
- } else if (packet.getType() == MessagePacket.TYPE_ERROR) {
- message = MessageParser.parseError(packet, account, service);
- } else {
- Log.d(LOGTAG, "unparsed message " + packet.toString());
- }
- if (message == null) {
- return;
- }
- if (packet.hasChild("delay")) {
- try {
- String stamp = packet.findChild("delay").getAttribute(
- "stamp");
- stamp = stamp.replace("Z", "+0000");
- Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
- .parse(stamp);
- message.setTime(date.getTime());
- } catch (ParseException e) {
- Log.d(LOGTAG, "error trying to parse date" + e.getMessage());
- }
- }
- if (notify) {
- message.markUnread();
- }
- Conversation conversation = message.getConversation();
- conversation.getMessages().add(message);
- if (packet.getType() != MessagePacket.TYPE_ERROR) {
- databaseBackend.createMessage(message);
- }
- if (convChangedListener != null) {
- convChangedListener.onConversationListChanged();
- } else {
- if (notify) {
- NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- mNotificationManager.notify(2342, UIHelper
- .getUnreadMessageNotification(
- getApplicationContext(), conversation));
- }
- }
- }
- };
- private OnStatusChanged statusListener = new OnStatusChanged() {
-
- @Override
- public void onStatusChanged(Account account) {
- if (accountChangedListener != null) {
- accountChangedListener.onAccountListChangedListener();
- }
- if (account.getStatus() == Account.STATUS_ONLINE) {
- databaseBackend.clearPresences(account);
- connectMultiModeConversations(account);
- List<Conversation> conversations = getConversations();
- for (int i = 0; i < conversations.size(); ++i) {
- if (conversations.get(i).getAccount() == account) {
- sendUnsendMessages(conversations.get(i));
- }
- }
- if (convChangedListener != null) {
- convChangedListener.onConversationListChanged();
- }
- if (account.getKeys().has("pgp_signature")) {
- try {
- sendPgpPresence(account, account.getKeys().getString("pgp_signature"));
- } catch (JSONException e) {
- //
- }
- }
- }
- }
- };
-
- private OnPresencePacketReceived presenceListener = new OnPresencePacketReceived() {
-
- @Override
- public void onPresencePacketReceived(Account account,
- PresencePacket packet) {
- String[] fromParts = packet.getAttribute("from").split("/");
- Contact contact = findContact(account, fromParts[0]);
- if (contact == null) {
- // most likely muc, self or roster not synced
- Log.d(LOGTAG,
- "got presence for non contact " + packet.toString());
- return;
- }
- String type = packet.getAttribute("type");
- if (type == null) {
- Element show = packet.findChild("show");
- if (show == null) {
- contact.updatePresence(fromParts[1], Presences.ONLINE);
- } else if (show.getContent().equals("away")) {
- contact.updatePresence(fromParts[1], Presences.AWAY);
- } else if (show.getContent().equals("xa")) {
- contact.updatePresence(fromParts[1], Presences.XA);
- } else if (show.getContent().equals("chat")) {
- contact.updatePresence(fromParts[1], Presences.CHAT);
- } else if (show.getContent().equals("dnd")) {
- contact.updatePresence(fromParts[1], Presences.DND);
- }
- PgpEngine pgp = getPgpEngine();
- if (pgp!=null) {
- Element x = packet.findChild("x");
- if ((x != null)
- && (x.getAttribute("xmlns").equals("jabber:x:signed"))) {
- try {
- Log.d(LOGTAG,"pgp signature for contact" +packet.getAttribute("from"));
- contact.setPgpKeyId(pgp.fetchKeyId(packet.findChild("status")
- .getContent(), x.getContent()));
- } catch (OpenPgpException e) {
- Log.d(LOGTAG,"faulty pgp. just ignore");
- }
- }
- }
- databaseBackend.updateContact(contact);
- } else if (type.equals("unavailable")) {
- if (fromParts.length != 2) {
- // Log.d(LOGTAG,"received presence with no resource "+packet.toString());
- } else {
- contact.removePresence(fromParts[1]);
- databaseBackend.updateContact(contact);
- }
- } else if (type.equals("subscribe")) {
- if (contact
- .getSubscriptionOption(Contact.Subscription.PREEMPTIVE_GRANT)) {
- sendPresenceUpdatesTo(contact);
- contact.setSubscriptionOption(Contact.Subscription.FROM);
- contact.resetSubscriptionOption(Contact.Subscription.PREEMPTIVE_GRANT);
- replaceContactInConversation(contact.getJid(), contact);
- databaseBackend.updateContact(contact);
- if ((contact
- .getSubscriptionOption(Contact.Subscription.ASKING))
- && (!contact
- .getSubscriptionOption(Contact.Subscription.TO))) {
- requestPresenceUpdatesFrom(contact);
- }
- } else {
- // TODO: ask user to handle it maybe
- }
- } else {
- Log.d(LOGTAG, packet.toString());
- }
- replaceContactInConversation(contact.getJid(), contact);
- }
- };
-
- private OnIqPacketReceived unknownIqListener = new OnIqPacketReceived() {
-
- @Override
- public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.hasChild("query")) {
- Element query = packet.findChild("query");
- String xmlns = query.getAttribute("xmlns");
- if ((xmlns != null) && (xmlns.equals("jabber:iq:roster"))) {
- processRosterItems(account, query);
- mergePhoneContactsWithRoster(null);
- }
- }
- }
- };
-
- private OpenPgpServiceConnection pgpServiceConnection;
- private PgpEngine mPgpEngine = null;
-
- public PgpEngine getPgpEngine() {
- if (pgpServiceConnection.isBound()) {
- if (this.mPgpEngine == null) {
- this.mPgpEngine = new PgpEngine(new OpenPgpApi(
- getApplicationContext(),
- pgpServiceConnection.getService()));
- }
- return mPgpEngine;
- } else {
- return null;
- }
-
- }
-
- private void processRosterItems(Account account, Element elements) {
- String version = elements.getAttribute("ver");
- if (version != null) {
- account.setRosterVersion(version);
- databaseBackend.updateAccount(account);
- }
- for (Element item : elements.getChildren()) {
- if (item.getName().equals("item")) {
- String jid = item.getAttribute("jid");
- String subscription = item.getAttribute("subscription");
- Contact contact = databaseBackend.findContact(account, jid);
- if (contact == null) {
- if (!subscription.equals("remove")) {
- String name = item.getAttribute("name");
- if (name == null) {
- name = jid.split("@")[0];
- }
- contact = new Contact(account, name, jid, null);
- contact.parseSubscriptionFromElement(item);
- databaseBackend.createContact(contact);
- }
- } else {
- if (subscription.equals("remove")) {
- databaseBackend.deleteContact(contact);
- replaceContactInConversation(contact.getJid(), null);
- } else {
- contact.parseSubscriptionFromElement(item);
- databaseBackend.updateContact(contact);
- replaceContactInConversation(contact.getJid(), contact);
- }
- }
- }
- }
- }
-
- private void replaceContactInConversation(String jid, Contact contact) {
- List<Conversation> conversations = getConversations();
- for (int i = 0; i < conversations.size(); ++i) {
- if ((conversations.get(i).getContactJid().equals(jid))) {
- conversations.get(i).setContact(contact);
- break;
- }
- }
- }
-
- public class XmppConnectionBinder extends Binder {
- public XmppConnectionService getService() {
- return XmppConnectionService.this;
- }
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- for (Account account : accounts) {
- if (account.getXmppConnection() == null) {
- if (!account.isOptionSet(Account.OPTION_DISABLED)) {
- account.setXmppConnection(this.createConnection(account));
- }
- }
- }
- return START_STICKY;
- }
-
- @Override
- public void onCreate() {
- databaseBackend = DatabaseBackend.getInstance(getApplicationContext());
- this.accounts = databaseBackend.getAccounts();
-
- getContentResolver().registerContentObserver(
- ContactsContract.Contacts.CONTENT_URI, true, contactObserver);
- this.pgpServiceConnection = new OpenPgpServiceConnection(
- getApplicationContext(), "org.sufficientlysecure.keychain");
- this.pgpServiceConnection.bindToService();
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- for (Account account : accounts) {
- if (account.getXmppConnection() != null) {
- disconnect(account);
- }
- }
- }
-
- public XmppConnection createConnection(Account account) {
- PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- XmppConnection connection = new XmppConnection(account, pm);
- connection.setOnMessagePacketReceivedListener(this.messageListener);
- connection.setOnStatusChangedListener(this.statusListener);
- connection.setOnPresencePacketReceivedListener(this.presenceListener);
- connection
- .setOnUnregisteredIqPacketReceivedListener(this.unknownIqListener);
- Thread thread = new Thread(connection);
- thread.start();
- return connection;
- }
-
- public void sendMessage(Message message, String presence) {
- Account account = message.getConversation().getAccount();
- Conversation conv = message.getConversation();
- boolean saveInDb = false;
- boolean addToConversation = false;
- if (account.getStatus() == Account.STATUS_ONLINE) {
- MessagePacket packet;
- if (message.getEncryption() == Message.ENCRYPTION_OTR) {
- if (!conv.hasValidOtrSession()) {
- // starting otr session. messages will be send later
- conv.startOtrSession(getApplicationContext(), presence);
- } else if (conv.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) {
- // otr session aleary exists, creating message packet
- // accordingly
- packet = prepareMessagePacket(account, message,
- conv.getOtrSession());
- account.getXmppConnection().sendMessagePacket(packet);
- message.setStatus(Message.STATUS_SEND);
- }
- saveInDb = true;
- addToConversation = true;
- } else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
- long keyId = message.getConversation().getContact()
- .getPgpKeyId();
- packet = new MessagePacket();
- packet.setType(MessagePacket.TYPE_CHAT);
- packet.setFrom(message.getConversation().getAccount()
- .getFullJid());
- packet.setTo(message.getCounterpart());
- packet.setBody("This is an XEP-0027 encryted message");
- Element x = new Element("x");
- x.setAttribute("xmlns", "jabber:x:encrypted");
- x.setContent(this.getPgpEngine().encrypt(keyId,
- message.getBody()));
- packet.addChild(x);
- account.getXmppConnection().sendMessagePacket(packet);
- message.setStatus(Message.STATUS_SEND);
- message.setEncryption(Message.ENCRYPTION_DECRYPTED);
- saveInDb = true;
- addToConversation = true;
- } else {
- // don't encrypt
- if (message.getConversation().getMode() == Conversation.MODE_SINGLE) {
- message.setStatus(Message.STATUS_SEND);
- saveInDb = true;
- addToConversation = true;
- }
-
- packet = prepareMessagePacket(account, message, null);
- account.getXmppConnection().sendMessagePacket(packet);
- }
- } else {
- // account is offline
- saveInDb = true;
- addToConversation = true;
-
- }
- if (saveInDb) {
- databaseBackend.createMessage(message);
- }
- if (addToConversation) {
- conv.getMessages().add(message);
- if (convChangedListener != null) {
- convChangedListener.onConversationListChanged();
- }
- }
-
- }
-
- private void sendUnsendMessages(Conversation conversation) {
- for (int i = 0; i < conversation.getMessages().size(); ++i) {
- if (conversation.getMessages().get(i).getStatus() == Message.STATUS_UNSEND) {
- Message message = conversation.getMessages().get(i);
- MessagePacket packet = prepareMessagePacket(
- conversation.getAccount(), message, null);
- conversation.getAccount().getXmppConnection()
- .sendMessagePacket(packet);
- message.setStatus(Message.STATUS_SEND);
- if (conversation.getMode() == Conversation.MODE_SINGLE) {
- databaseBackend.updateMessage(message);
- } else {
- databaseBackend.deleteMessage(message);
- conversation.getMessages().remove(i);
- i--;
- }
- }
- }
- }
-
- public MessagePacket prepareMessagePacket(Account account, Message message,
- Session otrSession) {
- MessagePacket packet = new MessagePacket();
- if (message.getConversation().getMode() == Conversation.MODE_SINGLE) {
- packet.setType(MessagePacket.TYPE_CHAT);
- if (otrSession != null) {
- try {
- packet.setBody(otrSession.transformSending(message
- .getBody()));
- } catch (OtrException e) {
- Log.d(LOGTAG,
- account.getJid()
- + ": could not encrypt message to "
- + message.getCounterpart());
- }
- Element privateMarker = new Element("private");
- privateMarker.setAttribute("xmlns", "urn:xmpp:carbons:2");
- packet.addChild(privateMarker);
- packet.setTo(otrSession.getSessionID().getAccountID() + "/"
- + otrSession.getSessionID().getUserID());
- packet.setFrom(account.getFullJid());
- } else {
- packet.setBody(message.getBody());
- packet.setTo(message.getCounterpart());
- packet.setFrom(account.getJid());
- }
- } else if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
- packet.setType(MessagePacket.TYPE_GROUPCHAT);
- packet.setBody(message.getBody());
- packet.setTo(message.getCounterpart());
- packet.setFrom(account.getJid());
- }
- return packet;
- }
-
- public void getRoster(Account account,
- final OnRosterFetchedListener listener) {
- List<Contact> contacts = databaseBackend.getContacts(account);
- for (int i = 0; i < contacts.size(); ++i) {
- contacts.get(i).setAccount(account);
- }
- if (listener != null) {
- listener.onRosterFetched(contacts);
- }
- }
-
- public void updateRoster(final Account account,
- final OnRosterFetchedListener listener) {
- IqPacket iqPacket = new IqPacket(IqPacket.TYPE_GET);
- Element query = new Element("query");
- query.setAttribute("xmlns", "jabber:iq:roster");
- query.setAttribute("ver", account.getRosterVersion());
- iqPacket.addChild(query);
- account.getXmppConnection().sendIqPacket(iqPacket,
- new OnIqPacketReceived() {
-
- @Override
- public void onIqPacketReceived(final Account account,
- IqPacket packet) {
- Element roster = packet.findChild("query");
- if (roster != null) {
- processRosterItems(account, roster);
- StringBuilder mWhere = new StringBuilder();
- mWhere.append("jid NOT IN(");
- List<Element> items = roster.getChildren();
- for (int i = 0; i < items.size(); ++i) {
- mWhere.append(DatabaseUtils
- .sqlEscapeString(items.get(i)
- .getAttribute("jid")));
- if (i != items.size() - 1) {
- mWhere.append(",");
- }
- }
- mWhere.append(") and accountUuid = \"");
- mWhere.append(account.getUuid());
- mWhere.append("\"");
- List<Contact> contactsToDelete = databaseBackend
- .getContats(mWhere.toString());
- for (Contact contact : contactsToDelete) {
- databaseBackend.deleteContact(contact);
- replaceContactInConversation(contact.getJid(),
- null);
- }
-
- }
- mergePhoneContactsWithRoster(new OnPhoneContactsMerged() {
-
- @Override
- public void phoneContactsMerged() {
- if (listener != null) {
- getRoster(account, listener);
- }
- }
- });
- }
- });
- }
-
- public void mergePhoneContactsWithRoster(
- final OnPhoneContactsMerged listener) {
- PhoneHelper.loadPhoneContacts(getApplicationContext(),
- new OnPhoneContactsLoadedListener() {
- @Override
- public void onPhoneContactsLoaded(
- Hashtable<String, Bundle> phoneContacts) {
- List<Contact> contacts = databaseBackend
- .getContacts(null);
- for (int i = 0; i < contacts.size(); ++i) {
- Contact contact = contacts.get(i);
- if (phoneContacts.containsKey(contact.getJid())) {
- Bundle phoneContact = phoneContacts.get(contact
- .getJid());
- String systemAccount = phoneContact
- .getInt("phoneid")
- + "#"
- + phoneContact.getString("lookup");
- contact.setSystemAccount(systemAccount);
- contact.setPhotoUri(phoneContact
- .getString("photouri"));
- contact.setDisplayName(phoneContact
- .getString("displayname"));
- databaseBackend.updateContact(contact);
- replaceContactInConversation(contact.getJid(),
- contact);
- } else {
- if ((contact.getSystemAccount() != null)
- || (contact.getProfilePhoto() != null)) {
- contact.setSystemAccount(null);
- contact.setPhotoUri(null);
- databaseBackend.updateContact(contact);
- replaceContactInConversation(
- contact.getJid(), contact);
- }
- }
- }
- if (listener != null) {
- listener.phoneContactsMerged();
- }
- }
- });
- }
-
- public List<Conversation> getConversations() {
- if (this.conversations == null) {
- Hashtable<String, Account> accountLookupTable = new Hashtable<String, Account>();
- for (Account account : this.accounts) {
- accountLookupTable.put(account.getUuid(), account);
- }
- this.conversations = databaseBackend
- .getConversations(Conversation.STATUS_AVAILABLE);
- for (Conversation conv : this.conversations) {
- Account account = accountLookupTable.get(conv.getAccountUuid());
- conv.setAccount(account);
- conv.setContact(findContact(account, conv.getContactJid()));
- conv.setMessages(databaseBackend.getMessages(conv, 50));
- }
- }
- return this.conversations;
- }
-
- public List<Account> getAccounts() {
- return this.accounts;
- }
-
- public Contact findContact(Account account, String jid) {
- Contact contact = databaseBackend.findContact(account, jid);
- if (contact != null) {
- contact.setAccount(account);
- }
- return contact;
- }
-
- public Conversation findOrCreateConversation(Account account, String jid,
- boolean muc) {
- for (Conversation conv : this.getConversations()) {
- if ((conv.getAccount().equals(account))
- && (conv.getContactJid().equals(jid))) {
- return conv;
- }
- }
- Conversation conversation = databaseBackend.findConversation(account,
- jid);
- if (conversation != null) {
- conversation.setStatus(Conversation.STATUS_AVAILABLE);
- conversation.setAccount(account);
- if (muc) {
- conversation.setMode(Conversation.MODE_MULTI);
- if (account.getStatus() == Account.STATUS_ONLINE) {
- joinMuc(conversation);
- }
- } else {
- conversation.setMode(Conversation.MODE_SINGLE);
- }
- this.databaseBackend.updateConversation(conversation);
- conversation.setContact(findContact(account,
- conversation.getContactJid()));
- } else {
- String conversationName;
- Contact contact = findContact(account, jid);
- if (contact != null) {
- conversationName = contact.getDisplayName();
- } else {
- conversationName = jid.split("@")[0];
- }
- if (muc) {
- conversation = new Conversation(conversationName, account, jid,
- Conversation.MODE_MULTI);
- if (account.getStatus() == Account.STATUS_ONLINE) {
- joinMuc(conversation);
- }
- } else {
- conversation = new Conversation(conversationName, account, jid,
- Conversation.MODE_SINGLE);
- }
- conversation.setContact(contact);
- this.databaseBackend.createConversation(conversation);
- }
- this.conversations.add(conversation);
- if (this.convChangedListener != null) {
- this.convChangedListener.onConversationListChanged();
- }
- return conversation;
- }
-
- public void archiveConversation(Conversation conversation) {
- if (conversation.getMode() == Conversation.MODE_MULTI) {
- leaveMuc(conversation);
- } else {
- try {
- conversation.endOtrIfNeeded();
- } catch (OtrException e) {
- Log.d(LOGTAG,
- "error ending otr session for "
- + conversation.getName());
- }
- }
- this.databaseBackend.updateConversation(conversation);
- this.conversations.remove(conversation);
- if (this.convChangedListener != null) {
- this.convChangedListener.onConversationListChanged();
- }
- }
-
- public int getConversationCount() {
- return this.databaseBackend.getConversationCount();
- }
-
- public void createAccount(Account account) {
- databaseBackend.createAccount(account);
- this.accounts.add(account);
- account.setXmppConnection(this.createConnection(account));
- if (accountChangedListener != null)
- accountChangedListener.onAccountListChangedListener();
- }
-
- public void deleteContact(Contact contact) {
- IqPacket iq = new IqPacket(IqPacket.TYPE_SET);
- Element query = new Element("query");
- query.setAttribute("xmlns", "jabber:iq:roster");
- Element item = new Element("item");
- item.setAttribute("jid", contact.getJid());
- item.setAttribute("subscription", "remove");
- query.addChild(item);
- iq.addChild(query);
- contact.getAccount().getXmppConnection().sendIqPacket(iq, null);
- replaceContactInConversation(contact.getJid(), null);
- databaseBackend.deleteContact(contact);
- }
-
- public void updateAccount(Account account) {
- databaseBackend.updateAccount(account);
- if (account.getXmppConnection() != null) {
- disconnect(account);
- }
- if (!account.isOptionSet(Account.OPTION_DISABLED)) {
- account.setXmppConnection(this.createConnection(account));
- }
- if (accountChangedListener != null)
- accountChangedListener.onAccountListChangedListener();
- }
-
- public void deleteAccount(Account account) {
- Log.d(LOGTAG, "called delete account");
- if (account.getXmppConnection() != null) {
- this.disconnect(account);
- }
- databaseBackend.deleteAccount(account);
- this.accounts.remove(account);
- if (accountChangedListener != null)
- accountChangedListener.onAccountListChangedListener();
- }
-
- public void setOnConversationListChangedListener(
- OnConversationListChangedListener listener) {
- this.convChangedListener = listener;
- }
-
- public void removeOnConversationListChangedListener() {
- this.convChangedListener = null;
- }
-
- public void setOnAccountListChangedListener(
- OnAccountListChangedListener listener) {
- this.accountChangedListener = listener;
- }
-
- public void removeOnAccountListChangedListener() {
- this.accountChangedListener = null;
- }
-
- public void connectMultiModeConversations(Account account) {
- List<Conversation> conversations = getConversations();
- for (int i = 0; i < conversations.size(); i++) {
- Conversation conversation = conversations.get(i);
- if ((conversation.getMode() == Conversation.MODE_MULTI)
- && (conversation.getAccount() == account)) {
- joinMuc(conversation);
- }
- }
- }
-
- public void joinMuc(Conversation conversation) {
- String muc = conversation.getContactJid();
- PresencePacket packet = new PresencePacket();
- packet.setAttribute("to", muc + "/"
- + conversation.getAccount().getUsername());
- Element x = new Element("x");
- x.setAttribute("xmlns", "http://jabber.org/protocol/muc");
- if (conversation.getMessages().size() != 0) {
- Element history = new Element("history");
- long lastMsgTime = conversation.getLatestMessage().getTimeSent();
- long diff = (System.currentTimeMillis() - lastMsgTime) / 1000 - 1;
- history.setAttribute("seconds", diff + "");
- x.addChild(history);
- }
- packet.addChild(x);
- conversation.getAccount().getXmppConnection()
- .sendPresencePacket(packet);
- }
-
- public void leaveMuc(Conversation conversation) {
-
- }
-
- public void disconnect(Account account) {
- List<Conversation> conversations = getConversations();
- for (int i = 0; i < conversations.size(); i++) {
- Conversation conversation = conversations.get(i);
- if (conversation.getAccount() == account) {
- if (conversation.getMode() == Conversation.MODE_MULTI) {
- leaveMuc(conversation);
- } else {
- try {
- conversation.endOtrIfNeeded();
- } catch (OtrException e) {
- Log.d(LOGTAG, "error ending otr session for "
- + conversation.getName());
- }
- }
- }
- }
- account.getXmppConnection().disconnect();
- Log.d(LOGTAG, "disconnected account: " + account.getJid());
- account.setXmppConnection(null);
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
-
- public void updateContact(Contact contact) {
- databaseBackend.updateContact(contact);
- }
-
- public void updateMessage(Message message) {
- databaseBackend.updateMessage(message);
- }
-
- public void createContact(Contact contact) {
- SharedPreferences sharedPref = PreferenceManager
- .getDefaultSharedPreferences(getApplicationContext());
- boolean autoGrant = sharedPref.getBoolean("grant_new_contacts", true);
- if (autoGrant) {
- contact.setSubscriptionOption(Contact.Subscription.PREEMPTIVE_GRANT);
- contact.setSubscriptionOption(Contact.Subscription.ASKING);
- }
- databaseBackend.createContact(contact);
- IqPacket iq = new IqPacket(IqPacket.TYPE_SET);
- Element query = new Element("query");
- query.setAttribute("xmlns", "jabber:iq:roster");
- Element item = new Element("item");
- item.setAttribute("jid", contact.getJid());
- item.setAttribute("name", contact.getJid());
- query.addChild(item);
- iq.addChild(query);
- Account account = contact.getAccount();
- account.getXmppConnection().sendIqPacket(iq, null);
- if (autoGrant) {
- requestPresenceUpdatesFrom(contact);
- }
- replaceContactInConversation(contact.getJid(), contact);
- }
-
- public void requestPresenceUpdatesFrom(Contact contact) {
- // Requesting a Subscription type=subscribe
- PresencePacket packet = new PresencePacket();
- packet.setAttribute("type", "subscribe");
- packet.setAttribute("to", contact.getJid());
- packet.setAttribute("from", contact.getAccount().getJid());
- Log.d(LOGTAG, packet.toString());
- contact.getAccount().getXmppConnection().sendPresencePacket(packet);
- }
-
- public void stopPresenceUpdatesFrom(Contact contact) {
- // Unsubscribing type='unsubscribe'
- PresencePacket packet = new PresencePacket();
- packet.setAttribute("type", "unsubscribe");
- packet.setAttribute("to", contact.getJid());
- packet.setAttribute("from", contact.getAccount().getJid());
- Log.d(LOGTAG, packet.toString());
- contact.getAccount().getXmppConnection().sendPresencePacket(packet);
- }
-
- public void stopPresenceUpdatesTo(Contact contact) {
- // Canceling a Subscription type=unsubscribed
- PresencePacket packet = new PresencePacket();
- packet.setAttribute("type", "unsubscribed");
- packet.setAttribute("to", contact.getJid());
- packet.setAttribute("from", contact.getAccount().getJid());
- Log.d(LOGTAG, packet.toString());
- contact.getAccount().getXmppConnection().sendPresencePacket(packet);
- }
-
- public void sendPresenceUpdatesTo(Contact contact) {
- // type='subscribed'
- PresencePacket packet = new PresencePacket();
- packet.setAttribute("type", "subscribed");
- packet.setAttribute("to", contact.getJid());
- packet.setAttribute("from", contact.getAccount().getJid());
- Log.d(LOGTAG, packet.toString());
- contact.getAccount().getXmppConnection().sendPresencePacket(packet);
- }
-
- public void sendPgpPresence(Account account, String signature) {
- PresencePacket packet = new PresencePacket();
- packet.setAttribute("from", account.getFullJid());
- Element status = new Element("status");
- status.setContent("online");
- packet.addChild(status);
- Element x = new Element("x");
- x.setAttribute("xmlns", "jabber:x:signed");
- x.setContent(signature);
- packet.addChild(x);
- account.getXmppConnection().sendPresencePacket(packet);
- }
-
- public void generatePgpAnnouncement(Account account)
- throws PgpEngine.UserInputRequiredException {
- if (account.getStatus() == Account.STATUS_ONLINE) {
- String signature = getPgpEngine().generateSignature("online");
- account.setKey("pgp_signature", signature);
- databaseBackend.updateAccount(account);
- sendPgpPresence(account, signature);
- }
- }
-} \ No newline at end of file