com.hackeruproj.android.havatzfit.log_in_activity.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.hackeruproj.android.havatzfit.log_in_activity.MainActivity.java

Source

package com.hackeruproj.android.havatzfit.log_in_activity;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Toast;

import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;
import com.hackeruproj.android.havatzfit.firebase_utilities.Users;
import com.hackeruproj.android.havatzfit.general_utilities.GenUtils;
import com.hackeruproj.android.havatzfit.lobby_activity.LobbyActivity;
import com.hackeruproj.android.havatzfit.R;
import com.hackeruproj.android.havatzfit.custom_toolbar.UserToolbar;

/**
 * Created by Igor on 20-Jul-16.
*/
public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {
    //start TAG and RC setting
    private static final String TAG = "Google login";
    private static final int RC_SIGN_IN = 9001;
    //finish TAG and RC setting

    //start setting checkbox
    CheckBox stayOn;
    //end setting checkbox

    // start declare auth
    private FirebaseAuth mAuth;
    // finish declare auth

    //start declare SignIn Btn
    SignInButton nSignInBtn;
    //finish declare SignIn Btn

    //start delcare auth listener and GoogleAPIClient
    private FirebaseAuth.AuthStateListener mAuthListener;
    private GoogleApiClient mGoogleApiClient;
    //finish delcare auth listenerand and GoogleAPIClient
    //start ProgressDialog
    private ProgressDialog mProgressDialog;
    //finish

    //start initiate object FireBaseUtils
    GenUtils utils = new GenUtils(MainActivity.this);

    //finish initiate object FireBaseUtils
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //start asking user for license agreement
        showDisclaimer();
        //finish asking user for license agreement

        //start initiate progrss dialog
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("Loading...");
        mProgressDialog.setIndeterminate(true);
        mProgressDialog.setCancelable(false);
        //start button listener

        //start connect SignIn btn ref to xml id tag
        nSignInBtn = (SignInButton) findViewById(R.id.googleLoginBtn);
        //finish connect SignIn btn ref to xml id tag

        //start connect stayOn with XML id
        stayOn = (CheckBox) findViewById(R.id.checkBoxID);
        //end connect stayOn with XML id

        //start config signin
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id)).requestEmail().requestProfile().build();
        //end config signin

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this/*activity*/, this/*OnConnectionFailedListener */)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso).build();
        //start initialize Auth

        mAuth = FirebaseAuth.getInstance();
        //end initialize Auth

        //start intitialize SignIn btn onclick listener
        nSignInBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //check if internet connection is availbled if not pop a message and return from listener
                if (!GenUtils.isNetworkEnabled(MainActivity.this)) {
                    Toast.makeText(MainActivity.this, R.string.msgConnectivity, Toast.LENGTH_SHORT).show();
                    return;
                }
                //if internet connection is not null proceed to signIn
                signIn();
            }
        });
        //finish intitialize SignIn btn onclick listener

        //start if user marked stay online and connected to the web go straight to lobby
        if (utils.isChecked(GenUtils.IS_CHECKED) && GenUtils.isNetworkEnabled(MainActivity.this)) {

            FirebaseUser user = mAuth.getCurrentUser();
            getUserData(user);
            toLobby();
        } else if (!GenUtils.isNetworkEnabled(MainActivity.this)) {
            Toast.makeText(MainActivity.this, R.string.msgConnectivity, Toast.LENGTH_SHORT).show();
        }
        //end if user marked stay online and connected to the web go straight to lobby

    }

    //start ask for runtime permissions
    private void askRunPermission() {
        if (!GenUtils.chkLocPerm(this)) {
            ActivityCompat.requestPermissions(this,
                    new String[] { android.Manifest.permission.ACCESS_FINE_LOCATION }, 0);
        }
    }
    //finish ask for permissions in runtime

    //start check user agreement on terms and conditions
    private void showDisclaimer() {
        if (!utils.isChecked(GenUtils.HAS_AGREED)) {
            AlertDialog.Builder disclaimer = new AlertDialog.Builder(this);
            disclaimer.setTitle(R.string.disclaimerHead);
            disclaimer.setMessage(R.string.disclaimerTheme);
            //positive button, save to sp the value
            disclaimer.setPositiveButton(R.string.posetive, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    utils.saveUser(GenUtils.HAS_AGREED);

                    //start ask for runtime permissions
                    askRunPermission();
                    //finish ask for runtime permissions
                }
            });

            //on negetive click exit app
            disclaimer.setNegativeButton(R.string.negetive, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                    finish();
                }
            });

            disclaimer.show();

        }
    }
    //end check user agreement on terms and conditions

    //start onActivity result
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Result returned from launching the Intent and inputs all the UserData in the UserUtility Static class
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                GoogleSignInAccount account = result.getSignInAccount();
                firebaseAuthWithGoogle(account);//<-- authenticates user in the server with his account
            } else {
                Toast.makeText(MainActivity.this, "Login failed", Toast.LENGTH_SHORT).show();
            }
        }
    }

    //end onActivity result

    //start authWithGoogle
    private void firebaseAuthWithGoogle(final GoogleSignInAccount account) {
        Log.d(TAG, "firebaseAuthWithGoogle:" + account.getId());
        //start client loading
        mProgressDialog.show();
        //end client loading

        AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
        mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                String userUID = task.getResult().getUser().getUid();
                String userName = task.getResult().getUser().getDisplayName();
                String userMail = task.getResult().getUser().getEmail();
                String agrdOnTerms = GenUtils.getCurrentDate();
                //create user signature in the DB
                Users users = new Users(userUID, userName, userMail, agrdOnTerms);
                users.createUser();

                getUserData(task.getResult().getUser());//get user data into the Tab

                //check if stayOn has been clicked
                if (stayOn.isChecked()) {
                    utils.saveUser(GenUtils.IS_CHECKED);
                }

                toLobby();
                /*  startActivity(new Intent(MainActivity.this,LobbyActivity.class));
                finish();*/
                // If sign in fails, display a message to the user. If sign in succeeds
                // the auth state listener will be notified and logic to handle the
                // signed in user can be handled in the listener.
                if (!task.isSuccessful()) {
                    Log.w(TAG, "signInWithCredential", task.getException());
                    Toast.makeText(MainActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
                }

                //start end progrewssBar
                mProgressDialog.dismiss();
                //end end progrewssBar
            }
        });
    }
    //end authWithGoogle

    private void signIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    //start go to logged page method
    private void getUserData(FirebaseUser user) {
        //end loading progress bar
        if (user != null) {
            //if user logged in do succesfull user logged actions
            UserToolbar.setmStringID(user.getUid());
            UserToolbar.setmStringName(user.getDisplayName());
            UserToolbar.setmStringMail(user.getEmail());
            UserToolbar.setmStringUri(String.valueOf(user.getPhotoUrl()));
        }

    }
    //end go to logged page method

    //start move to lobbyPage
    private void toLobby() {
        startActivity(new Intent(MainActivity.this, LobbyActivity.class));
        finish();
    }
    //end move to lobbyPage

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Toast.makeText(MainActivity.this, R.string.cncFailMsg, Toast.LENGTH_SHORT).show();
    }
}