pushing bookmarks back to server

iNPUTmice created

Change summary

res/values/strings.xml                                         |  1 
src/eu/siacs/conversations/entities/Account.java               |  9 
src/eu/siacs/conversations/entities/Bookmark.java              | 31 ++
src/eu/siacs/conversations/entities/Conversation.java          |  4 
src/eu/siacs/conversations/services/XmppConnectionService.java | 17 +
src/eu/siacs/conversations/ui/StartConversation.java           | 37 +++
6 files changed, 87 insertions(+), 12 deletions(-)

Detailed changes

res/values/strings.xml 🔗

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

src/eu/siacs/conversations/entities/Account.java 🔗

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

src/eu/siacs/conversations/entities/Bookmark.java 🔗

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

src/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -702,6 +702,16 @@ public class XmppConnectionService extends Service {
 		sendIqPacket(account, iqPacket, callback);
 		
 	}
+	
+	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() {
 		PhoneHelper.loadPhoneContacts(getApplicationContext(),
@@ -840,6 +850,11 @@ public class XmppConnectionService extends Service {
 
 	public void archiveConversation(Conversation conversation) {
 		if (conversation.getMode() == Conversation.MODE_MULTI) {
+			Bookmark bookmark = conversation.getBookmark();
+			if (bookmark!=null && bookmark.autojoin()) {
+				bookmark.setAutojoin(false);
+				pushBookmarks(bookmark.getAccount());
+			}
 			leaveMuc(conversation);
 		} else {
 			conversation.endOtrIfNeeded();
@@ -1005,10 +1020,10 @@ public class XmppConnectionService extends Service {
 				+ "/" + conversation.getMucOptions().getNick());
 		packet.setAttribute("from", conversation.getAccount().getFullJid());
 		packet.setAttribute("type", "unavailable");
-		Log.d(LOGTAG, "send leaving muc " + packet);
 		sendPresencePacket(conversation.getAccount(),packet);
 		conversation.getMucOptions().setOffline();
 		conversation.deregisterWithBookmark();
+		Log.d(LOGTAG,conversation.getAccount().getJid()+" leaving muc "+conversation.getContactJid());
 	}
 
 	public void disconnect(Account account, boolean force) {

src/eu/siacs/conversations/ui/StartConversation.java 🔗

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