Files
assistant-android/app/src/main/java/com/gh/common/util/LoginUtils.java

516 lines
21 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.gh.common.util;
import android.app.Dialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import com.gh.gamecenter.entity.LoginResponseEntity;
import com.gh.gamecenter.entity.UserInfoEntity;
import com.gh.gamecenter.retrofit.JSONObjectResponse;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.lightgame.utils.Utils;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.HttpException;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by khy on 7/07/17.
*/
public class LoginUtils {
public enum LoginTag {
qq, wechat, weibo, phone, refresh, oldUserPhone
}
public static void checkPhoneNum(final Context context, final String phoneName, final onCaptchaCallBackListener listener) { // 老用户登录检查手机是否登录过
RetrofitManager.getApi()
.checkPhoneNum(phoneName)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>(){
@Override
public void onResponse(ResponseBody response) {
super.onResponse(response);
try {
JSONObject content = new JSONObject(response.string());
String status = content.getString("status");
if ("ok".equals(status)) {
getPhoneCaptcha(context, phoneName, listener);
} else {
DialogUtils.showWarningDialog(context, null, "手机号已存在,请使用未登录过的手机号,以保证数据正常同步到新账号上"
, null, "我知道了", null, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
Utils.toast(context, "请检查网络是否可用");
}
});
}
// 获取验证码
public static void getPhoneCaptcha(final Context context, String phoneNum, final onCaptchaCallBackListener listener) {
Map<String, String> params = new HashMap<>();
params.put("mobile", phoneNum);
RequestBody body = RequestBody.create(MediaType.parse("application/json"),
new JSONObject(params).toString());
RetrofitManager
.getUsersea()
.loginByCaptcha(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new JSONObjectResponse() {
@Override
public void onResponse(JSONObject response) {
super.onResponse(response);
try {
listener.onCaptcha(response.getString("service_id"));
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
if (e == null) return;
int code = e.code();
switch (code) {
case 40001:
Utils.toast(context, "缺少mobile参数");
break;
case 40002:
Utils.toast(context, "mobile格式错误");
break;
case 40003:
Utils.toast(context, "一分钟内已发送过验证码");
break;
default:
Utils.toast(context, "未知错误");
break;
}
}
});
}
// 登录前做好body判断
public static void login(final Context context, final JSONObject content, final LoginTag loginTag,
final onLoginCallBackListener listener) {
try {
JSONObject device = DeviceUtils.getLoginDevice(context.getApplicationContext());
content.put("device", device);
} catch (JSONException e) {
e.printStackTrace();
}
RequestBody body = RequestBody.create(MediaType.parse("application/json"), content.toString());
Observable<LoginResponseEntity> observable;
if (loginTag == LoginTag.weibo) {
observable = RetrofitManager.getUsersea().loginByWeibo(body);
} else if (loginTag == LoginTag.qq) {
observable = RetrofitManager.getUsersea().loginByQQ(body);
} else if (loginTag == LoginTag.wechat) {
observable = RetrofitManager.getUsersea().loginByWechat(body);
} else if (loginTag == LoginTag.phone || loginTag == LoginTag.oldUserPhone) {
observable = RetrofitManager.getUsersea().loginByMobile(body);
} else if (loginTag == LoginTag.refresh) {
observable = RetrofitManager.getUsersea().refreshToken(body);
} else {
return;
}
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<LoginResponseEntity>() {
@Override
public void onResponse(LoginResponseEntity response) {
super.onResponse(response);
if (loginTag.equals(LoginTag.refresh)) {
LoginResponseEntity loginToken = getLoginToken(context);
if (loginToken != null) {
response.setLoginType(loginToken.getLoginType());
}
} else {
if (loginTag.equals(LoginTag.phone) || loginTag.equals(LoginTag.oldUserPhone)) {
try {
response.setLoginType(content.getString("mobile"));
} catch (JSONException e) {
e.printStackTrace();
}
} else {
response.setLoginType(loginTag.name());
}
}
saveLoginToken(context, response);
String token = response.getAccessToken().getValue();
if (loginTag == LoginTag.oldUserPhone) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String syncDeviceID = sp.getString("syncDeviceID", null);
if (!TextUtils.isEmpty(syncDeviceID)) {
syncUserData(context, syncDeviceID, token, listener);
return;
}
}
getUserData(context, token, listener);
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
if (e == null) return;
ResponseBody responseBody = e.response().errorBody();
try {
String string = responseBody.string();
JSONObject content = new JSONObject(string);
int code = content.getInt("code");
switch (code) {
case 40000:
Utils.toast(context, "参数错误或不完整");
case 40004:
Utils.toast(context, "缺少mobile参数");
break;
case 40005:
Utils.toast(context, "缺少code参数");
break;
case 40006:
Utils.toast(context, "缺少service_id参数");
break;
case 40007:
Utils.toast(context, "服务已超时");
break;
case 40008:
Utils.toast(context, "验证码已超时");
break;
case 40009:
Utils.toast(context, "验证码错误");
break;
case 40010:
Utils.toast(context, "登录授权失败");
break;
case 40011:
Utils.toast(context, "缺少token参数");
break;
case 40012:
Utils.toast(context, "令牌已过期");
break;
default:
Utils.toast(context, "未知错误");
break;
}
Utils.log("login::" + loginTag , "error_message::" + content.getString("message") + "\n error_code::" + code);
} catch (Exception e1) {
e1.printStackTrace();
}
cleanUserData(context);
}
});
}
public static void onFailureControl(Context context, HttpException e) {
if (e == null) return;
ResponseBody responseBody = e.response().errorBody();
try {
String string = responseBody.string();
JSONObject content = new JSONObject(string);
int code = content.getInt("code");
if (code == 40002) {
LoginResponseEntity loginToken = getLoginToken(context);
if (loginToken == null) return;
LoginResponseEntity.RefreshToken refreshToken = loginToken.getRefreshToken();
Long refreshExpire = refreshToken.getExpire();
if (refreshExpire != null && refreshExpire > Utils.getTime(context)) {
Map<String, String> params = new HashMap<>();
params.put("refresh_token", refreshToken.getValue());
login(context, new JSONObject(params), LoginTag.refresh, null); // TODO 刷新accessToken
} else {
// TODO 重新登录
cleanUserData(context);
Utils.toast(context, "请登录!!");
}
}
Utils.log("Token::" , "error_message::" + content.getString("message") + "\n error_code::" + code);
} catch (Exception e1) {
e1.printStackTrace();
}
}
private static void syncUserData(final Context context, String syncDeviceID, final String token
, final onLoginCallBackListener listener) {
HashMap<String, String> map = new HashMap<>();
map.put("device_id", syncDeviceID);
RequestBody body = RequestBody.create(MediaType.parse("application/json"), new JSONObject(map).toString());
RetrofitManager.getApi().syncUserData(token, body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>(){
@Override
public void onResponse(ResponseBody response) {
super.onResponse(response);
getUserData(context, token, listener);
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
getUserData(context, token, listener);
}
});
}
// 注销登录
public static void logout(Context context) {
LoginResponseEntity loginToken = getLoginToken(context);
if (loginToken == null || loginToken.getAccessToken() == null) return;
RetrofitManager
.getUsersea()
.logout(loginToken.getAccessToken().getValue())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>() {
});
cleanUserData(context);
}
// 清除本地用户相关信息
public static void cleanUserData(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = sp.edit();
edit.putString("user_info", null);
edit.putString("login_token", null);
edit.apply();
GetLoginDataUtils.getInstance(context).QQLogout();
}
// 检查本地是否有缓存token,有则马上登录
public static void checkLogin(Context context, onLoginCallBackListener listener) {
LoginResponseEntity loginToken = getLoginToken(context);
if (loginToken != null && loginToken.getAccessToken() != null) {
LoginResponseEntity.AccessToken accessToken = loginToken.getAccessToken();
Long accessExpire = accessToken.getExpire();
if (accessExpire != null && accessExpire > Utils.getTime(context)) {
getUserData(context, accessToken.getValue(), listener);
} else {
LoginResponseEntity.RefreshToken refreshToken = loginToken.getRefreshToken();
Long refreshExpire = refreshToken.getExpire();
if (refreshExpire != null && refreshExpire > Utils.getTime(context)) {
Map<String, String> params = new HashMap<>();
params.put("refresh_token", refreshToken.getValue());
login(context, new JSONObject(params), LoginTag.refresh, listener); // TODO 刷新accessToken
} else {
// TODO 重新登录
cleanUserData(context);
}
}
}
}
// 获取用户信息
public static void getUserData(final Context context, String token, final onLoginCallBackListener listener) {
RetrofitManager
.getApi()
.getUserInfo(token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<UserInfoEntity>() {
@Override
public void onResponse(UserInfoEntity response) {
super.onResponse(response);
saveUserInfo(context, response);
if (listener != null) {
listener.onLogin(response, null);
}
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
}
});
}
// 获取本地缓存用户信息
public static UserInfoEntity getUserInfo(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String loginData = sp.getString("user_info", null);
if (!TextUtils.isEmpty(loginData)) {
Type listType = new TypeToken<UserInfoEntity>() {
}.getType();
return new Gson().fromJson(loginData, listType);
}
return null;
}
// 在本地缓存用户信息
public static void saveUserInfo(Context context, UserInfoEntity entity) {
if (entity != null) {
String s = new Gson().toJson(entity);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = sp.edit();
edit.putString("user_info", s);
edit.apply();
}
}
//获取本地缓存用户token
public static LoginResponseEntity getLoginToken(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String loginData = sp.getString("login_token", null);
if (!TextUtils.isEmpty(loginData)) {
Type listType = new TypeToken<LoginResponseEntity>() {
}.getType();
return new Gson().fromJson(loginData, listType);
}
return null;
}
//获取本地缓存用户token
public static String getToken(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String loginData = sp.getString("login_token", null);
if (!TextUtils.isEmpty(loginData)) {
Type listType = new TypeToken<LoginResponseEntity>() {
}.getType();
LoginResponseEntity entity = new Gson().fromJson(loginData, listType);
if (entity != null && entity.getAccessToken() != null) {
return entity.getAccessToken().getValue();
}
}
return null;
}
// 在本地缓存用户token
public static void saveLoginToken(Context context, LoginResponseEntity entity) {
if (entity != null) {
String s = new Gson().toJson(entity);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = sp.edit();
edit.putString("login_token", s);
edit.apply();
}
}
//更改用户信息
public static void changeUserInfo(final onChangeUserInfoListener listener, final Context context, String content, String editType) {
final UserInfoEntity entity = getUserInfo(context);
if (entity == null) {
return;
}
switch (editType) {
case "nickName":
entity.setName(content);
break;
case "contact":
entity.setContact(content);
break;
case "sex":
entity.setGender(content);
break;
case "area":
entity.setRegion(content);
break;
case "userIcon":
entity.setIcon(content);
break;
default:
return;
}
final Dialog loadingDialog = DialogUtils.showWaitDialog(context, "正在修改信息...");
LoginResponseEntity loginToken = getLoginToken(context);
if (loginToken == null || loginToken.getAccessToken() == null) return;
RequestBody body = RequestBody.create(MediaType.parse("application/json"),
new Gson().toJson(entity));
RetrofitManager
.getUsersea()
.changeUserInfo(loginToken.getAccessToken().getValue(), body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<ResponseBody>() {
@Override
public void onResponse(ResponseBody response) {
super.onResponse(response);
if (loadingDialog != null) {
loadingDialog.dismiss();
}
saveUserInfo(context, entity);
listener.onChange();
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
if (loadingDialog != null) {
loadingDialog.dismiss();
}
Utils.toast(context, "修改失败");
}
});
}
// 更改用户信息回调
public interface onChangeUserInfoListener {
void onChange();
}
// 获取验证码回调
public interface onCaptchaCallBackListener {
void onCaptcha(String serviceId);
}
// 登录回调
public interface onLoginCallBackListener {
void onLogin(UserInfoEntity entity, LoginTag loginTag);
}
}