package starter.kit.rx.app.feature.auth; import android.os.Bundle; import android.support.design.widget.TextInputLayout; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import butterknife.BindView; import com.jakewharton.rxbinding.view.RxView; import com.jakewharton.rxbinding.widget.RxTextView; import java.io.IOException; import java.util.concurrent.TimeUnit; import nucleus.factory.RequiresPresenter; import rx.Observable; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import starter.kit.retrofit.ErrorResponse; import starter.kit.retrofit.RetrofitException; import starter.kit.feature.NetworkContract; import starter.kit.rx.app.R; import starter.kit.feature.rx.RxStarterActivity; import support.ui.app.SupportApp; import work.wanghao.simplehud.SimpleHUD; import static rx.android.schedulers.AndroidSchedulers.mainThread; /** * Created by YuGang Yang on 06 29, 2016. * Copyright 2015-2016 qiji.tech. All rights reserved. */ @RequiresPresenter(AuthPresenter.class) public class LoginActivity extends RxStarterActivity<AuthPresenter> implements NetworkContract.View { @BindView(R.id.container_login_username) TextInputLayout mUsernameContainer; @BindView(R.id.container_login_password) TextInputLayout mPasswordContainer; @BindView(R.id.btn_login) Button mLoginBtn; EditText mUsernameEdit; EditText mPasswordEdit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); setupViews(); setupObservable(); } private void setupObservable() { Observable<Boolean> usernameChangeObservable = RxTextView.textChanges(mUsernameEdit) .doOnNext(charSequence -> hideUsernameError()) .debounce(400, TimeUnit.MILLISECONDS) .filter(charSequence -> !TextUtils.isEmpty(charSequence)) .map(charSequence -> validateUsername(charSequence.toString())); Observable<Boolean> passwordChangeObservable = RxTextView.textChanges(mPasswordEdit) .doOnNext(charSequence -> hidePasswordError()) .debounce(400, TimeUnit.MILLISECONDS) .filter(charSequence -> !TextUtils.isEmpty(charSequence)) .map(charSequence -> validatePassword(charSequence.toString())); // Checks for validity of the username input field Subscription usernameSubscription = usernameChangeObservable .observeOn(mainThread()) // UI Thread .subscribe(validFields -> { if (validFields) { hideUsernameError(); } else { showUsernameError(); } }); add(usernameSubscription); // Checks for validity of the password input field Subscription passwordSubscription = passwordChangeObservable .observeOn(mainThread()) // UI Thread .subscribe(validFields -> { if (validFields) { hidePasswordError(); } else { showPasswordError(); } }); add(passwordSubscription); // Checks for validity of all input fields Subscription btnSubscription = Observable.combineLatest(usernameChangeObservable, passwordChangeObservable, (isUsernameValid, isPasswordValid) -> isUsernameValid && isPasswordValid) .observeOn(AndroidSchedulers.mainThread()) // UI Thread .subscribe(RxView.enabled(mLoginBtn)); add(btnSubscription); //Observable.combineLatest(RxTextView.textChanges(mUsernameEdit).map(charSequence -> // charSequence != null && charSequence.length() >= 6), // RxTextView.textChanges(mPasswordEdit).map(charSequence -> // charSequence != null && charSequence.length() >= 6), // (username, password) -> username && password) // .subscribe(RxView.enabled(mLoginBtn)); RxView.clicks(mLoginBtn) .debounce(300, TimeUnit.MILLISECONDS) .subscribe(aVoid -> doLogin()); } private boolean validateUsername(String username) { return username != null && username.trim().length() >= 6; } private boolean validatePassword(String password) { return password != null && password.trim().length() >= 6; } private void enableError(TextInputLayout textInputLayout) { if (textInputLayout.getChildCount() == 2) textInputLayout.getChildAt(1).setVisibility(View.VISIBLE); } private void disableError(TextInputLayout textInputLayout) { if (textInputLayout.getChildCount() == 2) textInputLayout.getChildAt(1).setVisibility(View.GONE); } private void showUsernameError(){ enableError(mUsernameContainer); //mUsernameContainer.setErrorEnabled(true); mUsernameContainer.setError(SupportApp.appResources().getString(R.string.login_username_error)); } private void hideUsernameError(){ disableError(mUsernameContainer); mUsernameContainer.setError(null); } private void showPasswordError(){ enableError(mPasswordContainer); mPasswordContainer.setError(SupportApp.appResources().getString(R.string.login_username_error)); } private void hidePasswordError(){ disableError(mPasswordContainer); mPasswordContainer.setError(null); } private void setupViews() { mUsernameEdit = mUsernameContainer.getEditText(); mPasswordEdit = mPasswordContainer.getEditText(); } private void doLogin() { getPresenter().requestItem(mUsernameEdit.getText().toString(), mPasswordEdit.getText().toString()); } @Override public void onSuccess(Object item) { SimpleHUD.showInfoMessage(this, "登录成功"); } @Override public void onError(RetrofitException exception) { try { ErrorResponse errorResponse = exception.getErrorBodyAs(ErrorResponse.class); SimpleHUD.showErrorMessage(this, errorResponse.getMessage()); } catch (IOException e) { SimpleHUD.showErrorMessage(this, exception.getMessage()); } } }