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 mFullJidDisplay = findViewById(R.id.full_jid);
57 mUsername = findViewById(R.id.username);
58 mRandom = new SecureRandom();
59 Button next = findViewById(R.id.create_account);
60 next.setOnClickListener(v -> {
61 String username = mUsername.getText().toString();
62 if (username.contains("@") || username.length() < 3) {
63 mUsername.setError(getString(R.string.invalid_username));
64 mUsername.requestFocus();
65 } else {
66 mUsername.setError(null);
67 try {
68 Jid jid = Jid.of(username.toLowerCase(), Config.MAGIC_CREATE_DOMAIN, null);
69 Account account = xmppConnectionService.findAccountByJid(jid);
70 if (account == null) {
71 account = new Account(jid, createPassword());
72 account.setOption(Account.OPTION_REGISTER, true);
73 account.setOption(Account.OPTION_DISABLED, true);
74 account.setOption(Account.OPTION_MAGIC_CREATE, true);
75 xmppConnectionService.createAccount(account);
76 }
77 Intent intent = new Intent(MagicCreateActivity.this, EditAccountActivity.class);
78 intent.putExtra("jid", account.getJid().asBareJid().toString());
79 intent.putExtra("init", true);
80 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
81 Toast.makeText(MagicCreateActivity.this, R.string.secure_password_generated, Toast.LENGTH_SHORT).show();
82 WelcomeActivity.addInviteUri(intent, getIntent());
83 startActivity(intent);
84 } catch (IllegalArgumentException e) {
85 mUsername.setError(getString(R.string.invalid_username));
86 mUsername.requestFocus();
87 }
88 }
89 });
90 mUsername.addTextChangedListener(this);
91 }
92
93 private String createPassword() {
94 StringBuilder builder = new StringBuilder(PW_LENGTH);
95 for (int i = 0; i < PW_LENGTH; ++i) {
96 builder.append(CHARS.charAt(mRandom.nextInt(CHARS.length() - 1)));
97 }
98 return builder.toString();
99 }
100
101 @Override
102 public void beforeTextChanged(CharSequence s, int start, int count, int after) {
103
104 }
105
106 @Override
107 public void onTextChanged(CharSequence s, int start, int before, int count) {
108
109 }
110
111 @Override
112 public void afterTextChanged(Editable s) {
113 if (s.toString().trim().length() > 0) {
114 try {
115 mFullJidDisplay.setVisibility(View.VISIBLE);
116 Jid jid = Jid.of(s.toString().toLowerCase(), Config.MAGIC_CREATE_DOMAIN, null);
117 mFullJidDisplay.setText(getString(R.string.your_full_jid_will_be, jid.toString()));
118 } catch (IllegalArgumentException e) {
119 mFullJidDisplay.setVisibility(View.INVISIBLE);
120 }
121
122 } else {
123 mFullJidDisplay.setVisibility(View.INVISIBLE);
124 }
125 }
126}