From 401d4478aae18e3d4c113a8bd9442f61bdd2c727 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 15 Feb 2023 13:21:25 -0500 Subject: [PATCH 01/19] Make sure UI update happens even if the View was not attached when the iq came in --- .../conversations/entities/Conversation.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 28899827f9ebdab85ea0f183c0d54c67985e00ce..4e6c43ae49c56c1c82e57e1e15ffda1ff552b0bc 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -1390,26 +1390,21 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl final Element c = packet.addChild("command", Namespace.COMMANDS); c.setAttribute("node", command.getAttribute("node")); c.setAttribute("action", "execute"); - View v = mPager; if (command.getAttribute("node").equals("jabber:iq:register") && packet.getTo().asBareJid().equals(Jid.of("cheogram.com"))) { - new com.cheogram.android.CheogramLicenseChecker(v.getContext(), (signedData, signature) -> { + new com.cheogram.android.CheogramLicenseChecker(mPager.getContext(), (signedData, signature) -> { if (signedData != null && signature != null) { c.addChild("license", "https://ns.cheogram.com/google-play").setContent(signedData); c.addChild("licenseSignature", "https://ns.cheogram.com/google-play").setContent(signature); } xmppConnectionService.sendIqPacket(getAccount(), packet, (a, iq) -> { - v.post(() -> { - session.updateWithResponse(iq); - }); + session.updateWithResponse(iq); }); }).checkLicense(); } else { xmppConnectionService.sendIqPacket(getAccount(), packet, (a, iq) -> { - v.post(() -> { - session.updateWithResponse(iq); - }); + session.updateWithResponse(iq); }); } @@ -2376,6 +2371,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl protected GridLayoutManager layoutManager; protected WebView actionToWebview = null; protected int fillableFieldCount = 0; + protected IqPacket pendingResponsePacket = null; CommandSession(String title, String node, XmppConnectionService xmppConnectionService) { loading(); @@ -2401,7 +2397,15 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl return mTitle; } - public void updateWithResponse(IqPacket iq) { + public void updateWithResponse(final IqPacket iq) { + if (getView().isAttachedToWindow()) { + getView().post(() -> updateWithResponseUiThread(iq)); + } else { + pendingResponsePacket = iq; + } + } + + protected void updateWithResponseUiThread(final IqPacket iq) { this.loadingTimer.cancel(); this.loadingTimer = new Timer(); this.loading = false; @@ -2764,9 +2768,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl if (c.getAttribute("action") == null) c.setAttribute("action", action); xmppConnectionService.sendIqPacket(getAccount(), packet, (a, iq) -> { - getView().post(() -> { - updateWithResponse(iq); - }); + updateWithResponse(iq); }); loading(); @@ -2861,6 +2863,11 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl }); actionsAdapter.notifyDataSetChanged(); + + if (pendingResponsePacket != null) { + updateWithResponseUiThread(pendingResponsePacket); + pendingResponsePacket = null; + } } // https://stackoverflow.com/a/36037991/8611 From bcccd8eb3d8494b35a6005e3274642d4518272f5 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 15 Feb 2023 13:22:15 -0500 Subject: [PATCH 02/19] If a command response indicates an XMPP URI, jump to that If this is part of completed or canceled then the existing logic will close out the command run since we do not set responseElement to anything here. --- .../eu/siacs/conversations/entities/Conversation.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 4e6c43ae49c56c1c82e57e1e15ffda1ff552b0bc..c7ace79ffcc4c6b1e924022f743c2df500b93341 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -3,6 +3,7 @@ package eu.siacs.conversations.entities; import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.database.Cursor; import android.database.DataSetObserver; import android.graphics.drawable.BitmapDrawable; @@ -102,6 +103,7 @@ import eu.siacs.conversations.persistance.DatabaseBackend; import eu.siacs.conversations.services.AvatarService; import eu.siacs.conversations.services.QuickConversationsService; import eu.siacs.conversations.services.XmppConnectionService; +import eu.siacs.conversations.ui.UriHandlerActivity; import eu.siacs.conversations.ui.text.FixedURLSpan; import eu.siacs.conversations.ui.util.ShareUtil; import eu.siacs.conversations.ui.util.SoftKeyboardUtils; @@ -2480,6 +2482,13 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl this.responseElement = el; break; } + if (scheme.equals("xmpp")) { + final Intent intent = new Intent(getView().getContext(), UriHandlerActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(Uri.parse(url)); + getView().getContext().startActivity(intent); + break; + } } } if (el.getName().equals("note") && el.getNamespace().equals("http://jabber.org/protocol/commands")) { From 260d2c7ceaac64a9f0b7a16a1e058525b98be715 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 7 Mar 2023 15:26:37 -0500 Subject: [PATCH 03/19] Inverted flow happy path When doing first-time signup, create an account on the onboarding server and jump into register command at cheogram. When that command is done, we expect it will give us an OOB with xmmp:domain.tld?register which will jump us into magic create flow for that server. Once the new account is setup, if all we previously had was an onboarding account we execute jidSwitch and delete the onboarding account. If anything goes wrong you are left with the onboarding account still tied to cheogram and set up in the app as a "normal" account. If the registration finishes without jumping you to a ?register URI you are left with the onboarding account, but if you make an account then it will do the switch after that (it tries the switch blindly, without checking if the current backend supports it). If you press "no thanks" you just get a spinner forever. --- .../conversations/ui/WelcomeActivity.java | 42 ++++++++- .../java/eu/siacs/conversations/Config.java | 1 + .../conversations/entities/Conversation.java | 8 +- .../services/XmppConnectionService.java | 4 + .../ui/ConversationFragment.java | 3 + .../ui/ConversationsActivity.java | 4 +- .../ui/StartConversationActivity.java | 92 ++++++++++++++++++- 7 files changed, 141 insertions(+), 13 deletions(-) diff --git a/src/cheogram/java/eu/siacs/conversations/ui/WelcomeActivity.java b/src/cheogram/java/eu/siacs/conversations/ui/WelcomeActivity.java index 9f91e0b687c8299ba15b8ab8e9573e0d74337e2c..5c23520c596c8381b7e8c934b33bbc3bc2725901 100644 --- a/src/cheogram/java/eu/siacs/conversations/ui/WelcomeActivity.java +++ b/src/cheogram/java/eu/siacs/conversations/ui/WelcomeActivity.java @@ -17,15 +17,18 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.databinding.DataBindingUtil; +import java.security.SecureRandom; import java.util.Arrays; import java.util.List; import java.util.HashSet; +import java.util.UUID; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.databinding.ActivityWelcomeBinding; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.services.XmppConnectionService; +import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.Compatibility; import eu.siacs.conversations.utils.InstallReferrerUtils; import eu.siacs.conversations.utils.SignupUtils; @@ -35,11 +38,12 @@ import eu.siacs.conversations.xmpp.Jid; import static eu.siacs.conversations.utils.PermissionUtils.allGranted; import static eu.siacs.conversations.utils.PermissionUtils.writeGranted; -public class WelcomeActivity extends XmppActivity implements XmppConnectionService.OnAccountCreated, KeyChainAliasCallback { +public class WelcomeActivity extends XmppActivity implements XmppConnectionService.OnAccountCreated, XmppConnectionService.OnAccountUpdate, KeyChainAliasCallback { private static final int REQUEST_IMPORT_BACKUP = 0x63fb; private XmppUri inviteUri; + private Account onboardingAccount = null; public static void launch(AppCompatActivity activity) { Intent intent = new Intent(activity, WelcomeActivity.class); @@ -82,8 +86,21 @@ public class WelcomeActivity extends XmppActivity implements XmppConnectionServi } @Override - protected void refreshUiReal() { + protected synchronized void refreshUiReal() { + if (onboardingAccount == null) return; + if (onboardingAccount.getStatus() != Account.State.ONLINE) return; + Intent intent = new Intent(this, StartConversationActivity.class); + intent.putExtra("init", true); + intent.putExtra(EXTRA_ACCOUNT, onboardingAccount.getJid().asBareJid().toEscapedString()); + onboardingAccount = null; + startActivity(intent); + finish(); + } + + @Override + public void onAccountUpdate() { + refreshUi(); } @Override @@ -124,9 +141,18 @@ public class WelcomeActivity extends XmppActivity implements XmppConnectionServi setSupportActionBar(binding.toolbar); configureActionBar(getSupportActionBar(), false); binding.registerNewAccount.setOnClickListener(v -> { - final Intent intent = new Intent(this, MagicCreateActivity.class); - addInviteUri(intent); - startActivity(intent); + if (hasInviteUri()) { + final Intent intent = new Intent(this, MagicCreateActivity.class); + addInviteUri(intent); + startActivity(intent); + } else { + binding.registerNewAccount.setText("Working..."); + binding.registerNewAccount.setEnabled(false); + onboardingAccount = new Account(Jid.ofLocalAndDomain(UUID.randomUUID().toString(), Config.ONBOARDING_DOMAIN.toEscapedString()), CryptoHelper.createPassword(new SecureRandom())); + onboardingAccount.setOption(Account.OPTION_REGISTER, true); + onboardingAccount.setOption(Account.OPTION_FIXED_USERNAME, true); + xmppConnectionService.createAccount(onboardingAccount); + } }); binding.useExisting.setOnClickListener(v -> { final List accounts = xmppConnectionService.getAccounts(); @@ -235,6 +261,12 @@ public class WelcomeActivity extends XmppActivity implements XmppConnectionServi } } + protected boolean hasInviteUri() { + final Intent from = getIntent(); + if (from != null && from.hasExtra(StartConversationActivity.EXTRA_INVITE_URI)) return true; + return this.inviteUri != null; + } + public void addInviteUri(Intent to) { final Intent from = getIntent(); if (from != null && from.hasExtra(StartConversationActivity.EXTRA_INVITE_URI)) { diff --git a/src/main/java/eu/siacs/conversations/Config.java b/src/main/java/eu/siacs/conversations/Config.java index 681fdee3c7a3c9822aa3565d6c92b1a9f7215c66..73453583c237a0ad8b8c3e7b03fcb7a80f74c12d 100644 --- a/src/main/java/eu/siacs/conversations/Config.java +++ b/src/main/java/eu/siacs/conversations/Config.java @@ -48,6 +48,7 @@ public final class Config { public static final String DOMAIN_LOCK = null; //only allow account creation for this domain public static final String MAGIC_CREATE_DOMAIN = "chatterboxtown.us"; public static final Jid QUICKSY_DOMAIN = Jid.of("cheogram.com"); + public static final Jid ONBOARDING_DOMAIN = Jid.of("onboarding.cheogram.com"); public static final String CHANNEL_DISCOVERY = "https://search.jabber.network"; diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index c7ace79ffcc4c6b1e924022f743c2df500b93341..b09ff01fe7775abd573379780e61877efea918a3 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -797,7 +797,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } } } else if ((QuickConversationsService.isConversations() || !Config.QUICKSY_DOMAIN.equals(contactJid.getDomain())) && isWithStranger()) { - return contactJid; + return contactJid.equals(Jid.of("cheogram.com")) ? "Cheogram" : contactJid; } else { return this.getContact().getDisplayName(); } @@ -2400,7 +2400,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } public void updateWithResponse(final IqPacket iq) { - if (getView().isAttachedToWindow()) { + if (getView() != null && getView().isAttachedToWindow()) { getView().post(() -> updateWithResponseUiThread(iq)); } else { pendingResponsePacket = iq; @@ -2706,6 +2706,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } public View getView() { + if (mBinding == null) return null; return mBinding.getRoot(); } @@ -2874,8 +2875,9 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl actionsAdapter.notifyDataSetChanged(); if (pendingResponsePacket != null) { - updateWithResponseUiThread(pendingResponsePacket); + final IqPacket pending = pendingResponsePacket; pendingResponsePacket = null; + updateWithResponseUiThread(pending); } } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index c4e7e4f6fb8daab7af161d951843f7311f5f8bd1..5f802cd165771568a8832f89e90d4c4282a9061f 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1805,6 +1805,10 @@ public class XmppConnectionService extends Service { sendMessage(message, true, delay); } + public boolean isOnboarding() { + return getAccounts().size() == 1 && getAccounts().get(0).getJid().getDomain().equals(Config.ONBOARDING_DOMAIN); + } + public void requestEasyOnboardingInvite(final Account account, final EasyOnboardingInvite.OnInviteRequested callback) { final XmppConnection connection = account.getXmppConnection(); final Jid jid = connection == null ? null : connection.getJidForCommand(Namespace.EASY_ONBOARDING_INVITE); diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 264cca2bc2249b4d3c2491a9040e5020afa87f94..9ca8b274a04d0cfa486725d50765948ef1f71ea1 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1202,6 +1202,8 @@ public class ConversationFragment extends XmppFragment @Override public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { + if (activity.xmppConnectionService.isOnboarding()) return; + menuInflater.inflate(R.menu.fragment_conversation, menu); final MenuItem menuMucDetails = menu.findItem(R.id.action_muc_details); final MenuItem menuContactDetails = menu.findItem(R.id.action_contact_details); @@ -2997,6 +2999,7 @@ public class ConversationFragment extends XmppFragment } if (node != null && commandJid != null) { conversation.startCommand(commandFor(commandJid, node), activity.xmppConnectionService); + if (activity.xmppConnectionService.isOnboarding()) binding.tabLayout.setVisibility(View.GONE); } }); return; diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java index 5af53409fb5fbfba05b4e142f59fb3c9a92ef2f4..9c9a1e9a0c5f420f24920e015e7ce2b775faa84a 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java @@ -740,10 +740,10 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio final Conversation conversation = ((ConversationFragment) mainFragment).getConversation(); if (conversation != null) { actionBar.setTitle(conversation.getName()); - actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(!xmppConnectionService.isOnboarding()); ActionBarUtil.setActionBarOnClickListener( binding.toolbar, - (v) -> openConversationDetails(conversation) + (v) -> { if(!xmppConnectionService.isOnboarding()) openConversationDetails(conversation); } ); return; } diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java index 6c6a9b0ea46e88147ef1853025ccb33903e2d214..139b80b1c85cb63f68e2ab5e6345623859120618 100644 --- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java @@ -95,9 +95,13 @@ import eu.siacs.conversations.ui.widget.SwipeRefreshListFragment; import eu.siacs.conversations.utils.AccountUtils; import eu.siacs.conversations.utils.UIHelper; import eu.siacs.conversations.utils.XmppUri; +import eu.siacs.conversations.xml.Element; +import eu.siacs.conversations.xml.Namespace; import eu.siacs.conversations.xmpp.Jid; import eu.siacs.conversations.xmpp.OnUpdateBlocklist; import eu.siacs.conversations.xmpp.XmppConnection; +import eu.siacs.conversations.xmpp.forms.Data; +import eu.siacs.conversations.xmpp.stanzas.IqPacket; public class StartConversationActivity extends XmppActivity implements XmppConnectionService.OnConversationUpdate, OnRosterUpdate, OnUpdateBlocklist, CreatePrivateGroupChatDialog.CreateConferenceDialogListener, JoinConferenceDialog.JoinConferenceDialogListener, SwipeRefreshLayout.OnRefreshListener, CreatePublicChannelDialog.CreatePublicChannelDialogListener { @@ -918,8 +922,11 @@ public class StartConversationActivity extends XmppActivity implements XmppConne final String accountJid = intent.getStringExtra(EXTRA_ACCOUNT); intent = null; boolean hasPstnOrSms = false; + Account onboardingAccount = null; outer: for (Account account : xmppConnectionService.getAccounts()) { + if (onboardingAccount == null && account.getJid().getDomain().equals(Config.ONBOARDING_DOMAIN)) onboardingAccount = account; + if (accountJid != null) { if(account.getJid().asBareJid().toEscapedString().equals(accountJid)) { selectedAccount = account; @@ -941,9 +948,88 @@ public class StartConversationActivity extends XmppActivity implements XmppConne } if (!hasPstnOrSms) { - startCommand(selectedAccount, Jid.of("cheogram.com/CHEOGRAM%jabber:iq:register"), "jabber:iq:register"); - finish(); - return; + if (onboardingAccount != null && !selectedAccount.getJid().equals(onboardingAccount.getJid())) { + final Account onboardAccount = onboardingAccount; + final Account newAccount = selectedAccount; + final IqPacket packet = new IqPacket(IqPacket.TYPE.SET); + packet.setTo(Jid.of("cheogram.com")); + final Element c = packet.addChild("command", Namespace.COMMANDS); + c.setAttribute("node", "change jabber id"); + c.setAttribute("action", "execute"); + + xmppConnectionService.sendIqPacket(onboardingAccount, packet, (a, iq) -> { + Element command = iq.findChild("command", "http://jabber.org/protocol/commands"); + if (command == null) { + Log.e(Config.LOGTAG, "Did not get expected data form from cheogram, got: " + iq); + return; + } + + Element form = command.findChild("x", "jabber:x:data"); + Data dataForm = form == null ? null : Data.parse(form); + if (dataForm == null || dataForm.getFieldByName("new-jid") == null) { + Log.e(Config.LOGTAG, "Did not get expected data form from cheogram, got: " + iq); + return; + } + + dataForm.put("new-jid", newAccount.getJid().toEscapedString()); + dataForm.submit(); + command.setAttribute("action", "execute"); + iq.setTo(iq.getFrom()); + iq.setAttribute("type", "set"); + iq.removeAttribute("from"); + iq.removeAttribute("id"); + xmppConnectionService.sendIqPacket(a, iq, (a2, iq2) -> { + Element command2 = iq2.findChild("command", "http://jabber.org/protocol/commands"); + if (command2 != null && command2.getAttribute("status") != null && command2.getAttribute("status").equals("completed")) { + final IqPacket regPacket = new IqPacket(IqPacket.TYPE.SET); + regPacket.setTo(Jid.of("cheogram.com/CHEOGRAM%jabber:iq:register")); + final Element c2 = regPacket.addChild("command", Namespace.COMMANDS); + c2.setAttribute("node", "jabber:iq:register"); + c2.setAttribute("action", "execute"); + xmppConnectionService.sendIqPacket(newAccount, regPacket, (a3, iq3) -> { + Element command3 = iq3.findChild("command", "http://jabber.org/protocol/commands"); + if (command3 == null) { + Log.e(Config.LOGTAG, "Did not get expected data form from cheogram, got: " + iq3); + return; + } + + Element form3 = command3.findChild("x", "jabber:x:data"); + Data dataForm3 = form3 == null ? null : Data.parse(form3); + if (dataForm3 == null || dataForm3.getFieldByName("confirm") == null) { + Log.e(Config.LOGTAG, "Did not get expected data form from cheogram, got: " + iq3); + return; + } + + dataForm3.put("confirm", "true"); + dataForm3.submit(); + command3.setAttribute("action", "execute"); + iq3.setTo(iq3.getFrom()); + iq3.setAttribute("type", "set"); + iq3.removeAttribute("from"); + iq3.removeAttribute("id"); + xmppConnectionService.sendIqPacket(newAccount, iq3, (a4, iq4) -> { + Element command4 = iq2.findChild("command", "http://jabber.org/protocol/commands"); + if (command4 != null && command4.getAttribute("status") != null && command4.getAttribute("status").equals("completed")) { + xmppConnectionService.createContact(newAccount.getRoster().getContact(iq4.getFrom().asBareJid()), true); + Conversation withCheogram = xmppConnectionService.findOrCreateConversation(newAccount, iq4.getFrom().asBareJid(), true, true, true); + xmppConnectionService.markRead(withCheogram); + xmppConnectionService.clearConversationHistory(withCheogram); + xmppConnectionService.deleteAccount(onboardAccount); + } else { + Log.e(Config.LOGTAG, "Error confirming jid switch, got: " + iq4); + } + }); + }); + } else { + Log.e(Config.LOGTAG, "Error during jid switch, got: " + iq2); + } + }); + }); + } else { + startCommand(selectedAccount, Jid.of("cheogram.com/CHEOGRAM%jabber:iq:register"), "jabber:iq:register"); + finish(); + return; + } } } From d114f3736d2df40767ba6db6a45b32ccddc16267 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 7 Mar 2023 16:40:51 -0500 Subject: [PATCH 04/19] Allow cancel onboarding If this is just a register not part of inversion, archive the conversation when they say "no thanks" so they get back to their regular first start experience. If this is part of inversion, remove the onboarding account since they aren't going to use it and set a flag so we know to redirect to magic create instead of back to the welcome screen. The flag also lets us know not to offer cheogram again right after magic create like we normally would. Then we can clear the flag out and move on as usual. --- .../java/eu/siacs/conversations/utils/SignupUtils.java | 5 ++--- .../eu/siacs/conversations/entities/Conversation.java | 8 ++++++++ .../siacs/conversations/ui/StartConversationActivity.java | 4 +++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/cheogram/java/eu/siacs/conversations/utils/SignupUtils.java b/src/cheogram/java/eu/siacs/conversations/utils/SignupUtils.java index fb088234a24e10ea315bafebd910e28df9caa270..790ea14bfacdd132ef9033cfac3e9ff545613592 100644 --- a/src/cheogram/java/eu/siacs/conversations/utils/SignupUtils.java +++ b/src/cheogram/java/eu/siacs/conversations/utils/SignupUtils.java @@ -62,7 +62,7 @@ public class SignupUtils { if (Config.X509_VERIFICATION) { intent = new Intent(activity, ManageAccountActivity.class); } else if (Config.MAGIC_CREATE_DOMAIN != null) { - intent = getSignUpIntent(activity); + intent = activity.xmppConnectionService.getPreferences().getBoolean("onboarding_canceled", false) ? new Intent(activity, MagicCreateActivity.class) : getSignUpIntent(activity); } else { intent = new Intent(activity, EditAccountActivity.class); } @@ -70,8 +70,7 @@ public class SignupUtils { intent = new Intent(activity, StartConversationActivity.class); } } - intent.putExtra("init", true); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); return intent; } -} \ No newline at end of file +} diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index b09ff01fe7775abd573379780e61877efea918a3..86343cb2fbc1fa3fb6df857099203786740e5b26 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -2498,6 +2498,14 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } if (responseElement == null && command.getAttribute("status") != null && (command.getAttribute("status").equals("completed") || command.getAttribute("status").equals("canceled"))) { + if (mNode.equals("jabber:iq:register") && command.getAttribute("status").equals("canceled")) { + if (xmppConnectionService.isOnboarding()) { + xmppConnectionService.getPreferences().edit().putBoolean("onboarding_canceled", true).commit(); + xmppConnectionService.deleteAccount(getAccount()); + } + xmppConnectionService.archiveConversation(Conversation.this); + } + removeSession(this); return; } diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java index 139b80b1c85cb63f68e2ab5e6345623859120618..541ee116a4f4d53af27382dd42302ad3a8d0fdbe 100644 --- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java @@ -917,7 +917,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne configureHomeButton(); Intent intent = pendingViewIntent.pop(); - if (intent != null && intent.getBooleanExtra("init", false)) { + if (intent != null && intent.getBooleanExtra("init", false) && !xmppConnectionService.getPreferences().getBoolean("onboarding_canceled", false)) { Account selectedAccount = xmppConnectionService.getAccounts().get(0); final String accountJid = intent.getStringExtra(EXTRA_ACCOUNT); intent = null; @@ -1033,6 +1033,8 @@ public class StartConversationActivity extends XmppActivity implements XmppConne } } + xmppConnectionService.getPreferences().edit().remove("onboarding_canceled").commit(); + if (intent != null && processViewIntent(intent)) { filter(null); } else { From 8676e5260657378447660d6759b8fffeca4dd176 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 8 Mar 2023 16:30:25 -0500 Subject: [PATCH 05/19] Fix NPE --- src/main/java/eu/siacs/conversations/xmpp/forms/Option.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/xmpp/forms/Option.java b/src/main/java/eu/siacs/conversations/xmpp/forms/Option.java index f810fffec8a602af3b4f2734cb38867ec93b593e..4f506594f66f14e67ea2eb5627d7864e81355104 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/forms/Option.java +++ b/src/main/java/eu/siacs/conversations/xmpp/forms/Option.java @@ -14,7 +14,7 @@ public class Option { public static List