mac
2024-01-15 791f82dc46e14491116a87bd4aa84ade011ab4c6
2024年01月15日14:30:41

备份一下代码
3个文件已添加
18个文件已修改
459 ■■■■ 已修改文件
app/build.gradle 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/broadcast/NetworkChangeReceiver.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlCommonLogic.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/adapter/LanguageAdapter.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/message/MessageFragment.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/message/NascentMessageFragment.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/message/RecoverMessageFragment.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListFragment.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/utils/GlideUtils.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/widget/MovieDrawable.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/null_data_icon.gif 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_message_info.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_house_list.xml 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_nascent_message.xml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_recover_message.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/home_bottom_line.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/null_data_view.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-en/strings.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-zh/strings.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -28,7 +28,7 @@
        minSdk 23
        targetSdk 30
        versionCode 1
        versionName "1.1.3"//版本规则1.1是产品功能迭代用的,最后一位1是我们修复bug用的
        versionName "1.2.1"//版本规则1.2是产品功能迭代用的,最后一位1是我们修复bug用的
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
        manifestPlaceholders = mfph
@@ -136,7 +136,7 @@
    implementation 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1'
    //图片加载库
    implementation 'com.github.bumptech.glide:glide:4.12.0'
    implementation 'com.github.bumptech.glide:glide:4.13.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
app/src/main/java/com/hdl/photovoltaic/broadcast/NetworkChangeReceiver.java
@@ -21,7 +21,7 @@
    @Override
    public void onReceive(Context context, Intent intent) {
        //todo 已经在NetworkUtils里面实现
        //todo 已经转在NetworkUtils里面实现
//        ConnectivityManager connectionManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//        NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
//        if (networkInfo != null && networkInfo.isAvailable()) {
app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
@@ -10,7 +10,7 @@
    public static final String POST_Mqtt_GetRemoteInfo = "/home-wisdom/app/mqtt/getRemoteInfo";
    //region -----警报消息中心(住宅)---------
    //获取未处理消息数量
    public static final String POST_Message_UntreatedCount = "/home-wisdom/app/powerStation/message/untreatedCount";
    public static final String POST_Message_UntreatedCount = "/home-wisdom/app/powerStation/message/unCount";
    //消息列表
    public static final String POST_Message_List = "/home-wisdom/app/powerStation/message/listByPage";
    //获取消息详情
app/src/main/java/com/hdl/photovoltaic/other/HdlCommonLogic.java
@@ -1,14 +1,17 @@
package com.hdl.photovoltaic.other;
import android.content.Context;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.dcloud.zxing2.WriterException;
import com.google.gson.Gson;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.hdl.photovoltaic.utils.GlideUtils;
import java.util.Hashtable;
@@ -100,5 +103,23 @@
        }
    }
    /**
     * 没有数据界面的样式
     *
     * @param is_data   true有数据,false没数据
     * @param parent    父容器
     * @param imageView 显示gif控件
     * @param str       描述文本
     */
    public void nullDataUpdateUi(Context mContext, View parent, ImageView imageView, TextView textView, String str, boolean is_data) {
        if (is_data) {
            parent.setVisibility(View.GONE);
        } else {
            parent.setVisibility(View.VISIBLE);
            GlideUtils.getDrawableGifAnimation(mContext, imageView);
            textView.setText(str);
        }
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/adapter/LanguageAdapter.java
@@ -55,11 +55,15 @@
            if (position == this.mList.size() - 1) {
                holder.item_bottom_line_v.setVisibility(View.GONE);
            }
            holder.itemView.setTag(position);//标记位置
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (noOnclickListener != null) {
                        noOnclickListener.onClick(holder.getAdapterPosition(), itemData);
                    try {
                        if (noOnclickListener != null) {
                            noOnclickListener.onClick((int) holder.itemView.getTag(), itemData);
                        }
                    } catch (Exception ignored) {
                    }
                }
            });
