activity_register.xml


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#4CAF50"
    tools:context = ".Register" >



    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/aclonica"
        android:text="OTP AUTH"
        android:textColor="#FFFFFE"
        android:textSize="30sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.13" />


    <com.rilixtech.widget.countrycodepicker.CountryCodePicker
        android:id="@+id/ccp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2"
        app:layout_constraintVertical_bias="0.26999998" />

    <EditText
        android:id="@+id/phone"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
       android:ems="10"
        android:hint="Mobile Number"
        android:inputType="phone"
        android:textColor="#F2F1F3"
        android:textColorHint="#FFFEFE"
        android:textSize="19sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ccp"
        app:layout_constraintVertical_bias="0.0">

    </EditText>

    <Button
        android:id="@+id/nextBtn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:background="#009688"
        android:text="NEXT"
        android:textColor="#FFFFFF"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/state"
        app:layout_constraintVertical_bias="0.19" />

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:visibility="invisible"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/phone" />

    <TextView
        android:id="@+id/state"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="8dp"
        android:text="Sending OTP.."
        android:textColor="#FFEB3B"
        android:textSize="18sp"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@+id/progressBar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/progressBar"
        app:layout_constraintTop_toTopOf="@+id/progressBar" />

    <EditText
        android:id="@+id/codeEnter"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="8dp"
        android:ems="10"
        android:hint="Enter OTP"
        android:inputType="number"
        android:textColor="#FFFFFF"
        android:textColorHighlight="#E8E9EE"
        android:textColorHint="#DEDFE6"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/phone"
        app:layout_constraintVertical_bias="0.0" />

    <TextView
        android:id="@+id/resendOtpBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Resend"
        android:textColor="#FFEB3B"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@+id/codeEnter"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.92"
        app:layout_constraintStart_toEndOf="@+id/progressBar"
        app:layout_constraintTop_toTopOf="@+id/codeEnter" />

</androidx.constraintlayout.widget.ConstraintLayout>




Register.JAVA


package com.tn.loginpacttr;


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseException;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthProvider;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.rilixtech.widget.countrycodepicker.CountryCodePicker;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;

public class Register extends AppCompatActivity {
FirebaseAuth fAuth;
String phoneNumber = "+8801712441411";
String otpCode = "889889";
String verificationId;
EditText phone,optEnter;
Button next;
CountryCodePicker countryCodePicker;
PhoneAuthCredential credential;
Boolean verificationOnProgress = false;
ProgressBar progressBar;
TextView state,resend;
PhoneAuthProvider.ForceResendingToken token;
FirebaseFirestore fStore;


@Overrideprotected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_register);

   phone = findViewById(R.id.phone);
   optEnter = findViewById(R.id.codeEnter);
   countryCodePicker = findViewById(R.id.ccp);
   next = findViewById(R.id.nextBtn);
   fAuth = FirebaseAuth.getInstance();
   fStore = FirebaseFirestore.getInstance();
   progressBar = findViewById(R.id.progressBar);
   state = findViewById(R.id.state);
   resend = findViewById(R.id.resendOtpBtn);

   resend.setOnClickListener(new View.OnClickListener() {
      @Override      public void onClick(View v) {
         // todo:: resend OTP      }
   });


   next.setOnClickListener(new View.OnClickListener() {
      @Override      public void onClick(View v) {
         if(!phone.getText().toString().isEmpty() && phone.getText().toString().length() == 10) {
            if(!verificationOnProgress){
               next.setEnabled(false);
               progressBar.setVisibility(View.VISIBLE);
               state.setVisibility(View.VISIBLE);
               String phoneNum = "+"+countryCodePicker
              .getSelectedCountryCode()+phone.getText().toString();
               Log.d("phone", "Phone No.: " + phoneNum);
               requestPhoneAuth(phoneNum);
            }else {
               next.setEnabled(false);
               optEnter.setVisibility(View.GONE);
               progressBar.setVisibility(View.VISIBLE);
               state.setText("Log in");
               state.setVisibility(View.VISIBLE);
               otpCode = optEnter.getText().toString();
               if(otpCode.isEmpty()){
                  optEnter.setError("Required");
                  return;
               }

               credential = PhoneAuthProvider.getCredential(verificationId,otpCode);
               verifyAuth(credential);
            }

         }else {
            phone.setError("Valid Phone Number Required");
         }
      }
   });


}

private void requestPhoneAuth(String phoneNumber) {
   PhoneAuthProvider.getInstance().verifyPhoneNumber(phoneNumber,60L, TimeUnit.SECONDS,this,
         new PhoneAuthProvider.OnVerificationStateChangedCallbacks(){

            @Override            public void onCodeAutoRetrievalTimeOut(String s) {
               super.onCodeAutoRetrievalTimeOut(s);
               Toast.makeText(Register.this, "OTP Timeout, Please Re-generate the OTP Again.", Toast.LENGTH_SHORT).show();
               resend.setVisibility(View.VISIBLE);
            }

            @Override            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
               super.onCodeSent(s, forceResendingToken);
               verificationId = s;
               token = forceResendingToken;
               verificationOnProgress = true;
               progressBar.setVisibility(View.GONE);
               state.setVisibility(View.GONE);
               next.setText("Verify");
               next.setEnabled(true);
               optEnter.setVisibility(View.VISIBLE);
            }

            @Override            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {

               // called if otp is automatically detected by the app               verifyAuth(phoneAuthCredential);

            }

            @Override            public void onVerificationFailed(FirebaseException e) {
               Toast.makeText(Register.this, e.getMessage(), Toast.LENGTH_SHORT).show();

            }
         });
}


private void verifyAuth(PhoneAuthCredential credential) {
   fAuth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
      @Override      public void onComplete(@NonNull Task<AuthResult> task) {
         if(task.isSuccessful()){
            Toast.makeText(Register.this,
            "Phone Verified."+fAuth.getCurrentUser().getUid(), Toast.LENGTH_SHORT).show();
            checkUserProfile();
         }else {
            progressBar.setVisibility(View.GONE);
            state.setVisibility(View.GONE);
            Toast.makeText(Register.this, "Can not Verify phone and Create Account.",
            Toast.LENGTH_SHORT).show();
         }
      }
   });
}

@Overrideprotected void onStart() {
   super.onStart();

   if(fAuth.getCurrentUser() != null){
      progressBar.setVisibility(View.VISIBLE);
      state.setText("Checking..");
      state.setVisibility(View.VISIBLE);
      checkUserProfile();
   }
}

private void checkUserProfile() {
   DocumentReference docRef = fStore.collection("users").document
(fAuth.getCurrentUser().getUid());
   docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
      @Override      public void onSuccess(DocumentSnapshot documentSnapshot) {
         if(documentSnapshot.exists()){
            startActivity(new Intent(getApplicationContext(),MainActivity.class));
            finish();
         }else {
            //Toast.makeText(Register.this, "Profile Do not Exists.", Toast.LENGTH_SHORT).show();            
           startActivity(new Intent(getApplicationContext(),Detaile.class));
            finish();
         }
      }
   }).addOnFailureListener(new OnFailureListener() {
      @Override      public void onFailure(@NonNull Exception e) {
         Toast.makeText(Register.this, "Profile Do Not Exists", Toast.LENGTH_SHORT).show();
      }
   });
}
}