Stack Overflow на русском Asked by white-imp on December 9, 2020
Делаю аутентификацию на андроид по номеру телефона и есть два похожих метода.
Единственное отличие у них – это последний параметр: внутри обоих методов вызывается PhoneAuthProvider.getInstance().verifyPhoneNumber()
и для одного случая он на вход принимает 5 параметров, для другого 6 (параметр mResendToken
и есть эта разница).
Оба моих метода содержат идентичные коллбеки PhoneAuthProvider.OnVerificationStateChangedCallbacks()
которые я хочу отрефакторить, чтобы не было копипейста, но не знаю как, потому что внутри этих коллбеков я использую свои коллбеки callback.onReady()
для возврата результатов.
Буду благодарен за любые варианты.
мой интерфейс Callback:
interface AuthCallback {
void onReady(int phoneAuthState, String msg);
}
Один из этидх двух методов, которые нужно отрефакторить:
public void resendVerificationCode(String phoneNumber, UserPhoneRepositoryInterface.AuthCallback callback) {
PhoneAuthProvider.getInstance().verifyPhoneNumber(
phoneNumber, // Phone number to verify
60, // Timeout duration
TimeUnit.SECONDS, // Unit of timeout
TaskExecutors.MAIN_THREAD, // Executor
new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
Log.d(TAG, "onVerificationCompleted:" + phoneAuthCredential);
mVerificationInProgress = false;
callback.onReady(PhoneAuthState.STATE_VERIFY_SUCCESS, null);
}
@Override
public void onVerificationFailed(@NonNull FirebaseException e) {
Log.w(TAG, "onVerificationFailed", e);
mVerificationInProgress = false;
if (e instanceof FirebaseAuthInvalidCredentialsException) {
callback.onReady(PhoneAuthState.STATE_VERIFY_FAILED, "Invalid phone number.");
} else if (e instanceof FirebaseTooManyRequestsException) {
callback.onReady(PhoneAuthState.STATE_VERIFY_FAILED, "The SMS quota has been exceeded.");
}
}
@Override
public void onCodeSent(@NonNull String verificationId,
@NonNull PhoneAuthProvider.ForceResendingToken token) {
Log.d(TAG, "onCodeSent:" + verificationId);
mVerificationId = verificationId;
mResendToken = token;
callback.onReady(PhoneAuthState.STATE_CODE_SENT, "Code sent");
}
}, // OnVerificationStateChangedCallbacks
mResendToken); // ForceResendingToken from callbacks
}
Превратите анонимный внутренний класс в неанонимный нестатичный внутренний класс (т.е. чтобы он был определен в теле того же класса, что и метод resendVerificationCode
) так, чтоб он принимал AuthCallback
в конструктор:
class MyClass {
private class PhoneAuthVerificationStateChangedHandler extends
PhoneAuthProvider.OnVerificationStateChangedCallbacks {
private AuthCallback callback;
public PhoneAuthVerificationStateChangedHandler(AuthCallback callback) {
this.callback = callback;
}
@Override
public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
Log.d(TAG, "onVerificationCompleted:" + phoneAuthCredential);
mVerificationInProgress = false;
callback.onReady(PhoneAuthState.STATE_VERIFY_SUCCESS, null);
}
@Override
public void onVerificationFailed(@NonNull FirebaseException e) {
// тот же код что и в анонимном классе
}
@Override
public void onCodeSent(@NonNull String verificationId,
@NonNull PhoneAuthProvider.ForceResendingToken token) {
// тот же код что и в анонимном классе
}
}
// тут можно использовать созданный класс
public void resendVerificationCode(String phoneNumber, UserPhoneRepositoryInterface.AuthCallback callback) {
PhoneAuthProvider.getInstance().verifyPhoneNumber(
phoneNumber, // Phone number to verify
60, // Timeout duration
TimeUnit.SECONDS, // Unit of timeout
TaskExecutors.MAIN_THREAD, // Executor
new PhoneAuthVerificationStateChangedHandler(callback),
mResendToken
);
}
}
Это будет работать так как в экземпляре внутреннего классе, коим является PhoneAuthVerificationStateChangedHandler
, есть неявная ссылка на объект внешнего класса MyClass
и соответственно доступ к его полям типа mVerificationInProgress
.
Correct answer by Roman Konoval on December 9, 2020
Варианты на вскидку:
Answered by Георгий Чеботарев on December 9, 2020
2 Asked on August 30, 2021 by happy-hends
1 Asked on August 30, 2021
javascript php %d0%b2%d0%b5%d0%b1 %d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5 %d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8
2 Asked on August 30, 2021 by muturgan
1 Asked on August 30, 2021
email notepad windows %d0%b1%d0%b0%d0%b7%d0%b0 %d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82
1 Asked on August 30, 2021
c gui ui %d0%bf%d0%be%d0%b8%d1%81%d0%ba %d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d0%be%d1%82%d0%b5%d0%ba
0 Asked on August 30, 2021 by posix
1 Asked on August 30, 2021 by alex_mad
c %d0%b2%d1%8b%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5 %d0%bf%d0%b0%d0%bc%d1%8f%d1%82%d0%b8 %d0%b4%d0%b8%d0%bd%d0%b0%d0%bc%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5 %d0%bc%d0%b0%d1%81%d1%81%d0%b8%d0%b2%d1%8b
2 Asked on August 30, 2021 by sergey-orlove
1 Asked on August 30, 2021 by axmed2004
1 Asked on August 30, 2021 by svmitin
django django orm python %d0%bc%d0%b0%d1%81%d1%88%d1%82%d0%b0%d0%b1%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5
2 Asked on August 30, 2021
css css animation svg svg animation %d0%b2%d1%91%d1%80%d1%81%d1%82%d0%ba%d0%b0
2 Asked on August 30, 2021 by qtq
Get help from others!
Recent Questions
Recent Answers
© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP