04fa70b5c61f927e4b5e3c85e9fe9e116d79102e..c3542b10ea66a1c3fad44fe8e0efd357d7d3857e
6 天以前 wjc
2025年11月19日19:32:39
c3542b 对比 | 目录
6 天以前 wjc
2025年11月19日15:09:29 完成B端消息功能
c6d45e 对比 | 目录
6 天以前 wjc
2025-11-19 14:31:50
923e59 对比 | 目录
5个文件已添加
14个文件已修改
1314 ■■■■■ 已修改文件
app/src/main/AndroidManifest.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlMessageLogic.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/MessageNoticeBean.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/me/NotificationSettingsActivity.java 319 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/me/SetActivity.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/message/MessageActivity.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/message/MessageHouseFragment.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/message/SearchMessageHouseActivity.java 435 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/close.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/open.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_house_search.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_notification_settings.xml 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_search_message_house.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_set.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragement_message_house.xml 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-en/strings.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-zh/strings.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -69,10 +69,13 @@
        android:supportsRtl="true"
        android:theme="@style/Theme.PhotovoltaicDebug">
        <activity
            android:name=".ui.message.MessageActivity"
            android:name=".ui.me.NotificationSettingsActivity"
            android:exported="false" />
        <activity
            android:name=".ui.message.PowerStationMessageSearchActivity"
            android:name=".ui.message.SearchMessageHouseActivity"
            android:exported="false" />
        <activity
            android:name=".ui.message.MessageActivity"
            android:exported="false" />
        <activity
            android:name=".ui.me.HelpWebActivity"
app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
@@ -32,6 +32,10 @@
    public static final String POST_Message_AllRead = "/home-wisdom/app/powerStation/message/allRead";
    //消息全部已读(匹配维修方案)
    public static final String POST_Message_Plan_AllRead = "/home-wisdom/app/powerStation/message/plan/allRead";
    //消息通知设置详情
    public static final String POST_notice_setInfo = "/home-wisdom/app/powerStation/message/notice/setInfo";
    //消息通知设置
    public static final String POST_notice_set = "/home-wisdom/app/powerStation/message/notice/set";
    //endregion
