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

266 lines
11 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.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
}
// 获取验证码
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);
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, RequestBody body, final LoginTag loginTag,
final onLoginCallBackListener listener) {
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 {
observable = RetrofitManager.getUsersea().loginByMobile(body);
}
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<LoginResponseEntity>() {
@Override
public void onResponse(LoginResponseEntity response) {
super.onResponse(response);
saveLoginToken(context, response);
getUserData(context, response.getAccessToken().getValue(), listener);
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
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", "error_message::" + content.getString("message") + "\n error_code::" + code);
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
}
public static void logout(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = sp.edit();
edit.putString("user_info", null);
edit.putString("login_token", null);
edit.apply();
}
// 检查本地是否有缓存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)) {
// TODO 刷新accessToken
} else {
// TODO 重新登录
}
}
}
}
public static void getUserData(final Context context, String token, final onLoginCallBackListener listener) {
RetrofitManager
.getUsersea()
.getUserInfo(token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<UserInfoEntity>(){
@Override
public void onResponse(UserInfoEntity response) {
super.onResponse(response);
saveUserInfo(context, response);
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();
}
}
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;
}
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 interface onCaptchaCallBackListener {
void onCaptcha(String serviceId);
}
public interface onLoginCallBackListener {
void onLogin(UserInfoEntity entity, LoginTag loginTag);
}
}