app/src/main/java/com/hdl/photovoltaic/ui/message/MessageFragment.java
@@ -3,12 +3,16 @@
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.TextView;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hdl.linkpm.sdk.core.exception.HDLException;
import com.hdl.photovoltaic.R;
import com.hdl.photovoltaic.base.CustomBaseFragment;
import com.hdl.photovoltaic.config.ConstantManage;
@@ -16,6 +20,7 @@
import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch;
import com.hdl.photovoltaic.enums.MessageFunctionTabSwitch;
import com.hdl.photovoltaic.enums.MessageStateType;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.other.HdlCommonLogic;
import com.hdl.photovoltaic.other.HdlLogLogic;
import com.hdl.photovoltaic.other.HdlMessageLogic;
@@ -224,17 +229,8 @@
                EventBus.getDefault().removeStickyEvent(eventBus);
                postEventBus(MessageFunctionTabSwitch.nascent);
                HdlLogLogic.print("正在点击【消息】");
            }
        } else if (eventBus.getTopic().equals(ConstantManage.message_count)) {
            if (eventBus.getType().equals(MessageStateType.untreated)) {
                String s = getText(R.string.message_nascent) + "(" + HdlMessageLogic.getInstance().getNascentMessageMemoryList().size() + ")";
                viewBinding.messageTabNascentTitleTv.setText(s);
            } else if (eventBus.getType().equals(MessageStateType.processed)) {
                String s = getText(R.string.message_recover) + "(" + HdlMessageLogic.getInstance().getRecoverMessageMemoryList().size() + ")";
                viewBinding.messageTabRecoverTitleTv.setText(s);
            }
        }
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/message/NascentMessageFragment.java
@@ -4,12 +4,17 @@
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hdl.linkpm.sdk.core.exception.HDLException;
import com.hdl.photovoltaic.R;
import com.hdl.photovoltaic.base.CustomBaseFragment;
@@ -18,11 +23,14 @@
import com.hdl.photovoltaic.enums.MessageFunctionTabSwitch;
import com.hdl.photovoltaic.enums.MessageStateType;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.other.HdlCommonLogic;
import com.hdl.photovoltaic.other.HdlLogLogic;
import com.hdl.photovoltaic.other.HdlMessageLogic;
import com.hdl.photovoltaic.other.HdlThreadLogic;
import com.hdl.photovoltaic.ui.adapter.MessageAdapter;
import com.hdl.photovoltaic.ui.bean.HouseIdBean;
import com.hdl.photovoltaic.ui.bean.MessageBean;
import com.hdl.photovoltaic.utils.GlideUtils;
import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
import org.greenrobot.eventbus.EventBus;
@@ -124,15 +132,30 @@
            this.messageNascentAdapter.setList(mList);
            this.messageNascentAdapter.notifyDataSetChanged();
        }
        //刷新【发生中】信息数量总数
        this.refreshNascentCount();
        this.nullDataUpdateUi();
        if (mList.size() > 0) {
            BaseEventBus baseEventBus = new BaseEventBus();
            baseEventBus.setTopic(ConstantManage.message_count);
            baseEventBus.setType(MessageStateType.untreated);
            baseEventBus.setData(mList.size());
            EventBus.getDefault().post(baseEventBus);
        }
    }
    /**
     * 刷新【发生中】信息数量总数
     */
    private void refreshNascentCount() {
        HdlThreadLogic.runMainThread(new Runnable() {
            @Override
            public void run() {
                TextView textView = _mActivity.findViewById(R.id.message_tab_nascent_title_tv);
                if (textView != null) {
                    textView.setText(getText(R.string.message_nascent));
                    if (mList.size() > 0) {
                        String s = getText(R.string.message_nascent) + "(" + mList.size() + ")";
                        textView.setText(s);
                    }
                }
            }
        });
    }
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
@@ -146,8 +169,10 @@
            if (eventBus.getType().equals(MessageFunctionTabSwitch.nascent.toString())) {
                initData();
                getNascentMessageList(true);
                getUnreadCount();
                // 取消粘性事件
                EventBus.getDefault().removeStickyEvent(eventBus);
            }
        } else if (eventBus.getTopic().equals(ConstantManage.message_function_push_post)) {
@@ -155,6 +180,7 @@
                //消息详情回调
                initData();
                updateListData();
                getUnreadCount();
            }
        }
    }
