From 761ec4b0fdb704cc2f19a999fc17bd1cc5ba9aab Mon Sep 17 00:00:00 2001 From: wenfei Date: Fri, 30 Jan 2026 17:01:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=9C=A8=E7=BA=BF=E6=83=85?= =?UTF-8?q?=E5=86=B5=20=E8=BF=9B=E5=BA=A6=E9=A1=B5=E9=9D=A2=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 7 + .../main/java/com/rehome/zhdcoa/Contans.java | 7 +- .../zhdcoa/bean/DeviceOnlineStatusBean.java | 56 +++ .../ui/activity/DeviceAlarmInfoActivity.kt | 4 +- .../activity/DeviceAlarmInfoDetailActivity.kt | 2 +- .../DeviceAlarmInfoLineChartActivity.java | 42 ++- .../ui/activity/DeviceEntryActivity.java | 151 ++++++++ .../activity/DeviceOnlineStatusActivity.java | 154 ++++++++ .../zhdcoa/ui/activity/LoginActivity.kt | 4 +- .../zhdcoa/ui/fragment/YunXingFragment.kt | 18 +- .../com/rehome/zhdcoa/utils/HttpUtils.java | 8 + .../com/rehome/zhdcoa/utils/NohttpUtils.java | 60 +++ .../zhdcoa/weiget/CircularProgressBar.java | 343 ++++++++++++++++++ .../drawable-xhdpi/icon_device_all_show.png | Bin 0 -> 7117 bytes .../res/drawable-xhdpi/icon_device_entry.png | Bin 0 -> 6337 bytes .../drawable-xhdpi/icon_device_manager.png | Bin 0 -> 8338 bytes .../icon_device_online_status.png | Bin 0 -> 6400 bytes .../res/drawable/icon_more_vector_asset.xml | 20 + .../activity_device_alarm_info_line_chart.xml | 2 +- .../main/res/layout/activity_device_entry.xml | 26 ++ .../layout/activity_device_online_status.xml | 184 ++++++++++ app/src/main/res/layout/activity_login.xml | 1 - app/src/main/res/values/attrs.xml | 64 ++++ app/src/main/res/values/colors.xml | 5 + app/src/main/res/values/strings.xml | 5 + 26 files changed, 1139 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/com/rehome/zhdcoa/bean/DeviceOnlineStatusBean.java create mode 100644 app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceEntryActivity.java create mode 100644 app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlineStatusActivity.java create mode 100644 app/src/main/java/com/rehome/zhdcoa/weiget/CircularProgressBar.java create mode 100644 app/src/main/res/drawable-xhdpi/icon_device_all_show.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_device_entry.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_device_manager.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_device_online_status.png create mode 100644 app/src/main/res/drawable/icon_more_vector_asset.xml create mode 100644 app/src/main/res/layout/activity_device_entry.xml create mode 100644 app/src/main/res/layout/activity_device_online_status.xml diff --git a/app/build.gradle b/app/build.gradle index 2c8a0de..d88e941 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -169,6 +169,8 @@ dependencies { implementation libs.androidx.emoji.bundled //二维码扫描 implementation libs.barcode.scanning +// //环型进度条 +// implementation 'io.github.lilongweidev:easyview:1.0.6' // implementation('org.dom4j:dom4j:2.1.3') { // exclude group: 'pull-parser', module: 'pull-parser' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a0a8692..8a134ed 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -82,6 +82,7 @@ tools:replace="android:allowBackup" tools:targetApi="s"> + @@ -448,6 +449,12 @@ + + diff --git a/app/src/main/java/com/rehome/zhdcoa/Contans.java b/app/src/main/java/com/rehome/zhdcoa/Contans.java index 5dd2b24..1a1d2f8 100644 --- a/app/src/main/java/com/rehome/zhdcoa/Contans.java +++ b/app/src/main/java/com/rehome/zhdcoa/Contans.java @@ -55,9 +55,10 @@ public class Contans { //public static String BASE_URL_EXTRANET = "https://172.16.25.75:7082/"; //App巡检,点检外网服务器 public static String IP_EXTRANET = "https://219.131.195.3:7081/"; + //public static String IP_EXTRANET = "https://172.16.25.75:7081/"; // public static String BASE_URL_EXTRANET = "http://192.168.2.215:8082/";//app公司内网开发服务器 -// public static String IP_EXTRANET = "http://192.168.2.215:9005/"; + @@ -69,11 +70,13 @@ public class Contans { public static String BASE_URL_COMPANY_SERVER_INTRANET= "https://mobile.zhp.geg.com.cn:7011/"; //智慧安防平台登录 电厂外网 public static String BASE_URL_COMPANY_SERVER_EXTRANET= "https://219.131.195.3:7011/"; + //public static String BASE_URL_COMPANY_SERVER_EXTRANET= "https://172.16.25.75:7011/"; //AI三维可视化安防平台登录 电厂内网 //public static String BASE_URL_AI_3D_SERVER_INTRANET= "http://10.19.0.114:8100/"; public static String BASE_URL_AI_3D_SERVER_INTRANET= "https://mobile.zhp.geg.com.cn:7100/"; //AI三维可视化安防平台登录 电厂外网 public static String BASE_URL_AI_3D_SERVER_EXTRANET= "https://219.131.195.3:7100/"; + //public static String BASE_URL_AI_3D_SERVER_EXTRANET= "https://172.16.25.75:7100/"; //腾讯浏览服务key public static String TBS_LICENSE_KEY= "4ktUk0LXU2iC2Dx/oesZcwiKAOZ4YXvjSQ4OFCcx+5e1csWD0cYNfCdXe2LpY+mB"; //考试列表页面刷新数据 @@ -536,6 +539,8 @@ public class Contans { //设备预警信息列表 //http://10.19.0.17:1700/dserver/device/vibration/monitoring/list?deviceCode=002c005e&startTime=2026-01-21+14:37:00&endTime=2026-01-22+23:59:59&v=1769063841074 public final static String DeviceAlermInfoDataListUrl = "dserver/device/vibration/monitoring/list"; + public final static String DeviceOnlineStatusUrl = "dserver/device/online/data"; + public final static String DeviceOnlineStatusListUrl = "dserver/device/list"; //人员组织结构模块 用户验证接口token public final static String AUTHENTICATIONLOGINTOKEN = "AUTHENTICATIONLOGINTOKEN"; //人员组织结构模块 下次登录时间 diff --git a/app/src/main/java/com/rehome/zhdcoa/bean/DeviceOnlineStatusBean.java b/app/src/main/java/com/rehome/zhdcoa/bean/DeviceOnlineStatusBean.java new file mode 100644 index 0000000..1ea7151 --- /dev/null +++ b/app/src/main/java/com/rehome/zhdcoa/bean/DeviceOnlineStatusBean.java @@ -0,0 +1,56 @@ +package com.rehome.zhdcoa.bean; + +import java.util.List; + +public class DeviceOnlineStatusBean extends DeviceAlarmBaseBean{ + private DeviceOnlineStatusData data; + + public DeviceOnlineStatusData getData() { + return data; + } + + public void setData(DeviceOnlineStatusData data) { + this.data = data; + } + + public static class DeviceOnlineStatusData { + // --- 在线 + private Integer onlineCount; + // --- 离线 + private Integer offlineCount; + private List onlineDevices; + private List offlineDevices; + + public Integer getOnlineCount() { + return onlineCount; + } + + public void setOnlineCount(Integer onlineCount) { + this.onlineCount = onlineCount; + } + + public Integer getOfflineCount() { + return offlineCount; + } + + public void setOfflineCount(Integer offlineCount) { + this.offlineCount = offlineCount; + } + + public List getOnlineDevices() { + return onlineDevices; + } + + public void setOnlineDevices(List onlineDevices) { + this.onlineDevices = onlineDevices; + } + + public List getOfflineDevices() { + return offlineDevices; + } + + public void setOfflineDevices(List offlineDevices) { + this.offlineDevices = offlineDevices; + } + } +} diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceAlarmInfoActivity.kt b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceAlarmInfoActivity.kt index d865927..d990028 100644 --- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceAlarmInfoActivity.kt +++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceAlarmInfoActivity.kt @@ -116,7 +116,7 @@ class DeviceAlarmInfoActivity : BaseActivityOaToolbarViewBinding { +public class DeviceAlarmInfoLineChartActivity extends BaseActivityOaToolbarViewBinding { private String deviceCode; private String deviceName; //格式化日期的对象(转化成习惯的时间格式) @@ -93,21 +95,41 @@ public class DeviceAlarmInfoLineChartActivity extends BaseViewBindingActivity xLabelListDataZqpl = new ArrayList<>(); private ArrayList xLabelListDataFreq = new ArrayList<>(); +// @Override +// protected ActivityDeviceAlarmInfoLineChartBinding getBinding() { +// return ActivityDeviceAlarmInfoLineChartBinding.inflate(LayoutInflater.from(this)); +// } + + @NonNull @Override - protected ActivityDeviceAlarmInfoLineChartBinding getBinding() { + protected ActivityDeviceAlarmInfoLineChartBinding getViewBinding() { return ActivityDeviceAlarmInfoLineChartBinding.inflate(LayoutInflater.from(this)); } + @NonNull @Override - protected Toolbar getToolbar() { - return binding.toolbarView.toolbarYx; + protected OAToolbar getToolbar() { + return binding.toolbarView.toolbar; } +// @Override +// protected Toolbar getToolbar() { +// return binding.toolbarView.toolbarYx; +// } @Override protected void initView() { - this.setStatusBar(); - binding.toolbarView.titleYx.setText("曲线图-测振测温设备"); - setBack(); +// this.setStatusBar(); +// binding.toolbarView.titleYx.setText("曲线图-测振测温设备"); +// setBack(); + initToolbar("图表-测振测温设备", "刷新", new View.OnClickListener() { + @Override + public void onClick(View v) { + if(deviceCode!=null){ + showLog(deviceCode); + getDeviceAlarmInfoLineChartData(); + } + } + }); //静态方法getInstance()使用默认时区和语言环境获得一个日历。 Calendar calendarNow = Calendar.getInstance(); @@ -315,7 +337,7 @@ public class DeviceAlarmInfoLineChartActivity extends BaseViewBindingActivity item = new ArrayList<>(); + + String name = App.getInstance().getUserInfo().getManid().toUpperCase(); + + if (name.contains("CKCX")) { + item.add(0); + item.add(8); + item.add(9); + flag = false; + } + gv.setSelector(new ColorDrawable(Color.TRANSPARENT)); + gv.setAdapter(new GridViewYXAdapter(this, getGridViewData(), item, flag)); + gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + Intent intent; + switch (i) { + case 0: + intent = new Intent(DeviceEntryActivity.this, SbinfoActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + break; + case 1: + intent = new Intent(DeviceEntryActivity.this, DeviceAlarmInfoActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + break; + case 2: + intent = new Intent(DeviceEntryActivity.this, DeviceOnlineStatusActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + break; + case 3: +// intent = new Intent(DeviceEntryActivity.this, MaterialIssue.class); +// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); +// startActivity(intent); + break; + case 4: +// intent = new Intent(DeviceEntryActivity.this, TlrkActivity.class); +// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); +// startActivity(intent); + break; + case 5: + intent = new Intent(DeviceEntryActivity.this, JstkActivity.class); + startActivity(intent); + break; + case 6: + intent = new Intent(DeviceEntryActivity.this, ShelvesShift.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + break; + case 7: + intent = new Intent(DeviceEntryActivity.this, WztpScActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + break; + case 8: + intent = new Intent(DeviceEntryActivity.this, TmdyActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + break; + case 9: + intent = new Intent(DeviceEntryActivity.this, HjbqdyActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + break; + case 10: + intent = new Intent(DeviceEntryActivity.this, WztpblScActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + break; + } + } + }); + } + + private List getGridViewData() { + List datas = new ArrayList<>(); + for (int i = 0; i < str.length; i++) { + GridViewBean bean = new GridViewBean(); + bean.setTitle(str[i]); + bean.setImageid(imageId[i]); + bean.setShow(false); + datas.add(bean); + } + return datas; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlineStatusActivity.java b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlineStatusActivity.java new file mode 100644 index 0000000..427472d --- /dev/null +++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceOnlineStatusActivity.java @@ -0,0 +1,154 @@ +package com.rehome.zhdcoa.ui.activity; + +import static com.rehome.zhdcoa.utils.GsonUtils.GsonToBean; + +import android.annotation.SuppressLint; +import android.graphics.Color; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; + +import androidx.activity.EdgeToEdge; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.rehome.zhdcoa.Contans; +import com.rehome.zhdcoa.R; +import com.rehome.zhdcoa.base.BaseActivityOaToolbarViewBinding; +import com.rehome.zhdcoa.bean.DeviceAlarmInfoLineChartBean; +import com.rehome.zhdcoa.bean.DeviceOnlineStatusBean; +import com.rehome.zhdcoa.databinding.ActivityDeviceOnlineStatusBinding; +import com.rehome.zhdcoa.utils.AuthenticationLoginAIUtils; +import com.rehome.zhdcoa.utils.HttpListener; +import com.rehome.zhdcoa.utils.NohttpUtils; +import com.rehome.zhdcoa.utils.OnAuthenticationLoginListener; +import com.rehome.zhdcoa.utils.RSAAndroid; +import com.rehome.zhdcoa.weiget.OAToolbar; +import com.yolanda.nohttp.NoHttp; +import com.yolanda.nohttp.RequestMethod; +import com.yolanda.nohttp.rest.Request; + +import java.math.RoundingMode; +import java.text.DecimalFormat; + + +/** + * 设备在线情况 + */ + +public class DeviceOnlineStatusActivity extends BaseActivityOaToolbarViewBinding { + + @NonNull + @Override + protected ActivityDeviceOnlineStatusBinding getViewBinding() { + return ActivityDeviceOnlineStatusBinding.inflate(LayoutInflater.from(this)); + } + + @NonNull + @Override + protected OAToolbar getToolbar() { + return binding.toolbarView.toolbar; + } + + @Override + protected void initView() { +// this.setStatusBar(); + initToolbar("设备在线情况", "刷新", new View.OnClickListener() { + @Override + public void onClick(View v) { + authenticationLoginDeviceAlarmInfoRsa(); + } + }); + //binding.basdLl.setBackgroundColor(Color.argb(178, 0, 45, 85)); + //binding.circularProgressBar.setCustomAngle(0); + //0, 45, 85, 0.7 + +// // 方法1:使用Color类 +// view.setBackgroundColor(Color.argb(128, 0, 0, 255)) +// +//// 方法2:使用十六进制值 +// view.setBackgroundColor(0x800000FF.toInt()) +// +//// 方法3:解析颜色字符串 +// view.setBackgroundColor(Color.parseColor("#800000FF")) + + } + + @Override + protected void initData() { + authenticationLoginDeviceAlarmInfoRsa(); + } + + private void authenticationLoginDeviceAlarmInfoRsa() { + try { + //AI三维登录接口 + String userName = Contans.SP.DeviceAlermInfoAccount; + String strPublicDecode = RSAAndroid.decryptByPublicKeyForSpiltStr( + Contans.SP.DeviceAlermInfoPwd, + RSAAndroid.publicRsaKeyLocal + ); + AuthenticationLoginAIUtils.authenticationDeviceAlermInfoRsaShowProgress(this,userName,strPublicDecode,new OnAuthenticationLoginListener(){ + @Override + public void onAuthenticationSuccess(boolean result, String token) { + if(token!=null&&token.isEmpty()){ + //登录失败 + showToast("设备状态智能监测及分析平台登录失败"); + }else{ + //登录成功 + getDeviceOnlineStatusData(); + } + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + public void getDeviceOnlineStatusData() { + + String url = Contans.IP + Contans.DeviceOnlineStatusUrl; + Request request = NoHttp.createStringRequest(url, RequestMethod.GET); + + NohttpUtils.getInstance().add(this,0, request, new HttpListener() { + + @SuppressLint({"SetTextI18n", "DefaultLocale"}) + @Override + public void onSucceed(int what, com.yolanda.nohttp.rest.Response response) { + + String result = response.get(); + showLog(result); + + + DeviceOnlineStatusBean bean = GsonToBean(result, DeviceOnlineStatusBean.class); + if(bean!=null && bean.getCode()==20000 && bean.isSuccess() && bean.getData()!=null){ + DeviceOnlineStatusBean.DeviceOnlineStatusData data = bean.getData(); + int total = data.getOnlineCount()+data.getOfflineCount(); + binding.tvOnline.setText(data.getOnlineCount().toString()); + binding.tvOffline.setText(data.getOfflineCount().toString()); + binding.tvTotal.setText(String.valueOf(total)); + double progress = (data.getOnlineCount() / (double) total *100); + + DecimalFormat df = new DecimalFormat("#.#"); + df.setRoundingMode(RoundingMode.HALF_UP); // 设置截断模式 + Double progressDouble = Double.valueOf(df.format(progress)); + + binding.circularProgressBar.setText(String.format("%.0f", progressDouble) + "%"); + binding.circularProgressBar.setProgress((float) progress); + + showLog(String.valueOf(progress)); + showLog(String.valueOf(progressDouble)); + //String.format("%.0f", progress) + }else{ + showLog("数据加载失败"); + } + } + + @Override + public void onFailed(int what, com.yolanda.nohttp.rest.Response response) { + + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/LoginActivity.kt b/app/src/main/java/com/rehome/zhdcoa/ui/activity/LoginActivity.kt index eea57f7..fb363a5 100644 --- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/LoginActivity.kt +++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/LoginActivity.kt @@ -246,7 +246,9 @@ class LoginActivity : BaseActivityOaToolbarViewBinding() { // binding.etUsername.setText("310249") // binding.etPassword.setText("GZgs#@0249") - + //张富荣 +// binding.etUsername.setText("310272") +// binding.etPassword.setText("zh0272AS*") //公司内网215管理员 // binding.etUsername.setText("ZHPS_Admin") diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/YunXingFragment.kt b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/YunXingFragment.kt index 4a97805..9ce3f1d 100644 --- a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/YunXingFragment.kt +++ b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/YunXingFragment.kt @@ -50,6 +50,7 @@ import com.rehome.zhdcoa.service.PushService import com.rehome.zhdcoa.service.UploadDataService import com.rehome.zhdcoa.ui.activity.AjhxcglActivity import com.rehome.zhdcoa.ui.activity.DeviceAlarmInfoActivity +import com.rehome.zhdcoa.ui.activity.DeviceEntryActivity import com.rehome.zhdcoa.ui.activity.GdActivity import com.rehome.zhdcoa.ui.activity.SbinfoActivity import com.rehome.zhdcoa.ui.activity.SbxdjglActivity @@ -97,8 +98,7 @@ class YunXingFragment : BaseViewBindingKotlinFragment() "工单录入", "巡视抄表", "定期工作", - "设备报表查询", - "设备预警信息", + "设备" ) private val imageId = intArrayOf( R.drawable.icon8, @@ -109,8 +109,7 @@ class YunXingFragment : BaseViewBindingKotlinFragment() R.drawable.icon13, R.drawable.icon6, R.drawable.dingqi, - R.drawable.icon_baobiao, - R.drawable.icon_yujing + R.drawable.icon_device_entry ) /** @@ -168,6 +167,7 @@ class YunXingFragment : BaseViewBindingKotlinFragment() binding?.gvYx?.onItemClickListener = AdapterView.OnItemClickListener { parent: AdapterView<*>?, view: View?, position: Int, id: Long -> val intent: Intent + //DeviceEntryActivity when (position) { 0 -> { intent = Intent(activity, SbxdjglActivity::class.java) @@ -229,14 +229,14 @@ class YunXingFragment : BaseViewBindingKotlinFragment() } 8 -> { - intent = Intent(activity, SbinfoActivity::class.java) + intent = Intent(activity, DeviceEntryActivity::class.java) startActivity(intent) } - 9 -> { - intent = Intent(activity, DeviceAlarmInfoActivity::class.java) - startActivity(intent) - } +// 9 -> { +// intent = Intent(activity, DeviceAlarmInfoActivity::class.java) +// startActivity(intent) +// } else -> {} } diff --git a/app/src/main/java/com/rehome/zhdcoa/utils/HttpUtils.java b/app/src/main/java/com/rehome/zhdcoa/utils/HttpUtils.java index b6cb292..ff126d4 100644 --- a/app/src/main/java/com/rehome/zhdcoa/utils/HttpUtils.java +++ b/app/src/main/java/com/rehome/zhdcoa/utils/HttpUtils.java @@ -184,6 +184,14 @@ public class HttpUtils { httpClientBuilder.hostnameVerifier((hostname, session) -> true); // 信任所有主机名 } } + if(url.startsWith("https://172.16.25.75:7100")||url.startsWith("https://172.16.25.75:7011")||url.startsWith("https://172.16.25.75:7081")||url.startsWith("https://172.16.25.75:7082")){ + SSLSocketFactory socketFactory = getSSLSocketFactory(context); + if (socketFactory != null) { + TrustManagerFactory trustManagerFactory = getTrustManagerFactory(context); + httpClientBuilder.sslSocketFactory(socketFactory, (X509TrustManager) trustManagerFactory.getTrustManagers()[0]); + httpClientBuilder.hostnameVerifier((hostname, session) -> true); // 信任所有主机名 + } + } return httpClientBuilder.build(); } diff --git a/app/src/main/java/com/rehome/zhdcoa/utils/NohttpUtils.java b/app/src/main/java/com/rehome/zhdcoa/utils/NohttpUtils.java index 7bac774..b2e6f21 100644 --- a/app/src/main/java/com/rehome/zhdcoa/utils/NohttpUtils.java +++ b/app/src/main/java/com/rehome/zhdcoa/utils/NohttpUtils.java @@ -101,6 +101,18 @@ public class NohttpUtils { }); } } + if(url.startsWith("https://172.16.25.75:7100")||url.startsWith("https://172.16.25.75:7011")||url.startsWith("https://172.16.25.75:7081")||url.startsWith("https://172.16.25.75:7082")){ + SSLSocketFactory socketFactory = NohttpUtils.getSSLSocketFactory(mActivity); + if (socketFactory != null) { + request.setSSLSocketFactory(socketFactory); + request.setHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }); + } + } } mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, canCanel, isLoading, msg)); } @@ -137,6 +149,18 @@ public class NohttpUtils { }); } } + if(url.startsWith("https://172.16.25.75:7100")||url.startsWith("https://172.16.25.75:7011")||url.startsWith("https://172.16.25.75:7081")||url.startsWith("https://172.16.25.75:7082")){ + SSLSocketFactory socketFactory = NohttpUtils.getSSLSocketFactory(mActivity); + if (socketFactory != null) { + request.setSSLSocketFactory(socketFactory); + request.setHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }); + } + } } mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, canCanel, isLoading, msg)); } @@ -166,6 +190,18 @@ public class NohttpUtils { }); } } + if(url.startsWith("https://172.16.25.75:7100")||url.startsWith("https://172.16.25.75:7011")||url.startsWith("https://172.16.25.75:7081")||url.startsWith("https://172.16.25.75:7082")){ + SSLSocketFactory socketFactory = NohttpUtils.getSSLSocketFactory(mActivity); + if (socketFactory != null) { + request.setSSLSocketFactory(socketFactory); + request.setHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }); + } + } } mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, true, true, "数据加载中...")); } @@ -193,6 +229,18 @@ public class NohttpUtils { }); } } + if(url.startsWith("https://172.16.25.75:7100")||url.startsWith("https://172.16.25.75:7011")||url.startsWith("https://172.16.25.75:7081")||url.startsWith("https://172.16.25.75:7082")){ + SSLSocketFactory socketFactory = NohttpUtils.getSSLSocketFactory(mActivity); + if (socketFactory != null) { + request.setSSLSocketFactory(socketFactory); + request.setHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }); + } + } } mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, true, true, progressTitle)); } @@ -220,6 +268,18 @@ public class NohttpUtils { }); } } + if(url.startsWith("https://172.16.25.75:7100")||url.startsWith("https://172.16.25.75:7011")||url.startsWith("https://172.16.25.75:7081")||url.startsWith("https://172.16.25.75:7082")){ + SSLSocketFactory socketFactory = NohttpUtils.getSSLSocketFactory(context); + if (socketFactory != null) { + request.setSSLSocketFactory(socketFactory); + request.setHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }); + } + } } mQueue.add(what, request, new HttpResponseListenerNoProgress(request, callback)); } diff --git a/app/src/main/java/com/rehome/zhdcoa/weiget/CircularProgressBar.java b/app/src/main/java/com/rehome/zhdcoa/weiget/CircularProgressBar.java new file mode 100644 index 0000000..031bf90 --- /dev/null +++ b/app/src/main/java/com/rehome/zhdcoa/weiget/CircularProgressBar.java @@ -0,0 +1,343 @@ +package com.rehome.zhdcoa.weiget; + + +import android.animation.ValueAnimator; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Shader; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import com.rehome.zhdcoa.R; + +/** + * 圆环进度条 + * + * @author llw + * @since 2023/4/3 + */ +public class CircularProgressBar extends View { + + /** + * 半径 + */ + private int mRadius; + /** + * 进度条宽度 + */ + private int mStrokeWidth; + + /** + * 进度条背景颜色 + */ + private int mProgressbarBgColor; + + /** + * 进度条进度颜色 + */ + private int mProgressColor; + + /** + * 开始角度 + */ + private int mStartAngle = 0; + + /** + * 当前角度 + */ + private float mCurrentAngle = 0; + + /** + * 结束角度 + */ + private int mEndAngle = 360; + /** + * 最大进度 + */ + private float mMaxProgress; + /** + * 当前进度 + */ + private float mCurrentProgress; + /** + * 文字 + */ + private String mText; + /** + * 文字颜色 + */ + private int mTextColor; + /** + * 文字大小 + */ + private float mTextSize; + /** + * 是否渐变 + */ + private boolean isGradient; + /** + * 渐变颜色数组 + */ + private int[] colorArray; + /** + * 动画的执行时长 + */ + private long mDuration = 1000; + /** + * 是否执行动画 + */ + private boolean isAnimation = false; + /** + * 是否逆时针绘制 + */ + private boolean isCounterClockwise = false; + + public CircularProgressBar(Context context) { + this(context, null); + } + + public CircularProgressBar(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public CircularProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CircularProgressBar); + mRadius = array.getDimensionPixelSize(R.styleable.CircularProgressBar_radius, 80); + mStrokeWidth = array.getDimensionPixelSize(R.styleable.CircularProgressBar_strokeWidth, 8); + mProgressbarBgColor = array.getColor(R.styleable.CircularProgressBar_progressbarBackgroundColor, ContextCompat.getColor(context, R.color.teal_700)); + mProgressColor = array.getColor(R.styleable.CircularProgressBar_progressbarColor, ContextCompat.getColor(context, R.color.teal_200)); + mMaxProgress = array.getInt(R.styleable.CircularProgressBar_maxProgress, 100); + mCurrentProgress = array.getInt(R.styleable.CircularProgressBar_progress, 0); + String text = array.getString(R.styleable.CircularProgressBar_text); + mText = text == null ? "" : text; + mTextColor = array.getColor(R.styleable.CircularProgressBar_textColor, ContextCompat.getColor(context, R.color.black)); + mTextSize = array.getDimensionPixelSize(R.styleable.CircularProgressBar_textSize, (int) TypedValue + .applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, getResources().getDisplayMetrics())); + //是否渐变 + isGradient = array.getBoolean(R.styleable.CircularProgressBar_gradient, false); + //渐变颜色数组 + CharSequence[] textArray = array.getTextArray(R.styleable.CircularProgressBar_gradientColorArray); + if (textArray != null) { + colorArray = new int[textArray.length]; + for (int i = 0; i < textArray.length; i++) { + colorArray[i] = Color.parseColor((String) textArray[i]); + } + } + // 开始角度 + mStartAngle = array.getInt(R.styleable.CircularProgressBar_customAngle, 0); + // 是否逆时针绘制 + isCounterClockwise = array.getBoolean(R.styleable.CircularProgressBar_counterClockwise, false); + array.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = 0; + switch (MeasureSpec.getMode(widthMeasureSpec)) { + case MeasureSpec.UNSPECIFIED: + case MeasureSpec.AT_MOST: //wrap_content + width = mRadius * 2; + break; + case MeasureSpec.EXACTLY: //match_parent + width = MeasureSpec.getSize(widthMeasureSpec); + break; + } + //Set the measured width and height + setMeasuredDimension(width, width); + } + + @Override + protected void onDraw(Canvas canvas) { + int centerX = getWidth() / 2; + RectF rectF = new RectF(); + rectF.left = mStrokeWidth / 2; + rectF.top = mStrokeWidth / 2; + rectF.right = centerX * 2 - mStrokeWidth / 2; + rectF.bottom = centerX * 2 - mStrokeWidth / 2; + + //绘制进度条背景 + drawProgressbarBg(canvas, rectF); + //绘制进度 + drawProgress(canvas, rectF); + //绘制中心文本 + drawCenterText(canvas, centerX); + } + + /** + * 绘制进度条背景 + */ + private void drawProgressbarBg(Canvas canvas, RectF rectF) { + Paint mPaint = new Paint(); + //画笔的填充样式,Paint.Style.STROKE 描边 + mPaint.setStyle(Paint.Style.STROKE); + //圆弧的宽度 + mPaint.setStrokeWidth(mStrokeWidth); + //抗锯齿 + mPaint.setAntiAlias(true); + //画笔的颜色 + mPaint.setColor(mProgressbarBgColor); + //画笔的样式 Paint.Cap.Round 圆形 + mPaint.setStrokeCap(Paint.Cap.ROUND); + //开始画圆弧 + canvas.drawArc(rectF, mStartAngle, mEndAngle, false, mPaint); + } + + /** + * 绘制进度 + */ + private void drawProgress(Canvas canvas, RectF rectF) { + Paint paint = new Paint(); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(mStrokeWidth); + paint.setColor(mProgressColor); + + if (isGradient && colorArray != null) { + paint.setShader(new LinearGradient(0, 0, rectF.right, rectF.top, colorArray, null, Shader.TileMode.MIRROR)); + } + + paint.setAntiAlias(true); + paint.setStrokeCap(Paint.Cap.ROUND); + if (!isAnimation) { + mCurrentAngle = 360 * (mCurrentProgress / mMaxProgress); + } + + // 根据 isCounterClockwise 调整绘制角度 + float startAngle = mStartAngle; + float sweepAngle = mCurrentAngle; + if (isCounterClockwise) { + startAngle = mStartAngle - 360; + sweepAngle = -mCurrentAngle; + } + + canvas.drawArc(rectF, startAngle, sweepAngle, false, paint); + } + + /** + * 绘制中心文字 + */ + private void drawCenterText(Canvas canvas, int centerX) { + Paint paint = new Paint(); + paint.setAntiAlias(true); + paint.setColor(mTextColor); + paint.setTextAlign(Paint.Align.CENTER); + paint.setTextSize(mTextSize); + Rect textBounds = new Rect(); + paint.getTextBounds(mText, 0, mText.length(), textBounds); + canvas.drawText(mText, centerX, textBounds.height() / 2 + getHeight() / 2, paint); + } + + /** + * 设置当前进度 + */ + public void setProgress(float progress) { + if (progress < 0) { + throw new IllegalArgumentException("Progress value can not be less than 0"); + } + if (progress > mMaxProgress) { + progress = mMaxProgress; + } + mCurrentProgress = progress; + mCurrentAngle = 360 * (mCurrentProgress / mMaxProgress); + setAnimator(mStartAngle, mCurrentAngle); + } + + /** + * 设置文本 + */ + public void setText(String text) { + mText = text; + } + + /** + * 设置文本的颜色 + */ + public void setTextColor(int color) { + if (color <= 0) { + throw new IllegalArgumentException("Color value can not be less than 0"); + } + mTextColor = color; + } + + /** + * 设置文本的大小 + */ + public void setTextSize(float textSize) { + if (textSize <= 0) { + throw new IllegalArgumentException("textSize can not be less than 0"); + } + mTextSize = textSize; + } + + /** + * 设置角度 + * @param angle 角度 + */ + public void setCustomAngle(int angle) { + if (angle >= 0 && angle < 90) { + mStartAngle = 0; + } else if (angle >= 90 && angle < 180) { + mStartAngle = 90; + } else if (angle >= 180 && angle < 270) { + mStartAngle = 180; + } else if (angle >= 270 && angle < 360) { + mStartAngle = 270; + } else if (angle >= 360) { + mStartAngle = 0; + } + invalidate(); + } + + /** + * 设置是否渐变 + */ + public void setGradient(boolean gradient) { + isGradient = gradient; + } + + /** + * 设置是否逆时针 + * @param counterClockwise + */ + public void setCounterClockwise(boolean counterClockwise) { + isCounterClockwise = counterClockwise; + invalidate(); + } + + /** + * 设置渐变的颜色 + */ + public void setColorArray(int[] colorArr) { + if (colorArr == null) return; + colorArray = colorArr; + } + + + /** + * 设置动画 + * + * @param start 开始位置 + * @param target 结束位置 + */ + private void setAnimator(float start, float target) { + isAnimation = true; + ValueAnimator animator = ValueAnimator.ofFloat(start, target); + animator.setDuration(mDuration); + animator.setTarget(mCurrentAngle); + //动画更新监听 + animator.addUpdateListener(valueAnimator -> { + mCurrentAngle = (float) valueAnimator.getAnimatedValue(); + invalidate(); + }); + animator.start(); + } +} diff --git a/app/src/main/res/drawable-xhdpi/icon_device_all_show.png b/app/src/main/res/drawable-xhdpi/icon_device_all_show.png new file mode 100644 index 0000000000000000000000000000000000000000..91d7681ae68af5da88f0a29b2bf0121b70be63b1 GIT binary patch literal 7117 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_device_entry.png b/app/src/main/res/drawable-xhdpi/icon_device_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..08cc73331122545b8dde45b85b2bd3a0e1f64b28 GIT binary patch literal 6337 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 We}jRpB=3(%Kv7Qhd4-JGoBskX`PlaW literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_device_manager.png b/app/src/main/res/drawable-xhdpi/icon_device_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..143b4758d9b7d4af3ecf26f2d1b564296557d230 GIT binary patch literal 8338 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 Wb-3Vdv-?Yh0ji1`FRSD&BK{2^P!|yZ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_device_online_status.png b/app/src/main/res/drawable-xhdpi/icon_device_online_status.png new file mode 100644 index 0000000000000000000000000000000000000000..576c318638a0f025281a096ac5755efffadd14c9 GIT binary patch literal 6400 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 MDFw-Las4m<1r!bm$p8QV literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icon_more_vector_asset.xml b/app/src/main/res/drawable/icon_more_vector_asset.xml new file mode 100644 index 0000000..2d967ea --- /dev/null +++ b/app/src/main/res/drawable/icon_more_vector_asset.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_device_alarm_info_line_chart.xml b/app/src/main/res/layout/activity_device_alarm_info_line_chart.xml index 105ac6a..3114d93 100644 --- a/app/src/main/res/layout/activity_device_alarm_info_line_chart.xml +++ b/app/src/main/res/layout/activity_device_alarm_info_line_chart.xml @@ -8,7 +8,7 @@ + layout="@layout/layout_base" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_device_online_status.xml b/app/src/main/res/layout/activity_device_online_status.xml new file mode 100644 index 0000000..c0f7692 --- /dev/null +++ b/app/src/main/res/layout/activity_device_online_status.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index fba836e..88a9a9c 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -180,7 +180,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" - android:checked="true" android:text="aTrust" /> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 446363f..8c0b22e 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -80,5 +80,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 846d6cc..6ed0180 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -79,5 +79,10 @@ #90505050 #90FF0000 + #FF03DAC5 + #FF018786 + #0aefcc + #129be0 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1047bea..5c7be68 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,11 @@ 内网资源 外网资源 代理域名 + + #00FFF7 + #FFDD00 + #FF0000 +