0

While i am running my program i am seeing no error.Currently i am trying to use phone authentication of firebase for my app.when I try to save data onto firsetore it uploads the data but does not set the required UId.I want to first check if the user is already logged in if he is than he will be directed to details.activity and if not than he will have to register in register.activity.I want to set UID in place of UserID

RegisterActivity.java

 public class RegisterActivity extends AppCompatActivity {
    FirebaseAuth firebaseAuth;
    FirebaseFirestore firestore;

     EditText phoneNumber;
    EditText codeEnter;
    Button NextButton;
    ProgressBar progressBar;
    TextView State;
    CountryCodePicker codePicker;
    String TAG ="MyTag";
    String verificationID;
    PhoneAuthProvider.ForceResendingToken Token;
    Boolean verifiacationInProgress=false;




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

        firebaseAuth= FirebaseAuth.getInstance();
        firestore=FirebaseFirestore.getInstance();

        phoneNumber= findViewById(R.id.phone);
        codeEnter=findViewById(R.id.codeEnter);
        NextButton=findViewById(R.id.nextButton);
        progressBar=findViewById(R.id.progressBar);
        State=findViewById(R.id.state);
        codePicker=findViewById(R.id.ccp);



        NextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!verifiacationInProgress){
                    if (!phoneNumber.getText().toString().isEmpty() && phoneNumber.getText().toString().length() == 10) {
                        String phnNumber = "+" + codePicker.getSelectedCountryCode() + phoneNumber.getText().toString();
                        Log.d(TAG, "Phone Number is   " + phnNumber);
                        progressBar.setVisibility(View.VISIBLE);
                        State.setText("SENDING OTP");
                        State.setVisibility(View.VISIBLE);
                        requestOTP(phnNumber);


                    } else {
                        phoneNumber.setError("Phone number is not valid");
                    }
            }
                else {
                    String UserOTP=codeEnter.getText().toString();
                    if (!UserOTP.isEmpty()&&UserOTP.length()==6){
                        PhoneAuthCredential credential=PhoneAuthProvider.getCredential(verificationID,UserOTP);
                        VerifyAuth(credential);

                    }
                    else {
                        codeEnter.setError("Invalid OTP");
                    }
                }
            }
        });




    }
    @Override
    protected void onStart() {
        super.onStart();
        if(firebaseAuth!=null){
            progressBar.setVisibility(View.VISIBLE);
            State.setText("Checking");
            State.setVisibility(View.VISIBLE);
            CheckUserProfile();
        }
    }

    private void VerifyAuth(PhoneAuthCredential credential) {
        firebaseAuth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if(task.isSuccessful()){
                    CheckUserProfile();

                }
                else {
                    Toast.makeText(RegisterActivity.this,"Login Failed",Toast.LENGTH_SHORT).show();
                }

            }
        });
    }

    private void CheckUserProfile(){
        DocumentReference documentReference=firestore.collection("users")
                .document(firebaseAuth.getCurrentUser().getUid());
        documentReference.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                if(documentSnapshot.exists()){
                    Intent intent=new Intent(RegisterActivity.this,MainActivity.class);
                    startActivity(intent);
                    finish();
                }
                else {
                    Intent intent = new Intent(RegisterActivity.this,AddDetails.class);
                    startActivity(intent);
                    finish();
                }

            }
        });

    }

    private void requestOTP(String phnNumber) {
        PhoneAuthProvider.getInstance().verifyPhoneNumber(phnNumber, 60L, TimeUnit.SECONDS, RegisterActivity.this,
                new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
                    @Override
                    public void onCodeSent(@NonNull String s, @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                        super.onCodeSent(s, forceResendingToken);
                        verificationID = s;
                        Token= forceResendingToken;
                        progressBar.setVisibility(View.INVISIBLE);
                        State.setVisibility(View.INVISIBLE);
                        codeEnter.setVisibility(View.VISIBLE);
                        NextButton.setText("Verify");
                        NextButton.setEnabled(true);
                        verifiacationInProgress=true;



                    }

                    @Override
                    public void onCodeAutoRetrievalTimeOut(@NonNull String s) {
                        super.onCodeAutoRetrievalTimeOut(s);
                    }

                    @Override
                    public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {

                    }

                    @Override
                    public void onVerificationFailed(@NonNull FirebaseException e) {
                        Toast.makeText(RegisterActivity.this,"Cannot create account"+e.getMessage(),Toast.LENGTH_SHORT).show();

                    }


                });
    }
}

