package com.kickstarter.ui.activities;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.widget.Button;
import android.widget.TextView;
import com.facebook.AccessToken;
import com.kickstarter.R;
import com.kickstarter.libs.ActivityRequestCodes;
import com.kickstarter.libs.BaseActivity;
import com.kickstarter.libs.qualifiers.RequiresActivityViewModel;
import com.kickstarter.libs.utils.ObjectUtils;
import com.kickstarter.libs.utils.ViewUtils;
import com.kickstarter.services.apiresponses.ErrorEnvelope;
import com.kickstarter.ui.IntentKey;
import com.kickstarter.ui.toolbars.LoginToolbar;
import com.kickstarter.ui.views.LoginPopupMenu;
import com.kickstarter.viewmodels.LoginToutViewModel;
import java.util.Arrays;
import butterknife.Bind;
import butterknife.BindString;
import butterknife.ButterKnife;
import butterknife.OnClick;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import static com.kickstarter.libs.utils.TransitionUtils.slideInFromRight;
import static com.kickstarter.libs.utils.TransitionUtils.transition;
@RequiresActivityViewModel(LoginToutViewModel.class)
public final class LoginToutActivity extends BaseActivity<LoginToutViewModel> {
@Bind(R.id.disclaimer_text_view) TextView disclaimerTextView;
@Bind(R.id.login_button) Button loginButton;
@Bind(R.id.facebook_login_button) Button facebookButton;
@Bind(R.id.sign_up_button) Button signupButton;
@Bind(R.id.help_button) TextView helpButton;
@Bind(R.id.login_toolbar) LoginToolbar loginToolbar;
@BindString(R.string.login_tout_navbar_title) String loginOrSignUpString;
@BindString(R.string.login_errors_title) String loginErrorTitleString;
@BindString(R.string.login_errors_unable_to_log_in) String unableToLoginString;
@BindString(R.string.general_error_oops) String errorTitleString;
@BindString(R.string.login_tout_errors_facebook_authorization_exception_message) String troubleLoggingInString;
@BindString(R.string.login_tout_errors_facebook_authorization_exception_button) String tryAgainString;
@Override
protected void onCreate(final @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_tout_layout);
ButterKnife.bind(this);
loginToolbar.setTitle(loginOrSignUpString);
viewModel.outputs.finishWithSuccessfulResult()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(__ -> finishWithSuccessfulResult());
viewModel.outputs.startLoginActivity()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(__ -> startLogin());
viewModel.outputs.startSignupActivity()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(__ -> startSignup());
viewModel.outputs.startFacebookConfirmationActivity()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(ua -> startFacebookConfirmationActivity(ua.first, ua.second));
viewModel.outputs.showFacebookAuthorizationErrorDialog()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(__ -> ViewUtils.showDialog(this, errorTitleString, troubleLoggingInString, tryAgainString));
showErrorMessageToasts()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(ViewUtils.showToast(this));
viewModel.outputs.startTwoFactorChallenge()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(__ -> startTwoFactorFacebookChallenge());
viewModel.outputs.showUnauthorizedErrorDialog()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(errorMessage -> ViewUtils.showDialog(this, loginErrorTitleString, errorMessage));
}
private @NonNull Observable<String> showErrorMessageToasts() {
return viewModel.outputs.showMissingFacebookEmailErrorToast()
.map(ObjectUtils.coalesceWith(unableToLoginString))
.mergeWith(
viewModel.outputs.showFacebookInvalidAccessTokenErrorToast()
.map(ObjectUtils.coalesceWith(unableToLoginString))
);
}
@OnClick(R.id.disclaimer_text_view)
public void disclaimerTextViewClick() {
new LoginPopupMenu(this, helpButton).show();
}
@OnClick(R.id.facebook_login_button)
public void facebookLoginClick() {
viewModel.inputs.facebookLoginClick(this,
Arrays.asList(getResources().getStringArray(R.array.facebook_permissions_array))
);
}
@OnClick(R.id.login_button)
public void loginButtonClick() {
viewModel.inputs.loginClick();
}
@OnClick(R.id.sign_up_button)
public void signupButtonClick() {
viewModel.inputs.signupClick();
}
private void finishWithSuccessfulResult() {
setResult(Activity.RESULT_OK);
finish();
}
public void startFacebookConfirmationActivity(final @NonNull ErrorEnvelope.FacebookUser facebookUser,
final @NonNull String accessTokenString) {
final Intent intent = new Intent(this, FacebookConfirmationActivity.class)
.putExtra(IntentKey.FACEBOOK_USER, facebookUser)
.putExtra(IntentKey.FACEBOOK_TOKEN, accessTokenString);
startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW);
transition(this, slideInFromRight());
}
private void startLogin() {
final Intent intent = new Intent(this, LoginActivity.class);
startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW);
transition(this, slideInFromRight());
}
private void startSignup() {
final Intent intent = new Intent(this, SignupActivity.class);
startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW);
transition(this, slideInFromRight());
}
public void startTwoFactorFacebookChallenge() {
final Intent intent = new Intent(this, TwoFactorActivity.class)
.putExtra(IntentKey.FACEBOOK_LOGIN, true)
.putExtra(IntentKey.FACEBOOK_TOKEN, AccessToken.getCurrentAccessToken().getToken());
startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW);
transition(this, slideInFromRight());
}
}