session-android/src/org/thoughtcrime/securesms/RegistrationActivity.java

305 lines
11 KiB
Java
Raw Normal View History

2013-03-25 21:26:03 -07:00
package org.thoughtcrime.securesms;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
2013-03-25 21:26:03 -07:00
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
2013-03-25 21:26:03 -07:00
import android.text.Editable;
2014-11-12 11:15:05 -08:00
import android.text.TextUtils;
2013-03-25 21:26:03 -07:00
import android.text.TextWatcher;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
2014-07-23 15:40:45 -07:00
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
2013-03-25 21:26:03 -07:00
import com.google.i18n.phonenumbers.AsYouTypeFormatter;
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.util.Dialogs;
2014-07-23 15:40:45 -07:00
import org.thoughtcrime.securesms.util.TextSecurePreferences;
2014-11-12 11:15:05 -08:00
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
2013-03-25 21:26:03 -07:00
/**
2013-07-10 17:54:38 -07:00
* The register account activity. Prompts ths user for their registration information
* and begins the account registration process.
2013-03-25 21:26:03 -07:00
*
* @author Moxie Marlinspike
*
*/
public class RegistrationActivity extends BaseActionBarActivity {
2013-03-25 21:26:03 -07:00
private static final int PICK_COUNTRY = 1;
2013-07-09 16:36:15 -07:00
private AsYouTypeFormatter countryFormatter;
2013-03-25 21:26:03 -07:00
private ArrayAdapter<String> countrySpinnerAdapter;
2013-07-09 16:36:15 -07:00
private Spinner countrySpinner;
private TextView countryCode;
2013-03-25 21:26:03 -07:00
private TextView number;
2013-07-09 16:36:15 -07:00
private Button createButton;
private Button skipButton;
2013-03-25 21:26:03 -07:00
private MasterSecret masterSecret;
2013-03-25 21:26:03 -07:00
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
2013-03-25 21:26:03 -07:00
setContentView(R.layout.registration_activity);
getSupportActionBar().setTitle(getString(R.string.RegistrationActivity_connect_with_signal));
2013-03-25 21:26:03 -07:00
initializeResources();
2013-07-10 17:54:38 -07:00
initializeSpinner();
2013-03-25 21:26:03 -07:00
initializeNumber();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_COUNTRY && resultCode == RESULT_OK && data != null) {
this.countryCode.setText(data.getIntExtra("country_code", 1)+"");
setCountryDisplay(data.getStringExtra("country_name"));
setCountryFormatter(data.getIntExtra("country_code", 1));
}
}
private void initializeResources() {
this.masterSecret = getIntent().getParcelableExtra("master_secret");
2013-03-25 21:26:03 -07:00
this.countrySpinner = (Spinner)findViewById(R.id.country_spinner);
this.countryCode = (TextView)findViewById(R.id.country_code);
this.number = (TextView)findViewById(R.id.number);
this.createButton = (Button)findViewById(R.id.registerButton);
this.skipButton = (Button)findViewById(R.id.skipButton);
2013-03-25 21:26:03 -07:00
2013-07-10 17:54:38 -07:00
this.countryCode.addTextChangedListener(new CountryCodeChangedListener());
this.number.addTextChangedListener(new NumberChangedListener());
this.createButton.setOnClickListener(new CreateButtonListener());
this.skipButton.setOnClickListener(new CancelButtonListener());
if (getIntent().getBooleanExtra("cancel_button", false)) {
this.skipButton.setVisibility(View.VISIBLE);
} else {
this.skipButton.setVisibility(View.INVISIBLE);
}
findViewById(R.id.twilio_shoutout).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse("https://twilio.com"));
startActivity(intent);
}
});
2013-07-10 17:54:38 -07:00
}
private void initializeSpinner() {
2014-11-12 11:15:05 -08:00
this.countrySpinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item);
2013-03-25 21:26:03 -07:00
this.countrySpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
2013-07-10 17:54:38 -07:00
2013-07-09 16:36:15 -07:00
setCountryDisplay(getString(R.string.RegistrationActivity_select_your_country));
2013-03-25 21:26:03 -07:00
this.countrySpinner.setAdapter(this.countrySpinnerAdapter);
this.countrySpinner.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
Intent intent = new Intent(RegistrationActivity.this, CountrySelectionActivity.class);
startActivityForResult(intent, PICK_COUNTRY);
}
return true;
}
});
}
private void initializeNumber() {
PhoneNumberUtil numberUtil = PhoneNumberUtil.getInstance();
2014-11-12 11:15:05 -08:00
String localNumber = Util.getDeviceE164Number(this);
2013-03-25 21:26:03 -07:00
try {
2014-11-12 11:15:05 -08:00
if (!TextUtils.isEmpty(localNumber)) {
2013-03-25 21:26:03 -07:00
Phonenumber.PhoneNumber localNumberObject = numberUtil.parse(localNumber, null);
if (localNumberObject != null) {
this.countryCode.setText(String.valueOf(localNumberObject.getCountryCode()));
this.number.setText(String.valueOf(localNumberObject.getNationalNumber()));
2013-03-25 21:26:03 -07:00
}
} else {
String simCountryIso = Util.getSimCountryIso(this);
2014-11-12 11:15:05 -08:00
if (!TextUtils.isEmpty(simCountryIso)) {
this.countryCode.setText(numberUtil.getCountryCodeForRegion(simCountryIso)+"");
}
2013-03-25 21:26:03 -07:00
}
} catch (NumberParseException npe) {
Log.w("CreateAccountActivity", npe);
}
}
private void setCountryDisplay(String value) {
this.countrySpinnerAdapter.clear();
this.countrySpinnerAdapter.add(value);
}
private void setCountryFormatter(int countryCode) {
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
String regionCode = util.getRegionCodeForCountryCode(countryCode);
2013-07-09 16:36:15 -07:00
if (regionCode == null) this.countryFormatter = null;
else this.countryFormatter = util.getAsYouTypeFormatter(regionCode);
2013-03-25 21:26:03 -07:00
}
private String getConfiguredE164Number() {
return PhoneNumberFormatter.formatE164(countryCode.getText().toString(),
number.getText().toString());
}
private class CreateButtonListener implements View.OnClickListener {
@Override
public void onClick(View v) {
final RegistrationActivity self = RegistrationActivity.this;
2014-11-12 11:15:05 -08:00
if (TextUtils.isEmpty(countryCode.getText())) {
2013-07-09 16:36:15 -07:00
Toast.makeText(self,
getString(R.string.RegistrationActivity_you_must_specify_your_country_code),
2013-03-25 21:26:03 -07:00
Toast.LENGTH_LONG).show();
return;
}
2014-11-12 11:15:05 -08:00
if (TextUtils.isEmpty(number.getText())) {
2013-07-09 16:36:15 -07:00
Toast.makeText(self,
getString(R.string.RegistrationActivity_you_must_specify_your_phone_number),
2013-03-25 21:26:03 -07:00
Toast.LENGTH_LONG).show();
return;
}
final String e164number = getConfiguredE164Number();
if (!PhoneNumberFormatter.isValidNumber(e164number)) {
Dialogs.showAlertDialog(self,
2013-07-09 16:36:15 -07:00
getString(R.string.RegistrationActivity_invalid_number),
String.format(getString(R.string.RegistrationActivity_the_number_you_specified_s_is_invalid),
e164number));
2013-03-25 21:26:03 -07:00
return;
}
2014-07-23 15:40:45 -07:00
int gcmStatus = GooglePlayServicesUtil.isGooglePlayServicesAvailable(self);
if (gcmStatus != ConnectionResult.SUCCESS) {
if (GooglePlayServicesUtil.isUserRecoverableError(gcmStatus)) {
GooglePlayServicesUtil.getErrorDialog(gcmStatus, self, 9000).show();
} else {
Dialogs.showAlertDialog(self, getString(R.string.RegistrationActivity_unsupported),
getString(R.string.RegistrationActivity_sorry_this_device_is_not_supported_for_data_messaging));
}
2013-03-25 21:26:03 -07:00
return;
}
AlertDialog.Builder dialog = new AlertDialog.Builder(self);
dialog.setTitle(PhoneNumberFormatter.getInternationalFormatFromE164(e164number));
dialog.setMessage(R.string.RegistrationActivity_we_will_now_verify_that_the_following_number_is_associated_with_your_device_s);
2013-07-09 16:36:15 -07:00
dialog.setPositiveButton(getString(R.string.RegistrationActivity_continue),
2013-03-25 21:26:03 -07:00
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(self, RegistrationProgressActivity.class);
intent.putExtra("e164number", e164number);
intent.putExtra("master_secret", masterSecret);
2013-03-25 21:26:03 -07:00
startActivity(intent);
finish();
}
});
2013-07-09 16:36:15 -07:00
dialog.setNegativeButton(getString(R.string.RegistrationActivity_edit), null);
2013-03-25 21:26:03 -07:00
dialog.show();
}
}
private class CountryCodeChangedListener implements TextWatcher {
@Override
public void afterTextChanged(Editable s) {
2014-11-12 11:15:05 -08:00
if (TextUtils.isEmpty(s)) {
2013-07-09 16:36:15 -07:00
setCountryDisplay(getString(R.string.RegistrationActivity_select_your_country));
2013-03-25 21:26:03 -07:00
countryFormatter = null;
return;
}
int countryCode = Integer.parseInt(s.toString());
String regionCode = PhoneNumberUtil.getInstance().getRegionCodeForCountryCode(countryCode);
2013-07-09 16:36:15 -07:00
2013-03-25 21:26:03 -07:00
setCountryFormatter(countryCode);
setCountryDisplay(PhoneNumberFormatter.getRegionDisplayName(regionCode));
2014-11-12 11:15:05 -08:00
if (!TextUtils.isEmpty(regionCode) && !regionCode.equals("ZZ")) {
2013-03-25 21:26:03 -07:00
number.requestFocus();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}
private class NumberChangedListener implements TextWatcher {
@Override
public void afterTextChanged(Editable s) {
if (countryFormatter == null)
return;
2014-11-12 11:15:05 -08:00
if (TextUtils.isEmpty(s))
2013-03-25 21:26:03 -07:00
return;
countryFormatter.clear();
String number = s.toString().replaceAll("[^\\d.]", "");
String formattedNumber = null;
for (int i=0;i<number.length();i++) {
formattedNumber = countryFormatter.inputDigit(number.charAt(i));
}
if (formattedNumber != null && !s.toString().equals(formattedNumber)) {
2013-03-25 21:26:03 -07:00
s.replace(0, s.length(), formattedNumber);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}
private class CancelButtonListener implements View.OnClickListener {
@Override
public void onClick(View v) {
TextSecurePreferences.setPromptedPushRegistration(RegistrationActivity.this, true);
Intent nextIntent = getIntent().getParcelableExtra("next_intent");
if (nextIntent == null) {
nextIntent = new Intent(RegistrationActivity.this, ConversationListActivity.class);
}
startActivity(nextIntent);
finish();
}
}
2013-03-25 21:26:03 -07:00
}