@@ -162,7 +188,7 @@
    /**
     * 获取发生中的消息列表
     *
     * @param isShowLoading 是否启动 true启动
     * @param isShowLoading 是否启动加载框 true启动
     */
    private void getNascentMessageList(boolean isShowLoading) {
        if (mList.size() == 0) {
@@ -222,4 +248,64 @@
//        List<MessageBean> newData = HdlMessageLogic.getInstance().getAllMessageList();
//        return newData;
//    }
    /**
     * 读取消息【未读数量】
     */
    private void getUnreadCount() {
        HdlMessageLogic.getInstance().getMessageUntreatedCount(new CloudCallBeak<String>() {
            @Override
            public void onSuccess(String data) {
                HdlThreadLogic.runMainThread(new Runnable() {
                    @Override
                    public void run() {
                        JSONObject jsonObject = JSON.parseObject(data);
//                        if (jsonObject.containsKey("untreatedCount")) {
//                            //未处理数量
//                            jsonObject.getString("untreatedCount");
//                        }
                        String unreadCount = "0";
                        if (jsonObject.containsKey("unreadCount")) {
                            //未读数量
                            unreadCount = jsonObject.getString("unreadCount");
                        }
                        TextView textView = _mActivity.findViewById(R.id.my_message_bottom_il2).findViewById(R.id.red_count_tv);
                        if (textView != null) {
                            if (TextUtils.isEmpty(unreadCount) || unreadCount.equals("0")) {
                                textView.setVisibility(View.GONE);
                            } else {
                                if (unreadCount.length() > 2) {
                                    //大于3位数,默认99+
                                    unreadCount = "99+";
                                }
                                textView.setVisibility(View.VISIBLE);
                                textView.setText(unreadCount);
                            }
                        }
                    }
                });
            }
            @Override
            public void onFailure(HDLException e) {
                TextView textView = _mActivity.findViewById(R.id.my_message_bottom_il2).findViewById(R.id.red_count_tv);
                if (textView != null) {
                    textView.setVisibility(View.GONE);
                }
            }
        });
    }
    /**
     * 没有电站列表的样式
     */
    private void nullDataUpdateUi() {
        HdlCommonLogic.getInstance().nullDataUpdateUi(_mActivity,
                viewBinding.nullDataIc.getRoot(),
                viewBinding.nullDataIc.nullDataGifAnimationIv,
                viewBinding.nullDataIc.nullDataTv, getString(R.string.message_alarm_data_null), mList.size() > 0);
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/message/RecoverMessageFragment.java
@@ -2,6 +2,7 @@
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
@@ -15,6 +16,7 @@
import com.hdl.photovoltaic.enums.MessageFunctionTabSwitch;
import com.hdl.photovoltaic.enums.MessageStateType;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.other.HdlCommonLogic;
import com.hdl.photovoltaic.other.HdlLogLogic;
import com.hdl.photovoltaic.other.HdlMessageLogic;
import com.hdl.photovoltaic.other.HdlThreadLogic;
@@ -104,13 +106,29 @@
            this.messageRecoverAdapter.notifyDataSetChanged();
        }
        if (mList.size() > 0) {
            BaseEventBus baseEventBus = new BaseEventBus();
            baseEventBus.setTopic(ConstantManage.message_count);
            baseEventBus.setType(MessageStateType.processed);
            baseEventBus.setData(mList.size());
            EventBus.getDefault().post(baseEventBus);
        }
        //刷新【已恢复】信息数量总数
        this.refreshRecoverCount();
        this.nullDataUpdateUi();
    }
    /**
     * 刷新【已恢复】信息数量总数
     */
    private void refreshRecoverCount() {
        HdlThreadLogic.runMainThread(new Runnable() {
            @Override
            public void run() {
                TextView textView = _mActivity.findViewById(R.id.message_tab_recover_title_tv);
                if (textView != null) {
                    textView.setText(getText(R.string.message_recover));
                    if (mList.size() > 0) {
                        String s = getText(R.string.message_recover) + "(" + mList.size() + ")";
                        textView.setText(s);
                    }
                }
            }
        });
    }
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
@@ -182,4 +200,14 @@
            });
        }
    }
    /**
     * 没有电站列表的样式
     */
    private void nullDataUpdateUi() {
        HdlCommonLogic.getInstance().nullDataUpdateUi(_mActivity,
                viewBinding.nullDataIc.getRoot(),
                viewBinding.nullDataIc.nullDataGifAnimationIv,
                viewBinding.nullDataIc.nullDataTv, getString(R.string.message_alarm_data_null), mList.size() > 0);
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListFragment.java
@@ -1,16 +1,26 @@
package com.hdl.photovoltaic.ui.powerstation;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Movie;
import android.hardware.camera2.CameraManager;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.google.gson.Gson;
import com.hdl.linkpm.sdk.core.exception.HDLException;
import com.hdl.photovoltaic.R;
@@ -22,6 +32,7 @@
import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch;
import com.hdl.photovoltaic.enums.ShowErrorMode;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.other.HdlCommonLogic;
import com.hdl.photovoltaic.other.HdlLogLogic;
import com.hdl.photovoltaic.other.HdlResidenceLogic;
import com.hdl.photovoltaic.other.HdlThreadLogic;
@@ -29,7 +40,9 @@
import com.hdl.photovoltaic.ui.adapter.HouseInfoAdapter;
import com.hdl.photovoltaic.ui.bean.HouseIdBean;
import com.hdl.photovoltaic.uni.HDLUniMP;
import com.hdl.photovoltaic.utils.GlideUtils;
import com.hdl.photovoltaic.utils.PermissionUtils;
import com.hdl.photovoltaic.widget.MovieDrawable;
import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
import com.hdl.sdk.link.core.utils.mqtt.MqttRecvClient;
@@ -316,11 +329,10 @@
     * 没有电站列表的样式
     */
    private void nullDataUpdateUi(List<HouseIdBean> list) {
        if (list != null && list.size() > 0) {
            viewBinding.nullListTv.setVisibility(View.GONE);
        } else {
            viewBinding.nullListTv.setVisibility(View.VISIBLE);
        }
        HdlCommonLogic.getInstance().nullDataUpdateUi(_mActivity,
                viewBinding.nullDataIc.getRoot(),
                viewBinding.nullDataIc.nullDataGifAnimationIv,
                viewBinding.nullDataIc.nullDataTv, getString(R.string.my_power_station_data_null), list != null && list.size() > 0);
    }
app/src/main/java/com/hdl/photovoltaic/utils/GlideUtils.java
@@ -11,15 +11,22 @@
import android.graphics.RectF;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.load.resource.bitmap.GranularRoundedCorners;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target;
import com.hdl.photovoltaic.R;
import com.hdl.photovoltaic.other.HdlThreadLogic;
@@ -123,7 +130,7 @@
                    if (conn.getResponseCode() == 200) {
                        InputStream inStream = conn.getInputStream();
                        Bitmap bitmap = BitmapFactory.decodeStream(inStream);
                        imageView.setImageBitmap(getRoundedCornerBitmap(bitmap,pixels));
                        imageView.setImageBitmap(getRoundedCornerBitmap(bitmap, pixels));
                    }
                } catch (Exception e) {
                }
