fix NPE by refactoring onClick

Phillip Davis created

Change summary

src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java | 221 +
1 file changed, 112 insertions(+), 109 deletions(-)

Detailed changes

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

@@ -55,6 +55,7 @@ import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -190,42 +191,15 @@ public class EditAccountActivity extends OmemoActivity
 
                 @Override
                 public void onClick(final View v) {
-                    final String password = binding.accountPassword.getText().toString();
-                    final boolean wasDisabled =
-                            mAccount != null && mAccount.getStatus() == Account.State.DISABLED;
-                    final boolean accountInfoEdited = accountInfoEdited();
+                    final var passwordText = binding.accountPassword.getText();
+                    if (passwordText == null) return;
+                    final String password = passwordText.toString();
 
-                    ColorDrawable previewColor = (ColorDrawable) binding.colorPreview.getBackground();
-                    if (previewColor != null && previewColor.getColor() != mAccount.getColor(isDark())) {
-                        mAccount.setColor(previewColor.getColor());
-                    }
+                    final boolean registerNewAccount =
+                            Objects.requireNonNullElseGet(
+                                    mForceRegister,
+                                    () -> binding.accountRegisterNew.isChecked() && !Config.DISALLOW_REGISTRATION_IN_UI);
 
-                    if (mInitMode && mAccount != null) {
-                        mAccount.setOption(Account.OPTION_DISABLED, false);
-                    }
-                    if (mAccount != null
-                            && Arrays.asList(Account.State.DISABLED, Account.State.LOGGED_OUT)
-                                    .contains(mAccount.getStatus())
-                            && !accountInfoEdited) {
-                        mAccount.setOption(Account.OPTION_SOFT_DISABLED, false);
-                        mAccount.setOption(Account.OPTION_DISABLED, false);
-                        if (!xmppConnectionService.updateAccount(mAccount)) {
-                            Toast.makeText(
-                                            EditAccountActivity.this,
-                                            R.string.unable_to_update_account,
-                                            Toast.LENGTH_SHORT)
-                                    .show();
-                        }
-                        return;
-                    }
-                    final boolean registerNewAccount;
-                    if (mForceRegister != null) {
-                        registerNewAccount = mForceRegister;
-                    } else {
-                        registerNewAccount =
-                                binding.accountRegisterNew.isChecked()
-                                        && !Config.DISALLOW_REGISTRATION_IN_UI;
-                    }
                     if (mUsernameMode && binding.accountJid.getText().toString().contains("@")) {
                         binding.accountJidLayout.setError(getString(R.string.invalid_username));
                         removeErrorsOnAllBut(binding.accountJidLayout);
@@ -233,60 +207,6 @@ public class EditAccountActivity extends OmemoActivity
                         return;
                     }
 
-                    XmppConnection connection =
-                            mAccount == null ? null : mAccount.getXmppConnection();
-                    final boolean startOrbot =
-                            mAccount != null
-                                    && mAccount.getStatus() == Account.State.TOR_NOT_AVAILABLE;
-                    if (startOrbot) {
-                        if (TorServiceUtils.isOrbotInstalled(EditAccountActivity.this)) {
-                            TorServiceUtils.startOrbot(EditAccountActivity.this, REQUEST_ORBOT);
-                        } else {
-                            TorServiceUtils.downloadOrbot(EditAccountActivity.this, REQUEST_ORBOT);
-                        }
-                        return;
-                    }
-
-                    if (inNeedOfSaslAccept()) {
-                        mAccount.resetPinnedMechanism();
-                        if (!xmppConnectionService.updateAccount(mAccount)) {
-                            Toast.makeText(
-                                            EditAccountActivity.this,
-                                            R.string.unable_to_update_account,
-                                            Toast.LENGTH_SHORT)
-                                    .show();
-                        }
-                        return;
-                    }
-
-                    final boolean openRegistrationUrl =
-                            registerNewAccount
-                                    && !accountInfoEdited
-                                    && mAccount != null
-                                    && mAccount.getStatus() == Account.State.REGISTRATION_WEB;
-                    final boolean openPaymentUrl =
-                            mAccount != null
-                                    && mAccount.getStatus() == Account.State.PAYMENT_REQUIRED;
-                    final boolean redirectionWorthyStatus = openPaymentUrl || openRegistrationUrl;
-                    final HttpUrl url =
-                            connection != null && redirectionWorthyStatus
-                                    ? connection.getRedirectionUrl()
-                                    : null;
-                    if (url != null && !wasDisabled) {
-                        try {
-                            startActivity(
-                                    new Intent(Intent.ACTION_VIEW, Uri.parse(url.toString())));
-                            return;
-                        } catch (ActivityNotFoundException e) {
-                            Toast.makeText(
-                                            EditAccountActivity.this,
-                                            R.string.application_found_to_open_website,
-                                            Toast.LENGTH_SHORT)
-                                    .show();
-                            return;
-                        }
-                    }
-
                     final Jid jid;
                     try {
                         if (mUsernameMode) {
@@ -353,40 +273,123 @@ public class EditAccountActivity extends OmemoActivity
                         binding.accountJid.requestFocus();
                         return;
                     }
-                    if (mAccount != null) {
-                        if (mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE)) {
-                            mAccount.setOption(
-                                    Account.OPTION_MAGIC_CREATE,
-                                    mAccount.getPassword().contains(password));
+
+                    final boolean isNewAccount;
+                    if (mAccount == null) {
+                        if (xmppConnectionService.findAccountByJid(jid) != null) {
+                            binding.accountJidLayout.setError(
+                                    getString(R.string.account_already_exists));
+                            removeErrorsOnAllBut(binding.accountJidLayout);
+                            binding.accountJid.requestFocus();
+                            return;
                         }
-                        mAccount.setJid(jid);
-                        mAccount.setPort(numericPort);
-                        mAccount.setHostname(hostname);
-                        binding.accountJidLayout.setError(null);
-                        mAccount.setPassword(password);
-                        mAccount.setOption(Account.OPTION_REGISTER, registerNewAccount);
+                        mAccount = new Account(jid.asBareJid(), password);
+                        isNewAccount = true;
+                    } else {
+                        isNewAccount = false;
+                    }
+
+                    if (mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE)) {
+                        mAccount.setOption(
+                                Account.OPTION_MAGIC_CREATE,
+                                mAccount.getPassword().contains(password));
+                    }
+                    mAccount.setJid(jid);
+                    mAccount.setPort(numericPort);
+                    mAccount.setHostname(hostname);
+                    mAccount.setPassword(password);
+                    mAccount.setOption(Account.OPTION_REGISTER, registerNewAccount);
+
+                    final boolean wasDisabled = mAccount.getStatus() == Account.State.DISABLED;
+                    final boolean accountInfoEdited = accountInfoEdited();
+
+                    // Check TOR FIRST, before any network operations
+                    final boolean startOrbot = mAccount.getStatus() == Account.State.TOR_NOT_AVAILABLE;
+                    if (startOrbot) {
+                        if (TorServiceUtils.isOrbotInstalled(EditAccountActivity.this)) {
+                            TorServiceUtils.startOrbot(EditAccountActivity.this, REQUEST_ORBOT);
+                        } else {
+                            TorServiceUtils.downloadOrbot(EditAccountActivity.this, REQUEST_ORBOT);
+                        }
+                        return;
+                    }
+
+                    ColorDrawable previewColor = (ColorDrawable) binding.colorPreview.getBackground();
+                    if (previewColor != null && previewColor.getColor() != mAccount.getColor(isDark())) {
+                        mAccount.setColor(previewColor.getColor());
+                    }
+
+                    if (mInitMode) {
+                        mAccount.setOption(Account.OPTION_DISABLED, false);
+                    }
+                    if (Arrays.asList(Account.State.DISABLED, Account.State.LOGGED_OUT)
+                                    .contains(mAccount.getStatus())
+                            && !accountInfoEdited) {
+                        mAccount.setOption(Account.OPTION_SOFT_DISABLED, false);
+                        mAccount.setOption(Account.OPTION_DISABLED, false);
+                        if (!xmppConnectionService.updateAccount(mAccount)) {
+                            Toast.makeText(
+                                            EditAccountActivity.this,
+                                            R.string.unable_to_update_account,
+                                            Toast.LENGTH_SHORT)
+                                    .show();
+                        }
+                        return;
+                    }
+
+                    XmppConnection connection = mAccount.getXmppConnection();
+
+                    if (inNeedOfSaslAccept()) {
+                        mAccount.resetPinnedMechanism();
                         if (!xmppConnectionService.updateAccount(mAccount)) {
                             Toast.makeText(
                                             EditAccountActivity.this,
                                             R.string.unable_to_update_account,
                                             Toast.LENGTH_SHORT)
                                     .show();
+                        }
+                        return;
+                    }
+
+                    final boolean openRegistrationUrl =
+                            registerNewAccount
+                                    && !accountInfoEdited
+                                    && mAccount.getStatus() == Account.State.REGISTRATION_WEB;
+                    final boolean openPaymentUrl = mAccount.getStatus() == Account.State.PAYMENT_REQUIRED;
+                    final boolean redirectionWorthyStatus = openPaymentUrl || openRegistrationUrl;
+                    final HttpUrl url =
+                            connection != null && redirectionWorthyStatus
+                                    ? connection.getRedirectionUrl()
+                                    : null;
+                    if (url != null && !wasDisabled) {
+                        try {
+                            startActivity(
+                                    new Intent(Intent.ACTION_VIEW, Uri.parse(url.toString())));
+                            return;
+                        } catch (ActivityNotFoundException e) {
+                            Toast.makeText(
+                                            EditAccountActivity.this,
+                                            R.string.application_found_to_open_website,
+                                            Toast.LENGTH_SHORT)
+                                    .show();
                             return;
                         }
+                    }
+
+                    binding.accountJidLayout.setError(null);
+                    if (isNewAccount) {
+                        xmppConnectionService.createAccount(mAccount);
                     } else {
-                        if (xmppConnectionService.findAccountByJid(jid) != null) {
-                            binding.accountJidLayout.setError(
-                                    getString(R.string.account_already_exists));
-                            removeErrorsOnAllBut(binding.accountJidLayout);
-                            binding.accountJid.requestFocus();
+                        if (!xmppConnectionService.updateAccount(mAccount)) {
+                            Toast.makeText(
+                                            EditAccountActivity.this,
+                                            R.string.unable_to_update_account,
+                                            Toast.LENGTH_SHORT)
+                                    .show();
                             return;
                         }
-                        mAccount = new Account(jid.asBareJid(), password);
-                        mAccount.setPort(numericPort);
-                        mAccount.setHostname(hostname);
-                        mAccount.setOption(Account.OPTION_REGISTER, registerNewAccount);
-                        xmppConnectionService.createAccount(mAccount);
                     }
+
                     binding.hostnameLayout.setError(null);
                     binding.portLayout.setError(null);
                     if (mAccount.isOnion()) {