wjc
2023-06-08 f5f9d439cfc6b45acc486ec52ed7a0288e92d189
2023年06月08日20:34:33

备份一下代码
9个文件已添加
6个文件已修改
1 文件已重命名
999 ■■■■■ 已修改文件
.idea/misc.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/bean/LoginBean.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/bean/LoginUserRegionBean.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/bean/ResponsePack.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/config/ConfigManagement.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/config/UserManagement.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/internet/HttpClient.java 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/listener/BaseFailureCallBack.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/listener/BaseSuccessFailureCallBeak.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/listener/CloudCallBeak.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlAccountLogic.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/HomeLoginActivity.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/utils/HDLMD5Utils.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/misc.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ExternalStorageConfigurationManager" enabled="true" />
  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="11" project-jdk-type="JavaSDK" />
  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK" />
</project>
app/src/main/AndroidManifest.xml
@@ -7,9 +7,12 @@
        android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application
        android:name=".HDLApp"
app/src/main/java/com/hdl/photovoltaic/bean/LoginBean.java
New file
@@ -0,0 +1,177 @@
package com.hdl.photovoltaic.bean;
import androidx.annotation.NonNull;
import java.io.Serializable;
public class LoginBean implements Serializable {
    /// 用户有效身份Token
    private String accessToken;
    /// 用户有效身份Token过期时间
    private String expiration;
    /// 刷新Token
    private String refreshToken;
    /// 刷新Token过期时间
    private String refreshExpiration;
    /// 用户唯一ID
    private String userId;
    /// 登录帐号
    private String account;
    /// headerPrefix
    private String headerPrefix;
    private String tokenUuid;
    private String tokenType;
    private String expiresIn;
    private String refreshExpiresIn;
    private String userType;
    private String name;
    private String userPhone;
    /// 用户邮箱
    private String userEmail;
    ///企业单位id
    private String companyId;
    @NonNull
    public String getAccessToken() {
        return accessToken == null ? "" : accessToken;
    }
    public void setAccessToken(@NonNull String accessToken) {
        this.accessToken = accessToken;
    }
    @NonNull
    public String getExpiration() {
        return expiration == null ? "" : expiration;
    }
    public void setExpiration(@NonNull String expiration) {
        this.expiration = expiration;
    }
    @NonNull
    public String getRefreshToken() {
        return refreshToken == null ? "" : refreshToken;
    }
    public void setRefreshToken(@NonNull String refreshToken) {
        this.refreshToken = refreshToken;
    }
    @NonNull
    public String getRefreshExpiration() {
        return refreshExpiration == null ? "" : refreshExpiration;
    }
    public void setRefreshExpiration(@NonNull String refreshExpiration) {
        this.refreshExpiration = refreshExpiration;
    }
    @NonNull
    public String getUserId() {
        return userId == null ? "" : userId;
    }
    public void setUserId(@NonNull String userId) {
        this.userId = userId;
    }
    @NonNull
    public String getAccount() {
        return account == null ? "" : account;
    }
    public void setAccount(@NonNull String account) {
        this.account = account;
    }
    @NonNull
    public String getHeaderPrefix() {
        return headerPrefix == null ? "" : headerPrefix;
    }
    public void setHeaderPrefix(@NonNull String headerPrefix) {
        this.headerPrefix = headerPrefix;
    }
    @NonNull
    public String getTokenUuid() {
        return tokenUuid == null ? "" : tokenUuid;
    }
    public void setTokenUuid(@NonNull String tokenUuid) {
        this.tokenUuid = tokenUuid;
    }
    @NonNull
    public String getTokenType() {
        return tokenType == null ? "" : tokenType;
    }
    public void setTokenType(@NonNull String tokenType) {
        this.tokenType = tokenType;
    }
    @NonNull
    public String getExpiresIn() {
        return expiresIn == null ? "" : expiresIn;
    }
    public void setExpiresIn(@NonNull String expiresIn) {
        this.expiresIn = expiresIn;
    }
    @NonNull
    public String getRefreshExpiresIn() {
        return refreshExpiresIn == null ? "" : refreshExpiresIn;
    }
    public void setRefreshExpiresIn(@NonNull String refreshExpiresIn) {
        this.refreshExpiresIn = refreshExpiresIn;
    }
    @NonNull
    public String getUserType() {
        return userType == null ? "" : userType;
    }
    public void setUserType(@NonNull String userType) {
        this.userType = userType;
    }
    @NonNull
    public String getName() {
        return name == null ? "" : name;
    }
    public void setName(@NonNull String name) {
        this.name = name;
    }
    @NonNull
    public String getUserPhone() {
        return userPhone == null ? "" : userPhone;
    }
    public void setUserPhone(@NonNull String userPhone) {
        this.userPhone = userPhone;
    }
    @NonNull
    public String getUserEmail() {
        return userEmail == null ? "" : userEmail;
    }
    public void setUserEmail(@NonNull String userEmail) {
        this.userEmail = userEmail;
    }
    @NonNull
    public String getCompanyId() {
        return companyId == null ? "" : companyId;
    }
    public void setCompanyId(@NonNull String companyId) {
        this.companyId = companyId;
    }
}
app/src/main/java/com/hdl/photovoltaic/bean/LoginUserRegionBean.java
New file
@@ -0,0 +1,68 @@
package com.hdl.photovoltaic.bean;
import androidx.annotation.NonNull;
import java.io.Serializable;
public class LoginUserRegionBean implements Serializable {
    private String regionId;//区域Id
    private String regionName;//区域名称
    private String regionMark;
    private String regionMqttUrl;
    private String regionSlbUrl;
    private String regionUrl;//账号所在区域协议及地址
    @NonNull
    public String getRegionId() {
        return regionId == null ? "" : regionId;
    }
    public void setRegionId(@NonNull String regionId) {
        this.regionId = regionId;
    }
    @NonNull
    public String getRegionName() {
        return regionName == null ? "" : regionName;
    }
    public void setRegionName(@NonNull String regionName) {
        this.regionName = regionName;
    }
    @NonNull
    public String getRegionMark() {
        return regionMark == null ? "" : regionMark;
    }
    public void setRegionMark(@NonNull String regionMark) {
        this.regionMark = regionMark;
    }
    @NonNull
    public String getRegionMqttUrl() {
        return regionMqttUrl == null ? "" : regionMqttUrl;
    }
    public void setRegionMqttUrl(@NonNull String regionMqttUrl) {
        this.regionMqttUrl = regionMqttUrl;
    }
    @NonNull
    public String getRegionSlbUrl() {
        return regionSlbUrl == null ? "" : regionSlbUrl;
    }
    public void setRegionSlbUrl(@NonNull String regionSlbUrl) {
        this.regionSlbUrl = regionSlbUrl;
    }
    @NonNull
    public String getRegionUrl() {
        return regionUrl == null ? "" : regionUrl;
    }
    public void setRegionUrl(@NonNull String regionUrl) {
        this.regionUrl = regionUrl;
    }
}
app/src/main/java/com/hdl/photovoltaic/bean/ResponsePack.java
New file
@@ -0,0 +1,44 @@
package com.hdl.photovoltaic.bean;
import java.io.Serializable;
public class ResponsePack implements Serializable {
    /**
     * 状态码
     */
    private String code;
    /**
     * 云端状态码的消息
     */
    private String message;
    /**
     * 云端返回的数据
     */
    private Object data;
    public String getCode() {
        return code == null ? "" : code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getMessage() {
        return message.equals("") ? "" : message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
}
app/src/main/java/com/hdl/photovoltaic/config/ConfigManagement.java
New file
@@ -0,0 +1,75 @@
package com.hdl.photovoltaic.config;
import com.hdl.photovoltaic.BuildConfig;
public class ConfigManagement {
    /*********是否正式服务器*********/
    private static final boolean isOnlineServer = true;
    /*********正式环境*********/
    private static final String APP_KEY_ONLINE = "CSZEMDJL";
    private static final String APP_SECRET_ONLINE = "CSZEMDKBCSZEMDKR";
    private static final String APP_REGIONURL_ONLINE = "https://nearest.hdlcontrol.com";
    /*********测试环境*********/
    private static final String APP_KEY_TEST = "CTBGMNUV";
    private static final String APP_SECRET_TEST = "CTBGMNVLCTBGMNWB";
    private static final String APP_REGIONURL_TEST = "https://test-gz.hdlcontrol.com";
    /*********获取当前是否使用正式服务器环境*********/
    public static boolean isIsOnlineServer() {
        return isOnlineServer;
    }
    /// 用户注册所在服务器域名地址
    private static String sUserRegionUrl;
    public static String getUserRegionUrl() {
        return sUserRegionUrl == null ? "" : sUserRegionUrl;
    }
    public static void setUserRegionUrl(String userRegionUrl) {
        sUserRegionUrl = userRegionUrl;
    }
    /*********getAppKey*********/
    public static String getAppKey() {
        if (isOnlineServer) {
            return APP_KEY_ONLINE;
        } else {
            return APP_KEY_TEST;
        }
    }
    /*********getAppSecret*********/
    public static String getAppSecret() {
        if (isOnlineServer) {
            return APP_SECRET_ONLINE;
        } else {
            return APP_SECRET_TEST;
        }
    }
    /*********getAPP_RegionUrl*********/
    public static String getAPPRegionUrl() {
        if (isOnlineServer) {
            return APP_REGIONURL_ONLINE;
        } else {
            return APP_REGIONURL_TEST;
        }
    }
    /**
     * 当前是否为调试模式
     */
    public static boolean isDebug() {
        return BuildConfig.DEBUG;
    }
    /**
     * 获取当前应用的版本名
     */
    public static String getVersionName() {
        return BuildConfig.VERSION_NAME;
    }
}
app/src/main/java/com/hdl/photovoltaic/config/UserManagement.java
New file
@@ -0,0 +1,5 @@
package com.hdl.photovoltaic.config;
public class UserManagement {
}
app/src/main/java/com/hdl/photovoltaic/internet/HttpClient.java
@@ -1,4 +1,203 @@
package com.hdl.photovoltaic.internet;
import android.net.Uri;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import com.hdl.hdlhttp.utils.GsonConvert;
import com.hdl.photovoltaic.bean.ResponsePack;
import com.hdl.photovoltaic.config.ConfigManagement;
import com.hdl.photovoltaic.listener.BaseSuccessFailureCallBeak;
import com.hdl.photovoltaic.utils.HDLMD5Utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class HttpClient {
    private static volatile HttpClient sHttpClient;
    public static synchronized HttpClient getInstance() {
        if (sHttpClient == null) {
            synchronized (HttpClient.class) {
                if (sHttpClient == null) {
                    sHttpClient = new HttpClient();
                }
            }
        }
        return sHttpClient;
    }
    /**
     * 请求服务器的方法
     *
     * @param requestUrl     请求接口
     * @param json           请求数据
     * @param isBasicService 是否是基础服务的接口(基础服务的接口需要 appKey,timestamp,sign这三个参数,当为true时,内部会自动添加)
     * @param isExecute      是否是同步(true=同步,false=异步)
     */
    public void requestHttp(String requestUrl, String json, boolean isBasicService, boolean isExecute, BaseSuccessFailureCallBeak baseSuccessCallBeak) {
        String fullUrl = ConfigManagement.getUserRegionUrl() + requestUrl;
        this.requestHttps(fullUrl, json, isBasicService, isExecute, baseSuccessCallBeak);
    }
    /**
     * 请求服务器的方法(目前只用在获取获取账号区域信息)
     *
     * @param fullUrl        绝对地址(地址+接口)
     * @param json           请求数据
     * @param isBasicService 是否是基础服务的接口(基础服务的接口需要 appKey,timestamp,sign这三个参数,当为true时,内部会自动添加)
     * @param isExecute      是否是同步(true=同步,false=异步)
     */
    public void requestFullHttp(String fullUrl, String json, boolean isBasicService, boolean isExecute, BaseSuccessFailureCallBeak baseSuccessCallBeak) {
        this.requestHttps(fullUrl, json, isBasicService, isExecute, baseSuccessCallBeak);
    }
    /**
     * 请求服务器的方法
     *
     * @param fullUrl        绝对请求地址
     * @param json           请求数据
     * @param isBasicService 是否是基础服务的接口(基础服务的接口需要 appKey,timestamp,sign这三个参数,当为true时,内部会自动添加)
     * @param isExecute      是否是同步(true=同步,false=异步)
     */
    private void requestHttps(String fullUrl, String json, boolean isBasicService, boolean isExecute, BaseSuccessFailureCallBeak baseSuccessCallBeak) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient okHttpClient = new OkHttpClient();
                    RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), getJson(json));
                    final Request request = new Request.Builder()
                            .url(fullUrl)//请求的url//
                            .addHeader("Authorization", "accessToken")
                            .post(requestBody)
                            .build();
                    if (isExecute) {
                        Response response = okHttpClient.newCall(request).execute();//同步
                        if (response.isSuccessful()) {
                            String s = Objects.requireNonNull(response.body()).string();
                            ResponsePack responsePack = new Gson().fromJson(s, ResponsePack.class);
                            baseSuccessCallBeak.onSuccess(responsePack);
                        } else {
                            //throw new IOException("Unexpected code " + response);
                            baseSuccessCallBeak.onFailure(new Exception());
                        }
                    } else {
                        Call call = okHttpClient.newCall(request);
                        call.enqueue(new Callback() {//异步
                            @Override
                            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                                System.out.println("失败" + e.toString());
                            }
                            @Override
                            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                                System.out.println("url连接信息" + response.code());
                                if (response.code() == 200) {
                                    String s = Objects.requireNonNull(response.body()).string();
                                    ResponsePack responsePack = new Gson().fromJson(s, ResponsePack.class);
                                    baseSuccessCallBeak.onSuccess(responsePack);
                                } else {
                                    baseSuccessCallBeak.onFailure(new Exception());
                                }
                            }
                        });
                    }
                } catch (Exception e) {
                    baseSuccessCallBeak.onFailure(e);
                }
            }
        }).start();
    }
    /**
     * 添加sign字段
     */
    private String getJson(String json) {
        final String timestamp = String.valueOf(System.currentTimeMillis());
        final String appKey = ConfigManagement.getAppKey();
        final String appSecret = ConfigManagement.getAppSecret();
        JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
        if (jsonObject == null) {
            jsonObject = new JsonObject();
        }
        jsonObject.addProperty("appKey", appKey);
        jsonObject.addProperty("timestamp", timestamp);
        jsonObject.addProperty("sign", getSign(jsonObject, appSecret));
        return jsonObject.toString();
    }
    /**
     * 需要按字母排序
     *
     * @param json 所有字段使用urlParameter拼接,除了appSecret
     */
    private String getSign(JsonObject json, String appSecret) {
        String builder = jsonToUrlParameter(json) +
                appSecret;
        return HDLMD5Utils.encodeMD5(builder);
    }
    private String jsonToUrlParameter(JsonObject object) {
        final Map<String, String> map = GsonConvert.getGson().fromJson(object, new TypeToken<Map<String, String>>() {
        }.getType());
        final Uri.Builder builder = new Uri.Builder();
        List<String> list = new ArrayList<>(map.keySet());
        Collections.sort(list);
        for (String key : list) {
            //判断当前值是否需要参与签名,保持跟云端一致
            if (IfValueNeedSign(map.get(key))) {
                builder.appendQueryParameter(key, map.get(key));
//                HDLSDKLog.e("要签名:" + key + " :" + map.get(key));
            } else {
//                HDLSDKLog.e("不需要签名:" + key + " :" + map.get(key));
            }
        }
        return builder.build().getQuery();
    }
    /**
     * 判断当前值是否需要参与签名,保持跟云端一致
     * 空字符串不参与
     * 数组,集合,对象不参与
     *
     * @param valueStr -
     * @return -
     */
    private boolean IfValueNeedSign(String valueStr) {
        if (TextUtils.isEmpty(valueStr))
            return false;
        final char[] strChar = valueStr.substring(0, 1).toCharArray();
        final char firstChar = strChar[0];
        //System.out.println("getJSONType firstChar = "+firstChar);
        if (firstChar != '{' && firstChar != '[')
            return true;
        return false;
    }
}
app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
@@ -7,7 +7,7 @@
    //登录接口
    public static final String POST_Login = "/smart-footstone/user/oauth/login";
    //发送消息验证码
    public static final String POST_VERIFICATION_CODE_SEND= "/smart-footstone/verification/message/send";
    public static final String POST_VERIFICATION_CODE_SEND = "/smart-footstone/verification/message/send";
    //用户找回密码 忘记密码,通过邮箱和手机号找回
    public static final String POST_FORGET_PROGRAM_PWD = "/smart-footstone/user/oauth/forgetProgramPwd";
    //更改个人密码