@@ -160,4 +167,39 @@
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return output;
    }
    /**
     * 界面线数据显示样式
     *
     * @param context   上下文
     * @param imageview 显示图片组件
     */
    public static void getDrawableGifAnimation(Context context, ImageView imageview) {
        if (context == null) {
            return;
        }
        if (imageview == null) {
            return;
        }
        Glide.with(context)
                .asGif()
                .load(R.drawable.null_data_icon)//(res或者gif的url链接)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .listener(new RequestListener<GifDrawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
                        return false;
                    }
                    @Override
                    public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
//                            resource.setLoopCount(1);控制播放次数
                        return false;
                    }
                })
                .into(imageview);
    }
}
app/src/main/java/com/hdl/photovoltaic/widget/MovieDrawable.java
New file
@@ -0,0 +1,75 @@
package com.hdl.photovoltaic.widget;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Movie;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import com.hdl.photovoltaic.R;
/**
 * 播放GIF动画
 */
public class MovieDrawable extends Drawable {
    private final Movie mMovie;
    private long mStartTime;
    public MovieDrawable(Movie movie) {
        mMovie = movie;
    }
    public void start() {
        mStartTime = SystemClock.uptimeMillis();
    }
    @Override
    public void draw(@NonNull Canvas canvas) {
        long time = SystemClock.uptimeMillis() - mStartTime;
        mMovie.setTime((int) (time % mMovie.duration()));
        mMovie.draw(canvas, getBounds().left, getBounds().top);
        invalidateSelf();
    }
    @Override
    public void setAlpha(int alpha) {
        // 设置透明度
    }
    @Override
    public void setColorFilter(ColorFilter colorFilter) {
        // 设置颜色滤镜
    }
    @Override
    public int getOpacity() {
        // 返回透明度
        return PixelFormat.TRANSLUCENT;
    }
    public void getDrawableGifAnimation(Context mContext, ImageView imageView) {
        try {
            if (mContext == null) {
                return;
            }
            if (imageView == null) {
                return;
            }
            @SuppressLint("ResourceType") Movie movie = Movie.decodeStream(mContext.getResources().openRawResource(R.drawable.null_data_icon));
            MovieDrawable drawable = new MovieDrawable(movie);
            imageView.setImageDrawable(drawable);
            drawable.start();
        } catch (Exception ignored) {
        }
    }
}
app/src/main/res/drawable/null_data_icon.gif
app/src/main/res/layout/activity_message_info.xml
@@ -50,7 +50,7 @@
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="18.5dp"
            android:layout_marginTop="@dimen/dp_32"
            android:orientation="vertical"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
@@ -62,7 +62,7 @@
            <View
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_14" />
                android:layout_height="@dimen/dp_31" />
            <include
                android:id="@+id/message_info_alarm_device_in"
@@ -70,7 +70,7 @@
            <View
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_14" />
                android:layout_height="@dimen/dp_31" />
            <include
                android:id="@+id/message_info_alarm_range_in"
@@ -78,7 +78,7 @@
            <View
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_14" />
                android:layout_height="@dimen/dp_31" />
            <include
                android:id="@+id/message_info_power_station_location_in"
@@ -86,7 +86,7 @@
            <View
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_14" />
                android:layout_height="@dimen/dp_31" />
            <include
                android:id="@+id/message_info_alarm_time_in"
@@ -94,7 +94,7 @@
            <View
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_14" />
                android:layout_height="@dimen/dp_31" />
        </LinearLayout>
app/src/main/res/layout/fragment_house_list.xml
@@ -130,19 +130,18 @@
            android:paddingBottom="@dimen/dp_16" />
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
    <TextView
        android:id="@+id/null_list_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="数据为空,赶快创建一个吧"
        android:textColor="@color/text_90000000"
        android:textSize="@dimen/text_14"
        android:visibility="gone"
    <!--没有数据显示样式-->
    <include
        android:id="@+id/null_data_ic"
        layout="@layout/null_data_view"
        android:layout_width="match_parent"
        android:layout_height="224dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
        app:layout_constraintTop_toTopOf="parent"
        android:visibility="gone"
        />
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/fragment_nascent_message.xml
@@ -8,8 +8,8 @@
    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/message_nascent_srl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        android:layout_height="match_parent">
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/message_nascent_recyclerview"
            android:layout_width="match_parent"
@@ -18,4 +18,16 @@
            android:paddingBottom="@dimen/dp_16" />
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
    <!--没有数据显示样式-->
    <include
        android:id="@+id/null_data_ic"
        layout="@layout/null_data_view"
        android:layout_width="match_parent"
        android:layout_height="224dp"
        android:layout_marginTop="183dp"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/fragment_recover_message.xml
@@ -17,6 +17,17 @@
            android:clipToPadding="false"
            android:paddingBottom="@dimen/dp_16" />
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
    <!--没有数据显示样式-->
    <include
        android:id="@+id/null_data_ic"
        layout="@layout/null_data_view"
        android:layout_width="match_parent"
        android:layout_height="224dp"
        android:layout_marginTop="183dp"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/home_bottom_line.xml
