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.pngapp/src/main/res/drawable-xhdpi/open.pngapp/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>