package com.kickstarter.ui.activities;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Pair;
import android.widget.Button;
import android.widget.EditText;
import com.kickstarter.R;
import com.kickstarter.libs.BaseActivity;
import com.kickstarter.libs.qualifiers.RequiresActivityViewModel;
import com.kickstarter.libs.utils.ViewUtils;
import com.kickstarter.ui.toolbars.LoginToolbar;
import com.kickstarter.viewmodels.TwoFactorViewModel;
import butterknife.Bind;
import butterknife.BindString;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnTextChanged;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import static com.kickstarter.libs.utils.TransitionUtils.slideInFromLeft;
@RequiresActivityViewModel(TwoFactorViewModel.class)
public final class TwoFactorActivity extends BaseActivity<TwoFactorViewModel> {
public @Bind(R.id.code) EditText codeEditText;
public @Bind(R.id.resend_button) Button resendButton;
public @Bind(R.id.login_button) Button loginButton;
public @Bind(R.id.login_toolbar) LoginToolbar loginToolbar;
@BindString(R.string.two_factor_error_message) String codeMismatchString;
@BindString(R.string.login_errors_unable_to_log_in) String unableToLoginString;
@BindString(R.string.two_factor_title) String verifyString;
@BindString(R.string.login_errors_title) String errorTitleString;
@Override
protected void onCreate(final @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.two_factor_layout);
ButterKnife.bind(this);
loginToolbar.setTitle(verifyString);
viewModel.outputs.tfaSuccess()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(__ -> onSuccess());
viewModel.outputs.formSubmitting()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::setFormDisabled);
viewModel.outputs.formIsValid()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::setFormEnabled);
errorMessages()
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(e -> ViewUtils.showDialog(this, errorTitleString, e));
}
private Observable<String> errorMessages() {
return viewModel.errors.tfaCodeMismatchError().map(__ -> codeMismatchString)
.mergeWith(viewModel.errors.genericTfaError().map(__ -> unableToLoginString));
}
@OnTextChanged(R.id.code)
public void codeEditTextOnTextChanged(final @NonNull CharSequence code) {
viewModel.inputs.code(code.toString());
}
@OnClick(R.id.resend_button)
public void resendButtonOnClick() {
viewModel.inputs.resendClick();
}
@OnClick(R.id.login_button)
public void loginButtonOnClick() {
viewModel.inputs.loginClick();
}
public void onSuccess() {
setResult(Activity.RESULT_OK);
finish();
}
public void setFormEnabled(final boolean enabled) {
loginButton.setEnabled(enabled);
}
public void setFormDisabled(final boolean disabled) {
setFormEnabled(!disabled);
}
@Override
protected @Nullable Pair<Integer, Integer> exitTransition() {
return slideInFromLeft();
}
}