package com.fastaccess.ui.modules.cloud.auth;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.widget.ProgressBar;
import com.fastaccess.R;
import com.fastaccess.helper.Logger;
import com.fastaccess.ui.base.BaseActivity;
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.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import butterknife.BindView;
import butterknife.OnClick;
import icepick.State;
/**
* Created by Kosh on 23 Oct 2016, 7:56 PM
*/
public class LoginView extends BaseActivity<LoginMvp.View, LoginPresenter> implements LoginMvp.View {
public static final int BACKUP_TYPE = 0;
public static final int RESTORE_TYPE = 1;
public static final String TYPE = "type";
@BindView(R.id.topProgress) ProgressBar topProgress;
@BindView(R.id.signInBtn) SignInButton signInBtn;
@State int type;
private GoogleApiClient mGoogleApiClient;
private GoogleSignInOptions signInOptions;
private ProgressDialog progressDialog;
private LoginPresenter presenter;
private FirebaseAuth firebaseAuth;
@OnClick(R.id.signInBtn) void onSignIn() {
getPresenter().onSignIn(this, getGoogleApiClient());
}
@Override protected int layout() {
return R.layout.sign_in_layout;
}
@NonNull @Override protected LoginPresenter getPresenter() {
if (presenter == null) presenter = LoginPresenter.with(this);
return presenter;
}
@Override protected boolean isTransparent() {
return false;
}
@Override protected boolean canBack() {
return true;
}
@Override public void onShowProgress() {
topProgress.setVisibility(View.VISIBLE);
if (!getProgressDialog().isShowing()) getProgressDialog().show();
}
@Override public void onHideProgress() {
topProgress.setVisibility(View.GONE);
if (getProgressDialog().isShowing()) getProgressDialog().dismiss();
}
@Override public void onShowMessage(@StringRes int resId) {
onShowMessage(getString(resId));
}
@Override public void onShowMessage(@NonNull String msg) {
onHideProgress();
Snackbar.make(signInBtn, msg, Snackbar.LENGTH_LONG).show();
}
@Override public void onConnected() {
Logger.e();
}
@Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Logger.e();
}
@Override public void onSignedIn(@NonNull GoogleSignInAccount account) {
getPresenter().onFirebaseSignIn(account, getFirebaseAuth());
}
@Override public void onFirebaseUser(@NonNull FirebaseUser user) {
onHideProgress();
getPresenter().onStartBackOrRestore(type, this);
}
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
type = getIntent().getExtras().getInt(TYPE);
}
setTitle(type == BACKUP_TYPE ? R.string.backup : R.string.restore);
signInBtn.setSize(SignInButton.SIZE_WIDE);
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
getPresenter().onActivityResult(requestCode, resultCode, data);
}
@Override protected void onStart() {
super.onStart();
getFirebaseAuth().addAuthStateListener(getPresenter());
}
@Override protected void onStop() {
super.onStop();
getFirebaseAuth().removeAuthStateListener(getPresenter());
}
private ProgressDialog getProgressDialog() {
if (progressDialog == null) {
progressDialog = new ProgressDialog(this);
progressDialog.setCancelable(false);
progressDialog.setMessage(getString(R.string.in_progress));
}
return progressDialog;
}
private GoogleApiClient getGoogleApiClient() {
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, getPresenter())
.addApi(Auth.GOOGLE_SIGN_IN_API, getSignInOptions())
.build();
}
return mGoogleApiClient;
}
private GoogleSignInOptions getSignInOptions() {
if (signInOptions == null) {
signInOptions = new GoogleSignInOptions
.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
}
return signInOptions;
}
public FirebaseAuth getFirebaseAuth() {
if (firebaseAuth == null) {
firebaseAuth = FirebaseAuth.getInstance();
}
return firebaseAuth;
}
}