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