package com.hdl.photovoltaic.ui.message; import android.annotation.SuppressLint; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; 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.google.gson.Gson; 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; import com.hdl.photovoltaic.databinding.FragmentMessageBinding; import com.hdl.photovoltaic.enums.FilterType; import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch; 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.MessageBean; import com.hdl.photovoltaic.ui.bean.UnCountBean; import com.hdl.photovoltaic.widget.BTypeTitleListDialog; import com.hdl.photovoltaic.widget.TypeTitleListDialog; 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.HashMap; import java.util.List; import java.util.Map; /** * 消息模块界面 */ public class MessageFragment extends CustomBaseFragment { private FragmentMessageBinding viewBinding; private MessageAdapter mMessageAdapter; private boolean isAlarmDeviceClick = true;//true表示告警设备被选中,则false表示报警记录被选中 private final List mList = new ArrayList<>(); private boolean isRefreshTotalCount = true; private int mTotalCount = 0; //总条数 private int mCurrentPage = 0; // 当前页码 private int mCurrentTotal = 0; // 总页码 private String mDeviceTypeFilterKye = FilterType.deviceType;//过滤类型 deviceType(INV :逆变器;BMS :BMS控制盒;BATTERY :电池单元;"LOAD_CENTRE":负载控制中心) private String mDeviceTypeFilterValue = FilterType.all;//过滤类型值 deviceType(INV :逆变器;BMS :BMS控制盒;BATTERY :电池单元;"LOAD_CENTRE":负载控制中心 private String mTypeFilterKye = FilterType.all;//过滤类型 type(FAULT :故障; WARN :告警; EVENT :事件(提示)); private String mTypeFilterValue = FilterType.all;//过滤类型值 type(FAULT :故障; WARN :告警; EVENT :事件(提示)); private String mTimeTypeFilterKye = FilterType.all;//过滤类型 timeType(TODAY :今天;LAST_3_DAYS: 近3天;LAST_7_DAYS :近7天;LAST_30_DAYS :近30天); private String mTimeTypeFilterValue = FilterType.all;//过滤类型值 timeType(TODAY :今天;LAST_3_DAYS: 近3天;LAST_7_DAYS :近7天;LAST_30_DAYS :近30天); private boolean isLoadingMore = false; // 标记正在加载更多数据 @Override public Object getContentView() { viewBinding = FragmentMessageBinding.inflate(getLayoutInflater()); return viewBinding.getRoot(); } @Override public void onBindView(Bundle savedInstanceState) { //初始化界面 initView(); //初始化监听器 initEvent(); //初始化数据 initData(); } private void initEvent() { //发生中 viewBinding.messageTabNascentTitleTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isAlarmDeviceClick) { return; } mDeviceTypeFilterKye = FilterType.deviceType; mDeviceTypeFilterValue = FilterType.all; mTypeFilterKye = FilterType.all; mTypeFilterValue = FilterType.all; mTimeTypeFilterKye = FilterType.all; mTimeTypeFilterValue = FilterType.all; viewBinding.allDeviceTitleTv.setText(getString(R.string.alarm_all_device)); viewBinding.allGradeTitleTv.setText(getString(R.string.alarm_all_grade)); viewBinding.allTimeTitleTv.setText(getString(R.string.alarm_all_time)); isAlarmDeviceClick = true; isRefreshTotalCount = true; viewBinding.messageTabNascentTitleTv.setTextAppearance(R.style.Text18Style); viewBinding.messageTabRecoverTitleTv.setTextAppearance(R.style.Text14Style); viewBinding.allClearIv.setVisibility(View.VISIBLE); loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true); } }); //报警记录 viewBinding.messageTabRecoverTitleTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isAlarmDeviceClick) { return; } mDeviceTypeFilterKye = FilterType.deviceType; mDeviceTypeFilterValue = FilterType.all; mTypeFilterKye = FilterType.all; mTypeFilterValue = FilterType.all; mTimeTypeFilterKye = FilterType.all; mTimeTypeFilterValue = FilterType.all; viewBinding.allDeviceTitleTv.setText(getString(R.string.alarm_all_device)); viewBinding.allGradeTitleTv.setText(getString(R.string.alarm_all_grade)); viewBinding.allTimeTitleTv.setText(getString(R.string.alarm_all_time)); isAlarmDeviceClick = false; isRefreshTotalCount = true; viewBinding.messageTabNascentTitleTv.setTextAppearance(R.style.Text14Style); viewBinding.messageTabRecoverTitleTv.setTextAppearance(R.style.Text18Style); viewBinding.allClearIv.setVisibility(View.GONE); loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true); } }); //搜索消息 viewBinding.messageSearchCl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String messageStateType; if (isAlarmDeviceClick) { messageStateType = MessageStateType.untreated; } else { messageStateType = MessageStateType.processed; } Intent intent = new Intent(); intent.putExtra("MessageStateType", messageStateType); intent.setClass(_mActivity, SearchMessageActivity.class); startActivity(intent); } }); //清空所有未读按钮 viewBinding.allClearIv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showLoading(); HdlMessageLogic.getInstance().messageAllRead("", new CloudCallBeak() { @Override public void onSuccess(Boolean obj) { hideLoading(); loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true); } @Override public void onFailure(HDLException e) { hideLoading(); HdlThreadLogic.toast(_mActivity, e); } }); } }); //全部设备(全部设备、逆变器、BMS控制盒、电池单元)按钮 viewBinding.messageTabAllDeviceCl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewBinding.allDeviceTitleIv.setBackgroundResource(R.drawable.up); viewBinding.allGradeTitleIv.setBackgroundResource(R.drawable.down); viewBinding.allTimeTitleIv.setBackgroundResource(R.drawable.down); setTypeTitleListDialog(viewBinding.allDeviceTitleTv, FilterType.deviceType, getTypeList(FilterType.deviceType)); } }); //全部等级(故障、警告、提示)按钮 viewBinding.messageTabAllGradeCl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewBinding.allDeviceTitleIv.setBackgroundResource(R.drawable.down); viewBinding.allGradeTitleIv.setBackgroundResource(R.drawable.up); viewBinding.allTimeTitleIv.setBackgroundResource(R.drawable.down); setTypeTitleListDialog(viewBinding.allGradeTitleTv, FilterType.type, getTypeList(FilterType.type)); } }); //全部时间(当天、近3天、近7天、近30天)按钮 viewBinding.messageTabAllTimeCl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewBinding.allDeviceTitleIv.setBackgroundResource(R.drawable.down); viewBinding.allGradeTitleIv.setBackgroundResource(R.drawable.down); viewBinding.allTimeTitleIv.setBackgroundResource(R.drawable.up); setTypeTitleListDialog(viewBinding.allTimeTitleTv, FilterType.timeType, getTypeList(FilterType.timeType)); } }); //下拉按钮 viewBinding.messageSrl.setColorSchemeResources(R.color.text_FF245EC3); viewBinding.messageSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { viewBinding.messageSrl.setRefreshing(false); loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true); } }); //上拉按钮 viewBinding.messageRcv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { // super.onScrolled(recyclerView, dx, dy); LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); if (layoutManager == null) { return; } int visibleItemCount = layoutManager.getChildCount(); int totalItemCount = layoutManager.getItemCount(); int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition(); if (visibleItemCount > 0 && visibleItemCount + firstVisibleItemPosition == totalItemCount) { if (!isLoadingMore) { // 滑动到了底部,执行相应的操作 HdlLogLogic.print("--->滑动到了底部"); loadNextPageMessageList(false, ++mCurrentPage, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, false); } } } }); if (mMessageAdapter != null) { mMessageAdapter.setOnclickListener(new MessageAdapter.OnClickListener() { @Override public void onClick(int position, MessageBean messageBean) { Intent intent = new Intent(); intent.putExtra("messageBean", new Gson().toJson(messageBean)); intent.setClass(_mActivity, MessageInfoActivity.class); startActivity(intent); } }); } } /** * 类型筛选 * * @param textView 组件显示 * @param filterType 过滤类型 * @param stringList 过滤类型值表 */ private void setTypeTitleListDialog(TextView textView, String filterType, List stringList) { BTypeTitleListDialog typeTitleListDialog = new BTypeTitleListDialog(_mActivity, stringList, textView.getText().toString()); typeTitleListDialog.show(); typeTitleListDialog.setOnListener(new BTypeTitleListDialog.OnClickListener() { @Override public void onClick(int position, String title) { textView.setText(title); switch (filterType) { case FilterType.deviceType: { mDeviceTypeFilterKye = filterType; mDeviceTypeFilterValue = findFilterValueString(title); } break; case FilterType.type: { mTypeFilterKye = filterType; mTypeFilterValue = findFilterValueString(title); } break; case FilterType.timeType: { mTimeTypeFilterKye = filterType; mTimeTypeFilterValue = findFilterValueString(title); } break; } loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true); } }); typeTitleListDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { viewBinding.allDeviceTitleIv.setBackgroundResource(R.drawable.down); viewBinding.allGradeTitleIv.setBackgroundResource(R.drawable.down); viewBinding.allTimeTitleIv.setBackgroundResource(R.drawable.down); } }); } private void initView() { if (isAlarmDeviceClick) { viewBinding.messageTabNascentTitleTv.setTextAppearance(R.style.Text18Style); viewBinding.messageTabRecoverTitleTv.setTextAppearance(R.style.Text14Style); } else { viewBinding.messageTabNascentTitleTv.setTextAppearance(R.style.Text18Style); viewBinding.messageTabRecoverTitleTv.setTextAppearance(R.style.Text14Style); } // viewBinding..topMoreBtn.setVisibility(View.VISIBLE); // viewBinding.toolbarTopMessageCenterListRl.topMoreIv.setImageResource(R.drawable.clearall); mMessageAdapter = new MessageAdapter(_mActivity); viewBinding.messageRcv.setLayoutManager(new LinearLayoutManager(_mActivity)); viewBinding.messageRcv.setAdapter(mMessageAdapter); } private void initData() { //进来读取一次数据(为了更新currentPage,currentTotal这个值),app启动时候读取,为了刷新消息模块的角标 loadNextPageMessageList(true, 1, FilterType.all, FilterType.all, FilterType.all, FilterType.all, FilterType.all, FilterType.all, true); } @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void onEventMessage(BaseEventBus eventBus) { super.onEventMessage(eventBus); if (eventBus == null) { return; } //接收外部点击事件 if (eventBus.getTopic().equals(ConstantManage.homepage_title_tab_switch)) { if (eventBus.getType().equals(HomepageTitleTabSwitch.message.toString())) { // 取消粘性事件 EventBus.getDefault().removeStickyEvent(eventBus); //进来读取一次数据(为了更新currentPage,currentTotal这个值) // initData(); HdlLogLogic.print("正在点击【消息】"); } } else if (eventBus.getTopic().equals(ConstantManage.message_function_push_post)) { if (eventBus.getType().equals(MessageStateType.untreated)) { updateListData(); }/* else if (eventBus.getType().equals(MessageStateType.processed)) { updateListData(); }*/ } } /** * 加载一页数据 * * @param pageNo 页数 * @param isShowLoading 是否启动加载框 true启动 * @param deviceType_filter_key 类型(设备,等级,时间) * @param deviceType_filter_value deviceType(INV :逆变器;BMS :BMS控制盒;BATTERY :电池单元); * type(FAULT :故障; WARN :告警; EVENT :事件(提示)); * timeType(TODAY :今天;LAST_3_DAYS: 近3天;LAST_7_DAYS :近7天;LAST_30_DAYS :近30天); * @param isClear true表示清空缓存 */ private void loadNextPageMessageList( boolean isShowLoading, int pageNo, String deviceType_filter_key, String deviceType_filter_value, String type_filter_key, String type_filter_value, String timeType_filter_key, String timeType_filter_value, boolean isClear) { if (isClear) { //表示从第一页可以读取,默认清空所有缓存数据; clearCacheData(); } //第一页读取数据强制读 if (pageNo > 1 && mCurrentPage > mCurrentTotal) { --mCurrentPage; //当前页不能大于总页数 return; } isLoadingMore = true;//标记读取状态 if (isShowLoading) { showLoading(); } String messageStateType; if (isAlarmDeviceClick) { messageStateType = MessageStateType.untreated; } else { messageStateType = MessageStateType.processed; } HdlMessageLogic.getInstance().getPageNoMessageList("", pageNo, messageStateType, deviceType_filter_key, deviceType_filter_value, type_filter_key, type_filter_value, timeType_filter_key, timeType_filter_value, "", new CloudCallBeak() { @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(); } } @Override public void onFailure(HDLException e) { if (mCurrentPage > 1) { --mCurrentPage; } isLoadingMore = false; if (isShowLoading) { hideLoading(); } HdlThreadLogic.toast(_mActivity, e.getMsg() + "(" + e.getCode() + ")"); } }); } /** * 刷新列表数据 */ private void updateListData() { HdlThreadLogic.runMainThread(new Runnable() { @Override public void run() { //读取缓存数据 updateCacheData(); //刷新列表 updateRecyclerViewList(); //显示未读信息总数量 getUnreadCount(); if (isAlarmDeviceClick) { refreshNascentTotalCount(mTotalCount); } else { refreshRecoverTotalCount(mTotalCount); } //显示没数据Ui样式 nullDataUpdateUi(); } }); } /** * 刷新发送中消息总数量 * * @param nascentTotalCount 发送中消息总数量 */ private void refreshNascentTotalCount(int nascentTotalCount) { HdlThreadLogic.runMainThread(new Runnable() { @Override public void run() { //设备报警总数量 TextView nascentTv = _mActivity.findViewById(R.id.message_tab_nascent_title_tv); if (nascentTv != null) { nascentTv.setText(getText(R.string.message_nascent)); if (nascentTotalCount > 0) { String s = getText(R.string.message_nascent) + "(" + nascentTotalCount + ")"; nascentTv.setText(s); } } } }); } /** * 刷新报警记录消息总数量 * * @param recoverTotalCount 报警记录消息总数量 */ private void refreshRecoverTotalCount(int recoverTotalCount) { HdlThreadLogic.runMainThread(new Runnable() { @Override public void run() { //报警记录总数量 TextView recoverTV = _mActivity.findViewById(R.id.message_tab_recover_title_tv); if (recoverTV != null) { recoverTV.setText(getText(R.string.alarm_record)); if (recoverTotalCount > 0) { String s = getText(R.string.alarm_record) + "(" + recoverTotalCount + ")"; recoverTV.setText(s); } } } }); } /** * 刷新【消息模块】下角标数值 * * @param unreadCount 未读信息数量总数 */ private void refreshUnreadCount(int unreadCount) { HdlThreadLogic.runMainThread(new Runnable() { @SuppressLint("SetTextI18n") @Override public void run() { TextView textView = _mActivity.findViewById(R.id.my_message_bottom_il2).findViewById(R.id.red_count_tv); if (textView != null) { if (unreadCount == 0) { textView.setVisibility(View.GONE); } else { textView.setVisibility(View.VISIBLE); if (unreadCount > 99) { textView.setText("99+"); } else { textView.setText(unreadCount + ""); } } } } }); } /** * 重新更新列表数据 */ private void updateRecyclerViewList() { if (mMessageAdapter == null) { return; } mMessageAdapter.setList(mList); } /** * 清空所有缓存数据(获取第一页之前要清空所有缓存数据) */ private void clearCacheData() { mList.clear(); HdlMessageLogic.getInstance().clearListMessage();//表示强制清空所有缓存信息 } /** * 更新缓存数据 */ private void updateCacheData() { mList.clear(); if (isAlarmDeviceClick) { //设备报警 mList.addAll(HdlMessageLogic.getInstance().getNascentMessageMemoryList()); } else { //报警记录 mList.addAll(HdlMessageLogic.getInstance().getRecoverMessageMemoryList()); } } /** * 读取消息【未读数量,未处理总数量,已处理总数量】 */ private void getUnreadCount() { HdlMessageLogic.getInstance().getMessageUntreatedCount("", new CloudCallBeak() { @Override public void onSuccess(UnCountBean unCountBean) { HdlThreadLogic.runMainThread(new Runnable() { @Override public void run() { if (unCountBean == null) { return; } refreshUnreadCount(unCountBean.getUnreadCount()); if (isRefreshTotalCount) { isRefreshTotalCount = false; refreshNascentTotalCount(unCountBean.getUntreatedCount()); refreshRecoverTotalCount(unCountBean.getProcessedCount()); } } }); } @Override public void onFailure(HDLException e) { HdlThreadLogic.runMainThread(new Runnable() { @Override public void run() { 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); } /** * 查找过滤值 * * @param title 标题 * @return 过滤值 */ public String findFilterValueString(String title) { Map map = new HashMap<>(); map.put(getString(R.string.alarm_all_device), "");//设备全部 map.put(getString(R.string.alarm_all_device_inverter), "INV"); map.put(getString(R.string.alarm_all_device_bms), "BMS"); map.put(getString(R.string.alarm_all_device_battery_cell), "BATTERY"); map.put(getString(R.string.alarm_all_device_load_centre), "LOAD_CENTRE"); map.put(getString(R.string.alarm_all_grade), "");//设等级全部 map.put(getString(R.string.alarm_all_grade_malfunction), "FAULT"); map.put(getString(R.string.alarm_all_grade_warning), "WARN"); map.put(getString(R.string.alarm_all_grade_tip), "EVENT"); map.put(getString(R.string.alarm_all_time), "");//时间全部 map.put(getString(R.string.alarm_all_time_same_day), "TODAY"); map.put(getString(R.string.alarm_all_time_3), "LAST_3_DAYS"); map.put(getString(R.string.alarm_all_time_7), "LAST_7_DAYS"); map.put(getString(R.string.alarm_all_time_30), "LAST_30_DAYS"); for (Map.Entry entry : map.entrySet()) { if (title.equals(entry.getKey())) { return entry.getValue(); } } return ""; } /** * 获取类型列表 * * @param filterType 过滤类型 * @return 返回类型列表 */ private List getTypeList(String filterType) { List stringList = new ArrayList<>(); switch (filterType) { case FilterType.deviceType: { stringList.add(getString(R.string.alarm_all_device)); stringList.add(getString(R.string.alarm_all_device_inverter)); stringList.add(getString(R.string.alarm_all_device_bms)); stringList.add(getString(R.string.alarm_all_device_battery_cell)); stringList.add(getString(R.string.alarm_all_device_load_centre)); } break; case FilterType.type: { stringList.add(getString(R.string.alarm_all_grade)); stringList.add(getString(R.string.alarm_all_grade_malfunction)); stringList.add(getString(R.string.alarm_all_grade_warning)); stringList.add(getString(R.string.alarm_all_grade_tip)); } break; case FilterType.timeType: { stringList.add(getString(R.string.alarm_all_time)); stringList.add(getString(R.string.alarm_all_time_same_day)); stringList.add(getString(R.string.alarm_all_time_3)); stringList.add(getString(R.string.alarm_all_time_7)); stringList.add(getString(R.string.alarm_all_time_30)); } break; } return stringList; } }