@@ -15,7 +15,7 @@
    //获取员工列表
    public static final String POST_GET_USER_LIST = "/smart-footstone/user/userInfo/getUserList";
    //获取用户个人信息 C端
    public static final String POST_GET_MEMBER_INFO= "/smart-footstone/member/memberInfo/getMemberInfo";
    public static final String POST_GET_MEMBER_INFO = "/smart-footstone/member/memberInfo/getMemberInfo";
    //更新个人信息 C端
    public static final String POST_UPDATE_MEMBER_INFO = "/smart-footstone/member/memberInfo/updateMemberInfo";
    //上传图片
app/src/main/java/com/hdl/photovoltaic/listener/BaseFailureCallBack.java
New file
@@ -0,0 +1,8 @@
package com.hdl.photovoltaic.listener;
public interface BaseFailureCallBack {
    /**
     * 失败
     */
    void onFailure(Exception exception);
}
app/src/main/java/com/hdl/photovoltaic/listener/BaseSuccessFailureCallBeak.java
New file
@@ -0,0 +1,11 @@
package com.hdl.photovoltaic.listener;
import com.hdl.photovoltaic.bean.ResponsePack;
public interface BaseSuccessFailureCallBeak extends BaseFailureCallBack {
    /**
     * 成功回调
     */
    void onSuccess(ResponsePack responsePack);
}
app/src/main/java/com/hdl/photovoltaic/listener/CloudCallBeak.java
New file
@@ -0,0 +1,9 @@
package com.hdl.photovoltaic.listener;
public interface CloudCallBeak<T> extends BaseFailureCallBack {
    /**
     * 成功回调
     */
    void onSuccess(T obj);
}
app/src/main/java/com/hdl/photovoltaic/other/HdlAccountLogic.java
@@ -1,6 +1,20 @@
package com.hdl.photovoltaic.other;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.hdl.photovoltaic.bean.LoginBean;
import com.hdl.photovoltaic.bean.LoginUserRegionBean;
import com.hdl.photovoltaic.bean.ResponsePack;
import com.hdl.photovoltaic.config.ConfigManagement;
import com.hdl.photovoltaic.internet.HttpClient;
import com.hdl.photovoltaic.internet.api.HttpApi;
import com.hdl.photovoltaic.listener.BaseSuccessFailureCallBeak;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 登陆界面的逻辑
 */
