package
com.example.firebaseproject
import
android.annotation.SuppressLint
import
android.app.Activity
import
android.content.Context
import
android.os.Bundle
import
android.text.TextUtils
import
android.widget.Toast
import
androidx.activity.ComponentActivity
import
androidx.activity.compose.setContent
import
androidx.compose.foundation.background
import
androidx.compose.foundation.layout.*
import
androidx.compose.foundation.text.KeyboardOptions
import
androidx.compose.material.*
import
androidx.compose.runtime.Composable
import
androidx.compose.runtime.MutableState
import
androidx.compose.runtime.mutableStateOf
import
androidx.compose.runtime.remember
import
androidx.compose.ui.Alignment
import
androidx.compose.ui.Modifier
import
androidx.compose.ui.graphics.Color
import
androidx.compose.ui.platform.LocalContext
import
androidx.compose.ui.text.TextStyle
import
androidx.compose.ui.text.font.FontWeight
import
androidx.compose.ui.text.input.KeyboardType
import
androidx.compose.ui.text.style.TextAlign
import
androidx.compose.ui.unit.dp
import
androidx.compose.ui.unit.sp
import
com.example.firebaseproject.ui.theme.FirebaseProjectTheme
import
com.example.firebaseproject.ui.theme.greenColor
import
com.google.firebase.FirebaseException
import
com.google.firebase.auth.*
import
com.google.firebase.auth.PhoneAuthProvider.ForceResendingToken
import
com.google.firebase.auth.PhoneAuthProvider.OnVerificationStateChangedCallbacks
import
java.util.concurrent.TimeUnit
class
MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContent {
FirebaseProjectTheme {
Surface(
modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background
) {
Scaffold(
topBar = {
TopAppBar(backgroundColor = greenColor,
title = {
Text(
text =
"GFG"
,
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
color = Color.White
)
})
}) {
firebaseUI(LocalContext.current)
}
}
}
}
}
}
@Composable
fun firebaseUI(context: Context) {
val phoneNumber = remember {
mutableStateOf(
""
)
}
val otp = remember {
mutableStateOf(
""
)
}
val verificationID = remember {
mutableStateOf(
""
)
}
val message = remember {
mutableStateOf(
""
)
}
var mAuth: FirebaseAuth = FirebaseAuth.getInstance();
lateinit var callbacks: PhoneAuthProvider.OnVerificationStateChangedCallbacks
Column(
modifier = Modifier
.fillMaxHeight()
.fillMaxWidth()
.background(Color.White),
verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally
) {
TextField(
value = phoneNumber.value,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
onValueChange = { phoneNumber.value = it },
placeholder = { Text(text =
"Enter your phone number"
) },
modifier = Modifier
.padding(
16
.dp)
.fillMaxWidth(),
textStyle = TextStyle(color = Color.Black, fontSize =
15
.sp),
singleLine =
true
,
)
Spacer(modifier = Modifier.height(
10
.dp))
Button(
onClick = {
if
(TextUtils.isEmpty(phoneNumber.value.toString())) {
Toast.makeText(context,
"Please enter phone number.."
, Toast.LENGTH_SHORT)
.show()
}
else
{
val number =
"+91${phoneNumber.value}"
sendVerificationCode(number, mAuth, context as Activity, callbacks)
}
},
modifier = Modifier
.fillMaxWidth()
.padding(
16
.dp)
) {
Text(text =
"Generate OTP"
, modifier = Modifier.padding(
8
.dp))
}
Spacer(modifier = Modifier.height(
10
.dp))
TextField(
value = otp.value,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
onValueChange = { otp.value = it },
placeholder = { Text(text =
"Enter your otp"
) },
modifier = Modifier
.padding(
16
.dp)
.fillMaxWidth(),
textStyle = TextStyle(color = Color.Black, fontSize =
15
.sp),
singleLine =
true
,
)
Spacer(modifier = Modifier.height(
10
.dp))
Button(
onClick = {
if
(TextUtils.isEmpty(otp.value.toString())) {
Toast.makeText(context,
"Please enter otp.."
, Toast.LENGTH_SHORT)
.show()
}
else
{
val credential: PhoneAuthCredential = PhoneAuthProvider.getCredential(
verificationID.value, otp.value
)
signInWithPhoneAuthCredential(
credential,
mAuth,
context as Activity,
context,
message
)
}
},
modifier = Modifier
.fillMaxWidth()
.padding(
16
.dp)
) {
Text(text =
"Verify OTP"
, modifier = Modifier.padding(
8
.dp))
}
Spacer(modifier = Modifier.height(
5
.dp))
Text(
text = message.value,
style = TextStyle(color = greenColor, fontSize =
20
.sp, fontWeight = FontWeight.Bold)
)
}
callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
override fun onVerificationCompleted(p0: PhoneAuthCredential) {
message.value =
"Verification successful"
Toast.makeText(context,
"Verification successful.."
, Toast.LENGTH_SHORT).show()
}
override fun onVerificationFailed(p0: FirebaseException) {
message.value =
"Fail to verify user : \n"
+ p0.message
Toast.makeText(context,
"Verification failed.."
, Toast.LENGTH_SHORT).show()
}
override fun onCodeSent(verificationId: String, p1: ForceResendingToken) {
super
.onCodeSent(verificationId, p1)
verificationID.value = verificationId
}
}
}
private
fun signInWithPhoneAuthCredential(
credential: PhoneAuthCredential,
auth: FirebaseAuth,
activity: Activity,
context: Context,
message: MutableState<String>
) {
auth.signInWithCredential(credential)
.addOnCompleteListener(activity) { task ->
if
(task.isSuccessful) {
message.value =
"Verification successful"
Toast.makeText(context,
"Verification successful.."
, Toast.LENGTH_SHORT).show()
}
else
{
if
(task.exception is FirebaseAuthInvalidCredentialsException) {
Toast.makeText(
context,
"Verification failed.."
+ (task.exception as FirebaseAuthInvalidCredentialsException).message,
Toast.LENGTH_SHORT
).show()
}
}
}
}
private
fun sendVerificationCode(
number: String,
auth: FirebaseAuth,
activity: Activity,
callbacks: OnVerificationStateChangedCallbacks
) {
val options = PhoneAuthOptions.newBuilder(auth)
.setPhoneNumber(number)
.setTimeout(60L, TimeUnit.SECONDS)
.setActivity(activity)
.setCallbacks(callbacks)
.build()
PhoneAuthProvider.verifyPhoneNumber(options)
}