ensure bookmarks are set up after restoring by uuid

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  21 
src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java    | 126 
2 files changed, 87 insertions(+), 60 deletions(-)

Detailed changes

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

@@ -2290,6 +2290,22 @@ public class XmppConnectionService extends Service {
         processModifiedBookmark(bookmark, true);
     }
 
+    public void ensureBookmarkIsAutoJoin(final Conversation conversation) {
+        final var account = conversation.getAccount();
+        final var existingBookmark = conversation.getBookmark();
+        if (existingBookmark == null) {
+            final var bookmark = new Bookmark(account, conversation.getJid().asBareJid());
+            bookmark.setAutojoin(true);
+            createBookmark(account, bookmark);
+        } else {
+            if (existingBookmark.autojoin()) {
+                return;
+            }
+            existingBookmark.setAutojoin(true);
+            createBookmark(account, existingBookmark);
+        }
+    }
+
     public void createBookmark(final Account account, final Bookmark bookmark) {
         account.putBookmark(bookmark);
         final XmppConnection connection = account.getXmppConnection();
@@ -2302,7 +2318,6 @@ public class XmppConnectionService extends Service {
                     Config.LOGTAG,
                     account.getJid().asBareJid() + ": pushing bookmark via Bookmarks 2");
             final Element item = mIqGenerator.publishBookmarkItem(bookmark);
-            Log.d(Config.LOGTAG, "publishing: " + item.toString());
             pushNodeAndEnforcePublishOptions(
                     account,
                     Namespace.BOOKMARKS2,
@@ -2874,7 +2889,9 @@ public class XmppConnectionService extends Service {
                                 existing.getMode() == Conversational.MODE_MULTI,
                                 null));
         this.conversations.add(existing);
-        // TODO push bookmark
+        if (existing.getMode() == Conversational.MODE_MULTI) {
+            ensureBookmarkIsAutoJoin(existing);
+        }
         updateConversationUi();
         return existing;
     }

src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java 🔗

@@ -1,6 +1,5 @@
 package eu.siacs.conversations.ui;
 
-import android.app.AlertDialog;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -17,24 +16,16 @@ import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
 import android.widget.TextView;
 import android.widget.Toast;
-
 import androidx.annotation.NonNull;
 import androidx.core.content.ContextCompat;
 import androidx.databinding.DataBindingUtil;
-
 import com.google.android.material.color.MaterialColors;
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.google.common.base.Strings;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.databinding.ActivityChannelDiscoveryBinding;
 import eu.siacs.conversations.entities.Account;
-import eu.siacs.conversations.entities.Bookmark;
 import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.entities.Room;
 import eu.siacs.conversations.services.ChannelDiscoveryService;
@@ -44,8 +35,15 @@ import eu.siacs.conversations.ui.util.PendingItem;
 import eu.siacs.conversations.ui.util.SoftKeyboardUtils;
 import eu.siacs.conversations.utils.AccountUtils;
 import eu.siacs.conversations.xmpp.Jid;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
 