@@ -22,55 +36,89 @@
    /**
     * 初始化账号的Url区域地址(可能状态码:Sucess  NotAccount  NotNetWork)
     * 初始化账号的Url区域地址(可能状态码:Success  NotAccount  NotNetWork)
     *
     * @param i_account
     * @return
     * @param i_account 账号
     */
    private void InitAccoutRegionInfo(String i_account) {
//        String regionUrl = this.GetAccoutRegionInfo(i_account);
//
//
//        if (regionUrl == null) {
//            return AccountStatu.NotNetWork;
//        }
//        if (regionUrl == string.Empty) {
//            return AccountStatu.NotAccount;
//        }
//
//        return AccountStatu.Sucess;
    public void regionByAccount(String i_account, CloudCallBeak<LoginUserRegionBean> cloudCallBeak) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("account", i_account);
        String full = ConfigManagement.getAPPRegionUrl() + HttpApi.POST_RegionByUserAccount;
        HttpClient.getInstance().requestFullHttp(full, jsonObject.toString(), true, true, new BaseSuccessFailureCallBeak() {
            @Override
            public void onSuccess(ResponsePack responsePack) {
                if (responsePack.getData() != null) {
                    Gson gson = new Gson();
                    String json = gson.toJson(responsePack.getData());
                    LoginUserRegionBean loginUserRegionBean = new Gson().fromJson(json, LoginUserRegionBean.class);
                    if (cloudCallBeak != null) {
                        cloudCallBeak.onSuccess(loginUserRegionBean);
                    } else {
                        cloudCallBeak.onFailure(new Exception());
                    }
                }
            }
            @Override
            public void onFailure(Exception exception) {
                if (cloudCallBeak != null) {
                    cloudCallBeak.onFailure(exception);
                }
            }
        });
    }
    /**
     * 获取账号所在区域
     * 登录
     * 通过账号和密码
     *
     * @param account
     * @param callBack
     * @return https://nearest.hdlcontrol.com/smart-footstone/region/regionByUserAccount
     * @param account       手机或者邮箱
     * @param loginPwd      密码
     * @param cloudCallBeak -
     */
