Files
assistant-android/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java

276 lines
9.9 KiB
Java

package com.gh.gamecenter.fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Message;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.gh.base.fragment.WaitingDialogFragment;
import com.gh.common.util.GetLoginDataUtils;
import com.gh.common.util.LogUtils;
import com.gh.common.util.LoginUtils;
import com.gh.common.util.PatternUtils;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.LoginTokenEntity;
import com.gh.gamecenter.entity.UserInfoEntity;
import com.gh.gamecenter.manager.UserManager;
import com.gh.gamecenter.normal.NormalFragment;
import com.gh.gamecenter.user.ApiResponse;
import com.gh.gamecenter.user.LoginTag;
import com.gh.gamecenter.user.UserViewModel;
import com.halo.assistant.HaloApp;
import com.tencent.connect.common.Constants;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
import butterknife.BindView;
import butterknife.OnClick;
/**
* Created by khy on 14/08/17.
*/
public class LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackListener
, GetLoginDataUtils.OnLoginDataListener, View.OnClickListener, Observer<ApiResponse<UserInfoEntity>> {
@BindView(R.id.login_phone_et)
EditText mLoginPhoneEt;
@BindView(R.id.login_pass_et)
EditText mLoginPassEt;
@BindView(R.id.login_captcha)
TextView mLoginCaptcha;
@BindView(R.id.login_phone_btn)
TextView mLoginBtn;
private WaitingDialogFragment mLoginDialog;
private UserViewModel mUserViewModel;
private String mServiceId;
@Override
protected void handleMessage(Message msg) {
if (msg.what == 0) { // 验证码倒计时
int arg1 = msg.arg1;
arg1--;
if (arg1 >= 0) {
Message message = new Message();
message.what = 0;
message.arg1 = arg1;
mBaseHandler.sendMessageDelayed(message, 1000);
mLoginCaptcha.setText(arg1 + "s");
} else {
mLoginCaptcha.setText("重新获取");
mLoginCaptcha.setTextColor(ContextCompat.getColor(getContext(), R.color.title));
mLoginCaptcha.setBackgroundResource(R.drawable.border_black_bg);
mLoginCaptcha.setEnabled(true);
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.REQUEST_LOGIN) { // QQ Login callback
GetLoginDataUtils.getInstance(getContext()).onQQCallback(requestCode, resultCode, data);
} else if (requestCode == 32973) { // WeiBo Login callback
GetLoginDataUtils.getInstance(getContext()).onWeiboCallback(requestCode, resultCode, data);
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setNavigationTitle("登录光环助手");
}
@Override
protected int getLayoutId() {
return R.layout.fragment_login;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final UserViewModel.Factory factory = new UserViewModel.Factory(HaloApp.getInstance().getApplication());
mUserViewModel = ViewModelProviders.of(this, factory).get(UserViewModel.class);
mUserViewModel.getLoginObsUserinfo().observe(this, this);
mLoginPassEt.addTextChangedListener(new LoginTextWatcher(mLoginPassEt));
mLoginPhoneEt.addTextChangedListener(new LoginTextWatcher(mLoginPhoneEt));
}
@OnClick({R.id.login_captcha, R.id.login_phone_btn, R.id.login_qq_btn, R.id.login_weibo_btn, R.id.login_wechat_btn})
public void onClick(View v) {
super.onClick(v);
switch (v.getId()) {
case R.id.login_captcha:
final String phoneNum = mLoginPhoneEt.getText().toString().trim();
if (PatternUtils.isPhoneNum(phoneNum) && phoneNum.length() == 11) {
LoginUtils.getPhoneCaptcha(getContext(), phoneNum, LoginFragment.this);
} else {
toast("请输入正确的手机号");
}
break;
case R.id.login_phone_btn:
loginByMobile();
break;
case R.id.login_qq_btn:
GetLoginDataUtils.getInstance(getContext()).QQLogin(this, getActivity());
break;
case R.id.login_weibo_btn:
GetLoginDataUtils.getInstance(getContext()).WeiBoLogin(this, getActivity());
break;
case R.id.login_wechat_btn:
GetLoginDataUtils.getInstance(getContext()).WCLogin(this);
break;
}
}
// 登录
private void loginByMobile() {
String code = mLoginPassEt.getText().toString().trim();
String phoneNum = mLoginPhoneEt.getText().toString().trim();
if (TextUtils.isEmpty(phoneNum)) {
toast("手机号码不能为空");
return;
} else if (TextUtils.isEmpty(code)) {
toast("验证码不能为空");
return;
} else if (TextUtils.isEmpty(mServiceId)) {
toast("验证码错误,请重新获取");
return;
}
Map<String, String> params = new HashMap<>();
params.put("mobile", phoneNum);
params.put("code", code);
params.put("service_id", mServiceId);
login(new JSONObject(params), LoginTag.phone);
}
@Override
public void onCaptcha(String serviceId) {
if (!TextUtils.isEmpty(serviceId)) {
mServiceId = serviceId;
// 启动验证码倒计时
Message message = new Message();
message.what = 0;
message.arg1 = 60; // 倒数时间
mBaseHandler.sendMessage(message);
mLoginCaptcha.setTextColor(ContextCompat.getColor(getContext(), R.color.hint));
mLoginCaptcha.setBackgroundResource(R.drawable.border_captcha_bg);
mLoginCaptcha.setEnabled(false);
}
}
@Override
public void OnLoginData(JSONObject content, LoginTag loginTag) {
login(content, loginTag);
}
@Override
public void onChanged(@Nullable ApiResponse<UserInfoEntity> response) {
if (mLoginDialog != null) {
mLoginDialog.dismissAllowingStateLoss();
}
if (response != null && response.getData() != null) {
LoginTokenEntity loginTokenEntity = UserManager.getInstance().getLoginTokenEntity();
if (loginTokenEntity != null) {
String loginType = loginTokenEntity.getLoginType();
if (LoginTag.qq.name().equals(loginType) || LoginTag.wechat.name().equals(loginType)
|| LoginTag.weibo.name().equals(loginType)) {
LogUtils.login("success", loginType, mEntrance);
} else {
LogUtils.login("success", "mobile", mEntrance);
}
}
// 防止UserManager数据丢失后重复登录
if (TextUtils.isEmpty(UserManager.getInstance().getToken())) {
mUserViewModel.retryCheckLogin();
}
if (getActivity() != null) getActivity().finish();
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
mBaseHandler.removeCallbacksAndMessages(null);
}
private void login(JSONObject content, LoginTag loginTag) {
if (loginTag.equals(LoginTag.phone)) {
LogUtils.login("logging", "mobile", mEntrance);
} else {
LogUtils.login("logging", loginTag.name(), mEntrance);
}
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
mLoginDialog = WaitingDialogFragment.newInstance(getString(R.string.logging));
mLoginDialog.show(getChildFragmentManager(), null);
}
mUserViewModel.login(content, loginTag);
}
private class LoginTextWatcher implements TextWatcher {
private EditText mEditText;
public LoginTextWatcher(EditText e) {
mEditText = e;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Drawable drawable;
int tvCount = s.length();
if (mEditText == mLoginPassEt) {
if (tvCount > 0) {
drawable = ContextCompat.getDrawable(getContext(), R.drawable.login_password_focused);
} else {
drawable = ContextCompat.getDrawable(getContext(), R.drawable.login_password_unfocused);
}
} else {
if (tvCount > 0) {
drawable = ContextCompat.getDrawable(getContext(), R.drawable.login_phone_focused);
} else {
drawable = ContextCompat.getDrawable(getContext(), R.drawable.login_phone_unfocused);
}
}
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
Drawable line = ContextCompat.getDrawable(getContext(), R.drawable.et_line_login);
line.setBounds(0, 0, line.getMinimumWidth(), line.getMinimumHeight());
mEditText.setCompoundDrawables(drawable, null, null, line);
}
@Override
public void afterTextChanged(Editable s) {
}
}
}