app/src/main/java/com/hdl/photovoltaic/other/HdlMessageLogic.java
@@ -11,6 +11,7 @@
import com.hdl.photovoltaic.internet.api.HttpApi;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.ui.bean.MessageBean;
import com.hdl.photovoltaic.ui.bean.MessageNoticeBean;
import com.hdl.photovoltaic.ui.bean.UnCountBean;
import java.util.ArrayList;
@@ -753,6 +754,67 @@
    }
    /**
     * 消息通知设置详情获取
     *
     * @param cloudCallBeak -
     */
    public void getMessageNoticeInfo(CloudCallBeak<MessageNoticeBean> cloudCallBeak) {
        String requestUrl = HttpApi.POST_notice_setInfo;
        JsonObject JsonObject = new JsonObject();
        HttpClient.getInstance().requestHttp(requestUrl, JsonObject.toString(), new CloudCallBeak<String>() {
            @Override
            public void onSuccess(String jsonStr) {
                try {
                    Gson gson = new Gson();
                    MessageNoticeBean messageNoticeBean = gson.fromJson(jsonStr, MessageNoticeBean.class);
                    if (cloudCallBeak != null) {
                        cloudCallBeak.onSuccess(messageNoticeBean);
                    }
                } catch (Exception e) {
                    if (cloudCallBeak != null) {
                        cloudCallBeak.onSuccess(new MessageNoticeBean());
                    }
                }
            }
            @Override
            public void onFailure(HDLException e) {
                if (cloudCallBeak != null) {
                    cloudCallBeak.onFailure(e);
                }
            }
        });
    }
    /**
     * 消息通知设置
     *
     * @param cloudCallBeak -
     */
    public void setMessageNoticeInfo(String type, boolean isTypeBoolean, CloudCallBeak<Boolean> cloudCallBeak) {
        String requestUrl = HttpApi.POST_notice_set;
        JsonObject JsonObject = new JsonObject();
        JsonObject.addProperty(type, isTypeBoolean);
        HttpClient.getInstance().requestHttp(requestUrl, JsonObject.toString(), new CloudCallBeak<String>() {
            @Override
            public void onSuccess(String jsonStr) {
                if (cloudCallBeak != null) {
                    cloudCallBeak.onSuccess(true);
                }
            }
            @Override
            public void onFailure(HDLException e) {
                if (cloudCallBeak != null) {
                    cloudCallBeak.onFailure(e);
                }
            }
        });
    }
    public static class MessageListClass {
app/src/main/java/com/hdl/photovoltaic/ui/bean/MessageNoticeBean.java
New file
@@ -0,0 +1,45 @@
package com.hdl.photovoltaic.ui.bean;
public class MessageNoticeBean {
    private boolean aiPush = false;
    private boolean eventPush = false;
    private boolean faultPush = false;
    private boolean warnPush = false;
    public boolean isWarnPush() {
        return warnPush;
    }
    public void setWarnPush(boolean warnPush) {
        this.warnPush = warnPush;
    }
    public boolean isFaultPush() {
        return faultPush;
    }
    public void setFaultPush(boolean faultPush) {
        this.faultPush = faultPush;
    }
    public boolean isEventPush() {
        return eventPush;
    }
    public void setEventPush(boolean eventPush) {
        this.eventPush = eventPush;
    }
    public boolean isAiPush() {
        return aiPush;
    }
    public void setAiPush(boolean aiPush) {
        this.aiPush = aiPush;
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/me/NotificationSettingsActivity.java
New file
@@ -0,0 +1,319 @@
package com.hdl.photovoltaic.ui.me;
import android.app.AlertDialog;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.content.res.AppCompatResources;
import com.hdl.linkpm.sdk.core.exception.HDLException;
import com.hdl.photovoltaic.R;
import com.hdl.photovoltaic.base.CustomBaseActivity;
import com.hdl.photovoltaic.config.UserConfigManage;
import com.hdl.photovoltaic.databinding.ActivityNotificationSettingsBinding;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.other.HdlMessageLogic;
import com.hdl.photovoltaic.other.HdlThreadLogic;
import com.hdl.photovoltaic.ui.bean.MessageNoticeBean;
public class NotificationSettingsActivity extends CustomBaseActivity {
    private static final int REQUEST_CODE_NOTIFICATION_SETTINGS = 1001;
    private ActivityNotificationSettingsBinding viewBinding;
    @Override
    public Object getContentView() {
        viewBinding = ActivityNotificationSettingsBinding.inflate(getLayoutInflater());
        return viewBinding.getRoot();
    }
    @Override
    public void onBindView(Bundle savedInstanceState) {
        setStatusBarTranslucent();
        getWindow().setNavigationBarColor(getColor(R.color.text_FF000000));
        //初始化
        initView();
        //初始化界面监听器
        initEvent();
        initData();
    }
    private void initData() {
        HdlMessageLogic.getInstance().getMessageNoticeInfo(new CloudCallBeak<MessageNoticeBean>() {
            @Override
            public void onSuccess(MessageNoticeBean messageNoticeBean) {
                HdlThreadLogic.runMainThread(new Runnable() {
                    @Override
                    public void run() {
                        intiBtnState(messageNoticeBean);
                    }
                });
            }
            @Override
            public void onFailure(HDLException e) {
                HdlThreadLogic.toast(_mActivity, e);
            }
        });
    }
    /**
     * @param type          (aiPush,eventPush,warnPush,faultPush)
     * @param isTypeBoolean true或者false
     */
    private void setMessageNoticeInfo(String type, boolean isTypeBoolean) {
        HdlMessageLogic.getInstance().setMessageNoticeInfo(type, isTypeBoolean, new CloudCallBeak<Boolean>() {
            @Override
            public void onSuccess(Boolean obj) {
            }
            @Override
            public void onFailure(HDLException e) {
                HdlThreadLogic.toast(_mActivity, e);
            }
        });
    }
    private void initEvent() {
        viewBinding.toolbarTopRl.topBackLl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        viewBinding.notificationLl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openNotificationSettings();
            }
        });
        viewBinding.aiIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setSelected(!v.isSelected());
                setBtnClick(viewBinding.aiIv, v.isSelected());
                setMessageNoticeInfo("aiPush", v.isSelected());
            }
        });
        viewBinding.tipIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setSelected(!v.isSelected());
                setBtnClick(viewBinding.tipIv, v.isSelected());
                setMessageNoticeInfo("eventPush", v.isSelected());
            }
        });
        viewBinding.warningIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setSelected(!v.isSelected());
                setBtnClick(viewBinding.warningIv, v.isSelected());
                setMessageNoticeInfo("warnPush", v.isSelected());
            }
        });
        viewBinding.malfunctionIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setSelected(!v.isSelected());
                setBtnClick(viewBinding.malfunctionIv, v.isSelected());
                setMessageNoticeInfo("faultPush", v.isSelected());
            }
        });
    }
    private void initView() {
        viewBinding.toolbarTopRl.topTitleTv.setText(R.string.notification_settings);
        viewBinding.toolbarTopRl.topBackLl.setVisibility(View.VISIBLE);
        if (UserConfigManage.getInstance().isBAccount()) {
            viewBinding.aiLl.setVisibility(View.GONE);
            viewBinding.lineV1.setVisibility(View.GONE);
        } else {
            viewBinding.aiLl.setVisibility(View.VISIBLE);
            viewBinding.lineV1.setVisibility(View.VISIBLE);
        }
        checkAndRequestNotificationPermission();
    }
    /**
     * 检查并请求通知权限
     */
    private void checkAndRequestNotificationPermission() {
        if (!areNotificationsEnabled(_mActivity)) {
            setBtnEnabled(false);
        } else {
            setBtnEnabled(true);
        }
    }
    /**
     * 显示通知权限引导对话框
     */
    private void showNotificationPermissionDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("开启通知权限")
                .setMessage("为了及时接收重要消息,请开启通知权限")
                .setPositiveButton("立即开启", (dialog, which) -> {
                    openNotificationSettings();
                })
                .setNegativeButton("暂不开启", (dialog, which) -> {
                    dialog.dismiss();
                })
                .setCancelable(false)
                .show();
    }
    /**
     * 跳转到通知设置页面
     */
    private void openNotificationSettings() {
        Intent intent = new Intent();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // Android 8.0+ 直接跳转到应用的通知设置
            intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
            intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            // Android 5.0-7.1 跳转到应用详情页面
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.fromParts("package", getPackageName(), null));
        } else {
            // 旧版本 Android
            intent.setAction(Settings.ACTION_APPLICATION_SETTINGS);
        }
        try {
            startActivityForResult(intent, REQUEST_CODE_NOTIFICATION_SETTINGS);
        } catch (Exception e) {
            e.printStackTrace();
            // 备用方案
            openAppDetailsSettings();
        }
    }
    /**
     * 备用方案:跳转到应用详情页面
     */
    private void openAppDetailsSettings() {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.fromParts("package", getPackageName(), null));
        try {
            startActivityForResult(intent, REQUEST_CODE_NOTIFICATION_SETTINGS);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_NOTIFICATION_SETTINGS) {
            // 用户从设置页面返回,重新检查权限
            new Handler().postDelayed(() -> {
                checkAndRequestNotificationPermission();
            }, 500); // 延迟检查,确保设置已生效
        }
    }
    /**
     * 发送测试通知
     */
    private void sendTestNotification() {
        if (!areNotificationsEnabled(this)) {
            showNotificationPermissionDialog();
            return;
        }
    }
    /**
     * 检查通知权限是否开启
     */
    public boolean areNotificationsEnabled(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager notificationManager =
                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            return notificationManager.areNotificationsEnabled();
        } else {
            // Android 8.0 以下版本,通知权限默认开启或通过其他方式检查
            return true;
        }
    }
    /**
     * 检查特定渠道的通知权限 (Android 8.0+)
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    public boolean isNotificationChannelEnabled(Context context, String channelId) {
        NotificationManager notificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationChannel channel = notificationManager.getNotificationChannel(channelId);
        return channel != null && channel.getImportance() != NotificationManager.IMPORTANCE_NONE;
    }
    /**
     * 设置按钮是否开启点击样式
     *
     * @param enabled 是否开启
     */
    private void setBtnEnabled(boolean enabled) {
        final float alpha = enabled ? 1.0f : 0.5f;
        viewBinding.aiIv.setAlpha(alpha);
        viewBinding.aiIv.setEnabled(enabled);
        viewBinding.tipIv.setAlpha(alpha);
        viewBinding.tipIv.setEnabled(enabled);
        viewBinding.warningIv.setAlpha(alpha);
        viewBinding.warningIv.setEnabled(enabled);
        viewBinding.malfunctionIv.setAlpha(alpha);
        viewBinding.malfunctionIv.setEnabled(enabled);
        if (enabled) {
            viewBinding.notificationLl.setVisibility(View.GONE);
        } else {
            viewBinding.notificationLl.setVisibility(View.VISIBLE);
        }
    }
    /**
     * 初始化按钮状态
     *
     * @param messageNoticeBean 云端返回的模型
     */
    void intiBtnState(MessageNoticeBean messageNoticeBean) {
        setBtnClick(viewBinding.aiIv, messageNoticeBean.isAiPush());
        setBtnClick(viewBinding.tipIv, messageNoticeBean.isEventPush());
        setBtnClick(viewBinding.warningIv, messageNoticeBean.isWarnPush());
        setBtnClick(viewBinding.malfunctionIv, messageNoticeBean.isFaultPush());
    }
    /**
     * 按钮点击样式
     *
     * @param v          按钮组件
     * @param isSelected 点击状态
     */
    private void setBtnClick(ImageView v, boolean isSelected) {
        if (isSelected) {
            v.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.open));
        } else {
            v.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.close));
        }
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/me/SetActivity.java
@@ -84,6 +84,15 @@
                startActivityForResult(intent, 40);
            }
        });
        //开启系统通知
        viewBinding.setNotificationSettingsIl.getRoot().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(_mActivity, NotificationSettingsActivity.class);
                startActivity(intent);
            }
        });
        //切花环境
        viewBinding.setContextSwitchIl.getRoot().setOnClickListener(new View.OnClickListener() {
            @Override
@@ -119,6 +128,7 @@
        viewBinding.setLanguageIl.sllLlRlNameTv.setText(R.string.set_multilingual);
        viewBinding.setAccountSecurityIl.sllLlRlNameTv.setText(R.string.set_account_security);
        viewBinding.setTemperatureUnitIl.sllLlRlNameTv.setText(R.string.set_temperature_unit);
        viewBinding.setNotificationSettingsIl.sllLlRlNameTv.setText(R.string.notification_settings);
        viewBinding.setLanguageIl.sllLlRlRightContentTv.setVisibility(View.VISIBLE);
        viewBinding.setLanguageIl.lineV.setVisibility(View.VISIBLE);
        viewBinding.setAccountSecurityIl.lineV.setVisibility(View.VISIBLE);
@@ -126,12 +136,13 @@
        viewBinding.setLanguageIl.sllLlRlRightContentTv.setText(str);
        viewBinding.setTemperatureUnitIl.sllLlRlRightContentTv.setVisibility(View.VISIBLE);
        viewBinding.setTemperatureUnitIl.sllLlRlRightContentTv.setText(UserConfigManage.getInstance().getTemperature_unit());
        viewBinding.setTemperatureUnitIl.lineV.setVisibility(View.VISIBLE);
        if (AppConfigManage.isDebug()) {
            viewBinding.setContextSwitchIl.parentCl.setVisibility(View.VISIBLE);
            viewBinding.setContextSwitchIl.sllLlRlNameTv.setText("当前环境");
            viewBinding.setContextSwitchIl.sllLlRlRightContentTv.setVisibility(View.VISIBLE);
            viewBinding.setTemperatureUnitIl.lineV.setVisibility(View.VISIBLE);
            viewBinding.setNotificationSettingsIl.lineV.setVisibility(View.VISIBLE);
            if (AppConfigManage.getOnlineServer()) {
                viewBinding.setContextSwitchIl.sllLlRlRightContentTv.setText("线上");
            } else {
@@ -139,11 +150,8 @@
            }
        } else {
            viewBinding.setContextSwitchIl.parentCl.setVisibility(View.GONE);
            viewBinding.setTemperatureUnitIl.lineV.setVisibility(View.GONE);
            viewBinding.setNotificationSettingsIl.lineV.setVisibility(View.GONE);
        }
//        viewBinding.setContextSwitchIl.parentCl.setVisibility(View.GONE);
    }
app/src/main/java/com/hdl/photovoltaic/ui/message/MessageActivity.java
@@ -39,6 +39,9 @@
import java.util.List;
import java.util.Map;
/**
 * 电站消息界面
 */
public class MessageActivity extends CustomBaseActivity {
    private FragmentMessageBinding viewBinding;
@@ -366,8 +369,13 @@
    private void initData() {
        //进来读取一次数据(为了更新currentPage,currentTotal这个值),app启动时候读取,为了刷新消息模块的角标
        loadNextPageMessageList(true, 1, FilterType.all, FilterType.all, FilterType.all, FilterType.all, FilterType.all, FilterType.all, true);
        HdlThreadLogic.runSubThread(new Runnable() {
            @Override
            public void run() {
                //进来读取一次数据(为了更新currentPage,currentTotal这个值),app启动时候读取,为了刷新消息模块的角标
                loadNextPageMessageList(true, 1, FilterType.all, FilterType.all, FilterType.all, FilterType.all, FilterType.all, FilterType.all, true);
            }
        });
    }
@@ -421,40 +429,59 @@
            return;
        }
        isLoadingMore = true;//标记读取状态
        if (isShowLoading) {
            showLoading();
        }
        String messageStateType;
        if (isAlarmDeviceClick) {
            messageStateType = MessageStateType.untreated;
        } else {
            messageStateType = MessageStateType.processed;
        }
        HdlThreadLogic.runMainThread(new Runnable() {
            @Override
            public void run() {
                if (isShowLoading) {
                    showLoading();
                }
            }
        });
        HdlMessageLogic.getInstance().getPageNoMessageList(mMessageBean.getHomeId(), pageNo, messageStateType, deviceType_filter_key, deviceType_filter_value, type_filter_key, type_filter_value, timeType_filter_key, timeType_filter_value, "", new CloudCallBeak<HdlMessageLogic.MessageListClass>() {
            @Override
            public void onSuccess(HdlMessageLogic.MessageListClass messageListClass) {
                if (messageListClass != null) {
                    mCurrentTotal = (int) messageListClass.getTotalPage();
                    mCurrentPage = (int) messageListClass.getPageNo();
                    mTotalCount = (int) messageListClass.getTotalCount();
                    updateListData();
                }
                isLoadingMore = false;
                if (isShowLoading) {
                    hideLoading();
                }
                HdlThreadLogic.runMainThread(new Runnable() {
                    @Override
                    public void run() {
                        if (isShowLoading) {
                            hideLoading();
                        }
                        if (messageListClass != null) {
                            mCurrentTotal = (int) messageListClass.getTotalPage();
                            mCurrentPage = (int) messageListClass.getPageNo();
                            mTotalCount = (int) messageListClass.getTotalCount();
                            updateListData();
                        }
                        isLoadingMore = false;
                    }
                });
            }
            @Override
            public void onFailure(HDLException e) {
                if (mCurrentPage > 1) {
                    --mCurrentPage;
                }
                isLoadingMore = false;
                if (isShowLoading) {
                    hideLoading();
                }
                HdlThreadLogic.toast(_mActivity, e.getMsg() + "(" + e.getCode() + ")");
                HdlThreadLogic.runMainThread(new Runnable() {
                    @Override
                    public void run() {
                        if (isShowLoading) {
                            hideLoading();
                        }
                        if (mCurrentPage > 1) {
                            --mCurrentPage;
                        }
                        isLoadingMore = false;
                        HdlThreadLogic.toast(_mActivity, e.getMsg() + "(" + e.getCode() + ")");
                    }
                });
            }
        });
app/src/main/java/com/hdl/photovoltaic/ui/message/MessageHouseFragment.java
@@ -30,6 +30,7 @@
import com.hdl.photovoltaic.ui.adapter.MessageHouseAdapter;
import com.hdl.photovoltaic.ui.bean.MessageBean;
import com.hdl.photovoltaic.ui.bean.UnCountBean;
import com.hdl.photovoltaic.ui.powerstation.HouseSearchActivity;
import com.hdl.photovoltaic.utils.KeyboardStateObserverUtils;
import com.hdl.photovoltaic.widget.refreshlayout.BGARefreshLayout;
import com.hdl.photovoltaic.widget.refreshlayout.HDLRefreshViewHolder;
@@ -179,15 +180,12 @@
    private void initEvent() {
        //搜索
        viewBinding.powerStationSearchEt.addTextChangedListener(powerStationSearchWatcher);
        //清除搜索文案
        viewBinding.powerStationClearIv.setOnClickListener(new View.OnClickListener() {
        viewBinding.powerStationSearchCl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewBinding.powerStationSearchEt.setText("");
                viewBinding.powerStationClearIv.setVisibility(View.GONE);
                getMessageHouseList("", false);
                Intent intent = new Intent();
                intent.setClass(_mActivity, SearchMessageHouseActivity.class);
                startActivity(intent);
            }
        });
        //全部已读
@@ -263,22 +261,7 @@
        viewBinding.houseListRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
        viewBinding.houseListRcv.setAdapter(mMessageHouseAdapter);
        this.pullToRefresh();
        //在界面中使用
        KeyboardStateObserverUtils.getKeyboardStateObserver(_mActivity).setKeyboardVisibilityListener(new KeyboardStateObserverUtils.OnKeyboardVisibilityListener() {
            @Override
            public void onKeyboardShow(int h) {
                //Toast.makeText(MainActivity.this,"键盘弹出",Toast.LENGTH_SHORT).show();
//                viewBinding.messageSearchEt.requestFocus();
            }
            @Override
            public void onKeyboardHide(int h) {
                viewBinding.powerStationSearchEt.clearFocus();
            }
        });
    }
    /**
@@ -372,38 +355,8 @@
        }
    }
    /**
     *
     */
    private final TextWatcher powerStationSearchWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //搜索关键字
            String currSearchText = s.toString().replace(" ", "");
            if (TextUtils.isEmpty(currSearchText)) {
                viewBinding.powerStationClearIv.setVisibility(View.GONE);
//                HdlThreadLogic.toast(_mActivity, R.string.search_content_null);
                return;
            }
            viewBinding.powerStationClearIv.setVisibility(View.VISIBLE);
            viewBinding.powerStationSearchEt.clearFocus();
            getMessageHouseList(currSearchText, false);
        }
        @Override
        public void afterTextChanged(Editable s) {
        }
    };
    @Override
    public void onDestroy() {
        super.onDestroy();
        viewBinding.powerStationSearchEt.removeTextChangedListener(powerStationSearchWatcher);
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/message/SearchMessageHouseActivity.java
New file
@@ -0,0 +1,435 @@
package com.hdl.photovoltaic.ui.message;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hdl.linkpm.sdk.core.exception.HDLException;
import com.hdl.photovoltaic.R;
import com.hdl.photovoltaic.base.CustomBaseActivity;
import com.hdl.photovoltaic.config.ConstantManage;
import com.hdl.photovoltaic.databinding.ActivityHouseSearchBinding;
import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.other.HdlCommonLogic;
import com.hdl.photovoltaic.other.HdlFileLogic;
import com.hdl.photovoltaic.other.HdlLogLogic;
import com.hdl.photovoltaic.other.HdlMessageLogic;
import com.hdl.photovoltaic.other.HdlThreadLogic;
import com.hdl.photovoltaic.ui.adapter.MessageHouseAdapter;
import com.hdl.photovoltaic.ui.adapter.SearchHistoryAdapter;
import com.hdl.photovoltaic.ui.bean.MessageBean;
import com.hdl.photovoltaic.utils.KeyboardStateObserverUtils;
import com.hdl.photovoltaic.widget.refreshlayout.BGARefreshLayout;
import com.hdl.photovoltaic.widget.refreshlayout.HDLRefreshViewHolder;
import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
/**
 * 搜索电站消息
 */
public class SearchMessageHouseActivity extends CustomBaseActivity {
    private ActivityHouseSearchBinding viewBinding;
    private Handler handler;
    private Runnable delayedRunnable;
    SearchHistoryAdapter searchHistoryAdapter;
    MessageHouseAdapter searchMessageHouseAdapter;
    List<MessageBean> mList = new ArrayList<>();
    List<String> searchHistoryTitleList = new ArrayList<>();
    private String currSearchText;
    @Override
    public Object getContentView() {
        viewBinding = ActivityHouseSearchBinding.inflate(getLayoutInflater());
        return viewBinding.getRoot();
    }
    @Override
    public void onBindView(Bundle savedInstanceState) {
        setStatusBarTranslucent();
        getWindow().setNavigationBarColor(getColor(R.color.text_FF000000));
        //历史记录文件夹创建
        HdlFileLogic.getInstance().createFileDir(HdlFileLogic.getInstance().getCurrentUserRootPath());
        //初始化数据
        initData();
        //初始化
        initView();
        //初始化界面监听器
        initEvent();
    }
    private void initData() {
        try {
            String json = HdlFileLogic.getInstance().readFile(getHistoryFileNamePath());
            if (TextUtils.isEmpty(json)) {
                return;
            }
            searchHistoryTitleList = new Gson().fromJson(json, new TypeToken<List<String>>() {
            }.getType());
        } catch (Exception ignored) {
        }
    }
    /**
     * 下拉刷新的逻辑
     */
    protected void pullToRefresh() {
        viewBinding.listSrl.setDelegate(new BGARefreshLayout.BGARefreshLayoutDelegate() {
            @Override
            public void onBGARefreshLayoutBeginRefreshing(BGARefreshLayout refreshLayout) {
                handler = new Handler(Looper.getMainLooper());
                delayedRunnable = new Runnable() {
                    @Override
                    public void run() {
                        viewBinding.listSrl.endRefreshing();
                        getMessageHouseList(currSearchText, false);
                    }
                };
                // 延迟 5 秒执行
                handler.postDelayed(delayedRunnable, 1000);
            }
            @Override
            public boolean onBGARefreshLayoutBeginLoadingMore(BGARefreshLayout refreshLayout) {
//                handler = new Handler(Looper.getMainLooper());
//                delayedRunnable = new Runnable() {
//                    @Override
//                    public void run() {
//                        viewBinding.listSrl.endLoadingMore();
//                        //加载最新数据完成
//                        if (!isHouseLoadingMore) {
//                            // 滑动到了底部,执行相应的操作
//                            getMessageHouseList(currSearchText,false);
//                        }
//                    }
//                };
//                // 延迟 5 秒执行
//                handler.postDelayed(delayedRunnable, 10);
                return true;
            }
        });
        HDLRefreshViewHolder hdlRefreshViewHolder = new HDLRefreshViewHolder(_mActivity, true);
        hdlRefreshViewHolder.setPullDownImageResource(R.mipmap.loading_44);
        hdlRefreshViewHolder.setChangeToReleaseRefreshAnimResId(R.drawable.loading_refresh);
        hdlRefreshViewHolder.setRefreshingAnimResId(R.drawable.loading_refresh_end);
        viewBinding.listSrl.setRefreshViewHolder(hdlRefreshViewHolder);
    }
    private void initEvent() {
        //后退
        viewBinding.backRl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        viewBinding.powerStationSearchEt.addTextChangedListener(textWatcher);
        //搜索
        viewBinding.powerStationSearchTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //搜索关键字
                currSearchText = viewBinding.powerStationSearchEt.getText().toString().replace(" ", "");
                viewBinding.historyListParent.setVisibility(View.GONE);
                viewBinding.listParent.setVisibility(View.VISIBLE);
                viewBinding.powerStationSearchEt.clearFocus();
                hideSoftInputFromWindow();
                addSearchTextToList();
                getMessageHouseList(currSearchText, true);
            }
        });
        //清除
        viewBinding.powerStationClearIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                currSearchText = "";
                viewBinding.powerStationSearchEt.setText("");
                viewBinding.historyListParent.setVisibility(View.VISIBLE);
                viewBinding.listParent.setVisibility(View.GONE);
                viewBinding.deviceNullDataIc.getRoot().setVisibility(View.GONE);
                searchHistoryAdapter.setList(searchHistoryTitleList);
                viewBinding.powerStationSearchEt.requestFocus();
                showSoftInput();
                mList.clear();
                searchMessageHouseAdapter.setList(mList);
            }
        });
        //删除
        viewBinding.powerStationDelIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewBinding.powerStationSearchEt.clearFocus();
                hideSoftInputFromWindow();
                searchHistoryTitleList = new ArrayList<>();
                searchHistoryAdapter.setList(searchHistoryTitleList);
                viewBinding.deviceNullDataIc.getRoot().setVisibility(View.GONE);
                HdlFileLogic.getInstance().deleteFile(getHistoryFileNamePath());
            }
        });
        //历史记录点击事件
        searchHistoryAdapter.setOnclickListener(new SearchHistoryAdapter.OnClickListener() {
            @Override
            public void onClick(int position, String title) {
                viewBinding.powerStationSearchEt.setText(title);
                //搜索关键字
                currSearchText = viewBinding.powerStationSearchEt.getText().toString().replace(" ", "");
                if (TextUtils.isEmpty(currSearchText)) {
                    HdlThreadLogic.toast(_mActivity, R.string.search_content_null);
                    return;
                }
                viewBinding.powerStationSearchEt.clearFocus();
                hideSoftInputFromWindow();
                viewBinding.historyListParent.setVisibility(View.GONE);
                viewBinding.listParent.setVisibility(View.VISIBLE);
                addSearchTextToList();
                getMessageHouseList(currSearchText, true);
            }
        });
        //电站点击是事件
        if (searchMessageHouseAdapter != null) {
            searchMessageHouseAdapter.setOnclickListener(new MessageHouseAdapter.OnClickListener() {
                @Override
                public void onClick(int position, MessageBean messageBean) {
                    Intent intent = new Intent();
                    intent.putExtra("messageBean", new Gson().toJson(messageBean));
                    intent.setClass(_mActivity, MessageActivity.class);
                    startActivity(intent);
                }
            });
        }
    }
    /**
     * 显示软键盘
     */
    public void showSoftInput() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(viewBinding.powerStationSearchEt, 0);
    }
    /**
     * 隐藏软键盘
     */
    public void hideSoftInputFromWindow() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(viewBinding.getRoot().getWindowToken(), 0);
    }
    private void initView() {
        viewBinding.historyListParent.setVisibility(View.VISIBLE);
        viewBinding.listParent.setVisibility(View.GONE);
        viewBinding.powerStationClearIv.setVisibility(View.GONE);
        //初始化历史记录适配器
        searchHistoryAdapter = new SearchHistoryAdapter(_mActivity);
        viewBinding.historyListRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
        viewBinding.historyListRcv.setAdapter(searchHistoryAdapter);
        searchHistoryAdapter.setList(searchHistoryTitleList);
        //初始化电站适配器
        searchMessageHouseAdapter = new MessageHouseAdapter(_mActivity);
        viewBinding.listRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
        viewBinding.listRcv.setAdapter(searchMessageHouseAdapter);
        viewBinding.powerStationSearchEt.post(new Runnable() {
            @Override
            public void run() {
                viewBinding.powerStationSearchEt.requestFocus();
            }
        });
        pullToRefresh();
        //在界面中使用
        KeyboardStateObserverUtils.getKeyboardStateObserver(_mActivity).setKeyboardVisibilityListener(new KeyboardStateObserverUtils.OnKeyboardVisibilityListener() {
            @Override
            public void onKeyboardShow(int h) {
                //Toast.makeText(MainActivity.this,"键盘弹出",Toast.LENGTH_SHORT).show();
//                viewBinding.powerStationSearchEt.requestFocus();
            }
            @Override
            public void onKeyboardHide(int h) {
                viewBinding.powerStationSearchEt.clearFocus();
            }
        });
    }
    /**
     * 输入电站名称进行过滤
     */
    private final TextWatcher textWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }
        @Override
        public void afterTextChanged(Editable s) {
            String et = viewBinding.powerStationSearchEt.getText().toString().replace(" ", "");
            if (TextUtils.isEmpty(et)) {
                viewBinding.powerStationClearIv.setVisibility(View.GONE);
            } else {
                viewBinding.powerStationClearIv.setVisibility(View.VISIBLE);
            }
            viewBinding.powerStationSearchEt.setSelection(viewBinding.powerStationSearchEt.length());
        }
    };
    /**
     * 重新更新列表数据
     */
    private void updateRecyclerViewList() {
        if (searchMessageHouseAdapter == null) {
            return;
        }
        searchMessageHouseAdapter.setList(mList);
        nullDataUpdateUi();
    }
    /**
     * 物理按键返回事件
     */
    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }
    @Override
    protected void onDestroy() {
        viewBinding.powerStationSearchEt.removeTextChangedListener(textWatcher);
        if (searchHistoryTitleList.size() > 0) {
            HdlFileLogic.getInstance().deleteFile(getHistoryFileNamePath());
            HdlFileLogic.getInstance().appendFile(getHistoryFileNamePath(), new Gson().toJson(searchHistoryTitleList));
        }
        if (handler != null && delayedRunnable != null) {
            handler.removeCallbacks(delayedRunnable);
        }
        super.onDestroy();
    }
    /**
     * 添加历史记录
     */
    private void addSearchTextToList() {
        if (TextUtils.isEmpty(currSearchText.replace(" ", ""))) {
            return;
        }
        for (int i = 0; i < searchHistoryTitleList.size(); i++) {
            if (searchHistoryTitleList.get(i).equals(currSearchText)) {
                searchHistoryTitleList.remove(searchHistoryTitleList.get(i));
            }
        }
        final int maxValue = 10;
        searchHistoryTitleList.add(0, currSearchText);
        if (searchHistoryTitleList.size() > maxValue) {
            //历史记录不能超出10
            searchHistoryTitleList.remove(searchHistoryTitleList.get(maxValue));
        }
    }
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMessage(BaseEventBus eventBus) {
        super.onEventMessage(eventBus);
        if (eventBus == null) {
            return;
        }
        //接收外部点击事件
        if (eventBus.getTopic().equals(ConstantManage.refresh_message_house)) {
            EventBus.getDefault().removeStickyEvent(eventBus);
            getMessageHouseList(currSearchText, false);
        }
    }
    /**
     * 获取账号下全部电站消息
     *
     * @param homeName      电站名称(搜索用的),如果是空字符串默认读取全部
     * @param isShowLoading 是否需要加载窗(true=需要,false=不需要)
     */
    private void getMessageHouseList(String homeName, boolean isShowLoading) {
        if (isShowLoading) {
            showLoading();
        }
        HdlMessageLogic.getInstance().getMessageHouseList(homeName, new CloudCallBeak<List<MessageBean>>() {
            @Override
            public void onSuccess(List<MessageBean> list) {
                if (isShowLoading) {
                    hideLoading();
                }
                mList.clear();
                if (list != null && !list.isEmpty()) {
                    mList.addAll(list);
                }
                updateRecyclerViewList();
            }
            @Override
            public void onFailure(HDLException e) {
                if (isShowLoading) {
                    hideLoading();
                }
            }
        });
    }
    /**
     * 没有电站列表的样式
     */
    private void nullDataUpdateUi() {
        boolean is_data = mList != null && mList.size() > 0;
        HdlCommonLogic.getInstance().nullDataUpdateUi(_mActivity, viewBinding.deviceNullDataIc.getRoot(), viewBinding.deviceNullDataIc.nullDataGifAnimationIv, viewBinding.deviceNullDataIc.nullDataTv, getString(R.string.my_power_station_data_null), is_data);
    }
    /**
     * 获取【搜索历史记录文件】全路径
     */
    public String getHistoryFileNamePath() {
        return HdlFileLogic.getInstance().getCurrentUserRootPath() + "/message_house_history.txt";
    }
}
app/src/main/res/drawable-xhdpi/close.png

