package org.estgroup.phphub.ui.view; import android.accounts.Account; import android.accounts.AccountManager; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.widget.TextView; import android.widget.Toast; import com.levelmoney.velodrome.Velodrome; import com.levelmoney.velodrome.annotations.OnActivityResult; import com.orhanobut.logger.Logger; import org.estgroup.phphub.R; import org.estgroup.phphub.api.entity.UserEntity; import org.estgroup.phphub.api.entity.element.Token; import org.estgroup.phphub.api.entity.element.User; import org.estgroup.phphub.common.App; import org.estgroup.phphub.common.Navigator; import org.estgroup.phphub.common.util.Utils; import org.estgroup.phphub.model.TokenModel; import org.estgroup.phphub.model.UserModel; import java.util.Set; import javax.inject.Inject; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import cn.jpush.android.api.JPushInterface; import cn.jpush.android.api.TagAliasCallback; import eu.unicate.retroauth.AuthenticationActivity; import rx.Observable; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; import rx.functions.Action1; import rx.functions.Func1; import static org.estgroup.phphub.common.Constant.LOGIN_TOKEN_KEY; import static org.estgroup.phphub.common.Constant.USERNAME_KEY; import static org.estgroup.phphub.common.Constant.USER_AVATAR_KEY; import static org.estgroup.phphub.common.Constant.USER_ID_KEY; import static org.estgroup.phphub.common.Constant.USER_SIGNATURE; import static org.estgroup.phphub.common.Constant.USER_REPLY_URL_KEY; import static org.estgroup.phphub.common.qualifier.AuthType.AUTH_TYPE_REFRESH; public class LoginActivity extends AuthenticationActivity { private final static int CODE_SCANNER = 100; @Bind(R.id.toolbar) Toolbar toolbarView; @Bind(R.id.toolbar_title) TextView toolbarTitleView; @Inject Navigator navigator; @Inject TokenModel tokenModel; @Inject UserModel userModel; @Inject AccountManager accountManager; Subscription subscription; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.login); ButterKnife.bind(this); initializeToolbar(); ((App) getApplication()).getApiComponent().inject(this); if (accountManager.getAccountsByType(getString(R.string.auth_account_type)).length > 0) { Toast.makeText(this, "只能有一个账号", Toast.LENGTH_SHORT).show(); finish(); return; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Velodrome.handleResult(this, requestCode, resultCode, data); } protected void initializeToolbar() { setSupportActionBar(toolbarView); getSupportActionBar().setDisplayShowTitleEnabled(false); toolbarTitleView.setText(R.string.please_login); } public static Intent getCallingIntent(Context context) { return new Intent(context, LoginActivity.class); } @OnClick(R.id.btn_login_guide) public void loginGuide() { navigator.navigateToWebView(this, "http://7xnqwn.com1.z0.glb.clouddn.com/index.html"); } @OnClick(R.id.btn_scanner) public void navigateToScanner() { navigator.navigateToScanner(this, CODE_SCANNER); } @OnActivityResult(CODE_SCANNER) public void onScanner(Intent data) { final String username = data.getStringExtra(USERNAME_KEY), loginToken = data.getStringExtra(LOGIN_TOKEN_KEY); if (TextUtils.isEmpty(username) || TextUtils.isEmpty(loginToken)) { Toast.makeText(this, "用户名或密码错误", Toast.LENGTH_SHORT).show(); return; } final ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage("登陆中"); dialog.setCancelable(false); final Account account = createOrGetAccount(username); subscription = tokenModel.tokenGenerator(username, loginToken) .doOnSubscribe(new Action0() { @Override public void call() { dialog.show(); } }) .doOnNext(new Action1<Token>() { @Override public void call(Token token) { } }) .flatMap(new Func1<Token, Observable<User>>() { @Override public Observable<User> call(final Token token) { return ((UserModel) userModel.once() .setToken(token.getToken())) .getMyselfInfo() .map(new Func1<UserEntity.AUser, User>() { @Override public User call(UserEntity.AUser user) { return user.getData(); } }) .doOnNext(new Action1<User>() { @Override public void call(User user) { storeToken(account, getString(R.string.auth_token_type), token.getToken()); storeUserData(account, AUTH_TYPE_REFRESH, token.getRefreshToken()); storeUserData(account, USER_ID_KEY, String.valueOf(user.getId())); storeUserData(account, USERNAME_KEY, user.getName()); storeUserData(account, USER_SIGNATURE, user.getSignature()); storeUserData(account, USER_AVATAR_KEY, user.getAvatar()); storeUserData(account, USER_REPLY_URL_KEY, user.getLinks().getRepliesWebView()); JPushInterface.setAlias(getApplicationContext(), "userid_" + user.getId(), new TagAliasCallback() { @Override public void gotResult(int i, String s, Set<String> set) { } }); } }); } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<User>() { @Override public void call(User user) { dialog.dismiss(); finalizeAuthentication(account); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { Account[] accounts = Utils.getAccounts(LoginActivity.this, accountManager); if (accounts.length > 0) { accountManager.removeAccount(Utils.getAccounts(LoginActivity.this, accountManager)[0], null, null); } dialog.dismiss(); Toast.makeText(LoginActivity.this, throwable.getMessage(), Toast.LENGTH_SHORT).show(); Logger.e(throwable.toString()); } }); } @Override protected void onDestroy() { super.onDestroy(); if (subscription != null && !subscription.isUnsubscribed()) { subscription.unsubscribe(); } } }