-public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.OnActionExpandListener, TextView.OnEditorActionListener, ChannelDiscoveryService.OnChannelSearchResultsFound, ChannelSearchResultAdapter.OnChannelSearchResultSelected {
+public class ChannelDiscoveryActivity extends XmppActivity
+        implements MenuItem.OnActionExpandListener,
+                TextView.OnEditorActionListener,
+                ChannelDiscoveryService.OnChannelSearchResultsFound,
+                ChannelSearchResultAdapter.OnChannelSearchResultSelected {
 
     private static final String CHANNEL_DISCOVERY_OPT_IN = "channel_discovery_opt_in";
 
@@ -60,9 +58,7 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
     private boolean optedIn = false;
 
     @Override
-    protected void refreshUiReal() {
-
-    }
+    protected void refreshUiReal() {}
 
     @Override
     protected void onBackendConnected() {
@@ -89,21 +85,25 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
         this.adapter.setOnChannelSearchResultSelectedListener(this);
         this.optedIn = getPreferences().getBoolean(CHANNEL_DISCOVERY_OPT_IN, false);
 
-        final String search = savedInstanceState == null ? null : savedInstanceState.getString("search");
+        final String search =
+                savedInstanceState == null ? null : savedInstanceState.getString("search");
         if (search != null) {
             mInitialSearchValue.push(search);
         }
     }
 
     private static ChannelDiscoveryService.Method getMethod(final Context c) {
-        if ( Strings.isNullOrEmpty(Config.CHANNEL_DISCOVERY)) {
+        if (Strings.isNullOrEmpty(Config.CHANNEL_DISCOVERY)) {
             return ChannelDiscoveryService.Method.LOCAL_SERVER;
         }
         if (QuickConversationsService.isQuicksy()) {
             return ChannelDiscoveryService.Method.JABBER_NETWORK;
         }
         final SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(c);
-        final String m = p.getString("channel_discovery_method", c.getString(R.string.default_channel_discovery));
+        final String m =
+                p.getString(
+                        "channel_discovery_method",
+                        c.getString(R.string.default_channel_discovery));
         try {
             return ChannelDiscoveryService.Method.valueOf(m);
         } catch (IllegalArgumentException e) {
@@ -124,7 +124,8 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
             mMenuSearchView.expandActionView();
             mSearchEditText.append(initialSearchValue);
             mSearchEditText.requestFocus();
-            if ((optedIn || method == ChannelDiscoveryService.Method.LOCAL_SERVER) && xmppConnectionService != null) {
+            if ((optedIn || method == ChannelDiscoveryService.Method.LOCAL_SERVER)
+                    && xmppConnectionService != null) {
                 xmppConnectionService.discoverChannels(initialSearchValue, this.method, this);
             }
         }
@@ -135,18 +136,22 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
 
     @Override
     public boolean onMenuItemActionExpand(@NonNull MenuItem item) {
-        mSearchEditText.post(() -> {
-            mSearchEditText.requestFocus();
-            final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
-            imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT);
-        });
+        mSearchEditText.post(
+                () -> {
+                    mSearchEditText.requestFocus();
+                    final InputMethodManager imm =
+                            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+                    imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT);
+                });
         return true;
     }
 
     @Override
     public boolean onMenuItemActionCollapse(@NonNull MenuItem item) {
-        final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
-        imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
+        final InputMethodManager imm =
+                (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+        imm.hideSoftInputFromWindow(
+                mSearchEditText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
         mSearchEditText.setText("");
         toggleLoadingScreen();
         if (optedIn || method == ChannelDiscoveryService.Method.LOCAL_SERVER) {
@@ -158,7 +163,9 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
     private void toggleLoadingScreen() {
         adapter.submitList(Collections.emptyList());
         binding.progressBar.setVisibility(View.VISIBLE);
-        binding.list.setBackgroundColor(MaterialColors.getColor(binding.list, com.google.android.material.R.attr.colorSurface));
+        binding.list.setBackgroundColor(
+                MaterialColors.getColor(
+                        binding.list, com.google.android.material.R.attr.colorSurface));
     }
 
     @Override
@@ -173,13 +180,14 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
             builder.setPositiveButton(R.string.confirm, (dialog, which) -> optIn());
             builder.setOnCancelListener(dialog -> finish());
             final androidx.appcompat.app.AlertDialog dialog = builder.create();
-            dialog.setOnShowListener(d -> {
-                final TextView textView = dialog.findViewById(android.R.id.message);
-                if (textView == null) {
-                    return;
-                }
-                textView.setMovementMethod(LinkMovementMethod.getInstance());
-            });
+            dialog.setOnShowListener(
+                    d -> {
+                        final TextView textView = dialog.findViewById(android.R.id.message);
+                        if (textView == null) {
+                            return;
+                        }
+                        textView.setMovementMethod(LinkMovementMethod.getInstance());
+                    });
             dialog.setCanceledOnTouchOutside(false);
             dialog.show();
             holdLoading();
@@ -189,13 +197,17 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
     private void holdLoading() {
         adapter.submitList(Collections.emptyList());
         binding.progressBar.setVisibility(View.GONE);
-        binding.list.setBackgroundColor(MaterialColors.getColor(binding.list, com.google.android.material.R.attr.colorSurface));
+        binding.list.setBackgroundColor(
+                MaterialColors.getColor(
+                        binding.list, com.google.android.material.R.attr.colorSurface));
     }
 
     @Override
     public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
         if (mMenuSearchView != null && mMenuSearchView.isActionViewExpanded()) {
-            savedInstanceState.putString("search", mSearchEditText != null ? mSearchEditText.getText().toString() : null);
+            savedInstanceState.putString(
+                    "search",
+                    mSearchEditText != null ? mSearchEditText.getText().toString() : null);
         }
         super.onSaveInstanceState(savedInstanceState);
     }
@@ -220,16 +232,20 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
 
     @Override
     public void onChannelSearchResultsFound(final List<Room> results) {
-        runOnUiThread(() -> {
-            adapter.submitList(results);
-            binding.progressBar.setVisibility(View.GONE);
-            if (results.isEmpty()) {
-                binding.list.setBackground(ContextCompat.getDrawable(this,R.drawable.background_no_results));
-            } else {
-                binding.list.setBackgroundColor(MaterialColors.getColor(binding.list, com.google.android.material.R.attr.colorSurface));
-            }
-        });
-
+        runOnUiThread(
+                () -> {
+                    adapter.submitList(results);
+                    binding.progressBar.setVisibility(View.GONE);
+                    if (results.isEmpty()) {
+                        binding.list.setBackground(
+                                ContextCompat.getDrawable(this, R.drawable.background_no_results));
+                    } else {
+                        binding.list.setBackgroundColor(
+                                MaterialColors.getColor(
+                                        binding.list,
+                                        com.google.android.material.R.attr.colorSurface));
+                    }
+                });
     }
 
     @Override
@@ -243,12 +259,16 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
             final AtomicReference<String> account = new AtomicReference<>(accounts.get(0));
             final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this);
             builder.setTitle(R.string.choose_account);
-            builder.setSingleChoiceItems(accounts.toArray(new CharSequence[0]), 0, (dialog, which) -> account.set(accounts.get(which)));
-            builder.setPositiveButton(R.string.join, (dialog, which) -> joinChannelSearchResult(account.get(), result));
+            builder.setSingleChoiceItems(
+                    accounts.toArray(new CharSequence[0]),
+                    0,
+                    (dialog, which) -> account.set(accounts.get(which)));
+            builder.setPositiveButton(
+                    R.string.join,
+                    (dialog, which) -> joinChannelSearchResult(account.get(), result));
             builder.setNegativeButton(R.string.cancel, null);
             builder.create().show();
         }
-
     }
 
     @Override
@@ -279,17 +299,7 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
         final Conversation conversation =
                 xmppConnectionService.findOrCreateConversation(
                         account, result.getRoom(), true, true, true);
-        final var existingBookmark = conversation.getBookmark();
-        if (existingBookmark == null) {
-            final var bookmark = new Bookmark(account, conversation.getJid().asBareJid());
-            bookmark.setAutojoin(true);
-            xmppConnectionService.createBookmark(account, bookmark);
-        } else {
-            if (!existingBookmark.autojoin()) {
-                existingBookmark.setAutojoin(true);
-                xmppConnectionService.createBookmark(account, existingBookmark);
-            }
-        }
+        xmppConnectionService.ensureBookmarkIsAutoJoin(conversation);
         switchToConversation(conversation);
     }
 }