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.finePrint.setVisibility(View.INVISIBLE);
 70            binding.username.setEnabled(false);
 71            binding.username.setText(this.username);
 72            updateFullJidInformation(this.username);
 73        } else if (domain != null) {
 74            binding.instructions.setText(getString(R.string.magic_create_text_on_x, domain));
 75            binding.finePrint.setVisibility(View.INVISIBLE);
 76        }
 77        binding.createAccount.setOnClickListener(v -> {
 78            try {
 79                final String username = binding.username.getText().toString();
 80                final Jid jid;
 81                final boolean fixedUsername;
 82                if (this.domain != null && this.username != null) {
 83                    fixedUsername = true;
 84                    jid = Jid.ofLocalAndDomainEscaped(this.username, this.domain);
 85                } else if (this.domain != null) {
 86                    fixedUsername = false;
 87                    jid = Jid.ofLocalAndDomainEscaped(username, this.domain);
 88                } else {
 89                    fixedUsername = false;
 90                    jid = Jid.ofLocalAndDomainEscaped(username, Config.MAGIC_CREATE_DOMAIN);
 91                }
 92                if (!jid.getEscapedLocal().equals(jid.getLocal()) || (this.username == null && username.length() < 3)) {
 93                    binding.username.setError(getString(R.string.invalid_username));
 94                    binding.username.requestFocus();
 95                } else {
 96                    binding.username.setError(null);
 97                    Account account = xmppConnectionService.findAccountByJid(jid);
 98                    if (account == null) {
 99                        account = new Account(jid, CryptoHelper.createPassword(new SecureRandom()));
100                        account.setOption(Account.OPTION_REGISTER, true);
101                        account.setOption(Account.OPTION_DISABLED, true);
102                        account.setOption(Account.OPTION_MAGIC_CREATE, true);
103                        account.setOption(Account.OPTION_FIXED_USERNAME, fixedUsername);
104                        if (this.preAuth != null) {
105                            account.setKey(Account.PRE_AUTH_REGISTRATION_TOKEN, this.preAuth);
106                        }
107                        xmppConnectionService.createAccount(account);
108                    }
109                    Intent intent = new Intent(MagicCreateActivity.this, EditAccountActivity.class);
110                    intent.putExtra("jid", account.getJid().asBareJid().toString());
111                    intent.putExtra("init", true);
112                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
113                    Toast.makeText(MagicCreateActivity.this, R.string.secure_password_generated, Toast.LENGTH_SHORT).show();
114                    StartConversationActivity.addInviteUri(intent, getIntent());
115                    startActivity(intent);
116                }
117            } catch (IllegalArgumentException e) {
118                binding.username.setError(getString(R.string.invalid_username));
119                binding.username.requestFocus();
120            }
121        });
122        binding.username.addTextChangedListener(this);
123    }
124
125    @Override
126    public void onDestroy() {
127        InstallReferrerUtils.markInstallReferrerExecuted(this);
128        super.onDestroy();
129    }
130
131    @Override
132    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
133
134    }
135
136    @Override
137    public void onTextChanged(CharSequence s, int start, int before, int count) {
138
139    }
140
141    @Override
142    public void afterTextChanged(final Editable s) {
143        updateFullJidInformation(s.toString());
144    }
145
146    private void updateFullJidInformation(final String username) {
147        if (username.trim().isEmpty()) {
148            binding.fullJid.setVisibility(View.INVISIBLE);
149        } else {
150            try {
151                binding.fullJid.setVisibility(View.VISIBLE);
152                final Jid jid;
153                if (this.domain == null) {
154                    jid = Jid.ofLocalAndDomainEscaped(username, Config.MAGIC_CREATE_DOMAIN);
155                } else {
156                    jid = Jid.ofLocalAndDomainEscaped(username, this.domain);
157                }
158                binding.fullJid.setText(getString(R.string.your_full_jid_will_be, jid.toEscapedString()));
159            } catch (IllegalArgumentException e) {
160                binding.fullJid.setVisibility(View.INVISIBLE);
161            }
162        }
163    }
164}