app/src/main/res/drawable-xhdpi/open.png

app/src/main/res/layout/activity_house_search.xml
@@ -33,10 +33,11 @@
        <RelativeLayout
            android:id="@+id/search_et_bj"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginStart="@dimen/dp_7"
            android:layout_marginEnd="@dimen/dp_21"
            android:layout_marginEnd="@dimen/dp_11"
            android:layout_toStartOf="@+id/power_station_search_tv"
            android:layout_toEndOf="@+id/back_rl"
            android:background="@drawable/search_bj_ff1c1c1e">
@@ -76,17 +77,23 @@
                android:src="@drawable/clear" />
        </RelativeLayout>
        <TextView
        <LinearLayout
            android:id="@+id/power_station_search_tv"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:layout_marginEnd="@dimen/dp_21"
            android:gravity="center"
            android:text="@string/search"
            android:textColor="@color/text_FFACACAC"
            android:textSize="@dimen/text_14" />
            android:layout_centerVertical="true">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginStart="@dimen/dp_10"
                android:layout_marginEnd="@dimen/dp_21"
                android:gravity="center"
                android:text="@string/search"
                android:textColor="@color/text_FFACACAC"
                android:textSize="@dimen/text_14" />
        </LinearLayout>
    </RelativeLayout>
@@ -158,7 +165,10 @@
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/list_rcv"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
                android:layout_height="match_parent"
                android:clipToPadding="false"
                android:paddingTop="@dimen/dp_10"
                />
        </com.hdl.photovoltaic.widget.refreshlayout.BGARefreshLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/activity_notification_settings.xml
