wjc
6 天以前 c3542b10ea66a1c3fad44fe8e0efd357d7d3857e
2025年11月19日19:32:39
3个文件已添加
10个文件已修改
680 ■■■■■ 已修改文件
app/src/main/AndroidManifest.xml 6 ●●●● 补丁 | 查看 | 原始文档 | 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/res/drawable-xhdpi/close.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/open.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_notification_settings.xml 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_set.xml 6 ●●●● 补丁 | 查看 | 原始文档 | 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,13 +69,13 @@
        android:supportsRtl="true"
        android:theme="@style/Theme.PhotovoltaicDebug">
        <activity
            android:name=".ui.me.NotificationSettingsActivity"
            android:exported="false" />
        <activity
            android:name=".ui.message.SearchMessageHouseActivity"
            android:exported="false" />
        <activity
            android:name=".ui.message.MessageActivity"
            android:exported="false" />
        <activity
            android:name=".ui.message.PowerStationMessageSearchActivity"
            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/res/drawable-xhdpi/close.png

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

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_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/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>