//    public Disposable regionByAccount(String account, IRegionByAccountCallBack callBack) {
//        String requestUrl = HDLLinkPMSdk.getInitUrl() + HttpApi.POST_RegionByUserAccount;
//        return HxHttp.builder()
//                .url(requestUrl)
//                .params("account", account)
//                .build()
//                .post()
//                .subscribeWith(new HDLResponse<HDLUserRegionBean>() {
//                    @Override
//                    public void onResponse(HDLUserRegionBean response) {
//                        if (callBack != null) {
//                            callBack.onSuccess(response);
//                        }
//                    }
//
//                    @Override
//                    public void onFailure(HDLException e) {
//                        HDLExceptionSubmitUtils.submit(requestUrl, account, e);
//                        if (callBack != null) {
//                            callBack.onFailure(e);
//                        }
//                    }
//                });
    public void loginByPassword(String account, String loginPwd, CloudCallBeak<LoginBean> cloudCallBeak) {
        String requestUrl = HttpApi.POST_Login;
        JsonObject json = new JsonObject();
        json.addProperty("account", account);
        json.addProperty("loginPwd", loginPwd);
//        json.addProperty("platform", "APP");
        json.addProperty("grantType", "password");
//    }
        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), true, true, new BaseSuccessFailureCallBeak() {
            @Override
            public void onSuccess(ResponsePack responsePack) {
                if (responsePack.getData() != null) {
                    Gson gson = new Gson();
                    String json = gson.toJson(responsePack.getData());
                    LoginBean loginBean = new Gson().fromJson(json, LoginBean.class);
                    if (cloudCallBeak != null) {
                        cloudCallBeak.onSuccess(loginBean);
                    } else {
                        cloudCallBeak.onFailure(new Exception());
                    }
                }
            }
            @Override
            public void onFailure(Exception exception) {
                if (cloudCallBeak != null) {
                    cloudCallBeak.onFailure(exception);
                }
            }
        });
    }
    public boolean isPhone(String phone) {
        Pattern p = Pattern.compile("^((13[0-9])|(14[0|5|6|7|9])|(15[0-3])|(15[5-9])|(16[6|7])|(17[2|3|5|6|7|8])|(18[0-9])|(19[1|8|9]))\\d{8}$");
        Matcher m = p.matcher(phone);
        return m.matches();
    }
    public boolean isMailbox(String mailbox) {
        String regex = "^(\\w+([-.][A-Za-z0-9]+)*){3,18}@\\w+([-.][A-Za-z0-9]+)*\\.\\w+([-.][A-Za-z0-9]+)*$";
        return mailbox.matches(regex);
    }
}
app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java
File was renamed from app/src/main/java/com/hdl/photovoltaic/utils/FileUtils.java
@@ -1,42 +1,53 @@
package com.hdl.photovoltaic.utils;
package com.hdl.photovoltaic.other;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import com.hdl.photovoltaic.other.HdlLogLogic;
import com.hdl.photovoltaic.HDLApp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
public class HdlFileLogic {
public class FileUtils {
    private static volatile HdlFileLogic sHdlFileLogic;
    public static synchronized HdlFileLogic getInstance() {
        if (sHdlFileLogic == null) {
            synchronized (HdlFileLogic.class) {
                if (sHdlFileLogic == null) {
                    sHdlFileLogic = new HdlFileLogic();
                }
            }
        }
        return sHdlFileLogic;
    }
    private static final String TAG = "FileUtils";
    public static final String userId = "";
    /**
     * 获取内部存储文件路径
     *
     * @param context 上下文
     * @return -
     */
    public static String getInternalStoreFilesPath(Context context) {
        if (context == null) {
            return "";
        }
        return context.getFilesDir().getAbsolutePath();
    private String getInternalStoreFilesPath() {
        return HDLApp.getInstance().getFilesDir().getAbsolutePath();
    }
    public static File createFile(String dirPath, String fileName) {
    /**
     * 获取App存放文件的根路径
     */
    public String getAppFilesPath() {
        return HDLApp.getInstance().getFilesDir().getAbsolutePath() + userId + "/home";
    }
    public File createFile(String dirPath, String fileName) {
        try {
            File dirFile = new File(dirPath);
            if (!dirFile.exists()) {
@@ -71,7 +82,7 @@
    /**
     * 创建文件夹---之所以要一层层创建,是因为一次性创建多层文件夹可能会失败!
     */
    public static boolean createFileDir(File dirFile) {
    public boolean createFileDir(File dirFile) {
        if (dirFile == null) {
            return true;
        }
@@ -92,7 +103,7 @@
        }
    }
    public static void writeFile(String path, String data) {
    public void writeFile(String path, String data) {
        try {
            File file = new File(path);
            if (!file.exists()) {
@@ -111,7 +122,7 @@
    }
    public static String readFile(String filepath) {
    public String readFile(String filepath) {
        try {
            String fileContent = "";
            if (null == filepath) {
@@ -140,7 +151,7 @@
    /**
     * 把位图数据保存到指定路径的图片文件
     */
    public static void writeImage(String path, Bitmap bitmap) {
    public void writeImage(String path, Bitmap bitmap) {
        try {
            //根据指定文件路径构建缓存输出流对象
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path));
@@ -159,7 +170,7 @@
    /**
     * 从指定路径的图片文件中读取位图数据
     */
    public static Bitmap readImage(String path) {
    public Bitmap readImage(String path) {
        try {
            //根据指定文件路径构建缓存输入流对象
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
@@ -174,8 +185,4 @@
        }
        return null;
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/HomeLoginActivity.java
@@ -2,7 +2,6 @@
import android.os.Bundle;
import android.os.SystemClock;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
@@ -13,8 +12,6 @@
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.TextView;
@@ -22,9 +19,11 @@
import com.hdl.photovoltaic.R;
import com.hdl.photovoltaic.base.CustomBaseActivity;
import com.hdl.photovoltaic.bean.LoginUserRegionBean;
import com.hdl.photovoltaic.config.ConfigManagement;
import com.hdl.photovoltaic.databinding.ActivityHomeLoginBinding;
import com.hdl.photovoltaic.ui.MyPowerStationActivity;
import com.hdl.photovoltaic.utils.FileUtils;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.other.HdlAccountLogic;
public class HomeLoginActivity extends CustomBaseActivity {
@@ -160,7 +159,18 @@
        viewBinding.homeLoginExperienceTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(MyPowerStationActivity.class);
//                startActivity(MyPowerStationActivity.class);
                HdlAccountLogic.getInstance().regionByAccount("18402017839", new CloudCallBeak<LoginUserRegionBean>() {
                    @Override
                    public void onSuccess(LoginUserRegionBean obj) {
                        ConfigManagement.setUserRegionUrl(obj.getRegionUrl());
                    }
                    @Override
                    public void onFailure(Exception exception) {
                    }
                });
            }
        });
app/src/main/java/com/hdl/photovoltaic/utils/HDLMD5Utils.java
New file
@@ -0,0 +1,177 @@
package com.hdl.photovoltaic.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class HDLMD5Utils {
    /**
     * MD5转字符串
     */
    public static String encodeMD5(String s) {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(s.getBytes(StandardCharsets.UTF_8));
            byte[] messageDigest = digest.digest();
            return toHexString(messageDigest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
    private static String toHexString(byte[] keyData) {
        if (keyData == null) {
            return null;
        }
        int expectedStringLen = keyData.length * 2;
        StringBuilder sb = new StringBuilder(expectedStringLen);
        for (byte keyDatum : keyData) {
            String hexStr = Integer.toString(keyDatum & 0x00FF, 16);
            if (hexStr.length() == 1) {
                hexStr = "0" + hexStr;
            }
            sb.append(hexStr);
        }
        return sb.toString();
    }
    /**
     * MD5转字符串
     * 额外值
     */
    public static String encodeMD52(String s) {
        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            byte[] btInput = s.getBytes(StandardCharsets.UTF_8);
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.update(btInput);
            byte[] md = digest.digest();
            int j = md.length;
            char[] str = new char[j * 2];
            int k = 0;
            for (byte byte0 : md) {
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * MD5文件转字符串
     */
    public static String encodeMD5(File f) {
        if (!f.isFile()) {
            return null;
        }
        MessageDigest digest;
        byte[] buffer = new byte[1024];
        int len;
        try {
            digest = MessageDigest.getInstance("MD5");
            FileInputStream in = new FileInputStream(f);
            while ((len = in.read(buffer, 0, 1024)) != -1) {
                digest.update(buffer, 0, len);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        BigInteger bigInt = new BigInteger(1, digest.digest());
        return bigInt.toString(16);
    }
    /**
     * MD5文件转字符串
     */
    public static String encodeMD5(byte[] f) {
        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("MD5");
            digest.update(f);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        BigInteger bigInt = new BigInteger(1, digest.digest());
        return bigInt.toString(16);
    }
    public final static String md5(String plainText) {
// 返回字符串
        String md5Str = null;
        try {
// 操作字符串
            StringBuffer buf = new StringBuffer();
            MessageDigest md =
                    MessageDigest.getInstance("MD5");
// 添加要进行计算摘要的信息,使用 plainText 的 byte
            md.update(plainText.getBytes());
// 计算出摘要,完成哈希计算。
            byte b[] = md.digest();
            int i;
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
// 将整型 十进制 i
                buf.append(Integer.toHexString(i));
            }
// 32位的加密
            md5Str = buf.toString();
// 16位的加密
// md5Str =  buf.toString().md5Strstring(8,24);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return md5Str;
    }
}