mac
2024-05-17 88fa5aa9631b263e6e3d99d9ee787f73e78c6fda
2024年05月17日14:54:51
1个文件已添加
10个文件已修改
484 ■■■■ 已修改文件
app/src/main/java/com/hdl/photovoltaic/other/HdlCommonLogic.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlPowerStationDataStatisticsLogic.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/StatisticsBean.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/home/HomePageFragment.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/BasicChartComposer.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/CustomStyleChartComposer.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/utils/SpanUtils.java 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/utils/TimeUtils.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_home_page.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlCommonLogic.java
@@ -21,6 +21,8 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Hashtable;
@@ -48,6 +50,37 @@
        }
        return sHdlCommonLogic;
    }
    public static String getConvertDoubleUnit(String value) {
        if (TextUtils.isEmpty(value)) {
            return HdlDeviceLogic.noValue ;
        }
        BigDecimal formattedValue = getBigDecimal(value);
        return formattedValue.toString() ;
    }
    public static String getConvertDoubleUnit(int value) {
        if (value == 0) {
            return HdlDeviceLogic.noValue ;
        }
        BigDecimal formattedValue = getBigDecimal(value + "");
        return formattedValue.toString() ;
    }
    public static String convertString(Object value) {
        return String.valueOf(value);
    }
    public static BigDecimal getBigDecimal(String value) {
        if (TextUtils.isEmpty(value)) {
            return new BigDecimal(0);
        }
        double doubleValue = Double.parseDouble(value);
        return BigDecimal.valueOf(doubleValue).setScale(2, RoundingMode.HALF_UP);
    }
