package co.smartreceipts.android.identity.widget.login;
import android.content.Context;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.jakewharton.rxbinding2.view.RxView;
import com.jakewharton.rxbinding2.widget.RxTextView;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import co.smartreceipts.android.R;
import co.smartreceipts.android.identity.widget.login.model.UiInputValidationIndicator;
import co.smartreceipts.android.utils.SoftKeyboardManager;
import co.smartreceipts.android.utils.log.Logger;
import co.smartreceipts.android.widget.model.UiIndicator;
import dagger.android.support.AndroidSupportInjection;
import io.reactivex.Observable;
public class LoginFragment extends Fragment implements LoginView {
@Inject
LoginPresenter presenter;
@Inject
LoginRouter router;
@BindView(R.id.login_fields_hint)
TextView loginFieldsHintMessage;
@BindView(R.id.login_field_email)
EditText emailInput;
@BindView(R.id.login_field_password)
EditText passwordInput;
@BindView(R.id.progress)
ProgressBar progress;
@BindView(R.id.login_button)
Button loginButton;
@BindView(R.id.sign_up_button)
Button signUpButton;
private Unbinder unbinder;
@NonNull
public static LoginFragment newInstance() {
return new LoginFragment();
}
@Override
public void onAttach(Context context) {
AndroidSupportInjection.inject(this);
super.onAttach(context);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.login_fragment, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
this.unbinder = ButterKnife.bind(this, view);
this.emailInput.requestFocus();
SoftKeyboardManager.showKeyboard(this.emailInput);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
return router.navigateBack();
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
public void onResume() {
super.onResume();
Logger.debug(this, "onResume");
final ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle(R.string.login_toolbar_title);
actionBar.setSubtitle("");
}
this.presenter.subscribe();
}
@Override
public void onPause() {
Logger.debug(this, "onPause");
this.presenter.unsubscribe();
super.onPause();
}
@Override
public void onDestroyView() {
Logger.debug(this, "onDestroyView");
SoftKeyboardManager.hideKeyboard(emailInput);
this.unbinder.unbind();
super.onDestroyView();
}
@Override
public void present(@NonNull UiIndicator uiIndicator) {
progress.setVisibility(uiIndicator.getState() == UiIndicator.State.Loading ? View.VISIBLE : View.GONE);
if (uiIndicator.getState() != UiIndicator.State.Idle) {
loginButton.setEnabled(uiIndicator.getState() != UiIndicator.State.Loading);
signUpButton.setEnabled(uiIndicator.getState() != UiIndicator.State.Loading);
}
if (uiIndicator.getMessage().isPresent()) {
Toast.makeText(getContext(), uiIndicator.getMessage().get(), Toast.LENGTH_SHORT).show();
}
if (uiIndicator.getState() == UiIndicator.State.Succcess) {
router.navigateBack();
}
}
@Override
public void present(@NonNull UiInputValidationIndicator uiInputValidationIndicator) {
final boolean enableButtons = uiInputValidationIndicator.isEmailValid() && uiInputValidationIndicator.isPasswordValid();
loginFieldsHintMessage.setText(uiInputValidationIndicator.getMessage());
loginButton.setEnabled(enableButtons);
signUpButton.setEnabled(enableButtons);
highlightInput(emailInput, uiInputValidationIndicator.isEmailValid());
highlightInput(passwordInput, uiInputValidationIndicator.isPasswordValid());
}
@NonNull
@Override
public Observable<CharSequence> getEmailTextChanges() {
return RxTextView.textChanges(emailInput);
}
@NonNull
@Override
public Observable<CharSequence> getPasswordTextChanges() {
return RxTextView.textChanges(passwordInput);
}
@NonNull
@Override
public Observable<Object> getLoginButtonClicks() {
return RxView.clicks(loginButton);
}
@NonNull
@Override
public Observable<Object> getSignUpButtonClicks() {
return RxView.clicks(signUpButton);
}
private void highlightInput(@NonNull EditText editText, boolean isValid) {
final int color;
if (isValid) {
color = ResourcesCompat.getColor(editText.getResources(), R.color.smart_receipts_colorSuccess, editText.getContext().getTheme());
} else {
color = ResourcesCompat.getColor(editText.getResources(), R.color.smart_receipts_colorAccent, editText.getContext().getTheme());
}
editText.getBackground().mutate().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
}
}