| | |
| | | |
| | | import androidx.annotation.NonNull; |
| | | import androidx.appcompat.content.res.AppCompatResources; |
| | | import androidx.core.app.ActivityCompat; |
| | | |
| | | import android.Manifest; |
| | | import android.content.IntentFilter; |
| | | import android.content.UriPermission; |
| | | import android.content.pm.PackageManager; |
| | | import android.os.Bundle; |
| | | import android.os.Parcel; |
| | | import android.os.Parcelable; |
| | | import android.view.MotionEvent; |
| | | import android.os.Process; |
| | | import android.text.TextUtils; |
| | | import android.view.View; |
| | | |
| | | import com.google.gson.Gson; |
| | | import com.google.gson.reflect.TypeToken; |
| | | import com.hdl.linkpm.sdk.core.exception.HDLException; |
| | | import com.hdl.linkpm.sdk.home.type.HomeType; |
| | | import com.hdl.photovoltaic.R; |
| | | import com.hdl.photovoltaic.base.CustomBaseActivity; |
| | | import com.hdl.photovoltaic.bean.MqttInfo; |
| | | import com.hdl.photovoltaic.broadcast.NetworkChangeReceiver; |
| | | import com.hdl.photovoltaic.config.ConstantManage; |
| | | import com.hdl.photovoltaic.config.UserConfigManage; |
| | | import com.hdl.photovoltaic.databinding.ActivityMyPowerStationBinding; |
| | | import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch; |
| | | import com.hdl.photovoltaic.enums.NetworkType; |
| | | import com.hdl.photovoltaic.listener.CloudCallBeak; |
| | | import com.hdl.photovoltaic.other.HdlCommonLogic; |
| | | import com.hdl.photovoltaic.other.HdlDeviceLogic; |
| | | import com.hdl.photovoltaic.other.HdlLogLogic; |
| | | import com.hdl.photovoltaic.other.HdlMqttLogic; |
| | | import com.hdl.photovoltaic.other.HdlOtaLogic; |
| | | import com.hdl.photovoltaic.other.HdlThreadLogic; |
| | | import com.hdl.photovoltaic.other.HdlUniLogic; |
| | | import com.hdl.photovoltaic.ui.bean.DeviceRemoteInfo; |
| | | import com.hdl.photovoltaic.ui.bean.OidBean; |
| | | import com.hdl.photovoltaic.uni.HDLUniMP; |
| | | import com.hdl.photovoltaic.utils.AppManagerUtils; |
| | | import com.hdl.photovoltaic.utils.PermissionUtils; |
| | | import com.hdl.sdk.link.HDLLinkLocalSdk; |
| | | import com.hdl.sdk.link.common.event.EventListener; |
| | | import com.hdl.sdk.link.core.bean.LinkResponse; |
| | | import com.hdl.sdk.link.core.bean.ModbusResponse; |
| | | import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus; |
| | | import com.hdl.sdk.link.core.bean.gateway.GatewayBean; |
| | | import com.hdl.sdk.link.core.config.HDLLinkConfig; |
| | | import com.hdl.sdk.link.core.utils.mqtt.MqttRecvClient; |
| | | |
| | | import org.greenrobot.eventbus.EventBus; |
| | | import org.greenrobot.eventbus.Subscribe; |
| | | import org.greenrobot.eventbus.ThreadMode; |
| | | |
| | | import java.lang.reflect.Type; |
| | | import java.util.List; |
| | | |
| | | |
| | | /** |
| | | * 我的电站界面 |
| | | */ |
| | | public class MyPowerStationActivity extends CustomBaseActivity { |
| | | |
| | | |
| | | private ActivityMyPowerStationBinding viewBinding; |
| | | private int currentFragmentIndex = 0; |
| | | private int currentFragmentIndex = 1; |
| | | private EventListener allTopicsListener; |
| | | |
| | | private int backPressTimes; |
| | | |
| | | private NetworkChangeReceiver networkChangeReceiver; |
| | | |
| | | |
| | | @Override |
| | |
| | | |
| | | @Override |
| | | public void onBindView(Bundle savedInstanceState) { |
| | | getWindow().setStatusBarColor(getColor(R.color.text_245EC3)); |
| | | setNotificationBarBackgroundColor(CustomColor.blue); |
| | | //初始化 |
| | | initView(); |
| | | this.initView(); |
| | | //初始化界面监听器 |
| | | initEvent(); |
| | | this.initEvent(); |
| | | //注册监听 |
| | | registerAllTopicsListener(); |
| | | this.registerAllTopicsListener(); |
| | | //初始化mqtt客户端 |
| | | this.initMqttClient(); |
| | | //监听网络状态变化 |
| | | this.networkMonitoring(); |
| | | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 监听网络状态变化 |
| | | */ |
| | | private void networkMonitoring() { |
| | | IntentFilter intentFilter = new IntentFilter(); |
| | | intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); |
| | | networkChangeReceiver = new NetworkChangeReceiver(); |
| | | registerReceiver(networkChangeReceiver, intentFilter); |
| | | } |
| | | |
| | | private void initEvent() { |
| | | viewBinding.myPowerStationBottomIl1.clickTv.setOnClickListener(new View.OnClickListener() { |
| | | @Override |
| | | public void onClick(View v) { |
| | | currentFragmentIndex = 0; |
| | | bottomViewChangeOfStyle(); |
| | | } |
| | | }); |
| | | viewBinding.myPowerStationBottomIl2.clickTv.setOnClickListener(new View.OnClickListener() { |
| | | @Override |
| | | public void onClick(View v) { |
| | | currentFragmentIndex = 1; |
| | | bottomViewChangeOfStyle(); |
| | | postEventBus(HomepageTitleTabSwitch.powerstation); |
| | | } |
| | | }); |
| | | viewBinding.myMessageBottomIl2.clickTv.setOnClickListener(new View.OnClickListener() { |
| | | @Override |
| | | public void onClick(View v) { |
| | | currentFragmentIndex = 2; |
| | | bottomViewChangeOfStyle(); |
| | | postEventBus(HomepageTitleTabSwitch.message); |
| | | |
| | | } |
| | | }); |
| | | viewBinding.myMeBottomIl3.clickTv.setOnClickListener(new View.OnClickListener() { |
| | | @Override |
| | | public void onClick(View v) { |
| | | currentFragmentIndex = 3; |
| | | bottomViewChangeOfStyle(); |
| | | postEventBus(HomepageTitleTabSwitch.me); |
| | | } |
| | | }); |
| | | |
| | | |
| | | } |
| | | |
| | |
| | | HdlUniLogic.getInstance().checkRemoveOtherUniMPEventCallBack(); |
| | | //移除监听 |
| | | HDLLinkLocalSdk.getInstance().removeAllTopicsListener(allTopicsListener); |
| | | //移除监听网络状态变化 |
| | | unregisterReceiver(networkChangeReceiver); |
| | | |
| | | } |
| | | |
| | | private void initView() { |
| | | viewBinding.myPowerStationBottomIl1.titleTv.setText(R.string.my_power_station_电站); |
| | | viewBinding.myPowerStationBottomIl2.titleTv.setText(R.string.my_power_station_我的); |
| | | viewBinding.myPowerStationBottomIl1.titleTv.setText("首页");// |
| | | viewBinding.myMessageBottomIl2.titleTv.setText(R.string.message); |
| | | viewBinding.myMeBottomIl3.titleTv.setText(R.string.power_station_me); |
| | | this.bottomViewChangeOfStyle(); |
| | | |
| | | } |
| | | |
| | | private void bottomViewChangeOfStyle() { |
| | | if (this.currentFragmentIndex == 0) { |
| | | viewBinding.myPowerStationFcv1.setVisibility(View.VISIBLE); |
| | | viewBinding.myPowerStationFcv2.setVisibility(View.GONE); |
| | | if (this.currentFragmentIndex == 1) { |
| | | viewBinding.myPowerStationFcv1.setVisibility(View.VISIBLE);//显示电站界面 |
| | | viewBinding.myMessageFcv2.setVisibility(View.GONE);//隐藏消息界面 |
| | | viewBinding.myMeFcv3.setVisibility(View.GONE);//隐藏我的界面 |
| | | viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.selectedpowerstation)); |
| | | viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_90000000)); |
| | | viewBinding.myPowerStationBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.unselectedme)); |
| | | viewBinding.myPowerStationBottomIl2.titleTv.setTextColor(getColor(R.color.text_65000000)); |
| | | } else { |
| | | viewBinding.myPowerStationFcv1.setVisibility(View.GONE); |
| | | viewBinding.myPowerStationFcv2.setVisibility(View.VISIBLE); |
| | | viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_unselected)); |
| | | viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_65000000)); |
| | | viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.unselectedme)); |
| | | viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_65000000)); |
| | | } else if (this.currentFragmentIndex == 2) { |
| | | viewBinding.myPowerStationFcv1.setVisibility(View.GONE);//隐藏电站界面 |
| | | viewBinding.myMessageFcv2.setVisibility(View.VISIBLE);//显示消息界面 |
| | | viewBinding.myMeFcv3.setVisibility(View.GONE);//隐藏我的界面 |
| | | viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.unselectedpowerstation)); |
| | | viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_65000000)); |
| | | viewBinding.myPowerStationBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.selectedme)); |
| | | viewBinding.myPowerStationBottomIl2.titleTv.setTextColor(getColor(R.color.text_90000000)); |
| | | |
| | | |
| | | viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_select)); |
| | | viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_90000000)); |
| | | viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.unselectedme)); |
| | | viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_65000000)); |
| | | } else if (this.currentFragmentIndex == 3) { |
| | | viewBinding.myPowerStationFcv1.setVisibility(View.GONE);//隐藏电站界面 |
| | | viewBinding.myMessageFcv2.setVisibility(View.GONE);//隐藏消息界面 |
| | | viewBinding.myMeFcv3.setVisibility(View.VISIBLE);//显示我的界面 |
| | | viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.unselectedpowerstation)); |
| | | viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_65000000)); |
| | | viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_unselected)); |
| | | viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_65000000)); |
| | | viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.selectedme)); |
| | | viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_90000000)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 发布点击事件 |
| | | * |
| | | * @param tabSwitch - |
| | | */ |
| | | private void postEventBus(HomepageTitleTabSwitch tabSwitch) { |
| | | BaseEventBus baseEventBus = new BaseEventBus(); |
| | | baseEventBus.setTopic(ConstantManage.homepage_title_tab_switch); |
| | | baseEventBus.setType(tabSwitch.toString()); |
| | | EventBus.getDefault().post(baseEventBus); |
| | | } |
| | | |
| | | public void requestPermissions() { |
| | | String[] ary = PermissionUtils.checkPermission(_mActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}); |
| | |
| | | allTopicsListener = new EventListener() { |
| | | @Override |
| | | public void onMessage(Object msg) { |
| | | if (msg instanceof LinkResponse) { |
| | | LinkResponse response = (LinkResponse) msg; |
| | | |
| | | if (msg == null) { |
| | | return; |
| | | } |
| | | if (msg instanceof ModbusResponse) { |
| | | ModbusResponse response = (ModbusResponse) msg; |
| | | if (response.getTopic() == null) { |
| | | return; |
| | | } |
| | | HdlLogLogic.print("监听到的数据===========" + new Gson().toJson(response)); |
| | | HdlLogLogic.print("监听到Modbus数据--->" + new Gson().toJson(response), false); |
| | | // if (response.getTopic().endsWith("custom/native/inverter/up")) { |
| | | HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean(); |
| | | uniCallBackBaseBean.setType(response.getTopic()); |
| | |
| | | HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_MODEL, uniCallBackBaseBean); |
| | | // } |
| | | |
| | | } else if (msg instanceof LinkResponse) { |
| | | LinkResponse linkResponse = (LinkResponse) msg; |
| | | if (linkResponse.getTopic() == null) { |
| | | return; |
| | | } |
| | | if (linkResponse.getTopic().endsWith("/ota/device/progress/up")) { |
| | | HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean(); |
| | | uniCallBackBaseBean.setType(linkResponse.getTopic()); |
| | | uniCallBackBaseBean.setData(linkResponse.getData()); |
| | | HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_REPLY_OTA_MODEL, uniCallBackBaseBean); |
| | | HdlLogLogic.print(linkResponse.getTopic() + new Gson().toJson(linkResponse.getData()), true); |
| | | } else if (linkResponse.getTopic().endsWith("/custom/device/list/upload")) { |
| | | //逆变器有新oid通知主题 |
| | | if (linkResponse.getData() == null) { |
| | | HdlLogLogic.print("逆变器有新oid通知--->数据为空", false); |
| | | return; |
| | | } |
| | | try { |
| | | Gson gson = new Gson(); |
| | | Type typeOfT = new TypeToken<List<OidBean>>() { |
| | | }.getType(); |
| | | String json = gson.toJson(linkResponse.getData()); |
| | | List<OidBean> oidList = gson.fromJson(json, typeOfT); |
| | | //增量增加add |
| | | HdlDeviceLogic.getInstance().updateOidAdd(UserConfigManage.getInstance().getHomeId(), oidList, null); |
| | | } catch (Exception ignored) { |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | HDLLinkLocalSdk.getInstance().registerAllTopicsListener(allTopicsListener); |
| | | } |
| | | |
| | | ; |
| | | HDLLinkLocalSdk.getInstance(). |
| | | |
| | | registerAllTopicsListener(allTopicsListener); |
| | | } |
| | | |
| | | /** |
| | | * 初始化mqtt客户端 |
| | | */ |
| | | public void initMqttClient() { |
| | | HdlMqttLogic.getInstance().getMqttRemoteInfo(HomeType.A, new CloudCallBeak<MqttInfo>() { |
| | | @Override |
| | | public void onSuccess(MqttInfo info) { |
| | | if (info != null) { |
| | | MqttRecvClient.init(_mActivity, info.getUrl(), info.getClientId(), info.getUserName(), info.getPassWord()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void onFailure(HDLException e) { |
| | | HdlLogLogic.print("读取mqtt远程信息失败--->" + e.getMessage(), e.getCode(), true); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | @Subscribe(threadMode = ThreadMode.MAIN) |
| | | public void onEventMessage(BaseEventBus event) { |
| | | |
| | | if (event == null) { |
| | | return; |
| | | } |
| | | if (TextUtils.isEmpty(event.getTopic())) { |
| | | return; |
| | | } |
| | | //网关更新mqtt秘钥更新通知 |
| | | if (event.getTopic().contains("/custom/mqtt/secret/change")) { |
| | | String[] topics = event.getTopic().split("/"); |
| | | //主题不符合规则不处理 |
| | | if (topics.length < 3) { |
| | | return; |
| | | } |
| | | int index = -1; |
| | | List<GatewayBean> list = HdlDeviceLogic.getInstance().getCurrentHomeGatewayList(UserConfigManage.getInstance().getHomeId()); |
| | | for (int i = 0; i < list.size(); i++) { |
| | | GatewayBean gatewayBean = list.get(i); |
| | | if (gatewayBean.getGatewayId().equals(topics[2])) { |
| | | index = i; |
| | | break; |
| | | } |
| | | } |
| | | if (index > -1) { |
| | | GatewayBean gatewayBean = list.get(index); |
| | | HdlDeviceLogic.getInstance().getDeviceRemoteInfo(UserConfigManage.getInstance().getHomeId(), gatewayBean.getSpk(), gatewayBean.getDevice_mac(), new CloudCallBeak<DeviceRemoteInfo>() { |
| | | @Override |
| | | public void onSuccess(DeviceRemoteInfo deviceRemoteInfo) { |
| | | if (deviceRemoteInfo != null) { |
| | | //更新mqtt通讯的新秘钥 |
| | | gatewayBean.setAesKey(deviceRemoteInfo.getSecret()); |
| | | //用之前的库,底层mqtt订阅,加解密会用到该参数; |
| | | HDLLinkConfig.getInstance().setAesKey(deviceRemoteInfo.getSecret());//设置mqtt通讯秘钥库 |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void onFailure(HDLException e) { |
| | | |
| | | } |
| | | }); |
| | | } |
| | | } else if (event.getTopic().contains(HdlOtaLogic.localDownloadProgress)) { |
| | | //下载云端驱动或者固件文件到本地,自己计算进度条上报到uni那边 |
| | | HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean(); |
| | | uniCallBackBaseBean.setType(event.getType()); |
| | | uniCallBackBaseBean.setData(event.getData()); |
| | | HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_REPLY_OTA_MODEL, uniCallBackBaseBean); |
| | | HdlLogLogic.print(event.getTopic() + new Gson().toJson(event.getData()), true); |
| | | } else if (event.getTopic().contains(ConstantManage.network_change_post)) { |
| | | // String wifi_ssid = WifiUtils.getInstance().getCurrentConnectWifiSsid();//获取WiFi的ssid需要位置权限的 |
| | | HdlLogLogic.print("监听网络状态--->" + event.getData().toString() + "(" + event.getType() + ")", true); |
| | | //第一次启动App,以及切换网络的时候更新 |
| | | if (TextUtils.isEmpty(UserConfigManage.getInstance().getHomeId())) { |
| | | return; |
| | | } |
| | | if (!event.getType().equals(NetworkType.no_network.toString())) { |
| | | // AppManagerUtils.getAppManager().showLoading(); |
| | | HdlThreadLogic.runSubThread(new Runnable() { |
| | | @Override |
| | | public void run() { |
| | | HdlDeviceLogic.getInstance().getCurrentHomeLocalAndCloudGatewayList(UserConfigManage.getInstance().getHomeId(), new CloudCallBeak<List<GatewayBean>>() { |
| | | @Override |
| | | public void onSuccess(List<GatewayBean> obj) { |
| | | // AppManagerUtils.getAppManager().hideLoading(); |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void onFailure(HDLException e) { |
| | | // AppManagerUtils.getAppManager().hideLoading(); |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 物理按键返回事件 |
| | | */ |
| | | @Override |
| | | public void onBackPressed() { |
| | | if (AppManagerUtils.getAppManager().getActivitySize() <= 1) { |
| | | if (backPressTimes == 0) { |
| | | HdlThreadLogic.toast(_mActivity, R.string.kill_app); |
| | | backPressTimes = 1; |
| | | new Thread() { |
| | | @Override |
| | | public void run() { |
| | | try { |
| | | Thread.sleep(2000); |
| | | } catch (InterruptedException e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | backPressTimes = 0; |
| | | } |
| | | } |
| | | }.start(); |
| | | return; |
| | | } else { |
| | | AppManagerUtils.getAppManager().finishAllActivity(); |
| | | Process.killProcess(Process.myPid()); |
| | | } |
| | | } |
| | | super.onBackPressed(); |
| | | } |
| | | |
| | | |