@@ -131,7 +164,6 @@
        }
    }
}
app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
@@ -82,30 +82,7 @@
    private List<DeviceBean> mListDevice = new ArrayList<>();
    public static String getConvertDoubleUnit(String value) {
        if (TextUtils.isEmpty(value)) {
            return noValue + kWh;
        }
        BigDecimal formattedValue = getBigDecimal(value);
        return formattedValue + kWh;
    }
    public static String getConvertDoubleUnit(int value) {
        if (value == 0) {
            return noValue + kWh;
        }
        BigDecimal formattedValue = getBigDecimal(value + "");
        return formattedValue + kWh;
    }
    private static BigDecimal getBigDecimal(String value) {
        if (TextUtils.isEmpty(value)) {
            return new BigDecimal(0);
        }
        double doubleValue = Double.parseDouble(value);
        return BigDecimal.valueOf(doubleValue).setScale(2, RoundingMode.HALF_UP);
    }
    public void clearDeviceList() {
        if (mListDevice == null) {
app/src/main/java/com/hdl/photovoltaic/other/HdlPowerStationDataStatisticsLogic.java
@@ -6,14 +6,19 @@
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import com.hdl.linkpm.sdk.core.exception.HDLException;
import com.hdl.photovoltaic.config.UserConfigManage;
import com.hdl.photovoltaic.enums.TimeType;
import com.hdl.photovoltaic.internet.HttpClient;
import com.hdl.photovoltaic.internet.api.HttpApi;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.ui.bean.DataOverBean;
import com.hdl.photovoltaic.ui.bean.SocialContributionBean;
import com.hdl.photovoltaic.ui.bean.StatisticsBean;
import com.hdl.photovoltaic.utils.TimeUtils;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
/**
@@ -38,6 +43,7 @@
        }
        return sHdlPowerStationDataStatisticsLogic;
    }
    /**
     * 获取统计概览数据(公司维度)
@@ -87,9 +93,19 @@
    public void getStatistics(String type, String time, CloudCallBeak<List<StatisticsBean>> cloudCallBeak) {
        String requestUrl = HttpApi.POST_Home_page_statistics;
        JsonObject json = new JsonObject();
        json.addProperty("dataType", "GE");//发电量
        json.addProperty("dataType", "GE");//发电量(GE : 发电量 ;POWER : 发电功率)
        json.addProperty("type", type);//类型
        if (!TextUtils.isEmpty(time)) {
            if (!UserConfigManage.getInstance().isZh()) {
                //英文的时候需要日期格式
                if (TimeType.day.equals(type)) {
                    String[] ary = time.split("/");
                    time = ary[2] + "/" + ary[1] + "/" + ary[0];
                } else if (TimeType.month.equals(type)) {
                    String[] ary = time.split("/");
                    time = ary[1] + "/" + ary[0];
                }
            }
            json.addProperty("time", time);//时间
        }
        //json.addProperty("zoneType", "password");//区域
app/src/main/java/com/hdl/photovoltaic/ui/bean/StatisticsBean.java
@@ -10,7 +10,7 @@
public class StatisticsBean implements Serializable {
    private String fieldName;//    描述
    private int fieldValue;//值
    private String fieldValue;//值
    private String time;//    时间
    public String getFieldName() {
@@ -21,11 +21,11 @@
        this.fieldName = fieldName;
    }
    public int getFieldValue() {
        return fieldValue;
    public String getFieldValue() {
        return fieldValue == null ? "" : fieldValue;
    }
    public void setFieldValue(int fieldValue) {
    public void setFieldValue(String fieldValue) {
        this.fieldValue = fieldValue;
    }
app/src/main/java/com/hdl/photovoltaic/ui/home/HomePageFragment.java
@@ -26,6 +26,7 @@
import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch;
import com.hdl.photovoltaic.enums.TimeType;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.other.HdlCommonLogic;
import com.hdl.photovoltaic.other.HdlDeviceLogic;
import com.hdl.photovoltaic.other.HdlLogLogic;
import com.hdl.photovoltaic.other.HdlPowerStationDataStatisticsLogic;
@@ -63,8 +64,8 @@
    AAChartModel aaChartModel;
    private String[] fieldNames = {"00:00", "02:00", "05:00", "07:00", "09:00", "17:00", "22:00", "23:59"};//图标X轴坐标值的数组
    private Object[] fieldValues = {35, 70.5, 150.5, 135, 170, 205, 222, 245};//图标Y轴坐标值的数组
    private String[] fieldNames = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"};//图标X轴坐标值的数组
    private Object[] fieldValues = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//图标Y轴坐标值的数组
    private String timeType = TimeType.day;//时间类型(默认:天)
@@ -147,7 +148,7 @@
                viewBinding.v3.setVisibility(View.VISIBLE);
                viewBinding.homePageStationSelectTimeLl.setVisibility(View.VISIBLE);
                String dataStr = TimeUtils.getDateTimestamp(getCurrentTimestamp(), getTimeDateFormat());
                String dataStr = TimeUtils.getDateTimestamp(TimeUtils.getCurrentTimestamp(), TimeUtils.getTimeDateFormat(timeType));
                viewBinding.yearMonthDayTv.setText(dataStr);
                getStatistics();
@@ -178,7 +179,7 @@
                viewBinding.v2.setVisibility(View.GONE);
                viewBinding.v3.setVisibility(View.VISIBLE);
                viewBinding.homePageStationSelectTimeLl.setVisibility(View.VISIBLE);
                String dataStr = TimeUtils.getDateTimestamp(getCurrentTimestamp(), getTimeDateFormat());
                String dataStr = TimeUtils.getDateTimestamp(TimeUtils.getCurrentTimestamp(), TimeUtils.getTimeDateFormat(timeType));
                viewBinding.yearMonthDayTv.setText(dataStr);
                getStatistics();
@@ -210,7 +211,7 @@
                viewBinding.v2.setVisibility(View.GONE);
                viewBinding.v3.setVisibility(View.GONE);
                viewBinding.homePageStationSelectTimeLl.setVisibility(View.VISIBLE);
                String dataStr = TimeUtils.getDateTimestamp(getCurrentTimestamp(), getTimeDateFormat());
                String dataStr = TimeUtils.getDateTimestamp(TimeUtils.getCurrentTimestamp(), TimeUtils.getTimeDateFormat(timeType));
                viewBinding.yearMonthDayTv.setText(dataStr);
                getStatistics();
            }
@@ -252,11 +253,11 @@
                if (TextUtils.isEmpty(currDate)) {
                    return;
                }
                String timeDateFormat = getTimeDateFormat();
                String timeDateFormat = TimeUtils.getTimeDateFormat(timeType);
                Calendar calendar = TimeUtils.stringToCalendar(currDate, timeDateFormat);
                String time = TimeUtils.subtractDayMonthYearFromDate(calendar, 1, timeDateFormat, timeType);
                viewBinding.yearMonthDayTv.setText(time);
                getStatistics();
            }
        });
@@ -268,15 +269,16 @@
                if (TextUtils.isEmpty(currDate)) {
                    return;
                }
                String timeDateFormat = getTimeDateFormat();
                String timeDateFormat = TimeUtils.getTimeDateFormat(timeType);
                Calendar calendar = TimeUtils.stringToCalendar(currDate, timeDateFormat);
                String time = TimeUtils.addDayMonthYearToDate(calendar, 1, timeDateFormat, timeType);
                if (TimeUtils.stringDateToTimestamp(time, timeDateFormat) > getCurrentTimestamp()) {
                if (TimeUtils.stringDateToTimestamp(time, timeDateFormat) > TimeUtils.getCurrentTimestamp()) {
                    HdlThreadLogic.toast(_mActivity, getString(R.string.the_query_date_is_exceeded));
                    return;
                }
                viewBinding.yearMonthDayTv.setText(time);
                getStatistics();
            }
        });
        //设置下拉箭头颜色
@@ -298,9 +300,9 @@
    private void selectedTimePickerBuilder() {
        String currDate = viewBinding.yearMonthDayTv.getText().toString();
        //时间选择器
        Calendar selectedDate = TimeUtils.stringToCalendar(currDate, getTimeDateFormat());
        Calendar selectedDate = TimeUtils.stringToCalendar(currDate, TimeUtils.getTimeDateFormat(timeType));
        Calendar startDate = Calendar.getInstance();
        Calendar endDate = TimeUtils.timestampToCalendar(getCurrentTimestamp());
        Calendar endDate = TimeUtils.timestampToCalendar(TimeUtils.getCurrentTimestamp());
        //设置日期【开始】和【结束】
        startDate.set(2023, 1, 1);
        endDate.set(endDate.get(Calendar.YEAR), endDate.get(Calendar.MONTH), endDate.get(Calendar.DAY_OF_MONTH));
@@ -316,7 +318,7 @@
        TimePickerView pvTime = new TimePickerBuilder(_mActivity, new OnTimeSelectListener() {
            @Override
            public void onTimeSelect(Date date, View v) {//选中事件回调
                String timeDateFormat = getTimeDateFormat();
                String timeDateFormat = TimeUtils.getTimeDateFormat(timeType);
                String time = TimeUtils.dateToString(date, timeDateFormat);
                if (viewBinding.yearMonthDayTv.getText().toString().equals(time)) {
                    //表示同一个时间
@@ -356,11 +358,11 @@
        aaChartView = viewBinding.autoSizeMyAAChart;
        aaChartView.callBack = this;
        if (TimeType.day.equals(timeType)) {
            aaChartModel = BasicChartComposer.configureAreaChart("Pv发电功率", fieldNames, fieldValues);
            aaChartModel = BasicChartComposer.configureAreaChart(getString(R.string.pv_power), fieldNames, fieldValues);
        } else if (TimeType.month.equals(timeType)
                || TimeType.year.equals(timeType)
                || TimeType.all.equals(timeType)) {
            aaChartModel = configureColorfulColumnChart("Pv发电功率", fieldNames, fieldValues);
            aaChartModel = configureColorfulColumnChart(getString(R.string.pv_power), fieldNames, fieldValues);
        }
        aaChartView.aa_drawChartWithChartModel(aaChartModel);
@@ -374,7 +376,7 @@
        viewBinding.homeOfflineIl.stationTitleTv.setText(getString(R.string.my_power_station_off_line));
        viewBinding.homeConnectedIl.stationTitleTv.setText(getString(R.string.to_be_added));
        String dataStr = TimeUtils.getDateTimestamp(getCurrentTimestamp(), getTimeDateFormat());
        String dataStr = TimeUtils.getDateTimestamp(TimeUtils.getCurrentTimestamp(), TimeUtils.getTimeDateFormat(timeType));
        viewBinding.yearMonthDayTv.setText(dataStr);
        String installed_capacity = getString(R.string.installed_capacity) + "(" + HdlDeviceLogic.kWp + ")";
@@ -444,10 +446,10 @@
                if (statusOverviewBean == null) {
                    return;
                }
                viewBinding.homeAllIl.stationTotalTv.setText(statusOverviewBean.getTotal() + "");
                viewBinding.homeFaultsIl.stationTotalTv.setText(statusOverviewBean.getFault() + "");
                viewBinding.homeOfflineIl.stationTotalTv.setText(statusOverviewBean.getOffline() + "");
                viewBinding.homeConnectedIl.stationTotalTv.setText(statusOverviewBean.getConnecting() + "");
                viewBinding.homeAllIl.stationTotalTv.setText(HdlCommonLogic.convertString(statusOverviewBean.getTotal()));
                viewBinding.homeFaultsIl.stationTotalTv.setText(HdlCommonLogic.convertString(statusOverviewBean.getFault()));
                viewBinding.homeOfflineIl.stationTotalTv.setText(HdlCommonLogic.convertString(statusOverviewBean.getOffline()));
                viewBinding.homeConnectedIl.stationTotalTv.setText(HdlCommonLogic.convertString(statusOverviewBean.getConnecting()));
            }
            @Override
@@ -462,6 +464,7 @@
     * 获取统计概览数据(公司维度)
     */
    private void getDataOver() {
        HdlPowerStationDataStatisticsLogic.getInstance().getDataOver(new CloudCallBeak<DataOverBean>() {
            @Override
            public void onSuccess(DataOverBean dataOverBean) {
@@ -471,14 +474,14 @@
                        if (dataOverBean == null) {
                            return;
                        }
                        viewBinding.infoRl1Text1Tv.setText(HdlDeviceLogic.getConvertDoubleUnit(dataOverBean.getInstalledCapacity()));
                        viewBinding.infoRl1Text3Tv.setText(HdlDeviceLogic.getConvertDoubleUnit(dataOverBean.getPower()));
                        viewBinding.infoRl1Text1Tv.setText(HdlCommonLogic.getConvertDoubleUnit(dataOverBean.getInstalledCapacity()));
                        viewBinding.infoRl1Text3Tv.setText(HdlCommonLogic.getConvertDoubleUnit(dataOverBean.getPower()));
                        viewBinding.infoRl1FText1Tv.setText(dataOverBean.getPowerRatio());
                        viewBinding.homePageStationInfoRl2DayIc.dataTv.setText(HdlDeviceLogic.getConvertDoubleUnit(dataOverBean.getTodayElectricity()));
                        viewBinding.homePageStationInfoRl2MonIc.dataTv.setText(HdlDeviceLogic.getConvertDoubleUnit(dataOverBean.getMonthElectricity()));
                        viewBinding.homePageStationInfoRl2YearIc.dataTv.setText(HdlDeviceLogic.getConvertDoubleUnit(dataOverBean.getYearElectricity()));
                        viewBinding.homePageStationInfoRl2CumulativeIc.dataTv.setText(HdlDeviceLogic.getConvertDoubleUnit(dataOverBean.getTotalElectricity()));
                        viewBinding.homePageStationInfoRl2DayIc.dataTv.setText(HdlCommonLogic.getConvertDoubleUnit(dataOverBean.getTodayElectricity()));
                        viewBinding.homePageStationInfoRl2MonIc.dataTv.setText(HdlCommonLogic.getConvertDoubleUnit(dataOverBean.getMonthElectricity()));
                        viewBinding.homePageStationInfoRl2YearIc.dataTv.setText(HdlCommonLogic.getConvertDoubleUnit(dataOverBean.getYearElectricity()));
                        viewBinding.homePageStationInfoRl2CumulativeIc.dataTv.setText(HdlCommonLogic.getConvertDoubleUnit(dataOverBean.getTotalElectricity()));
                    }
                });
            }
@@ -495,9 +498,12 @@
     */
    private void getStatistics() {
        String currDate = viewBinding.yearMonthDayTv.getText().toString();
        HdlPowerStationDataStatisticsLogic.getInstance().getStatistics(currDate, timeType, new CloudCallBeak<List<StatisticsBean>>() {
        HdlPowerStationDataStatisticsLogic.getInstance().getStatistics(timeType, currDate, new CloudCallBeak<List<StatisticsBean>>() {
            @Override
            public void onSuccess(List<StatisticsBean> list) {
                HdlThreadLogic.runMainThread(new Runnable() {
                    @Override
                    public void run() {
                if (list == null || list.size() == 0) {
                    return;
                }
@@ -505,11 +511,14 @@
                Object[] values = new Object[list.size()];
                for (int i = 0; i < list.size(); i++) {
                    keys[i] = list.get(i).getFieldName();
                    values[i] = list.get(i).getFieldValue();
                            values[i] = HdlCommonLogic.getBigDecimal(list.get(i).getFieldValue()).intValue();//获取整数部分
                }
                fieldNames = keys;
                fieldValues = values;
                setUpAAChartView();
                    }
                });
            }
            @Override
@@ -529,9 +538,9 @@
                if (socialContributionBean == null) {
                    return;
                }
                viewBinding.socialContributionData1Tv.setText(socialContributionBean.getCoal());
                viewBinding.socialContributionData2Tv.setText(socialContributionBean.getCo2());
                viewBinding.socialContributionData3Tv.setText(socialContributionBean.getTreePlanting());
                viewBinding.socialContributionData1Tv.setText(HdlCommonLogic.convertString(HdlCommonLogic.getBigDecimal(socialContributionBean.getCoal())));
                viewBinding.socialContributionData2Tv.setText(HdlCommonLogic.convertString(HdlCommonLogic.getBigDecimal(socialContributionBean.getCo2())));
                viewBinding.socialContributionData3Tv.setText(HdlCommonLogic.convertString(HdlCommonLogic.getBigDecimal(socialContributionBean.getTreePlanting())));
            }
            @Override
@@ -539,51 +548,6 @@
            }
        });
    }
    /**
     * 获取当前系统日期时间戳
     *
     * @return 时间戳
     */
    private long getCurrentTimestamp() {
        return new Date().getTime();
    }
    /**
     * 获取日期格式 (2024/2/09,yyyy/DD/dd)
     *
     * @return 日期格式 (2024/2/09,yyyy/DD/dd)
     */
    private String getTimeDateFormat() {
        String timeDateFormat = TimeUtils.zhDateYearMonthDayFormat;
        switch (timeType) {
            case TimeType.day: {
                timeDateFormat = TimeUtils.zhDateYearMonthDayFormat;
                if (!UserConfigManage.getInstance().isZh()) {
                    timeDateFormat = TimeUtils.enDateYearMonthDayFormat;
                }
            }
            break;
            case TimeType.month: {
                timeDateFormat = TimeUtils.zhDateYearMonthFormat;
                if (!UserConfigManage.getInstance().isZh()) {
                    timeDateFormat = TimeUtils.enDateYearMonthFormat;
                }
            }
            break;
            case TimeType.year:
            case TimeType.all: {
                timeDateFormat = TimeUtils.zhDateYearFormat;
                if (!UserConfigManage.getInstance().isZh()) {
                    timeDateFormat = TimeUtils.enDateYearFormat;
                }
            }
            break;
        }
        return timeDateFormat;
    }
app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/BasicChartComposer.java
@@ -56,7 +56,7 @@
                .legendEnabled(false)
                .markerRadius(0)
//                .markerSymbol(AAChartSymbolType.Circle)
//                .markerSymbolStyle(AAChartSymbolStyleType.Normal)
                .markerSymbolStyle(AAChartSymbolStyleType.Normal)
                .chartType(AAChartType.Area)
                .categories(new String[]{"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"})
                .series(new AASeriesElement[]{element1});
@@ -95,7 +95,7 @@
//                .markerSymbolStyle(AAChartSymbolStyleType.Normal)
                .chartType(AAChartType.Area)
                .categories(categories)
//                .zoomType(AAChartZoomType.None)//手势缩放
                .zoomType(AAChartZoomType.None)//手势缩放
//                .yAxisMax(500)
                .yAxisMin(0)
                .series(new AASeriesElement[]{element1});
app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/CustomStyleChartComposer.java
@@ -195,12 +195,12 @@
                .colorsTheme(new String[]{"#38C494",})
                .categories(categories)
                .xAxisLabelsEnabled(true)
                .zoomType(AAChartZoomType.XY)
                .zoomType(AAChartZoomType.None)
                .legendEnabled(false)
                .series(new AASeriesElement[]{
                        new AASeriesElement()
//                                .color(linearGradientColor)
                                .name("东京")
                                .name(tipSuspendName)
                                .data(data)
//                                .colorByPoint(true)
                                .tooltip(new AATooltip().style(new AAStyle().backgroundColor("#FFFFFF").fontSize(25)))
app/src/main/java/com/hdl/photovoltaic/utils/SpanUtils.java
New file
@@ -0,0 +1,193 @@
package com.hdl.photovoltaic.utils;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.style.BackgroundColorSpan;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.MetricAffectingSpan;
import android.text.style.RelativeSizeSpan;
import android.view.View;
import androidx.annotation.NonNull;
/**
 * String字符串通过区间来改变颜色,大小,字体,下划线等
 */
public class SpanUtils {
    private long mLastClickTime = 0;
    public static final int TIME_INTERVAL = 1000;
    private static volatile SpanUtils sSpanUtils;
    /**
     * 获取当前对象
     *
     * @return HdlCommonLogic
     */
    public static synchronized SpanUtils getInstance() {
        if (sSpanUtils == null) {
            synchronized (SpanUtils.class) {
                if (sSpanUtils == null) {
                    sSpanUtils = new SpanUtils();
                }
            }
        }
        return sSpanUtils;
    }
    private SpanUtils() {
    }
    /**
     * 变大变小
     */
    public CharSequence toSizeSpan(CharSequence charSequence, int start, int end, float scale) {
        SpannableString spannableString = new SpannableString(charSequence);
        spannableString.setSpan(
                new RelativeSizeSpan(scale),
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        return spannableString;
    }
    /**
     * 变色
     */
    public CharSequence toColorSpan(CharSequence charSequence, int start, int end, int color) {
        SpannableString spannableString = new SpannableString(charSequence);
        spannableString.setSpan(
                new ForegroundColorSpan(color),
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        return spannableString;
    }
    /**
     * 变背景色
     */
    public CharSequence toBackgroundColorSpan(CharSequence charSequence, int start, int end, int color) {
        SpannableString spannableString = new SpannableString(charSequence);
        spannableString.setSpan(
                new BackgroundColorSpan(color),
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        return spannableString;
    }
    /**
     * 可点击-带下划线
     */
    public CharSequence toClickSpan(CharSequence charSequence, int start, int end, int color, boolean needUnderLine, OnSpanClickListener listener) {
        SpannableString spannableString = new SpannableString(charSequence);
        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
                if (listener != null) {
                    //防止重复点击
                    if (System.currentTimeMillis() - mLastClickTime >= TIME_INTERVAL) {
                        //to do
                        listener.onClick(charSequence.subSequence(start, end));
                        mLastClickTime = System.currentTimeMillis();
                    }
                }
            }
            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                ds.setColor(color);
                ds.setUnderlineText(needUnderLine);
            }
        };
        spannableString.setSpan(
                clickableSpan,
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        return spannableString;
    }
    public interface OnSpanClickListener {
        void onClick(CharSequence charSequence);
    }
    /**
     * 变成自定义的字体
     */
    public CharSequence toCustomTypeFaceSpan(CharSequence charSequence, int start, int end, Typeface typeface) {
        SpannableString spannableString = new SpannableString(charSequence);
        spannableString.setSpan(
                new MyTypefaceSpan(typeface),
                start,
                end,
                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        return spannableString;
    }
    /**
     * 系统原生的TypefaceSpan只能使用原生的默认字体
     * 如果使用自定义的字体,通过这个来实现
     */
    public class MyTypefaceSpan extends MetricAffectingSpan {
        private final Typeface typeface;
        public MyTypefaceSpan(final Typeface typeface) {
            this.typeface = typeface;
        }
        @Override
        public void updateDrawState(final TextPaint drawState) {
            apply(drawState);
        }
        @Override
        public void updateMeasureState(final TextPaint paint) {
            apply(paint);
        }
        private void apply(final Paint paint) {
            final Typeface oldTypeface = paint.getTypeface();
            final int oldStyle = oldTypeface != null ? oldTypeface.getStyle() : 0;
            int fakeStyle = oldStyle & ~typeface.getStyle();
            if ((fakeStyle & Typeface.BOLD) != 0) {
                paint.setFakeBoldText(true);
            }
            if ((fakeStyle & Typeface.ITALIC) != 0) {
                paint.setTextSkewX(-0.25f);
            }
            paint.setTypeface(typeface);
        }
    }
}
app/src/main/java/com/hdl/photovoltaic/utils/TimeUtils.java
@@ -24,8 +24,52 @@
    public static final String zhDateYearFormat = "yyyy";
    public static final String enDateYearMonthDayFormat = "dd/MM/yyyy";
    public static final String enDateYearMonthFormat = "/MM/yyyy";
    public static final String enDateYearMonthFormat = "MM/yyyy";
    public static final String enDateYearFormat = "yyyy";
    /**
     * 获取当前系统日期时间戳
     *
     * @return 时间戳
     */
    public static long getCurrentTimestamp() {
        return new Date().getTime();
    }
    /**
     * 获取日期格式 (2024/2/09,yyyy/DD/dd)
     *
     * @return 日期格式 (2024/2/09,yyyy/DD/dd)
     */
    public static String getTimeDateFormat(String timeType) {
        String timeDateFormat = TimeUtils.zhDateYearMonthDayFormat;
        switch (timeType) {
            case TimeType.day: {
                timeDateFormat = TimeUtils.zhDateYearMonthDayFormat;
                if (!UserConfigManage.getInstance().isZh()) {
                    timeDateFormat = TimeUtils.enDateYearMonthDayFormat;
                }
            }
            break;
            case TimeType.month: {
                timeDateFormat = TimeUtils.zhDateYearMonthFormat;
                if (!UserConfigManage.getInstance().isZh()) {
                    timeDateFormat = TimeUtils.enDateYearMonthFormat;
                }
            }
            break;
            case TimeType.year:
            case TimeType.all: {
                timeDateFormat = TimeUtils.zhDateYearFormat;
                if (!UserConfigManage.getInstance().isZh()) {
                    timeDateFormat = TimeUtils.enDateYearFormat;
                }
            }
            break;
        }
        return timeDateFormat;
    }
    /**
     * 获取分钟
@@ -35,7 +79,7 @@
     */
    public static String getMinuteTime(long timestamp) {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("mm", Locale.ENGLISH);
            SimpleDateFormat dateFormat = new SimpleDateFormat("mm", getLocale());
            Date date = new Date(timestamp);
            return dateFormat.format(date);
        } catch (Exception e) {
@@ -53,7 +97,7 @@
     */
    public static String getDateTimestamp(long timestamp, String date_format) {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat(date_format, Locale.ENGLISH);
            SimpleDateFormat dateFormat = new SimpleDateFormat(date_format, getLocale());
            Date date = new Date(timestamp);
            return dateFormat.format(date);
        } catch (Exception e) {
@@ -74,7 +118,7 @@
            if (UserConfigManage.getInstance().getCurrentAppLanguage().equals(LocalManageUtil.en)) {
                pattern = "dd-MM-yyyy HH:mm";
            }
            SimpleDateFormat dateFormat = new SimpleDateFormat(pattern, Locale.ENGLISH);
            SimpleDateFormat dateFormat = new SimpleDateFormat(pattern, getLocale());
            Date date = new Date(timestamp);
            return dateFormat.format(date);
        } catch (Exception e) {
@@ -184,7 +228,7 @@
     * @return Calendar对象
     */
    public static Calendar stringToCalendar(String dateString, String dateFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, getLocale());
        Calendar calendar = Calendar.getInstance();
        try {
            Date date = sdf.parse(dateString);
@@ -203,7 +247,7 @@
     * @return Calendar对象
     */
    public static String calendarToString(Calendar calendar, String dateFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, getLocale());
        return sdf.format(calendar.getTime());
    }
@@ -214,7 +258,7 @@
     * @return Calendar对象
     */
    public static String dateToString(Date date, String dateFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, getLocale());
        return sdf.format(date.getTime());
    }
@@ -227,7 +271,7 @@
     */
    public static long stringDateToTimestamp(String dateString, String dateFormat) {
        try {
            SimpleDateFormat slf = new SimpleDateFormat(dateFormat, Locale.getDefault());
            SimpleDateFormat slf = new SimpleDateFormat(dateFormat, getLocale());
            Date date = slf.parse(dateString);
            if (date == null) {
                return 0;
@@ -238,4 +282,8 @@
        return 0;
    }
    private static Locale getLocale() {
        return Locale.ENGLISH;
    }
}
app/src/main/res/layout/fragment_home_page.xml
@@ -103,11 +103,13 @@
                            <TextView
                                android:id="@+id/info_rl1_f_text1_tv"
                                android:layout_width="56dp"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_centerVertical="true"
                                android:layout_centerInParent="true"
                                android:layout_marginStart="@dimen/dp_6"
                                android:gravity="end|center_vertical"
                                android:text="88"
                                android:textColor="@color/text_E6000000"
                                android:textSize="@dimen/text_26"
                                android:textStyle="bold" />
@@ -528,8 +530,8 @@
                            android:layout_alignParentStart="true"
                            android:layout_alignParentTop="true"
                            android:layout_marginStart="@dimen/dp_10"
                            android:layout_marginTop="@dimen/dp_35"
                            android:text="s"
                            android:layout_marginTop="@dimen/dp_39"
                            android:text="@string/saving_standard_coal"
                            android:textColor="@color/text_66000000"
                            android:textSize="@dimen/text_12" />
@@ -584,8 +586,8 @@
                            android:layout_alignParentStart="true"
                            android:layout_alignParentTop="true"
                            android:layout_marginStart="@dimen/dp_10"
                            android:layout_marginTop="@dimen/dp_35"
                            android:text="s"
                            android:layout_marginTop="@dimen/dp_39"
                            android:text="@string/co_reduction_rate"
                            android:textColor="@color/text_66000000"
                            android:textSize="@dimen/text_12" />
@@ -639,8 +641,8 @@
                            android:layout_alignParentStart="true"
                            android:layout_alignParentTop="true"
                            android:layout_marginStart="@dimen/dp_10"
                            android:layout_marginTop="@dimen/dp_35"
                            android:text="s"
                            android:layout_marginTop="@dimen/dp_39"
                            android:text="@string/quantity_of_equivalent_values"
                            android:textColor="@color/text_66000000"
                            android:textSize="@dimen/text_12" />
app/src/main/res/values/strings.xml
@@ -293,4 +293,8 @@
    <string name="email_address">邮箱地址</string>
    <string name="successful_replication">复制成功</string>
    <string name="to_be_added">待接入</string>
    <string name="saving_standard_coal">节约标准煤</string>
    <string name="co_reduction_rate">CO2减排</string>
    <string name="quantity_of_equivalent_values">等效值数量</string>
    <string name="pv_power">Pv发电功率</string>
</resources>