Skip to content

Instantly share code, notes, and snippets.

@mondoktamas
Created December 30, 2016 09:41
Show Gist options
  • Save mondoktamas/31a32a65b0dac2fcff7d00d20f5c3e35 to your computer and use it in GitHub Desktop.
Save mondoktamas/31a32a65b0dac2fcff7d00d20f5c3e35 to your computer and use it in GitHub Desktop.
package com.booklava.booklava.presentation.authorisation.signin.inhouse;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.support.v4.app.NavUtils;
import android.support.v4.app.TaskStackBuilder;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.booklava.booklava.R;
import com.booklava.booklava.domain.usecase.FacebookSignInUseCase;
import com.booklava.booklava.domain.usecase.LinkedInSignInUseCase;
import com.booklava.booklava.domain.usecase.SignInUseCase;
import com.booklava.booklava.domain.utils.Injection;
import com.booklava.booklava.presentation.BooklavaBaseActivity;
import com.booklava.booklava.presentation.authorisation.confirm.VerifyEmailActivity;
import com.booklava.booklava.presentation.authorisation.forgot.ForgotPasswordActivity;
import com.booklava.booklava.presentation.authorisation.signin.social.LinkedInActivity;
import com.booklava.booklava.presentation.category.InterestedCategoriesActivity;
import com.booklava.booklava.presentation.constants.Arguments;
import com.booklava.booklava.presentation.tabs.TabActivity;
import com.booklava.booklava.presentation.utils.KeyboardUtils;
import com.booklava.core.presentation.utils.Validator;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookException;
import com.facebook.login.LoginManager;
import com.facebook.login.widget.LoginButton;
import java.util.Arrays;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;
public class SignInActivity extends BooklavaBaseActivity implements SignInContract.SignInView {
private final static int REQUEST_CODE_LINKED_IN = 123;
@BindView(R.id.layout_user_name)
TextInputLayout mUserNameContainer;
@BindView(R.id.edit_user_name)
EditText mUserName;
@BindView(R.id.layout_password)
TextInputLayout mPasswordContainer;
@BindView(R.id.edit_password)
EditText mPassword;
@BindView(R.id.login_button_facebook_login)
LoginButton mFacebookLogin;
SignInPresenter mPresenter;
private CallbackManager callbackManager;
private Unbinder mUnbinder;
public static Intent getLaunchActivity(final Context context) {
return new Intent(context, SignInActivity.class);
}
@Override
protected void onCreate(final @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
mUnbinder = ButterKnife.bind(this);
mPresenter = new SignInPresenter(new SignInUseCase(Injection.provideUserRepository(this)),
new FacebookSignInUseCase(Injection.provideUserRepository(this)),
new LinkedInSignInUseCase(Injection.provideUserRepository(this)),
this);
initFacebookSettings();
}
private void initFacebookSettings() {
if (AccessToken.getCurrentAccessToken() != null && !AccessToken.getCurrentAccessToken().isExpired())
LoginManager.getInstance().logOut();
callbackManager = CallbackManager.Factory.create();
mFacebookLogin.setReadPermissions(Arrays.asList("public_profile, email"));
mFacebookLogin.registerCallback(callbackManager, mPresenter.getFacebookCallback());
}
@VisibleForTesting
void setPresenter(final SignInPresenter signInPresenter) {
mPresenter = signInPresenter;
}
@VisibleForTesting
void setFacebookLoginButton(final LoginButton loginButton) {
mFacebookLogin = loginButton;
}
@OnClick(R.id.button_sign_in)
public void signInClicked() {
mPresenter.signInClicked(mUserName.getText().toString().trim(),
mPassword.getText().toString().trim());
}
@OnClick(R.id.text_forgot_password)
public void forgotPasswordClicked() {
startActivity(ForgotPasswordActivity.getLaunchIntent(this));
}
@OnClick(R.id.button_linked_in)
public void signInWithLinkedIn() {
final Intent launchIntent = LinkedInActivity.getLaunchIntent(this);
startActivityForResult(launchIntent, REQUEST_CODE_LINKED_IN);
}
@OnClick(R.id.button_fb_login)
public void fbButtonClick() {
mFacebookLogin.performClick();
}
@Override
public void userNameIsEmpty() {
mUserNameContainer.setError(getText(R.string.sign_in_error_empty_username));
}
@Override
public void passwordIsEmpty() {
mPasswordContainer.setError(getText(R.string.sign_in_error_empty_password));
}
@Override
public void clearValidationErrors() {
mUserNameContainer.setError(null);
mPasswordContainer.setError(null);
}
@Override
public void showProgress(final boolean visible) {
showProgressDialog(visible);
}
@Override
public void onSignInSuccess(final boolean confirmed, final boolean hasNoFavorites) {
KeyboardUtils.hideKeyboard(this);
final Intent launchIntent;
if (confirmed) {
if (hasNoFavorites) {
launchIntent = InterestedCategoriesActivity.getLaunchIntent(this);
} else {
launchIntent = TabActivity.getLaunchIntent(this, TabActivity.TAB_DISCOVER_POSITION);
}
} else {
launchIntent = VerifyEmailActivity.getLaunchIntent(this, hasNoFavorites);
}
startActivity(launchIntent);
finishAffinity();
}
@Override
public void onSignInFailed(final String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
@Override
public void onFacebookLoginError(final FacebookException error) {
Toast.makeText(this, error.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onEmptyEmail(final int loginType) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final View dialogView = getLayoutInflater().inflate(R.layout.dialog_add_email, null);
builder.setView(dialogView)
.setTitle(R.string.sign_in_alert_title_email)
.setCancelable(false)
.setNegativeButton(getText(R.string.alert_btn_cancel), (dialog, id) -> dialog.cancel())
.setPositiveButton(getText(R.string.alert_btn_send), null);
AlertDialog alert = builder.create();
alert.show();
alert.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(view -> {
TextInputLayout inputLayout = ((TextInputLayout) dialogView.findViewById(R.id.input_layout_email));
TextInputEditText email = ((TextInputEditText) dialogView.findViewById(R.id.edit_email));
if (Validator.isEmpty(email.getText().toString().trim())) {
inputLayout.setError(getText(R.string.error_empty_email));
} else if (!Validator.isCorrectEmail(email.getText().toString().trim())) {
inputLayout.setError(getText(R.string.error_wrong_email));
} else {
mPresenter.onSendEmailSubmit(email.getText().toString().trim(), loginType);
alert.dismiss();
}
});
}
@Override
public void onFacebookLoginCancel() {
Toast.makeText(this, R.string.sign_in_facebook_canceled, Toast.LENGTH_SHORT).show();
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
NavUtils.navigateUpTo(this, upIntent);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case Activity.RESULT_OK:
handleSuccessResult(requestCode, data);
break;
case Activity.RESULT_CANCELED:
handleCanceledResult(requestCode);
break;
}
}
private void handleCanceledResult(final int requestCode) {
switch (requestCode) {
case REQUEST_CODE_LINKED_IN:
Toast.makeText(getApplicationContext(), R.string.sign_in_linked_in_canceled, Toast.LENGTH_SHORT).show();
break;
}
}
private void handleSuccessResult(final int requestCode, final Intent data) {
switch (requestCode) {
case REQUEST_CODE_LINKED_IN:
final String linkedInAccessToken = data.getStringExtra(Arguments.EXTRA_LINKED_IN_TOKEN);
mPresenter.signInWithLinkedIn(linkedInAccessToken);
break;
}
}
@Override
protected void onDestroy() {
mPresenter.detach();
mUnbinder.unbind();
super.onDestroy();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment