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