New file
@@ -0,0 +1,207 @@
<?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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/text_FF000000"
    tools:context=".ui.me.NotificationSettingsActivity">
    <include
        android:id="@+id/toolbar_top_rl"
        layout="@layout/toolbar_top_view_44"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_44"
        android:layout_marginTop="@dimen/dp_38"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/text_FF1C1C1E"
        android:orientation="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar_top_rl">
        <LinearLayout
            android:id="@+id/notification_ll"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_52">
            <TextView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_marginStart="@dimen/dp_16"
                android:layout_marginEnd="@dimen/dp_10"
                android:layout_weight="1"
                android:ellipsize="end"
                android:gravity="center_vertical|start"
                android:singleLine="true"
                android:text="@string/notification_settings"
                android:textColor="@color/text_FFACACAC"
                android:textSize="@dimen/text_14" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:ellipsize="end"
                android:gravity="center_vertical|end"
                android:paddingStart="@dimen/dp_6"
                android:paddingEnd="@dimen/dp_16"
                android:singleLine="true"
                android:text="@string/go_and_start"
                android:textColor="@color/text_38C494"
                android:textSize="@dimen/text_14" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_48"
            android:background="@color/text_FF000000">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dp_16"
                android:layout_marginTop="@dimen/dp_20"
                android:ellipsize="end"
                android:singleLine="true"
                android:text="@string/notification_alert"
                android:textColor="@color/text_FF8E8E8E"
                android:textSize="@dimen/text_14" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/ai_ll"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_52">
            <TextView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_marginStart="@dimen/dp_16"
                android:layout_marginEnd="@dimen/dp_10"
                android:layout_weight="1"
                android:ellipsize="end"
                android:gravity="center_vertical|start"
                android:singleLine="true"
                android:text="@string/ai_butler_message"
                android:textColor="@color/text_FFACACAC"
                android:textSize="@dimen/text_14" />
            <ImageView
                android:id="@+id/ai_iv"
                android:layout_width="@dimen/dp_44"
                android:layout_height="@dimen/dp_24"
                android:layout_gravity="center_vertical"
                android:layout_marginStart="@dimen/dp_6"
                android:layout_marginEnd="@dimen/dp_16"
                android:background="@drawable/open" />
        </LinearLayout>
        <View
            android:id="@+id/line_v1"
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:background="@color/text_1AFFFFFF" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_52">
            <TextView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_marginStart="@dimen/dp_16"
                android:layout_marginEnd="@dimen/dp_10"
                android:layout_weight="1"
                android:ellipsize="end"
                android:gravity="center_vertical|start"
                android:singleLine="true"
                android:text="@string/alarm_all_grade_tip"
                android:textColor="@color/text_FFACACAC"
                android:textSize="@dimen/text_14" />
            <ImageView
                android:id="@+id/tip_iv"
                android:layout_width="@dimen/dp_44"
                android:layout_height="@dimen/dp_24"
                android:layout_gravity="center_vertical"
                android:layout_marginStart="@dimen/dp_6"
                android:layout_marginEnd="@dimen/dp_16"
                android:background="@drawable/open" />
        </LinearLayout>
        <View
            android:id="@+id/line_v2"
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:background="@color/text_1AFFFFFF" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_52">
            <TextView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_marginStart="@dimen/dp_16"
                android:layout_marginEnd="@dimen/dp_10"
                android:layout_weight="1"
                android:ellipsize="end"
                android:gravity="center_vertical|start"
                android:singleLine="true"
                android:text="@string/alarm_all_grade_warning"
                android:textColor="@color/text_FFACACAC"
                android:textSize="@dimen/text_14" />
            <ImageView
                android:id="@+id/warning_iv"
                android:layout_width="@dimen/dp_44"
                android:layout_height="@dimen/dp_24"
                android:layout_gravity="center_vertical"
                android:layout_marginStart="@dimen/dp_6"
                android:layout_marginEnd="@dimen/dp_16"
                android:background="@drawable/open" />
        </LinearLayout>
        <View
            android:id="@+id/line_v3"
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:background="@color/text_1AFFFFFF" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_52">
            <TextView
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_marginStart="@dimen/dp_16"
                android:layout_marginEnd="@dimen/dp_10"
                android:layout_weight="1"
                android:ellipsize="end"
                android:gravity="center_vertical|start"
                android:singleLine="true"
                android:text="@string/alarm_all_grade_malfunction"
                android:textColor="@color/text_FFACACAC"
                android:textSize="@dimen/text_14" />
            <ImageView
                android:id="@+id/malfunction_iv"
                android:layout_width="@dimen/dp_44"
                android:layout_height="@dimen/dp_24"
                android:layout_gravity="center_vertical"
                android:layout_marginStart="@dimen/dp_6"
                android:layout_marginEnd="@dimen/dp_16"
                android:background="@drawable/open" />
        </LinearLayout>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/activity_search_message_house.xml
