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