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