create api calls
This commit is contained in:
parent
31eb89e2fb
commit
2fa629d113
|
@ -24,7 +24,11 @@ public class Plain extends SaslMechanism {
|
|||
|
||||
@Override
|
||||
public String getClientFirstMessage() {
|
||||
final String sasl = '\u0000' + account.getUsername() + '\u0000' + account.getPassword();
|
||||
return Base64.encodeToString(sasl.getBytes(Charset.defaultCharset()), Base64.NO_WRAP);
|
||||
return getMessage(account.getUsername(), account.getPassword());
|
||||
}
|
||||
|
||||
public static String getMessage(String username, String password) {
|
||||
final String message = '\u0000' + username + '\u0000' + password;
|
||||
return Base64.encodeToString(message.getBytes(Charset.defaultCharset()), Base64.NO_WRAP);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -760,9 +760,11 @@
|
|||
<string name="please_enter_your_phone_number">Please enter your phone number.</string>
|
||||
<string name="search_countries">Search countries</string>
|
||||
<string name="verify_x">Verify %s</string>
|
||||
<string name="we_have_sent_you_an_sms"><![CDATA[We have sent you an SMS to <b>%s</b>.]]></string>
|
||||
<string name="we_have_sent_you_an_sms_to_x"><![CDATA[We have sent you an SMS to <b>%s</b>.]]></string>
|
||||
<string name="we_have_sent_you_the_sms_again">We have sent you the SMS again.</string>
|
||||
<string name="please_enter_pin_below">Please enter the 6 digit pin below.</string>
|
||||
<string name="resend_sms">Resend SMS</string>
|
||||
<string name="resend_sms_in">Resend SMS (%s)</string>
|
||||
<string name="back">back</string>
|
||||
<string name="possible_pin">Automatically pasted possible pin from clipboard.</string>
|
||||
<string name="please_enter_pin">Please enter your 6 digit pin.</string>
|
||||
|
@ -770,4 +772,5 @@
|
|||
<string name="yes">Yes</string>
|
||||
<string name="no">No</string>
|
||||
<string name="verifying">Verifying…</string>
|
||||
<string name="requesting_sms">Requesting SMS…</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,8 +1,17 @@
|
|||
package eu.siacs.conversations.services;
|
||||
|
||||
|
||||
import android.os.SystemClock;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.ConnectException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.net.UnknownHostException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
@ -10,7 +19,9 @@ import java.util.WeakHashMap;
|
|||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import eu.siacs.conversations.Config;
|
||||
import eu.siacs.conversations.crypto.sasl.Plain;
|
||||
import eu.siacs.conversations.entities.Account;
|
||||
import eu.siacs.conversations.utils.AccountUtils;
|
||||
import eu.siacs.conversations.utils.CryptoHelper;
|
||||
import eu.siacs.conversations.utils.PhoneNumberUtilWrapper;
|
||||
import io.michaelrocks.libphonenumber.android.Phonenumber;
|
||||
|
@ -18,12 +29,20 @@ import rocks.xmpp.addr.Jid;
|
|||
|
||||
public class QuickConversationsService {
|
||||
|
||||
|
||||
public static final int API_ERROR_OTHER = -1;
|
||||
public static final int API_ERROR_UNKNOWN_HOST = -2;
|
||||
public static final int API_ERROR_CONNECT = -3;
|
||||
|
||||
private static final String BASE_URL = "https://venus.fritz.box:4567";
|
||||
|
||||
private final XmppConnectionService service;
|
||||
|
||||
private final Set<OnVerificationRequested> mOnVerificationRequested = Collections.newSetFromMap(new WeakHashMap<>());
|
||||
private final Set<OnVerification> mOnVerification = Collections.newSetFromMap(new WeakHashMap<>());
|
||||
|
||||
private final AtomicBoolean mVerificationInProgress = new AtomicBoolean(false);
|
||||
private final AtomicBoolean mVerificationRequestInProgress = new AtomicBoolean(false);
|
||||
|
||||
QuickConversationsService(XmppConnectionService xmppConnectionService) {
|
||||
this.service = xmppConnectionService;
|
||||
|
@ -54,31 +73,136 @@ public class QuickConversationsService {
|
|||
}
|
||||
|
||||
public void requestVerification(Phonenumber.PhoneNumber phoneNumber) {
|
||||
final String e164 = PhoneNumberUtilWrapper.normalize(service, phoneNumber);
|
||||
|
||||
/**
|
||||
* GET /authentication/+phoneNumber
|
||||
*
|
||||
* - returns too many requests, (sms ist unterwegs), retry after seconden -- auf jeden fall in nächste activity (verify activity) weiter leiten weil es sein kann das sms noch ankommt
|
||||
* - returns OK; success (auch in activity weiter lassen. aber ohne error paramater; dh send again button is activ; und vielleicht kurzer toast bzw snackbar
|
||||
* - returns invalid request user error wenn die phone number falsch ist
|
||||
*/
|
||||
if (mVerificationRequestInProgress.compareAndSet(false, true)) {
|
||||
new Thread(() -> {
|
||||
try {
|
||||
|
||||
Thread.sleep(5000);
|
||||
|
||||
final URL url = new URL(BASE_URL + "/authentication/" + e164);
|
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setConnectTimeout(Config.SOCKET_TIMEOUT * 1000);
|
||||
connection.setReadTimeout(Config.SOCKET_TIMEOUT * 1000);
|
||||
final int code = connection.getResponseCode();
|
||||
if (code == 200) {
|
||||
createAccountAndWait(phoneNumber, 0L);
|
||||
} else if (code == 429) {
|
||||
createAccountAndWait(phoneNumber, retryAfter(connection));
|
||||
} else {
|
||||
synchronized (mOnVerificationRequested) {
|
||||
for (OnVerificationRequested onVerificationRequested : mOnVerificationRequested) {
|
||||
onVerificationRequested.onVerificationRequestFailed(code);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
final int code = getApiErrorCode(e);
|
||||
synchronized (mOnVerificationRequested) {
|
||||
for (OnVerificationRequested onVerificationRequested : mOnVerificationRequested) {
|
||||
onVerificationRequested.onVerificationRequestFailed(code);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
mVerificationRequestInProgress.set(false);
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void createAccountAndWait(Phonenumber.PhoneNumber phoneNumber, final long timestamp) {
|
||||
String local = PhoneNumberUtilWrapper.normalize(service, phoneNumber);
|
||||
Log.d(Config.LOGTAG,"requesting verification for "+PhoneNumberUtilWrapper.normalize(service,phoneNumber));
|
||||
Account account = new Account(Jid.of(local,"quick.conversations.im",null), CryptoHelper.createPassword(new SecureRandom()));
|
||||
account.setOption(Account.OPTION_DISABLED, true);
|
||||
account.setOption(Account.OPTION_UNVERIFIED, true);
|
||||
service.createAccount(account);
|
||||
Log.d(Config.LOGTAG, "requesting verification for " + PhoneNumberUtilWrapper.normalize(service, phoneNumber));
|
||||
Jid jid = Jid.of(local, "quick.conversations.im", null);
|
||||
Account account = AccountUtils.getFirst(service);
|
||||
if (account == null || !account.getJid().asBareJid().equals(jid.asBareJid())) {
|
||||
if (account != null) {
|
||||
service.deleteAccount(account);
|
||||
}
|
||||
account = new Account(jid, CryptoHelper.createPassword(new SecureRandom()));
|
||||
account.setOption(Account.OPTION_DISABLED, true);
|
||||
account.setOption(Account.OPTION_UNVERIFIED, true);
|
||||
service.createAccount(account);
|
||||
}
|
||||
synchronized (mOnVerificationRequested) {
|
||||
for(OnVerificationRequested onVerificationRequested : mOnVerificationRequested) {
|
||||
onVerificationRequested.onVerificationRequested();
|
||||
for (OnVerificationRequested onVerificationRequested : mOnVerificationRequested) {
|
||||
if (timestamp <= 0) {
|
||||
onVerificationRequested.onVerificationRequested();
|
||||
} else {
|
||||
onVerificationRequested.onVerificationRequestedRetryAt(timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void verify(Account account, String pin) {
|
||||
/**
|
||||
* POST /password
|
||||
* authentication gesetzt mit telephone nummber und verification code
|
||||
* body = password
|
||||
*
|
||||
* retry after, too many requests
|
||||
* code wrong
|
||||
* OK (weiterleiten auf publish avatar activity
|
||||
*
|
||||
*/
|
||||
if (mVerificationInProgress.compareAndSet(false, true)) {
|
||||
new Thread(() -> {
|
||||
try {
|
||||
|
||||
Thread.sleep(5000);
|
||||
synchronized (mOnVerification) {
|
||||
for (OnVerification onVerification : mOnVerification) {
|
||||
onVerification.onVerificationFailed();
|
||||
|
||||
final URL url = new URL(BASE_URL + "/password");
|
||||
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setConnectTimeout(Config.SOCKET_TIMEOUT * 1000);
|
||||
connection.setReadTimeout(Config.SOCKET_TIMEOUT * 1000);
|
||||
connection.setRequestMethod("POST");
|
||||
connection.setRequestProperty("Authorization", Plain.getMessage(account.getUsername(), pin));
|
||||
final OutputStream os = connection.getOutputStream();
|
||||
final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
|
||||
writer.write(account.getPassword());
|
||||
writer.flush();
|
||||
writer.close();
|
||||
os.close();
|
||||
connection.connect();
|
||||
final int code = connection.getResponseCode();
|
||||
if (code == 200) {
|
||||
synchronized (mOnVerification) {
|
||||
for (OnVerification onVerification : mOnVerification) {
|
||||
onVerification.onVerificationSucceeded();
|
||||
}
|
||||
}
|
||||
} else if (code == 429) {
|
||||
final long retryAfter = retryAfter(connection);
|
||||
synchronized (mOnVerification) {
|
||||
for (OnVerification onVerification : mOnVerification) {
|
||||
onVerification.onVerificationRetryAt(retryAfter);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
synchronized (mOnVerification) {
|
||||
for (OnVerification onVerification : mOnVerification) {
|
||||
onVerification.onVerificationFailed(code);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
final int code = getApiErrorCode(e);
|
||||
synchronized (mOnVerification) {
|
||||
for (OnVerification onVerification : mOnVerification) {
|
||||
onVerification.onVerificationFailed(code);
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
mVerificationInProgress.set(false);
|
||||
}
|
||||
|
@ -86,17 +210,46 @@ public class QuickConversationsService {
|
|||
}
|
||||
}
|
||||
|
||||
private static int getApiErrorCode(Exception e) {
|
||||
if (e instanceof UnknownHostException) {
|
||||
return API_ERROR_UNKNOWN_HOST;
|
||||
} else if (e instanceof ConnectException) {
|
||||
return API_ERROR_CONNECT;
|
||||
} else {
|
||||
Log.d(Config.LOGTAG,e.getClass().getName());
|
||||
return API_ERROR_OTHER;
|
||||
}
|
||||
}
|
||||
|
||||
private static long retryAfter(HttpURLConnection connection) {
|
||||
try {
|
||||
return SystemClock.elapsedRealtime() + (Long.parseLong(connection.getHeaderField("Retry-After")) * 1000L);
|
||||
} catch (Exception e) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isVerifying() {
|
||||
return mVerificationInProgress.get();
|
||||
}
|
||||
|
||||
public boolean isRequestingVerification() {
|
||||
return mVerificationRequestInProgress.get();
|
||||
}
|
||||
|
||||
public interface OnVerificationRequested {
|
||||
void onVerificationRequestFailed(int code);
|
||||
|
||||
void onVerificationRequested();
|
||||
|
||||
void onVerificationRequestedRetryAt(long timestamp);
|
||||
}
|
||||
|
||||
public interface OnVerification {
|
||||
void onVerificationFailed();
|
||||
void onVerificationFailed(int code);
|
||||
|
||||
void onVerificationSucceeded();
|
||||
|
||||
void onVerificationRetryAt(long timestamp);
|
||||
}
|
||||
}
|
|
@ -30,7 +30,10 @@ public class EnterPhoneNumberActivity extends XmppActivity implements QuickConve
|
|||
private static final int REQUEST_CHOOSE_COUNTRY = 0x1234;
|
||||
|
||||
private ActivityEnterNumberBinding binding;
|
||||
|
||||
private String region = null;
|
||||
private boolean requestingVerification = false;
|
||||
|
||||
private final TextWatcher countryCodeTextWatcher = new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||
|
@ -78,6 +81,7 @@ public class EnterPhoneNumberActivity extends XmppActivity implements QuickConve
|
|||
super.onCreate(savedInstanceState);
|
||||
|
||||
String region = savedInstanceState != null ? savedInstanceState.getString("region") : null;
|
||||
boolean requestingVerification = savedInstanceState != null && savedInstanceState.getBoolean("requesting_verification", false);
|
||||
if (region != null) {
|
||||
this.region = region;
|
||||
} else {
|
||||
|
@ -91,6 +95,7 @@ public class EnterPhoneNumberActivity extends XmppActivity implements QuickConve
|
|||
setSupportActionBar((Toolbar) this.binding.toolbar);
|
||||
this.binding.countryCode.addTextChangedListener(this.countryCodeTextWatcher);
|
||||
this.binding.countryCode.setText(String.valueOf(PhoneNumberUtilWrapper.getInstance(this).getCountryCodeForRegion(this.region)));
|
||||
setRequestingVerificationState(requestingVerification);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -98,6 +103,7 @@ public class EnterPhoneNumberActivity extends XmppActivity implements QuickConve
|
|||
if (this.region != null) {
|
||||
savedInstanceState.putString("region", this.region);
|
||||
}
|
||||
savedInstanceState.putBoolean("requesting_verification", this.requestingVerification);
|
||||
super.onSaveInstanceState(savedInstanceState);
|
||||
}
|
||||
|
||||
|
@ -142,9 +148,19 @@ public class EnterPhoneNumberActivity extends XmppActivity implements QuickConve
|
|||
}
|
||||
|
||||
private void onPhoneNumberEntered(Phonenumber.PhoneNumber phoneNumber) {
|
||||
setRequestingVerificationState(true);
|
||||
xmppConnectionService.getQuickConversationsService().requestVerification(phoneNumber);
|
||||
}
|
||||
|
||||
private void setRequestingVerificationState(boolean requesting) {
|
||||
this.requestingVerification = requesting;
|
||||
this.binding.countryCode.setEnabled(!requesting);
|
||||
this.binding.country.setEnabled(!requesting);
|
||||
this.binding.number.setEnabled(!requesting);
|
||||
this.binding.next.setEnabled(!requesting);
|
||||
this.binding.next.setText(requesting ? R.string.requesting_sms : R.string.next);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, final Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
@ -160,13 +176,25 @@ public class EnterPhoneNumberActivity extends XmppActivity implements QuickConve
|
|||
|
||||
@Override
|
||||
public void onVerificationRequestFailed(int code) {
|
||||
|
||||
runOnUiThread(()->{
|
||||
setRequestingVerificationState(false);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVerificationRequested() {
|
||||
runOnUiThread(() -> {
|
||||
startActivity(new Intent(this,VerifyActivity.class));
|
||||
startActivity(new Intent(this, VerifyActivity.class));
|
||||
finish();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVerificationRequestedRetryAt(long timestamp) {
|
||||
runOnUiThread(() -> {
|
||||
Intent intent = new Intent(this, VerifyActivity.class);
|
||||
intent.putExtra(VerifyActivity.EXTRA_RETRY_SMS_AFTER, timestamp);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
});
|
||||
}
|
||||
|
|
|
@ -8,11 +8,15 @@ import android.content.Context;
|
|||
import android.content.Intent;
|
||||
import android.databinding.DataBindingUtil;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.SystemClock;
|
||||
import android.support.design.widget.Snackbar;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.text.Html;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import eu.siacs.conversations.Config;
|
||||
import eu.siacs.conversations.R;
|
||||
import eu.siacs.conversations.databinding.ActivityVerifyBinding;
|
||||
import eu.siacs.conversations.entities.Account;
|
||||
|
@ -20,10 +24,14 @@ import eu.siacs.conversations.services.QuickConversationsService;
|
|||
import eu.siacs.conversations.ui.util.PinEntryWrapper;
|
||||
import eu.siacs.conversations.utils.AccountUtils;
|
||||
import eu.siacs.conversations.utils.PhoneNumberUtilWrapper;
|
||||
import eu.siacs.conversations.utils.TimeframeUtils;
|
||||
import io.michaelrocks.libphonenumber.android.NumberParseException;
|
||||
|
||||
import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN;
|
||||
|
||||
public class VerifyActivity extends XmppActivity implements ClipboardManager.OnPrimaryClipChangedListener, QuickConversationsService.OnVerification {
|
||||
public class VerifyActivity extends XmppActivity implements ClipboardManager.OnPrimaryClipChangedListener, QuickConversationsService.OnVerification, QuickConversationsService.OnVerificationRequested {
|
||||
|
||||
public static final String EXTRA_RETRY_SMS_AFTER = "retry_sms_after";
|
||||
|
||||
private ActivityVerifyBinding binding;
|
||||
private Account account;
|
||||
|
@ -31,14 +39,43 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
|
|||
private ClipboardManager clipboardManager;
|
||||
private String pasted = null;
|
||||
private boolean verifying = false;
|
||||
private boolean requestingVerification = false;
|
||||
private long retrySmsAfter = 0;
|
||||
|
||||
private final Handler mHandler = new Handler();
|
||||
|
||||
|
||||
private final Runnable SMS_TIMEOUT_UPDATER = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (setTimeoutLabelInResendButton()) {
|
||||
mHandler.postDelayed(this,300);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private boolean setTimeoutLabelInResendButton() {
|
||||
if (retrySmsAfter != 0) {
|
||||
long remaining = retrySmsAfter - SystemClock.elapsedRealtime();
|
||||
if (remaining >= 0) {
|
||||
binding.resendSms.setEnabled(false);
|
||||
binding.resendSms.setText(getString(R.string.resend_sms_in, TimeframeUtils.resolve(VerifyActivity.this,remaining)));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
binding.resendSms.setEnabled(true);
|
||||
binding.resendSms.setText(R.string.resend_sms);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
String pin = savedInstanceState != null ? savedInstanceState.getString("pin") : null;
|
||||
boolean verifying = savedInstanceState != null && savedInstanceState.getBoolean("verifying");
|
||||
boolean requestingVerification = savedInstanceState != null && savedInstanceState.getBoolean("requesting_verification", false);
|
||||
this.pasted = savedInstanceState != null ? savedInstanceState.getString("pasted") : null;
|
||||
this.retrySmsAfter = savedInstanceState != null ? savedInstanceState.getLong(EXTRA_RETRY_SMS_AFTER,0L) : 0L;
|
||||
this.binding = DataBindingUtil.setContentView(this, R.layout.activity_verify);
|
||||
setSupportActionBar((Toolbar) this.binding.toolbar);
|
||||
this.pinEntryWrapper = new PinEntryWrapper(binding.pinBox);
|
||||
|
@ -47,8 +84,10 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
|
|||
}
|
||||
binding.back.setOnClickListener(this::onBackButton);
|
||||
binding.next.setOnClickListener(this::onNextButton);
|
||||
binding.resendSms.setOnClickListener(this::onResendSmsButton);
|
||||
clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
setVerifyingState(verifying);
|
||||
setRequestingVerificationState(requestingVerification);
|
||||
}
|
||||
|
||||
private void onBackButton(View view) {
|
||||
|
@ -88,6 +127,15 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
|
|||
}
|
||||
}
|
||||
|
||||
private void onResendSmsButton(View view) {
|
||||
try {
|
||||
xmppConnectionService.getQuickConversationsService().requestVerification(PhoneNumberUtilWrapper.toPhoneNumber(this, account.getJid()));
|
||||
setRequestingVerificationState(true);
|
||||
} catch (NumberParseException e) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void setVerifyingState(boolean verifying) {
|
||||
this.verifying = verifying;
|
||||
this.binding.back.setText(verifying ? R.string.cancel : R.string.back);
|
||||
|
@ -99,6 +147,17 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
|
|||
this.binding.progressBar.setIndeterminate(verifying);
|
||||
}
|
||||
|
||||
private void setRequestingVerificationState(boolean requesting) {
|
||||
this.requestingVerification = requesting;
|
||||
if (requesting) {
|
||||
this.binding.resendSms.setEnabled(false);
|
||||
this.binding.resendSms.setText(R.string.requesting_sms);
|
||||
} else {
|
||||
setTimeoutLabelInResendButton();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void refreshUiReal() {
|
||||
|
||||
|
@ -107,18 +166,22 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
|
|||
@Override
|
||||
void onBackendConnected() {
|
||||
xmppConnectionService.getQuickConversationsService().addOnVerificationListener(this);
|
||||
xmppConnectionService.getQuickConversationsService().addOnVerificationRequestedListener(this);
|
||||
this.account = AccountUtils.getFirst(xmppConnectionService);
|
||||
if (this.account == null) {
|
||||
return;
|
||||
}
|
||||
this.binding.weHaveSent.setText(Html.fromHtml(getString(R.string.we_have_sent_you_an_sms, PhoneNumberUtilWrapper.prettyPhoneNumber(this, this.account.getJid()))));
|
||||
this.binding.weHaveSent.setText(Html.fromHtml(getString(R.string.we_have_sent_you_an_sms_to_x, PhoneNumberUtilWrapper.toFormattedPhoneNumber(this, this.account.getJid()))));
|
||||
setVerifyingState(xmppConnectionService.getQuickConversationsService().isVerifying());
|
||||
setRequestingVerificationState(xmppConnectionService.getQuickConversationsService().isRequestingVerification());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle savedInstanceState) {
|
||||
savedInstanceState.putString("pin", this.pinEntryWrapper.getPin());
|
||||
savedInstanceState.putBoolean("verifying", this.verifying);
|
||||
savedInstanceState.putBoolean("requesting_verification", this.requestingVerification);
|
||||
savedInstanceState.putLong(EXTRA_RETRY_SMS_AFTER, this.retrySmsAfter);
|
||||
if (this.pasted != null) {
|
||||
savedInstanceState.putString("pasted", this.pasted);
|
||||
}
|
||||
|
@ -129,14 +192,19 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
|
|||
public void onStart() {
|
||||
super.onStart();
|
||||
clipboardManager.addPrimaryClipChangedListener(this);
|
||||
if (this.retrySmsAfter > 0) {
|
||||
mHandler.post(SMS_TIMEOUT_UPDATER);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
super.onStop();
|
||||
mHandler.removeCallbacks(SMS_TIMEOUT_UPDATER);
|
||||
clipboardManager.removePrimaryClipChangedListener(this);
|
||||
if (xmppConnectionService != null) {
|
||||
xmppConnectionService.getQuickConversationsService().removeOnVerificationListener(this);
|
||||
xmppConnectionService.getQuickConversationsService().removeOnVerificationRequestedListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -174,14 +242,49 @@ public class VerifyActivity extends XmppActivity implements ClipboardManager.OnP
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onVerificationFailed() {
|
||||
public void onVerificationFailed(int code) {
|
||||
runOnUiThread(() -> {
|
||||
setVerifyingState(false);
|
||||
});
|
||||
Log.d(Config.LOGTAG,"code="+code);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVerificationSucceeded() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVerificationRetryAt(long timestamp) {
|
||||
|
||||
}
|
||||
|
||||
//send sms again button callback
|
||||
@Override
|
||||
public void onVerificationRequestFailed(int code) {
|
||||
runOnUiThread(()->{
|
||||
setRequestingVerificationState(false);
|
||||
});
|
||||
Log.d(Config.LOGTAG,"code="+code);
|
||||
}
|
||||
|
||||
//send sms again button callback
|
||||
@Override
|
||||
public void onVerificationRequested() {
|
||||
runOnUiThread(()-> {
|
||||
setRequestingVerificationState(false);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setMessage(R.string.we_have_sent_you_the_sms_again);
|
||||
builder.setPositiveButton(R.string.ok, null);
|
||||
builder.create().show();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVerificationRequestedRetryAt(long timestamp) {
|
||||
this.retrySmsAfter = timestamp;
|
||||
runOnUiThread(()-> setRequestingVerificationState(false));
|
||||
mHandler.removeCallbacks(SMS_TIMEOUT_UPDATER);
|
||||
runOnUiThread(SMS_TIMEOUT_UPDATER);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,16 +41,18 @@ public class PhoneNumberUtilWrapper {
|
|||
return locale.getCountry();
|
||||
}
|
||||
|
||||
public static String prettyPhoneNumber(Context context, Jid jid) {
|
||||
PhoneNumberUtil phoneNumberUtil = getInstance(context);
|
||||
public static String toFormattedPhoneNumber(Context context, Jid jid) {
|
||||
try {
|
||||
Phonenumber.PhoneNumber phoneNumber = phoneNumberUtil.parse(jid.getEscapedLocal(), "de");
|
||||
return phoneNumberUtil.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL);
|
||||
return getInstance(context).format(toPhoneNumber(context, jid), PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL);
|
||||
} catch (Exception e) {
|
||||
return jid.getEscapedLocal();
|
||||
}
|
||||
}
|
||||
|
||||
public static Phonenumber.PhoneNumber toPhoneNumber(Context context, Jid jid) throws NumberParseException {
|
||||
return getInstance(context).parse(jid.getEscapedLocal(), "de");
|
||||
}
|
||||
|
||||
public static String normalize(Context context, String number) throws NumberParseException {
|
||||
return normalize(context, getInstance(context).parse(number, getUserCountry(context)));
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
android:id="@+id/we_have_sent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/we_have_sent_you_an_sms"
|
||||
android:text="@string/we_have_sent_you_an_sms_to_x"
|
||||
android:textAppearance="@style/TextAppearance.Conversations.Subhead" />
|
||||
|
||||
<TextView
|
||||
|
|
Loading…
Reference in a new issue