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.Button;
10import android.widget.EditText;
11import android.widget.TextView;
12import android.widget.Toast;
13
14import java.security.SecureRandom;
15
16import eu.siacs.conversations.Config;
17import eu.siacs.conversations.R;
18import eu.siacs.conversations.entities.Account;
19import rocks.xmpp.addr.Jid;
20
21public class MagicCreateActivity extends XmppActivity implements TextWatcher {
22
23 private TextView mFullJidDisplay;
24 private EditText mUsername;
25 private SecureRandom mRandom;
26
27 private static final String CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456780+-/#$!?";
28 private static final int PW_LENGTH = 10;
29
30 @Override
31 protected void refreshUiReal() {
32
33 }
34
35 @Override
36 void onBackendConnected() {
37
38 }
39
40 @Override
41 public void onStart() {
42 super.onStart();
43 final int theme = findTheme();
44 if (this.mTheme != theme) {
45 recreate();
46 }
47 }
48
49 @Override
50 protected void onCreate(final Bundle savedInstanceState) {
51 if (getResources().getBoolean(R.bool.portrait_only)) {
52 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
53 }
54 super.onCreate(savedInstanceState);
55 setContentView(R.layout.magic_create);
56 setSupportActionBar(findViewById(R.id.toolbar));
57 configureActionBar(getSupportActionBar());
58 mFullJidDisplay = findViewById(R.id.full_jid);
59 mUsername = findViewById(R.id.username);
60 mRandom = new SecureRandom();
61 Button next = findViewById(R.id.create_account);
62 next.setOnClickListener(v -> {
63 try {
64 String username = mUsername.getText().toString();
65 Jid jid = Jid.of(username.toLowerCase(), Config.MAGIC_CREATE_DOMAIN, null);
66 if (!jid.getEscapedLocal().equals(jid.getLocal())|| username.length() < 3) {
67 mUsername.setError(getString(R.string.invalid_username));
68 mUsername.requestFocus();
69 } else {
70 mUsername.setError(null);
71 Account account = xmppConnectionService.findAccountByJid(jid);
72 if (account == null) {
73 account = new Account(jid, createPassword());
74 account.setOption(Account.OPTION_REGISTER, true);
75 account.setOption(Account.OPTION_DISABLED, true);
76 account.setOption(Account.OPTION_MAGIC_CREATE, true);
77 xmppConnectionService.createAccount(account);
78 }
79 Intent intent = new Intent(MagicCreateActivity.this, EditAccountActivity.class);
80 intent.putExtra("jid", account.getJid().asBareJid().toString());
81 intent.putExtra("init", true);
82 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
83 Toast.makeText(MagicCreateActivity.this, R.string.secure_password_generated, Toast.LENGTH_SHORT).show();
84 WelcomeActivity.addInviteUri(intent, getIntent());
85 startActivity(intent);
86 }
87 } catch (IllegalArgumentException e) {
88 mUsername.setError(getString(R.string.invalid_username));
89 mUsername.requestFocus();
90 }
91 });
92 mUsername.addTextChangedListener(this);
93 }
94
95 private String createPassword() {
96 StringBuilder builder = new StringBuilder(PW_LENGTH);
97 for (int i = 0; i < PW_LENGTH; ++i) {
98 builder.append(CHARS.charAt(mRandom.nextInt(CHARS.length() - 1)));
99 }
100 return builder.toString();
101 }
102
103 @Override
104 public void beforeTextChanged(CharSequence s, int start, int count, int after) {
105
106 }
107
108 @Override
109 public void onTextChanged(CharSequence s, int start, int before, int count) {
110
111 }
112
113 @Override
114 public void afterTextChanged(Editable s) {
115 if (s.toString().trim().length() > 0) {
116 try {
117 mFullJidDisplay.setVisibility(View.VISIBLE);
118 Jid jid = Jid.of(s.toString().toLowerCase(), Config.MAGIC_CREATE_DOMAIN, null);
119 mFullJidDisplay.setText(getString(R.string.your_full_jid_will_be, jid.toEscapedString()));
120 } catch (IllegalArgumentException e) {
121 mFullJidDisplay.setVisibility(View.INVISIBLE);
122 }
123
124 } else {
125 mFullJidDisplay.setVisibility(View.INVISIBLE);
126 }
127 }
128}