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