diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberConfirmFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberConfirmFragment.kt index 563e259374..09576e8be0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberConfirmFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberConfirmFragment.kt @@ -5,8 +5,12 @@ import android.view.View import android.widget.TextView import androidx.appcompat.widget.Toolbar import androidx.navigation.fragment.findNavController +import com.google.android.gms.auth.api.phone.SmsRetriever +import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.LoggingFragment import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.util.PlayServicesUtil +import org.thoughtcrime.securesms.util.PlayServicesUtil.PlayServicesStatus import org.thoughtcrime.securesms.util.navigation.safeNavigate class ChangeNumberConfirmFragment : LoggingFragment(R.layout.fragment_change_number_confirm) { @@ -29,6 +33,35 @@ class ChangeNumberConfirmFragment : LoggingFragment(R.layout.fragment_change_num editNumber.setOnClickListener { findNavController().navigateUp() } val changeNumber: View = view.findViewById(R.id.change_number_confirm_change_number) - changeNumber.setOnClickListener { findNavController().safeNavigate(R.id.action_changePhoneNumberConfirmFragment_to_changePhoneNumberVerifyFragment) } + changeNumber.setOnClickListener { onConfirm() } + } + + private fun onConfirm() { + val playServicesAvailable = PlayServicesUtil.getPlayServicesStatus(context) == PlayServicesStatus.SUCCESS + + if (playServicesAvailable) { + val client = SmsRetriever.getClient(requireContext()) + val task = client.startSmsRetriever() + + task.addOnSuccessListener { + Log.i(TAG, "Successfully registered SMS listener.") + navigateToVerify() + } + + task.addOnFailureListener { e -> + Log.w(TAG, "Failed to register SMS listener.", e) + navigateToVerify() + } + } else { + navigateToVerify() + } + } + + private fun navigateToVerify() { + findNavController().safeNavigate(R.id.action_changePhoneNumberConfirmFragment_to_changePhoneNumberVerifyFragment) + } + + companion object { + private val TAG = Log.tag(ChangeNumberConfirmFragment::class.java) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModel.kt index 8ce9a9bc7e..c73d40a3fe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModel.kt @@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.pin.KbsRepository import org.thoughtcrime.securesms.pin.TokenData +import org.thoughtcrime.securesms.registration.SmsRetrieverReceiver import org.thoughtcrime.securesms.registration.VerifyAccountRepository import org.thoughtcrime.securesms.registration.VerifyAccountResponseProcessor import org.thoughtcrime.securesms.registration.VerifyAccountResponseWithoutKbs @@ -38,6 +39,7 @@ class ChangeNumberViewModel( password: String, verifyAccountRepository: VerifyAccountRepository, kbsRepository: KbsRepository, + private val smsRetrieverReceiver: SmsRetrieverReceiver = SmsRetrieverReceiver(ApplicationDependencies.getApplication()) ) : BaseRegistrationViewModel(savedState, verifyAccountRepository, kbsRepository, password) { var oldNumberState: NumberViewState = NumberViewState.Builder().build() @@ -57,6 +59,13 @@ class ChangeNumberViewModel( } catch (e: NumberParseException) { Log.i(TAG, "Unable to parse number for default country code") } + + smsRetrieverReceiver.registerReceiver() + } + + override fun onCleared() { + super.onCleared() + smsRetrieverReceiver.unregisterReceiver() } fun getLiveOldNumber(): LiveData { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationNavigationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationNavigationActivity.java index b81a032cad..2a568a905d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationNavigationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationNavigationActivity.java @@ -1,9 +1,7 @@ package org.thoughtcrime.securesms.registration; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.os.Bundle; import androidx.annotation.NonNull; @@ -12,19 +10,11 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; import androidx.lifecycle.ViewModelProvider; -import com.google.android.gms.auth.api.phone.SmsRetriever; -import com.google.android.gms.common.api.CommonStatusCodes; -import com.google.android.gms.common.api.Status; - -import org.greenrobot.eventbus.EventBus; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.registration.viewmodel.RegistrationViewModel; -import org.thoughtcrime.securesms.service.VerificationCodeParser; import org.thoughtcrime.securesms.util.CommunicationActions; -import java.util.Optional; - public final class RegistrationNavigationActivity extends AppCompatActivity { @@ -93,49 +83,14 @@ public final class RegistrationNavigationActivity extends AppCompatActivity { } private void initializeChallengeListener() { - smsRetrieverReceiver = new SmsRetrieverReceiver(); - - registerReceiver(smsRetrieverReceiver, new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION)); + smsRetrieverReceiver = new SmsRetrieverReceiver(getApplication()); + smsRetrieverReceiver.registerReceiver(); } private void shutdownChallengeListener() { if (smsRetrieverReceiver != null) { - unregisterReceiver(smsRetrieverReceiver); + smsRetrieverReceiver.unregisterReceiver(); smsRetrieverReceiver = null; } } - - private class SmsRetrieverReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - Log.i(TAG, "SmsRetrieverReceiver received a broadcast..."); - - if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) { - Bundle extras = intent.getExtras(); - Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS); - - switch (status.getStatusCode()) { - case CommonStatusCodes.SUCCESS: - Optional code = VerificationCodeParser.parse((String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE)); - if (code.isPresent()) { - Log.i(TAG, "Received verification code."); - handleVerificationCodeReceived(code.get()); - } else { - Log.w(TAG, "Could not parse verification code."); - } - break; - case CommonStatusCodes.TIMEOUT: - Log.w(TAG, "Hit a timeout waiting for the SMS to arrive."); - break; - } - } else { - Log.w(TAG, "SmsRetrieverReceiver received the wrong action?"); - } - } - } - - private void handleVerificationCodeReceived(@NonNull String code) { - EventBus.getDefault().post(new ReceivedSmsEvent(code)); - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/SmsRetrieverReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/registration/SmsRetrieverReceiver.java new file mode 100644 index 0000000000..6ca552d2ba --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/SmsRetrieverReceiver.java @@ -0,0 +1,71 @@ +package org.thoughtcrime.securesms.registration; + +import android.app.Application; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; + +import androidx.annotation.NonNull; + +import com.google.android.gms.auth.api.phone.SmsRetriever; +import com.google.android.gms.common.api.CommonStatusCodes; +import com.google.android.gms.common.api.Status; + +import org.greenrobot.eventbus.EventBus; +import org.signal.core.util.logging.Log; +import org.thoughtcrime.securesms.service.VerificationCodeParser; + +import java.util.Optional; + +/** + * Listen for SMS verification codes sent during registration or change number. + */ +public class SmsRetrieverReceiver extends BroadcastReceiver { + + private static final String TAG = Log.tag(SmsRetrieverReceiver.class); + + private final Context context; + + public SmsRetrieverReceiver(@NonNull Application context) { + this.context = context; + } + + public void registerReceiver() { + Log.d(TAG, "Registering SMS retriever receiver"); + context.registerReceiver(this, new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION)); + } + + public void unregisterReceiver() { + Log.d(TAG, "Unregistering SMS retriever receiver"); + context.unregisterReceiver(this); + } + + @Override + public void onReceive(Context context, Intent intent) { + Log.i(TAG, "SmsRetrieverReceiver received a broadcast..."); + + if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) { + Bundle extras = intent.getExtras(); + Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS); + + switch (status.getStatusCode()) { + case CommonStatusCodes.SUCCESS: + Optional code = VerificationCodeParser.parse((String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE)); + if (code.isPresent()) { + Log.i(TAG, "Received verification code."); + EventBus.getDefault().post(new ReceivedSmsEvent(code.get())); + } else { + Log.w(TAG, "Could not parse verification code."); + } + break; + case CommonStatusCodes.TIMEOUT: + Log.w(TAG, "Hit a timeout waiting for the SMS to arrive."); + break; + } + } else { + Log.w(TAG, "SmsRetrieverReceiver received the wrong action?"); + } + } +}