package com.gzsll.hupu.ui.login; import android.support.annotation.NonNull; import android.text.TextUtils; import com.gzsll.hupu.Constants; import com.gzsll.hupu.api.game.GameApi; import com.gzsll.hupu.bean.LoginData; import com.gzsll.hupu.bean.LoginResult; import com.gzsll.hupu.bean.UserData; import com.gzsll.hupu.bean.UserResult; import com.gzsll.hupu.components.storage.UserStorage; import com.gzsll.hupu.db.User; import com.gzsll.hupu.db.UserDao; import com.gzsll.hupu.injector.PerActivity; import com.gzsll.hupu.otto.LoginSuccessEvent; import com.gzsll.hupu.util.SecurityUtil; import com.gzsll.hupu.util.ToastUtil; import com.squareup.otto.Bus; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.List; import javax.inject.Inject; import rx.Observable; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; /** * Created by sll on 2016/3/10. */ @PerActivity public class LoginPresenter implements LoginContract.Presenter { private GameApi mGameApi; private Bus mBus; private UserDao mUserDao; private UserStorage mUserStorage; private LoginContract.View mLoginView; private User user = new User(); private Subscription mSubscription; @Inject public LoginPresenter(GameApi gameApi, Bus bus, UserDao userDao, UserStorage userStorage) { mGameApi = gameApi; mBus = bus; mUserDao = userDao; mUserStorage = userStorage; } @Override public void login(final String userName, final String passWord) { if (TextUtils.isEmpty(userName)) { mLoginView.showUserNameError("请输入用户名"); return; } if (TextUtils.isEmpty(passWord)) { mLoginView.showPassWordError("请输入密码"); return; } mLoginView.showLoading(); mSubscription = mGameApi.login(userName, SecurityUtil.getMD5(passWord)) .flatMap(new Func1<LoginData, Observable<UserData>>() { @Override public Observable<UserData> call(LoginData loginData) { if (loginData != null && loginData.is_login == 1) { LoginResult data = loginData.result; String cookie = ""; try { cookie = URLDecoder.decode(Constants.Cookie, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String uid = cookie.split("\\|")[0]; user.setUid(uid); user.setToken(data.token); user.setCookie(cookie); user.setUserName(data.username); return mGameApi.getUserInfo(uid); } return null; } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<UserData>() { @Override public void call(UserData userData) { if (userData != null && userData.result != null) { UserResult data = userData.result; user.setIcon(data.header); user.setThreadUrl(data.bbs_msg_url); user.setPostUrl(data.bbs_post_url); user.setRegisterTime(data.reg_time_str); user.setSchool(data.school); user.setSex(data.gender); user.setLocation(data.location_str); mUserStorage.login(user); insertOrUpdateUser(user); ToastUtil.showToast("登录成功"); mBus.post(new LoginSuccessEvent()); mLoginView.loginSuccess(); } else { mLoginView.hideLoading(); ToastUtil.showToast("登录失败,请检查您的网络"); } } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { throwable.printStackTrace(); mLoginView.hideLoading(); ToastUtil.showToast("登录失败,请检查您的网络"); } }); } private void insertOrUpdateUser(User user) { List<User> users = mUserDao.queryBuilder().where(UserDao.Properties.Uid.eq(user.getUid())).list(); if (!users.isEmpty()) { user.setId(users.get(0).getId()); } mUserDao.insertOrReplace(user); } @Override public void attachView(@NonNull LoginContract.View view) { mLoginView = view; } @Override public void detachView() { if (mSubscription != null && !mSubscription.isUnsubscribed()) { mSubscription.unsubscribe(); } mLoginView = null; } }