Created
September 29, 2024 10:47
-
-
Save BraveEvidence/12a877a9526271c48f04a02f181cb2db to your computer and use it in GitHub Desktop.
SmsRretriverGist MainActivity
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Full tutorial here https://www.youtube.com/watch?v=-YxaNRPd5aU