Arthelh/NCNF

View on GitHub
app/src/main/java/com/ncnf/views/fragments/login/SignInFragment.java

Summary

Maintainability
A
1 hr
Test Coverage
B
89%
package com.ncnf.views.fragments.login;

import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.ncnf.R;
import com.ncnf.authentication.firebase.FirebaseAuthentication;

import java.util.concurrent.CompletableFuture;

import javax.inject.Inject;

import dagger.hilt.android.AndroidEntryPoint;

import static com.ncnf.utilities.InputValidator.verifyEmailInput;
import static com.ncnf.utilities.StringCodes.BADLY_FORMATTED_EMAIL_STRING;
import static com.ncnf.utilities.StringCodes.DEBUG_TAG;
import static com.ncnf.utilities.StringCodes.EMPTY_FIELD_STRING;
import static com.ncnf.utilities.StringCodes.POPUP_POSITIVE_BUTTON;
import static com.ncnf.utilities.StringCodes.POPUP_TITLE;

@AndroidEntryPoint
public class SignInFragment extends Fragment {
    @Inject
    FirebaseAuthentication auth;

    private EditText email;
    private EditText password;
    private Button loginButton;
    private final Class<?> activity;

    public SignInFragment(Class<?> activity){
        this.activity = activity;
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_sign_in, container, false);
    }
    
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        getItemsFromView();

        showProgressBar(false);

        loginButton.setOnClickListener(v -> signIn());
    }

    
    public void signIn() {
        String emailString = email.getText().toString();
        String passwordString = password.getText().toString();

        if(checkInputs()){
            logIn(emailString, passwordString);
        }
    }

    
    private void logIn(String email, String password){

        showProgressBar(true);

        CompletableFuture<Boolean> futureResponse = auth.logIn(email, password);

        futureResponse.thenAccept(result -> {
            Log.d(DEBUG_TAG,"Successful login for " + email);
            Intent intent = new Intent(getActivity(), activity);
            startActivity(intent);
            requireActivity().finish();
        }).exceptionally(exception -> {
            Log.d(DEBUG_TAG,"Unsuccessful login for " + email + " : " + exception.getCause().getMessage());

            setException(exception.getCause().getMessage());
            showProgressBar(false);
            return null;
        });
    }

    private boolean checkInputs(){
        String emailString = email.getText().toString();
        String passwordString = password.getText().toString();

        if(emailString.isEmpty()){
            email.setError(EMPTY_FIELD_STRING);
            return false;
        } else if(passwordString.isEmpty()) {
            password.setError(EMPTY_FIELD_STRING);
            return false;
        } else if (!verifyEmailInput(emailString)){
            email.setError(BADLY_FORMATTED_EMAIL_STRING);
            return false;
        }

        return true;
    }

    private void getItemsFromView(){
        this.email = getView().findViewById(R.id.signInEmail);
        this.password = getView().findViewById(R.id.signInPassword);
        this.loginButton = getView().findViewById(R.id.signInLoginButton);
    }

    private void showProgressBar(Boolean show){
        ProgressBar bar = getView().findViewById(R.id.sign_in_spinner);
        if(show){
            bar.setVisibility(View.VISIBLE);
        } else {
            bar.setVisibility(View.INVISIBLE);
        }
    }

    private void setException(String s){
        AlertDialog.Builder popup = new AlertDialog.Builder(getActivity());
        popup.setCancelable(true);
        popup.setTitle(POPUP_TITLE);
        popup.setMessage(s);
        popup.setPositiveButton(POPUP_POSITIVE_BUTTON, (dialog, which) -> {
            dialog.cancel();
        });
        popup.show();
    }
}