New file
@@ -0,0 +1,10 @@
<?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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.message.SearchMessageHouseActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
app/src/main/res/layout/activity_set.xml
@@ -46,10 +46,14 @@
            <include
                android:id="@+id/set_temperature_unit_il"
                layout="@layout/set_line" />
            <include
                android:id="@+id/set_notification_settings_il"
                layout="@layout/set_line" />
            <include
                android:id="@+id/set_context_switch_il"
                layout="@layout/set_line" />
        </LinearLayout>
    </ScrollView>
app/src/main/res/layout/fragement_message_house.xml
@@ -33,31 +33,16 @@
                android:layout_marginStart="@dimen/dp_13"
                android:src="@drawable/search_path" />
            <EditText
                android:id="@+id/power_station_search_et"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_alignParentEnd="true"
            <TextView
                android:id="@+id/power_station_search_tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginStart="@dimen/dp_11"
                android:layout_marginEnd="@dimen/dp_40"
                android:layout_toEndOf="@+id/power_station_search_iv"
                android:background="@null"
                android:gravity="start|center_vertical"
                android:hint="@string/search_station"
                android:textColor="@color/text_FFACACAC"
                android:textColorHint="@color/text_FF5B5B5B"
                android:text="@string/search_station"
                android:textColor="@color/text_FF5B5B5B"
                android:textSize="@dimen/text_14" />
            <ImageView
                android:id="@+id/power_station_clear_iv"
                android:layout_width="@dimen/dp_20"
                android:layout_height="@dimen/dp_20"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:layout_marginEnd="@dimen/dp_13"
                android:src="@drawable/clear"
                android:visibility="gone" />
        </RelativeLayout>
        <ImageView
