hxb
2024-10-24 773b9953ad645b39a9efa8ab6d71dfc9d9e4e22e
HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/user/HDLLinkPMUser.java
New file
@@ -0,0 +1,547 @@
package com.hdl.linkpm.sdk.user;
import android.text.TextUtils;
import android.util.Log;
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<HDLUserInfoBean>() {
            }.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) {
        HDLSDKLog.i(TAG, "登录状态:"+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) {
        HDLSDKLog.i(TAG, "AccessToken:"+accessToken);
        this.accessToken = accessToken;
        HDLSDKSPUtils.put(HDLLINK_ACCESSTOKEN_KEY, this.accessToken);
    }
    private void saveRefreshToken(String refreshToken) {
        HDLSDKLog.i(TAG, "RefreshToken:"+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) {
            HDLSDKLog.i(TAG, "通知重新登录,登录类型:" + type);
            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<ImageSubmitInfo> 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<NewVersionBean> 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<NewVersionBean> callBack) {
        HDLPMUserController.getInstance().checkAppVersion(appCode, wgtVersion,"wgt", callBack);
    }
    /**
     * 获取mqtt
     */
    public void getMqttInfo(String attachClientId, String homeType, String deviceUuid, IResponseCallBack<MqttInfo>listener) {
        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;
    }
}