pushing bookmarks back to server

This commit is contained in:
iNPUTmice 2014-07-15 14:32:19 +02:00
parent 6031af8606
commit 2ebd92b7a7
6 changed files with 87 additions and 12 deletions

View file

@ -268,4 +268,5 @@
<string name="conference_address_example">room@conference.example.com</string> <string name="conference_address_example">room@conference.example.com</string>
<string name="save_as_bookmark">Save as bookmark</string> <string name="save_as_bookmark">Save as bookmark</string>
<string name="delete_bookmark">Delete bookmark</string> <string name="delete_bookmark">Delete bookmark</string>
<string name="bookmark_already_exists">This bookmark already exists</string>
</resources> </resources>

View file

@ -309,4 +309,13 @@ public class Account extends AbstractEntity{
public List<Bookmark> getBookmarks() { public List<Bookmark> getBookmarks() {
return this.bookmarks; return this.bookmarks;
} }
public boolean hasBookmarkFor(String conferenceJid) {
for(Bookmark bmark : this.bookmarks) {
if (bmark.getJid().equals(conferenceJid)) {
return true;
}
}
return false;
}
} }

View file

@ -16,13 +16,13 @@ public class Bookmark implements ListItem {
private boolean autojoin; private boolean autojoin;
private Conversation mJoinedConversation; private Conversation mJoinedConversation;
public Bookmark(Account account) { public Bookmark(Account account, String jid) {
this.account = account; this.account = account;
this.jid = jid;
} }
public static Bookmark parse(Element element, Account account) { public static Bookmark parse(Element element, Account account) {
Bookmark bookmark = new Bookmark(account); Bookmark bookmark = new Bookmark(account,element.getAttribute("jid"));
bookmark.setJid(element.getAttribute("jid"));
bookmark.setName(element.getAttribute("name")); bookmark.setName(element.getAttribute("name"));
String autojoin = element.getAttribute("autojoin"); String autojoin = element.getAttribute("autojoin");
if (autojoin!=null && (autojoin.equals("true")||autojoin.equals("1"))) { if (autojoin!=null && (autojoin.equals("true")||autojoin.equals("1"))) {
@ -45,10 +45,6 @@ public class Bookmark implements ListItem {
this.name = name; this.name = name;
} }
public void setJid(String jid) {
this.jid = jid;
}
public void setNick(String nick) { public void setNick(String nick) {
this.nick = nick; this.nick = nick;
} }
@ -60,8 +56,8 @@ public class Bookmark implements ListItem {
@Override @Override
public String getDisplayName() { public String getDisplayName() {
if (this.mJoinedConversation!=null) { if (this.mJoinedConversation!=null && (this.mJoinedConversation.getMucOptions().getSubject() != null)) {
return this.mJoinedConversation.getName(true); return this.mJoinedConversation.getMucOptions().getSubject();
} else if (name!=null) { } else if (name!=null) {
return name; return name;
} else { } else {
@ -109,4 +105,21 @@ public class Bookmark implements ListItem {
public String getName() { public String getName() {
return name; return name;
} }
public Element toElement() {
Element element = new Element("conference");
element.setAttribute("jid", this.getJid());
if (this.getName() != null) {
element.setAttribute("name", this.getName());
}
if (this.autojoin) {
element.setAttribute("autojoin", "true");
} else {
element.setAttribute("autojoin", "false");
}
if (this.nick != null) {
element.addChild("nick").setContent(this.nick);
}
return element;
}
} }

View file

@ -390,4 +390,8 @@ public class Conversation extends AbstractEntity {
this.bookmark.setConversation(null); this.bookmark.setConversation(null);
} }
} }
public Bookmark getBookmark() {
return this.bookmark;
}
} }

View file

@ -703,6 +703,16 @@ public class XmppConnectionService extends Service {
} }
public void pushBookmarks(Account account) {
IqPacket iqPacket = new IqPacket(IqPacket.TYPE_SET);
Element query = iqPacket.query("jabber:iq:private");
Element storage = query.addChild("storage", "storage:bookmarks");
for(Bookmark bookmark : account.getBookmarks()) {
storage.addChild(bookmark.toElement());
}
sendIqPacket(account, iqPacket,null);
}
private void mergePhoneContactsWithRoster() { private void mergePhoneContactsWithRoster() {
PhoneHelper.loadPhoneContacts(getApplicationContext(), PhoneHelper.loadPhoneContacts(getApplicationContext(),
new OnPhoneContactsLoadedListener() { new OnPhoneContactsLoadedListener() {
@ -840,6 +850,11 @@ public class XmppConnectionService extends Service {
public void archiveConversation(Conversation conversation) { public void archiveConversation(Conversation conversation) {
if (conversation.getMode() == Conversation.MODE_MULTI) { if (conversation.getMode() == Conversation.MODE_MULTI) {
Bookmark bookmark = conversation.getBookmark();
if (bookmark!=null && bookmark.autojoin()) {
bookmark.setAutojoin(false);
pushBookmarks(bookmark.getAccount());
}
leaveMuc(conversation); leaveMuc(conversation);
} else { } else {
conversation.endOtrIfNeeded(); conversation.endOtrIfNeeded();
@ -1005,10 +1020,10 @@ public class XmppConnectionService extends Service {
+ "/" + conversation.getMucOptions().getNick()); + "/" + conversation.getMucOptions().getNick());
packet.setAttribute("from", conversation.getAccount().getFullJid()); packet.setAttribute("from", conversation.getAccount().getFullJid());
packet.setAttribute("type", "unavailable"); packet.setAttribute("type", "unavailable");
Log.d(LOGTAG, "send leaving muc " + packet);
sendPresencePacket(conversation.getAccount(),packet); sendPresencePacket(conversation.getAccount(),packet);
conversation.getMucOptions().setOffline(); conversation.getMucOptions().setOffline();
conversation.deregisterWithBookmark(); conversation.deregisterWithBookmark();
Log.d(LOGTAG,conversation.getAccount().getJid()+" leaving muc "+conversation.getContactJid());
} }
public void disconnect(Account account, boolean force) { public void disconnect(Account account, boolean force) {

View file

@ -30,6 +30,7 @@ import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView; import android.widget.AutoCompleteTextView;
import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ListView; import android.widget.ListView;
@ -222,6 +223,10 @@ public class StartConversation extends XmppActivity {
Bookmark bookmark = (Bookmark) conferences.get(position); Bookmark bookmark = (Bookmark) conferences.get(position);
Conversation conversation = xmppConnectionService.findOrCreateConversation(bookmark.getAccount(), bookmark.getJid(), true); Conversation conversation = xmppConnectionService.findOrCreateConversation(bookmark.getAccount(), bookmark.getJid(), true);
conversation.setBookmark(bookmark); conversation.setBookmark(bookmark);
if (!bookmark.autojoin()) {
bookmark.setAutojoin(true);
xmppConnectionService.pushBookmarks(bookmark.getAccount());
}
switchToConversation(conversation); switchToConversation(conversation);
} }
@ -238,6 +243,15 @@ public class StartConversation extends XmppActivity {
filter(mSearchEditText.getText().toString()); filter(mSearchEditText.getText().toString());
} }
protected void deleteConference() {
int position = contact_context_id;
Bookmark bookmark = (Bookmark) conferences.get(position);
Account account = bookmark.getAccount();
account.getBookmarks().remove(bookmark);
xmppConnectionService.pushBookmarks(account);
filter(mSearchEditText.getText().toString());
}
protected void showCreateContactDialog() { protected void showCreateContactDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this); AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.create_contact); builder.setTitle(R.string.create_contact);
@ -293,6 +307,7 @@ public class StartConversation extends XmppActivity {
jid.setAdapter(new KnownHostsAdapter(this, jid.setAdapter(new KnownHostsAdapter(this,
android.R.layout.simple_list_item_1, mKnownConferenceHosts)); android.R.layout.simple_list_item_1, mKnownConferenceHosts));
populateAccountSpinner(spinner); populateAccountSpinner(spinner);
final CheckBox bookmarkCheckBox = (CheckBox) dialogView.findViewById(R.id.bookmark);
builder.setView(dialogView); builder.setView(dialogView);
builder.setNegativeButton(R.string.cancel, null); builder.setNegativeButton(R.string.cancel, null);
builder.setPositiveButton(R.string.join, null); builder.setPositiveButton(R.string.join, null);
@ -309,10 +324,26 @@ public class StartConversation extends XmppActivity {
String conferenceJid = jid.getText().toString(); String conferenceJid = jid.getText().toString();
Account account = xmppConnectionService Account account = xmppConnectionService
.findAccountByJid(accountJid); .findAccountByJid(accountJid);
if (bookmarkCheckBox.isChecked()) {
if (account.hasBookmarkFor(conferenceJid)) {
jid.setError(getString(R.string.bookmark_already_exists));
} else {
Bookmark bookmark = new Bookmark(account, conferenceJid);
bookmark.setAutojoin(true);
account.getBookmarks().add(bookmark);
xmppConnectionService.pushBookmarks(account);
Conversation conversation = xmppConnectionService
.findOrCreateConversation(account,
conferenceJid, true);
conversation.setBookmark(bookmark);
switchToConversation(conversation);
}
} else {
Conversation conversation = xmppConnectionService Conversation conversation = xmppConnectionService
.findOrCreateConversation(account, .findOrCreateConversation(account,
conferenceJid, true); conferenceJid, true);
switchToConversation(conversation); switchToConversation(conversation);
}
} else { } else {
jid.setError(getString(R.string.invalid_jid)); jid.setError(getString(R.string.invalid_jid));
} }
@ -508,6 +539,8 @@ public class StartConversation extends XmppActivity {
case R.id.context_join_conference: case R.id.context_join_conference:
activity.openConversationForBookmark(); activity.openConversationForBookmark();
break; break;
case R.id.context_delete_conference:
activity.deleteConference();
} }
return true; return true;
} }