Skip to content

Instantly share code, notes, and snippets.

@BraveEvidence
Created September 29, 2024 10:47
Show Gist options
  • Save BraveEvidence/12a877a9526271c48f04a02f181cb2db to your computer and use it in GitHub Desktop.
Save BraveEvidence/12a877a9526271c48f04a02f181cb2db to your computer and use it in GitHub Desktop.
SmsRretriverGist MainActivity
import android.app.PendingIntent
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.IntentSenderRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.lifecycleScope
import com.codingwithnobody.myandroidapp.request.GetOTPRequest
import com.codingwithnobody.myandroidapp.request.VerifyOTPRequest
import com.google.android.gms.auth.api.identity.GetPhoneNumberHintIntentRequest
import com.google.android.gms.auth.api.identity.Identity
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 com.google.gson.GsonBuilder
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
//https://developers.google.com/identity/sms-retriever/overview
object SmsLiveDataHolder {
private val _smsMessage = MutableLiveData<String>()
val smsMessage: LiveData<String> get() = _smsMessage
fun postSmsMessage(message: String) {
_smsMessage.postValue(message)
}
}
class MainActivity : AppCompatActivity() {
private lateinit var phoneNumberTextField: EditText
private lateinit var otpTextField: EditText
private lateinit var getOtpButton: Button
private lateinit var verifyOtpButton: Button
private val phoneNumberHintIntentResultLauncher =
registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
try {
val phoneNumber =
Identity.getSignInClient(this).getPhoneNumberFromIntent(result.data)
phoneNumberTextField.setText(phoneNumber)
} catch (e: Exception) {
Log.e("TAG", "Phone Number Hint failed")
}
}
//////////////////////////////////////////////
private val okHttpClient = OkHttpClient.Builder()
.connectTimeout(3, TimeUnit.MINUTES)
.readTimeout(3, TimeUnit.MINUTES)
.build()
//Eg => http://123.456.0.789:3000
private val retrofit = Retrofit.Builder()
.client(okHttpClient)
.baseUrl("${MyConstants.BASE_URL}/api/")
.addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
.build().create(OTPService::class.java)
///////////////////////////////////////////////
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
val appSignatureHelper = AppSignatureHelper(this)
appSignatureHelper.appSignatures.forEach {
Log.i("valueis", it)
}
phoneNumberTextField = findViewById(R.id.phonenumber)
otpTextField = findViewById(R.id.otp)
getOtpButton = findViewById(R.id.get_otp)
verifyOtpButton = findViewById(R.id.btn_verify)
getOtpButton.setOnClickListener {
lifecycleScope.launch {
val data = retrofit.requestOTP(GetOTPRequest(phoneNumberTextField.text.toString()))
// if (data.message == "Success") {
withContext(Dispatchers.Main) {
val client = SmsRetriever.getClient(this@MainActivity)
//timeout is 5 minutes
client.startSmsRetriever().addOnSuccessListener {
Toast.makeText(
this@MainActivity,
"Started retriever",
Toast.LENGTH_LONG
).show()
}.addOnFailureListener {
Toast.makeText(this@MainActivity, "Failed retriever", Toast.LENGTH_LONG)
.show()
}
}
// }
}
}
verifyOtpButton.setOnClickListener {
lifecycleScope.launch {
val data = retrofit.verifyOTP(
VerifyOTPRequest(
phoneNumberTextField.text.toString(),
otpTextField.text.toString()
)
)
Toast.makeText(this@MainActivity,"${data.success}",Toast.LENGTH_LONG).show()
}
}
requestHint()
SmsLiveDataHolder.smsMessage.observe(this) { message ->
message?.let {
// Handle the received SMS message here
otpTextField.setText(extractOtpFromMessage(it))
}
}
}
private fun requestHint() {
val request: GetPhoneNumberHintIntentRequest =
GetPhoneNumberHintIntentRequest.builder().build()
Identity.getSignInClient(this)
.getPhoneNumberHintIntent(request)
.addOnSuccessListener { result: PendingIntent ->
try {
phoneNumberHintIntentResultLauncher.launch(
IntentSenderRequest.Builder(result).build()
)
} catch (e: Exception) {
Log.e("TAG", "Launching the PendingIntent failed")
}
}
.addOnFailureListener {
Log.e("TAG", "Phone Number Hint failed")
}
}
private fun extractOtpFromMessage(message: String): String? {
val otpPattern = Regex("\\b\\d{6}\\b")
return otpPattern.find(message)?.value
}
}
@BraveEvidence
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment