package com.hdl.linkpm.sdk.user; import android.text.TextUtils; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import com.hdl.linkpm.sdk.core.callback.IDefaultCallBack; import com.hdl.linkpm.sdk.core.callback.IDefaultStrCallBack; import com.hdl.linkpm.sdk.core.callback.IResponseCallBack; import com.hdl.linkpm.sdk.core.exception.HDLErrorCode; import com.hdl.linkpm.sdk.core.exception.HDLException; import com.hdl.linkpm.sdk.user.bean.HDLLoginBean; import com.hdl.linkpm.sdk.user.bean.HDLUserInfoBean; import com.hdl.linkpm.sdk.user.bean.HDLUserRegionBean; import com.hdl.linkpm.sdk.user.bean.ImageSubmitInfo; import com.hdl.linkpm.sdk.user.bean.MqttInfo; import com.hdl.linkpm.sdk.user.bean.NewVersionBean; import com.hdl.linkpm.sdk.user.callback.ILoginCallBack; import com.hdl.linkpm.sdk.user.callback.IMemberInfoBack; import com.hdl.linkpm.sdk.user.callback.IOnReloginListener; import com.hdl.linkpm.sdk.user.callback.IRegionByAccountCallBack; import com.hdl.linkpm.sdk.user.controller.HDLPMUserController; import com.hdl.linkpm.sdk.utils.HDLGsonUtils; import com.hdl.linkpm.sdk.utils.HDLSDKLog; import com.hdl.linkpm.sdk.utils.HDLSDKSPUtils; import java.io.File; import java.util.Map; import io.reactivex.rxjava3.disposables.Disposable; /** * Created by jlchen on 12/2/21. */ public class HDLLinkPMUser { private static final String TAG = "HDLLinkPMUser"; private static final String HDLLINK_ISLOGIN_KEY = "hdllink_islogin";//登录状态 public static final String HDLLINK_USER_KEY = "hdllink_user";//用户信息 private static final String HDLLINK_PUSHID_KEY = "hdllink_jpush_id";//极光推送绑定后端返回id private static final String HDLLINK_ACCESSTOKEN_KEY = "hdllink_access_token";//用户token private static final String HDLLINK_REFRESHTOKEN_KEY = "hdllink_refresh_token";//用户刷新token private static final String HDLLINK_USERURL_KEY = "hdllink_user_url";//用户请求域名地址 private static final String HDLLINK_HOMEURL_KEY = "hdllink_home_url";//用户请求域名地址 /// 用户注册所在服务器域名地址 private String userRegionUrl; /// 住宅所在服务器域名地址 住宅相关接口都用这个地址 private String homeRegionUrl; //是否登录状态 private boolean isLogin = false; /// 用户有效身份Token private String accessToken; /// 刷新Token private String refreshToken; //登录成功后的用户信息 private HDLUserInfoBean mUser; //当用户AccessToken 错误后发出的通知 登出处理 private IOnReloginListener mOnReloginListener; //instance private volatile static HDLLinkPMUser instance; /** * getInstance * * @return HDLSmartUser */ public static synchronized HDLLinkPMUser getInstance() { if (instance == null) { synchronized (HDLLinkPMUser.class) { if (instance == null) { instance = new HDLLinkPMUser(); instance.loadData();//加载缓存的HDLUserBean对象 } } } return instance; } /** * loadData 加载缓存的HDLUser对象 */ private void loadData() { //1. isLogin = HDLSDKSPUtils.getBoolean(HDLLINK_ISLOGIN_KEY); //2. accessToken = HDLSDKSPUtils.getString(HDLLINK_ACCESSTOKEN_KEY); //3. refreshToken = HDLSDKSPUtils.getString(HDLLINK_REFRESHTOKEN_KEY); //4. userRegionUrl = HDLSDKSPUtils.getString(HDLLINK_USERURL_KEY); //5. homeRegionUrl = HDLSDKSPUtils.getString(HDLLINK_HOMEURL_KEY); //6. String userJsonStr = HDLSDKSPUtils.getString(HDLLINK_USER_KEY); if (!TextUtils.isEmpty(userJsonStr)) //防空判断 { mUser = HDLGsonUtils.fromJson(userJsonStr, new TypeToken() { }.getType()); if (mUser == null) { saveLogin(false);//重新标记为未登录 } } } /** * 登录成功或者刷新token后 保存一次HDLUser对象 */ private void saveHDLUserBean(HDLUserInfoBean user) { String mUserJsonStr = HDLGsonUtils.toJson(user); //将List转换成Json HDLSDKSPUtils.put(HDLLINK_USER_KEY, mUserJsonStr); } /** * 保存极光推送绑定之后的id */ public void saveHDLJpushId(String pushId) { HDLSDKSPUtils.put(HDLLINK_PUSHID_KEY, pushId); } /** * 获取极光推送绑定之后的id */ public String getHDLJpushId() { return HDLSDKSPUtils.getString(HDLLINK_PUSHID_KEY); } /** * 保存登录状态 * * @param isLogin */ private void saveLogin(Boolean isLogin) { HDLSDKSPUtils.put(HDLLINK_ISLOGIN_KEY, isLogin); } /** * 登录成功后,刷新和保存相关用户身份参数 * * @param userBean */ private void loginSuccess(HDLLoginBean userBean) { //1.保存登录状态 saveLogin(true); //2.保存token saveAccessToken(userBean.getHeaderPrefix() + userBean.getAccessToken()); //3.保存刷新token saveRefreshToken(userBean.getRefreshToken()); //4.保存mUser对象到缓存 this.mUser = new HDLUserInfoBean(userBean); saveHDLUserBean(this.mUser); } private void saveAccessToken(String accessToken) { this.accessToken = accessToken; HDLSDKSPUtils.put(HDLLINK_ACCESSTOKEN_KEY, this.accessToken); } private void saveRefreshToken(String refreshToken) { this.refreshToken = refreshToken; HDLSDKSPUtils.put(HDLLINK_REFRESHTOKEN_KEY, this.refreshToken); } /** * @param userBean */ public void updateRefreshToken(HDLLoginBean userBean) { if (userBean == null) return; //刷新token返回的数据可能不带account、userPhone等相关参数,所以不能更新user值、只更新AccessToken和刷新Token的值就好了 //1.保存登录状态 saveLogin(true); //2.保存token saveAccessToken(userBean.getHeaderPrefix() + userBean.getAccessToken()); //3.保存刷新token saveRefreshToken(userBean.getRefreshToken()); } /** * 清空登录状态 */ private void removeAll() { //1.设置未登录状态 saveLogin(false); //2.清空token saveAccessToken(""); //3.清空刷新token saveRefreshToken(""); //4.清空用户对象 saveHDLUserBean(new HDLUserInfoBean()); } /** * 通知退出重新登录 * @param type: 0:正常退出 1:极光推送强制退出 */ private void notificationRelogin(int type) { if (mOnReloginListener != null) { mOnReloginListener.onReLogin(type); } } /** * 退出登录 * @param type: 0:正常退出 1:极光推送强制退出 */ public void logout(int type) { //1.清空登录状态 removeAll(); //2.发出重新登录通知 notificationRelogin(type); } /****************************请求接口****************************/ /** * 获取账号所在区域 * * @param account 账号 * @param callBack 结果回调 */ public void regionByAccount(String account, IRegionByAccountCallBack callBack) { HDLPMUserController.getInstance().regionByAccount(account, new IRegionByAccountCallBack() { @Override public void onSuccess(HDLUserRegionBean regionBean) { if (regionBean != null) { //查询成功记录一次 setUserRegionUrl(regionBean.getRegionUrl()); if (callBack != null) { callBack.onSuccess(regionBean); } } else { if (callBack != null) { callBack.onFailure(HDLException.getErrorWithCode(HDLErrorCode.HDL_DATA_PARSING_ERROR)); } } } @Override public void onFailure(HDLException error) { if (callBack != null) { callBack.onFailure(error); } } }); } /** * 通过账号和密码登录 * * @param account 账号 * @param loginPwd 密码 * @param callBack 结果回调 */ public void loginByPassword(String account, String loginPwd, ILoginCallBack callBack) { HDLPMUserController.getInstance().loginByPassword(account, loginPwd, new ILoginCallBack() { @Override public void onSuccess(HDLLoginBean loginBean) { loginSuccess(loginBean); if (callBack != null) { callBack.onSuccess(loginBean); } } @Override public void onFailure(HDLException error) { if (callBack != null) { callBack.onFailure(error); } } }); } /****************************请求接口****************************/ /** * 获取账号所在区域 * * @param isBooleanB true=B,false=C * @param account 账号 * @param callBack 结果回调 */ public void regionByAccount(boolean isBooleanB, String account, IRegionByAccountCallBack callBack) { HDLPMUserController.getInstance().regionByAccount(isBooleanB,account, new IRegionByAccountCallBack() { @Override public void onSuccess(HDLUserRegionBean regionBean) { if (regionBean != null) { //查询成功记录一次 setUserRegionUrl(regionBean.getRegionUrl()); if (callBack != null) { callBack.onSuccess(regionBean); } } else { if (callBack != null) { callBack.onFailure(HDLException.getErrorWithCode(HDLErrorCode.HDL_DATA_PARSING_ERROR)); } } } @Override public void onFailure(HDLException error) { if (callBack != null) { callBack.onFailure(error); } } }); } /** * 通过账号和密码登录 * * @param isBooleanB true=B,false=C * @param account 账号 * @param loginPwd 密码 * @param callBack 结果回调 */ public void loginByPassword(boolean isBooleanB, String account, String loginPwd, ILoginCallBack callBack) { HDLPMUserController.getInstance().loginByPassword(isBooleanB, account, loginPwd, new ILoginCallBack() { @Override public void onSuccess(HDLLoginBean loginBean) { loginSuccess(loginBean); if (callBack != null) { callBack.onSuccess(loginBean); } } @Override public void onFailure(HDLException error) { if (callBack != null) { callBack.onFailure(error); } } }); } /** * 登录 * 通过验证码 * * @param account 手机或者邮箱 * @param vCode 验证码 * @param callBack 回调 * @return */ public void loginByCode(String account, String vCode, ILoginCallBack callBack) { HDLPMUserController.getInstance().loginByCode(account, vCode, new ILoginCallBack() { @Override public void onSuccess(HDLLoginBean loginBean) { loginSuccess(loginBean); if (callBack != null) { callBack.onSuccess(loginBean); } } @Override public void onFailure(HDLException error) { if (callBack != null) { callBack.onFailure(error); } } }); } /** * 通用 发送验证码方法 * LanguageTypeEnum CHINESE,ENGLISH * * @param verifyType 1:注册 2:找回密码 3:绑定 4:验证码登陆 5:敏感数据 * @param account 邮箱或者手机号 * @param isPhone 是否手机 * @param phoneZoneCode 手机国家区号 * @param languageType 语言 * @param callBack * @return */ public void verificationCodeSend(int verifyType, String account, Boolean isPhone, String phoneZoneCode, String languageType, IDefaultCallBack callBack) { HDLPMUserController.getInstance().verificationCodeSend(verifyType, account, isPhone, phoneZoneCode, languageType, callBack); } /** * 忘记密码,重置密码 * * @param account 邮箱或者手机号 * @param password 新密码 * @param vCode 验证码 * @param isPhone 是否手机 * @param callBack 回调 */ public void forgetPassword(String account, String password, String vCode, Boolean isPhone, IDefaultCallBack callBack) { HDLPMUserController.getInstance().forgetPassword(account, password, vCode, isPhone, callBack); } /** * 更改个人密码 * * @param userId 当前用户ID * @param loginOldPwd 老密码 * @param loginPwd 新密码 * @param callBack 回调 */ public void updateProgramPassword(String userId, String loginOldPwd, String loginPwd, IDefaultCallBack callBack) { HDLPMUserController.getInstance().updateProgramPassword(userId, loginOldPwd, loginPwd, callBack); } /** * 获取用户个人信息 * * @param callBack */ public void getMemberInfo(IMemberInfoBack callBack) { HDLPMUserController.getInstance().getMemberInfo(callBack); } /** * 更新个人信息 * memberHeadIcon、memberName、memberBirthday、languageType、memberSex * * @param callBack */ public void updateMemberInfo(JsonObject updateInfo, IDefaultCallBack callBack) { HDLPMUserController.getInstance().updateMemberInfo(updateInfo, callBack); } /** * 获取用户头像路径 * * @param memberHeadIconKey 用户头像imageKey * @param callBack */ public void getHeadImageUrl(String memberHeadIconKey, IDefaultStrCallBack callBack) { HDLPMUserController.getInstance().getHeadImageUrl(memberHeadIconKey, callBack); } /** * 上传用户头像 * * @param userId 用户id * @param imageBytes 头像图片 * @param callBack * @return */ public void uploadUserHeadImage(String userId, byte[] imageBytes, IDefaultStrCallBack callBack) { HDLPMUserController.getInstance().uploadUserHeadImage(userId, imageBytes, callBack); } /** * 上传用户头像 * * @param file 图片文件 * @param callBack * @return */ public void uploadUserHeadImage(File file, IResponseCallBack callBack) { HDLPMUserController.getInstance().uplfadUserHeadImage(file, callBack); } /** * APP版本检测更新 * * @param appCode app编码 * @param version 版本号 * @param callBack 如果onSuccess 回调的bean为空,代表当前版本已经是最新版本,没有新版本 * @return */ public void checkAppVersion(String appCode, String version, IResponseCallBack callBack) { HDLPMUserController.getInstance().checkAppVersion(appCode, version, "Android", callBack); } /** * 小程序wgt版本检测更新 * * @param appCode app编码 * @param wgtVersion 小程序wgt版本号 * @param callBack 如果onSuccess 回调的bean为空,代表当前版本已经是最新版本,没有新版本 * @return */ public void checkWgtVersion(String appCode, String wgtVersion, IResponseCallBack callBack) { HDLPMUserController.getInstance().checkAppVersion(appCode, wgtVersion,"wgt", callBack); } /** * 获取mqtt */ public void getMqttInfo(String attachClientId, String homeType, String deviceUuid, IResponseCallBacklistener) { HDLPMUserController.getInstance().getMqttInfo(attachClientId, homeType, deviceUuid, listener); } /****************************请求接口****************************/ public String getUserRegionUrl() { if (TextUtils.isEmpty(userRegionUrl)) { HDLSDKLog.e(TAG, "userRegionUrl null "); } return userRegionUrl; } public void setUserRegionUrl(String userRegionUrl) { this.userRegionUrl = userRegionUrl; HDLSDKSPUtils.put(HDLLINK_USERURL_KEY, this.userRegionUrl); } public boolean isLogin() { return isLogin; } public HDLUserInfoBean getUser() { return mUser; } public String getAccessToken() { return accessToken; } public String getRefreshToken() { return refreshToken; } public String getHomeRegionUrl() { //如果没配置住宅的域名请求地址则默认用用户的 if (TextUtils.isEmpty(homeRegionUrl)) { return getUserRegionUrl(); } return homeRegionUrl; } /** * 设置住宅请求的地址 * * @param homeRegionUrl */ public void setHomeRegionUrl(String homeRegionUrl) { this.homeRegionUrl = homeRegionUrl; HDLSDKSPUtils.put(HDLLINK_HOMEURL_KEY, homeRegionUrl); } // private IOnReloginListener getOnReloginListener() { // return mOnReloginListener; // } public void setOnReloginListener(IOnReloginListener onReloginListener) { mOnReloginListener = onReloginListener; } }