package info.guardianproject.otr.app.im.plugin.loopback;
import info.guardianproject.otr.app.im.engine.Address;
import info.guardianproject.otr.app.im.engine.ChatGroupManager;
import info.guardianproject.otr.app.im.engine.ChatSession;
import info.guardianproject.otr.app.im.engine.ChatSessionManager;
import info.guardianproject.otr.app.im.engine.Contact;
import info.guardianproject.otr.app.im.engine.ContactList;
import info.guardianproject.otr.app.im.engine.ContactListListener;
import info.guardianproject.otr.app.im.engine.ContactListManager;
import info.guardianproject.otr.app.im.engine.ImConnection;
import info.guardianproject.otr.app.im.engine.ImException;
import info.guardianproject.otr.app.im.engine.LoginInfo;
import info.guardianproject.otr.app.im.engine.Message;
import info.guardianproject.otr.app.im.engine.Presence;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import android.os.Parcel;
public class LoopbackConnection extends ImConnection {
protected static final String TAG = "LoopbackConnection";
private LoopbackContactList mContactListManager;
private Contact mUser;
@Override
protected void doUpdateUserPresenceAsync(Presence presence) {
// mimic presence
ContactList cl;
try {
cl = mContactListManager.getDefaultContactList();
} catch (ImException e) {
throw new RuntimeException(e);
}
if (cl == null)
return;
Collection<Contact> contacts = cl.getContacts();
for (Iterator<Contact> iter = contacts.iterator(); iter.hasNext();) {
Contact contact = iter.next();
contact.setPresence(presence);
}
Contact[] contacts_array = new Contact[contacts.size()];
contacts.toArray(contacts_array);
mContactListManager.doPresence(contacts_array);
}
@Override
public int getCapability() {
// TODO Auto-generated method stub
return 0;
}
@Override
public ChatGroupManager getChatGroupManager() {
// TODO Auto-generated method stub
return null;
}
@Override
public ChatSessionManager getChatSessionManager() {
return new ChatSessionManager() {
@Override
protected void sendMessageAsync(ChatSession session, Message message) {
// Echo
Message rec = new Message(message.getBody());
rec.setFrom(message.getTo());
rec.setDateTime(new Date());
session.onReceiveMessage(rec);
}
/**
* Start encryption for this chat
*/
public boolean encryptChat(String address) { return false; }
/**
* Stop encryption for this chat
*/
public boolean unencryptChat(String address) { return false; }
/**
* Is definitely not encrypted
*/
public boolean isEncryptedSession(String address) { return false; }
/**
* Start remote identity verification
*/
public void verifyRemoteIdentity(String address) {}
/**
* Get public key fingerprint
*/
public String getRemoteKeyFingerprint(String address) { return null; }
/**
* Get public key fingerprint
*/
public String getLocalKeyFingerprint(String address) { return null; }
};
}
@Override
public ContactListManager getContactListManager() {
mContactListManager = new LoopbackContactList();
return mContactListManager;
}
@Override
public Contact getLoginUser() {
return mUser;
}
@Override
public HashMap<String, String> getSessionContext() {
// TODO Auto-generated method stub
return null;
}
@Override
public int[] getSupportedPresenceStatus() {
return new int[] {
Presence.AVAILABLE,
Presence.AWAY,
Presence.IDLE,
Presence.OFFLINE,
Presence.DO_NOT_DISTURB,
};
}
@Override
public void loginAsync(LoginInfo loginInfo, boolean retry) {
mUserPresence = new Presence(Presence.AVAILABLE, "available", null, null, Presence.CLIENT_TYPE_DEFAULT);
mUser = new Contact(new LoopbackAddress(loginInfo.getUserName() + "!", "loopback"), loginInfo.getUserName());
setState(LOGGED_IN, null);
}
@Override
public void logoutAsync() {
// TODO Auto-generated method stub
}
@Override
public void reestablishSessionAsync(HashMap<String, String> sessionContext) {
// TODO Auto-generated method stub
}
@Override
public void suspend() {
// TODO Auto-generated method stub
}
private final class LoopbackContactList extends ContactListManager {
@Override
protected void setListNameAsync(String name, ContactList list) {
// TODO Auto-generated method stub
}
@Override
public String normalizeAddress(String address) {
return address;
}
@Override
public void loadContactListsAsync() {
Collection<Contact> contacts = new ArrayList<Contact>();
Contact[] contacts_array = new Contact[1];
contacts.toArray(contacts_array);
Address dummy_addr = new LoopbackAddress("dummy", "dummy@google.com");
Contact dummy = new Contact(dummy_addr, "dummy");
dummy.setPresence(new Presence(Presence.AVAILABLE, "available", null, null, Presence.CLIENT_TYPE_DEFAULT));
contacts.add(dummy);
ContactList cl = new ContactList(mUser.getAddress(), "default", true, contacts, this);
mContactLists.add(cl);
mDefaultContactList = cl;
notifyContactListLoaded(cl);
notifyContactsPresenceUpdated(contacts.toArray(contacts_array));
notifyContactListsLoaded();
}
public void doPresence(Contact[] contacts) {
notifyContactsPresenceUpdated(contacts);
}
@Override
protected ImConnection getConnection() {
return LoopbackConnection.this;
}
@Override
protected void doRemoveContactFromListAsync(Contact contact,
ContactList list) {
// TODO Auto-generated method stub
}
@Override
protected void doDeleteContactListAsync(ContactList list) {
// TODO Auto-generated method stub
}
@Override
protected void doCreateContactListAsync(String name,
Collection<Contact> contacts, boolean isDefault) {
// TODO Auto-generated method stub
return;
}
@Override
protected void doBlockContactAsync(String address, boolean block) {
// TODO Auto-generated method stub
}
@Override
protected void doAddContactToListAsync(String address, ContactList list)
throws ImException {
Contact contact = new Contact(new LoopbackAddress(address, address), address);
contact.setPresence(new Presence(Presence.AVAILABLE, "available", null, null, Presence.CLIENT_TYPE_DEFAULT));
notifyContactListUpdated(list, ContactListListener.LIST_CONTACT_ADDED, contact);
Contact[] contacts = new Contact[] { contact };
mContactListManager.doPresence(contacts);
}
@Override
public void declineSubscriptionRequest(String contact) {
// TODO Auto-generated method stub
}
@Override
public Contact createTemporaryContact(String address) {
// TODO Auto-generated method stub
return null;
}
@Override
public void approveSubscriptionRequest(String contact) {
// TODO Auto-generated method stub
return;
}
}
class LoopbackAddress extends Address {
private String address;
private String name;
public LoopbackAddress() {
}
public LoopbackAddress(String name, String address) {
this.name = name;
this.address = address;
}
@Override
public String getFullName() {
return name;
}
@Override
public String getScreenName() {
return address;
}
@Override
public void readFromParcel(Parcel source) {
name = source.readString();
address = source.readString();
}
@Override
public void writeToParcel(Parcel dest) {
dest.writeString(name);
dest.writeString(address);
}
}
public void sendHeartbeat() {
}
public void setProxy (String type, String host, int port)
{
}
}