MagicCreateActivity.java

  1package eu.siacs.conversations.ui;
  2
  3import android.content.Intent;
  4import android.content.pm.ActivityInfo;
  5import android.os.Bundle;
  6import android.text.Editable;
  7import android.text.TextWatcher;
  8import android.view.View;
  9import android.widget.Toast;
 10
 11import androidx.databinding.DataBindingUtil;
 12
 13import eu.siacs.conversations.Config;
 14import eu.siacs.conversations.R;
 15import eu.siacs.conversations.databinding.ActivityMagicCreateBinding;
 16import eu.siacs.conversations.entities.Account;
 17import eu.siacs.conversations.utils.CryptoHelper;
 18import eu.siacs.conversations.utils.InstallReferrerUtils;
 19import eu.siacs.conversations.xmpp.Jid;
 20
 21import java.security.SecureRandom;
 22
 23public class MagicCreateActivity extends XmppActivity implements TextWatcher {
 24
 25    public static final String EXTRA_DOMAIN = "domain";
 26    public static final String EXTRA_PRE_AUTH = "pre_auth";
 27    public static final String EXTRA_USERNAME = "username";
 28
 29    private ActivityMagicCreateBinding binding;
 30    private String domain;
 31    private String username;
 32    private String preAuth;
 33
 34    @Override
 35    protected void refreshUiReal() {}
 36
 37    @Override
 38    protected void onBackendConnected() {}
 39
 40    @Override
 41    protected void onCreate(final Bundle savedInstanceState) {
 42        final Intent data = getIntent();
 43        this.domain = data == null ? null : data.getStringExtra(EXTRA_DOMAIN);
 44        this.preAuth = data == null ? null : data.getStringExtra(EXTRA_PRE_AUTH);
 45        this.username = data == null ? null : data.getStringExtra(EXTRA_USERNAME);
 46        if (getResources().getBoolean(R.bool.portrait_only)) {
 47            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
 48        }
 49        super.onCreate(savedInstanceState);
 50        this.binding = DataBindingUtil.setContentView(this, R.layout.activity_magic_create);
 51        Activities.setStatusAndNavigationBarColors(this, binding.getRoot());
 52        setSupportActionBar(this.binding.toolbar);
 53        configureActionBar(getSupportActionBar(), this.domain == null);
 54        if (username != null && domain != null) {
 55            binding.title.setText(R.string.your_server_invitation);
 56            binding.instructions.setText(getString(R.string.magic_create_text_fixed, domain));
 57            binding.username.setEnabled(false);
 58            binding.username.setText(this.username);
 59            updateFullJidInformation(this.username);
 60        } else if (domain != null) {
 61            binding.instructions.setText(getString(R.string.magic_create_text_on_x, domain));
 62        }
 63        binding.createAccount.setOnClickListener(
 64                v -> {
 65                    try {
 66                        final String username = binding.username.getText().toString();
 67                        final Jid jid;
 68                        final boolean fixedUsername;
 69                        if (this.domain != null && this.username != null) {
 70                            fixedUsername = true;
 71                            jid = Jid.ofLocalAndDomainEscaped(this.username, this.domain);
 72                        } else if (this.domain != null) {
 73                            fixedUsername = false;
 74                            jid = Jid.ofLocalAndDomainEscaped(username, this.domain);
 75                        } else {
 76                            fixedUsername = false;
 77                            jid = Jid.ofLocalAndDomainEscaped(username, Config.MAGIC_CREATE_DOMAIN);
 78                        }
 79                        if (!jid.getEscapedLocal().equals(jid.getLocal())
 80                                || (this.username == null && username.length() < 3)) {
 81                            binding.usernameLayout.setError(getString(R.string.invalid_username));
 82                            binding.username.requestFocus();
 83                        } else {
 84                            binding.usernameLayout.setError(null);
 85                            Account account = xmppConnectionService.findAccountByJid(jid);
 86                            if (account == null) {
 87                                account =
 88                                        new Account(
 89                                                jid,
 90                                                CryptoHelper.createPassword(new SecureRandom()));
 91                                account.setOption(Account.OPTION_REGISTER, true);
 92                                account.setOption(Account.OPTION_DISABLED, true);
 93                                account.setOption(Account.OPTION_MAGIC_CREATE, true);
 94                                account.setOption(Account.OPTION_FIXED_USERNAME, fixedUsername);
 95                                if (this.preAuth != null) {
 96                                    account.setKey(
 97                                            Account.KEY_PRE_AUTH_REGISTRATION_TOKEN, this.preAuth);
 98                                }
 99                                xmppConnectionService.createAccount(account);
100                            }
101                            Intent intent =
102                                    new Intent(MagicCreateActivity.this, EditAccountActivity.class);
103                            intent.putExtra("jid", account.getJid().asBareJid().toString());
104                            intent.putExtra("init", true);
105                            intent.setFlags(
106                                    Intent.FLAG_ACTIVITY_NEW_TASK
107                                            | Intent.FLAG_ACTIVITY_CLEAR_TASK);
108                            Toast.makeText(
109                                            MagicCreateActivity.this,
110                                            R.string.secure_password_generated,
111                                            Toast.LENGTH_SHORT)
112                                    .show();
113                            StartConversationActivity.addInviteUri(intent, getIntent());
114                            startActivity(intent);
115                        }
116                    } catch (final IllegalArgumentException e) {
117                        binding.usernameLayout.setError(getString(R.string.invalid_username));
118                        binding.username.requestFocus();
119                    }
120                });
121        binding.username.addTextChangedListener(this);
122    }
123
124    @Override
125    public void onDestroy() {
126        InstallReferrerUtils.markInstallReferrerExecuted(this);
127        super.onDestroy();
128    }
129
130    @Override
131    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
132
133    @Override
134    public void onTextChanged(CharSequence s, int start, int before, int count) {}
135
136    @Override
137    public void afterTextChanged(final Editable s) {
138        updateFullJidInformation(s.toString());
139    }
140
141    private void updateFullJidInformation(final String username) {
142        if (username.trim().isEmpty()) {
143            binding.fullJid.setVisibility(View.INVISIBLE);
144        } else {
145            try {
146                binding.fullJid.setVisibility(View.VISIBLE);
147                final Jid jid;
148                if (this.domain == null) {
149                    jid = Jid.ofLocalAndDomainEscaped(username, Config.MAGIC_CREATE_DOMAIN);
150                } else {
151                    jid = Jid.ofLocalAndDomainEscaped(username, this.domain);
152                }
153                binding.fullJid.setText(
154                        getString(R.string.your_full_jid_will_be, jid.toEscapedString()));
155                binding.usernameLayout.setError(null);
156            } catch (final IllegalArgumentException e) {
157                binding.fullJid.setVisibility(View.INVISIBLE);
158            }
159        }
160    }
161}