@@ -88,8 +73,7 @@
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"
            android:paddingTop="@dimen/dp_10"
            />
            android:paddingTop="@dimen/dp_10" />
    </com.hdl.photovoltaic.widget.refreshlayout.BGARefreshLayout>
    <!--没有数据显示样式-->
app/src/main/res/values-en/strings.xml
@@ -379,4 +379,8 @@
    <string name="debug_status_rollback">Roll back the debugging status of %s plant to debugging?</string>
    <string name="device_not_activated">The device is not activated</string>
    <string name="help">Help</string>
    <string name="notification_settings">Notification settings</string>
    <string name="go_and_start">Go and start</string>
    <string name="notification_alert">Notification alert</string>
    <string name="ai_butler_message">AI butler message</string>
</resources>
app/src/main/res/values-zh/strings.xml
@@ -375,4 +375,8 @@
    <string name="debug_status_rollback">是否将%s电站的调试状态回退到调试中?</string>
    <string name="device_not_activated">设备未激活</string>
    <string name="help">帮助</string>
    <string name="notification_settings">开启系统通知</string>
    <string name="go_and_start">去开启</string>
    <string name="notification_alert">通知提醒</string>
    <string name="ai_butler_message">AI管家消息</string>
</resources>
app/src/main/res/values/strings.xml
@@ -380,5 +380,8 @@
    <string name="debug_status_rollback">Roll back the debugging status of %s plant to debugging?</string>
    <string name="device_not_activated">The device is not activated</string>
    <string name="help">Help</string>
    <string name="notification_settings">Notification settings</string>
    <string name="go_and_start">Go and start</string>
    <string name="notification_alert">Notification alert</string>
    <string name="ai_butler_message">AI butler message</string>
</resources>