Load gateways into UI

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java | 45 +++++-
1 file changed, 38 insertions(+), 7 deletions(-)

Detailed changes

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

@@ -150,6 +150,34 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected
         binding.gatewayList.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
         binding.gatewayList.setAdapter(gatewayListAdapter);
 
+        binding.account.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView accountSpinner, View view, int position, long id) {
+                XmppActivity context = (XmppActivity) getActivity();
+                if (context.xmppConnectionService == null || accountJid() == null) return;
+
+                gatewayListAdapter.clear();
+                final Account account = context.xmppConnectionService.findAccountByJid(accountJid());
+
+                for (final Contact contact : account.getRoster().getContacts()) {
+                    if (contact.showInRoster() && (contact.getPresences().anyIdentity("gateway", null) || contact.getPresences().anySupport("jabber:iq:gateway"))) {
+                        context.xmppConnectionService.fetchGatewayPrompt(account, contact.getJid(), (final String prompt, String errorMessage) -> {
+                            if (prompt == null) return;
+
+                            context.runOnUiThread(() -> {
+                                gatewayListAdapter.add(contact, prompt);
+                            });
+                        });
+                    }
+                }
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView accountSpinner) {
+                gatewayListAdapter.clear();
+            }
+        });
+
         builder.setView(binding.getRoot());
         builder.setNegativeButton(R.string.cancel, null);
         builder.setPositiveButton(getArguments().getString(POSITIVE_BUTTON_KEY), null);
@@ -171,20 +199,23 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected
         return dialog;
     }
 
-    private void handleEnter(EnterJidDialogBinding binding, String account) {
-        final Jid accountJid;
-        if (!binding.account.isEnabled() && account == null) {
-            return;
-        }
+    protected Jid accountJid() {
         try {
             if (Config.DOMAIN_LOCK != null) {
-                accountJid = Jid.ofEscaped((String) binding.account.getSelectedItem(), Config.DOMAIN_LOCK, null);
+                return Jid.ofEscaped((String) binding.account.getSelectedItem(), Config.DOMAIN_LOCK, null);
             } else {
-                accountJid = Jid.ofEscaped((String) binding.account.getSelectedItem());
+                return Jid.ofEscaped((String) binding.account.getSelectedItem());
             }
         } catch (final IllegalArgumentException e) {
+            return null;
+        }
+    }
+
+    private void handleEnter(EnterJidDialogBinding binding, String account) {
+        if (!binding.account.isEnabled() && account == null) {
             return;
         }
+        final Jid accountJid = accountJid();
         final Jid contactJid;
         try {
             contactJid = Jid.ofEscaped(binding.jid.getText().toString());