@@ -2,8 +2,7 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dp"
    android:layout_height="@dimen/dp_49"
    android:layout_weight="1"
    >
    android:layout_weight="1">
    <ImageView
        android:id="@+id/icon_iv"
@@ -22,15 +21,18 @@
        android:layout_marginTop="@dimen/dp_2"
        android:textColor="@color/text_90000000"
        android:textSize="@dimen/text_10" />
    <TextView
        android:id="@+id/red_tv"
        android:layout_width="@dimen/dp_8"
        android:layout_height="@dimen/dp_8"
        android:id="@+id/red_count_tv"
        android:layout_width="@dimen/dp_16"
        android:layout_height="@dimen/dp_16"
        android:layout_alignStart="@+id/icon_iv"
        android:layout_marginStart="@dimen/dp_16"
        android:layout_marginTop="4.5dp"
        android:background="@drawable/red_font"
        android:layout_alignEnd="@+id/icon_iv"
        android:layout_alignTop="@+id/icon_iv"
        android:visibility="gone"
         />
        android:textColor="@color/text_FFFFFFFF"
        android:textSize="11sp"
        android:visibility="gone" />
    <!--加大点击热区-->
    <TextView
        android:id="@+id/click_tv"
app/src/main/res/layout/null_data_view.xml
New file
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="224dp">
    <ImageView
        android:id="@+id/null_data_gif_animation_iv"
        android:layout_width="289.5dp"
        android:layout_height="189.5dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="MissingConstraints" />
    <TextView
        android:id="@+id/null_data_tv"
        android:layout_width="match_parent"
        android:layout_height="22.5dp"
        android:layout_marginTop="11.5dp"
        android:gravity="center"
        android:text="数据为空,赶快创建一个吧"
        android:textColor="@color/text_7C8590"
        android:textSize="@dimen/text_16"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/null_data_gif_animation_iv" />
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/values-en/strings.xml
@@ -82,6 +82,7 @@
    <string name="my_power_station_malfunction">Malfunction</string>
    <string name="my_power_station_operation">Operating</string>
    <string name="my_power_station_await">Standby</string>
    <string name="my_power_station_data_null">Data is empty, create one now!</string>
    <!--设备-->
    <string name="device_manual_connection">Manual connect</string>
@@ -102,6 +103,7 @@
    <string name="message_alarm_details_time">Alarm time</string>
    <string name="message_alarm_details_back">Back</string>
    <string name="message_alarm_details_resolved">Solved</string>
    <string name="message_alarm_data_null">No alarm</string>
    <!--我的-->
app/src/main/res/values-zh/strings.xml
@@ -82,6 +82,7 @@
    <string name="my_power_station_malfunction">故障</string>
    <string name="my_power_station_operation">运行</string>
    <string name="my_power_station_await">待机</string>
    <string name="my_power_station_data_null">数据为空,赶快创建一个吧!</string>
    <!--设备-->
    <string name="device_manual_connection">手动连接</string>
@@ -102,6 +103,7 @@
    <string name="message_alarm_details_time">报警时间</string>
    <string name="message_alarm_details_back">返回</string>
    <string name="message_alarm_details_resolved">已解决</string>
    <string name="message_alarm_data_null">暂无报警</string>
    <!--我的-->
app/src/main/res/values/strings.xml
@@ -82,6 +82,7 @@
    <string name="my_power_station_malfunction">故障</string>
    <string name="my_power_station_operation">运行</string>
    <string name="my_power_station_await">待机</string>
    <string name="my_power_station_data_null">数据为空,赶快创建一个吧!</string>
    <!--设备-->
    <string name="device_manual_connection">手动连接</string>
@@ -102,6 +103,7 @@
    <string name="message_alarm_details_time">报警时间</string>
    <string name="message_alarm_details_back">返回</string>
    <string name="message_alarm_details_resolved">已解决</string>
    <string name="message_alarm_data_null">暂无报警</string>
    <!--我的-->
@@ -206,4 +208,6 @@
    <string name="system_positioning_switch">需要打开系统定位开关,否则取法获取位置信息.</string>
</resources>