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 0000000..91d7681 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_device_all_show.png differ 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 0000000..08cc733 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_device_entry.png differ 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 0000000..143b475 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_device_manager.png differ 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 0000000..576c318 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_device_online_status.png differ 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 +