AddDetails.java

    public class AddDetails extends AppCompatActivity {
    private Button button;
    private EditText fname,lname,emailid;
    FirebaseAuth firebaseAuth;
    FirebaseFirestore firebaseFirestore;
    String UserID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_details);
        button=findViewById(R.id.save_data);
        fname=findViewById(R.id.FirstName);
        lname=findViewById(R.id.LastName);
        emailid=findViewById(R.id.email_address);

        firebaseAuth=FirebaseAuth.getInstance();
        firebaseFirestore=FirebaseFirestore.getInstance();
        UserID=firebaseAuth.getCurrentUser().getUid();
        final DocumentReference documentReference=firebaseFirestore.collection("users").document("UserID");


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(!fname.getText().toString().isEmpty()&&!lname.getText().toString().
                        isEmpty()&&!emailid.getText().toString().isEmpty()){

                    String FirstName=fname.getText().toString();
                    String LastName=lname.getText().toString();
                    String EmailId=emailid.getText().toString();


                    Map<String,Object> user=new HashMap<>();
                    user.put("first",FirstName);
                    user.put("last",LastName);
                    user.put("EmailID",EmailId);

                    documentReference.set(user).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                         if(task.isSuccessful()){
                             Intent intent=new Intent(AddDetails.this,MainActivity.class);
                             startActivity(intent);
                             finish();
                             Toast.makeText(AddDetails.this,"Data Uploaded Successfully ",Toast.LENGTH_SHORT).show();
                         }
                         else {
                             Toast.makeText(AddDetails.this,"Data Upload Failed ",Toast.LENGTH_SHORT).show();
                         }

                        }
                    });

                }
                else {
                    Toast.makeText(AddDetails.this,"All Fields are Required",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

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="#4D8DF6"
    tools:context=".RegisterActivity">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        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/nextButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:background="#2F57EA"
        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>

activity_add_details

    <?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"
    tools:context=".AddDetails">

    <EditText
        android:id="@+id/FirstName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="96dp"
        android:layout_marginTop="78dp"
        android:ems="10"
        android:hint="First Name"
        android:inputType="textPersonName"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/LastName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="96dp"
        android:layout_marginTop="61dp"
        android:ems="10"
        android:hint="Last Name"
        android:inputType="textPersonName"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/FirstName" />

    <EditText
        android:id="@+id/email_address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="96dp"
        android:layout_marginTop="74dp"
        android:ems="10"
        android:hint="Email Address"
        android:inputType="textPersonName"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/LastName" />

    <Button
        android:id="@+id/save_data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="110dp"
        android:text="Save Data"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/email_address" />
</androidx.constraintlayout.widget.ConstraintLayout>

enter image description here

Doug Stevenson
  • 297,357
  • 32
  • 422
  • 441
Shivam
  • 113
  • 7

2 Answers2

1

you are using final DocumentReference documentReference=firebaseFirestore.collection("users").document("UserID"); which sets the document name to UserId. You can specify a viarble to put specific text in it (for example user authentication uid) or you can use an empty .document(); to create a document reference with an auto-generated ID. You can check Firebase docs for more info.

Chris Papantonis
  • 720
  • 7
  • 18
1

You cant change the name of the document after it was created. To have collections named with users-id you have to give the name at the moment you create the collections. something like this:

String userId = firebaseAuth.getCurrentUser().getUid();
Map<String,Object> user=new HashMap<>();
                    user.put("first",firstName);
                    user.put("last",lastName);
                    user.put("EmailID",emailId);
firebaseFirestore.collection("users").document(userId).set(user)
China fox
  • 124
  • 1
  • 8