[author] yjj

[desc]安全检测仪4G模块调试
1、接触wifiHelper和SimHelper之间的耦合关联
2、新增NetWorkHelper,统一管理wifi和4G网络相关
3、修改http请求服务器ip地址
4、增加用于测试的log显示view
5、4G流量使用情况参数修改未mobile
main
YJJ 10 months ago
parent 2e5b1c5676
commit c58d15f777

@ -11,6 +11,7 @@
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 修改系统屏幕亮度 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 修改系统屏幕亮度 -->
<uses-permission <uses-permission
android:name="android.permission.WRITE_SETTINGS" android:name="android.permission.WRITE_SETTINGS"

@ -1,6 +1,7 @@
package com.yinuo.safetywatcher.watcher.base package com.yinuo.safetywatcher.watcher.base
import android.content.Context import android.content.Context
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.AttributeSet import android.util.AttributeSet
import android.view.KeyEvent import android.view.KeyEvent
@ -18,12 +19,14 @@ import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatRadioButton import androidx.appcompat.widget.AppCompatRadioButton
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.common.commonlib.utils.DateUtils
import com.common.commonlib.utils.LogUtils import com.common.commonlib.utils.LogUtils
import com.common.commonlib.utils.MMKVUtils import com.common.commonlib.utils.MMKVUtils
import com.loper7.date_time_picker.number_picker.NumberPicker import com.loper7.date_time_picker.number_picker.NumberPicker
import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.ActivityBaseBinding import com.yinuo.safetywatcher.databinding.ActivityBaseBinding
import com.yinuo.safetywatcher.watcher.constant.NAMESPACE_ANDROID import com.yinuo.safetywatcher.watcher.constant.NAMESPACE_ANDROID
import com.yinuo.safetywatcher.watcher.log.LogPrintListener
import com.yinuo.safetywatcher.watcher.net.DevicesApi import com.yinuo.safetywatcher.watcher.net.DevicesApi
import com.yinuo.safetywatcher.watcher.ui.view.CommonDialog import com.yinuo.safetywatcher.watcher.ui.view.CommonDialog
import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar import com.yinuo.safetywatcher.watcher.ui.view.CommonTopBar
@ -53,10 +56,27 @@ abstract class BaseActivity : AppCompatActivity() {
var lastFocusView: View? = null var lastFocusView: View? = null
var showLog = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
setViewFactory() setViewFactory()
super.onCreate(null) super.onCreate(null)
setContentView(baseBinding.root) setContentView(baseBinding.root)
// 测试按钮
baseBinding.tvShowLog.setOnClickListener{
showLog = !showLog
baseBinding.scrollview.visibility = if (showLog) View.VISIBLE else View.GONE
}
baseBinding.tvExit.setOnClickListener{
val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_HOME)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivityForResult(intent, 1111)
// finish()
}
initSound() initSound()
setChildContent() setChildContent()
initView() initView()
@ -116,7 +136,14 @@ abstract class BaseActivity : AppCompatActivity() {
} }
} }
public val baseLogListener = object : LogPrintListener {
override fun log(msg: String?) {
printLog(msg)
}
}
private fun setTopBar() { private fun setTopBar() {
baseBinding.topBar.logListener = baseLogListener
val title = getTopBarTitle() val title = getTopBarTitle()
title?.let { title?.let {
baseBinding.topBar.setTitle(it) baseBinding.topBar.setTitle(it)
@ -334,4 +361,10 @@ abstract class BaseActivity : AppCompatActivity() {
baseBinding.root.removeCallbacks(hideVoiceAreaRunnable) baseBinding.root.removeCallbacks(hideVoiceAreaRunnable)
baseBinding.root.postDelayed(hideVoiceAreaRunnable, delayTime) baseBinding.root.postDelayed(hideVoiceAreaRunnable, delayTime)
} }
public fun printLog(msg : String?){
runOnUiThread {
baseBinding.tvLog.text = StringBuilder().append(DateUtils.getNowTimeFormat(DateUtils.DATE_TO_STRING_DETAIL_PATTERN)).append(" ").append(msg).append("\n").append(baseBinding.tvLog.text)
}
}
} }

@ -0,0 +1,8 @@
package com.yinuo.safetywatcher.watcher.interfaces
interface NetworkStateCallback {
fun onEnable(enable: Boolean)
fun onLevel(level: Int)
}

@ -0,0 +1,5 @@
package com.yinuo.safetywatcher.watcher.log
interface LogPrintListener {
fun log(msg: String?)
}

@ -11,7 +11,7 @@ import com.yinuo.safetywatcher.watcher.bean.LastTimeResponse
import com.yinuo.safetywatcher.watcher.bean.SosSnReq import com.yinuo.safetywatcher.watcher.bean.SosSnReq
import com.yinuo.safetywatcher.watcher.bean.TrafficReqInfo import com.yinuo.safetywatcher.watcher.bean.TrafficReqInfo
import com.yinuo.safetywatcher.watcher.utils.LztekUtil import com.yinuo.safetywatcher.watcher.utils.LztekUtil
import com.yinuo.safetywatcher.watcher.utils.SimHelper import com.yinuo.safetywatcher.watcher.utils.NetworkHelper
import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observable
import retrofit2.http.Body import retrofit2.http.Body
import retrofit2.http.GET import retrofit2.http.GET
@ -31,13 +31,11 @@ class DevicesApi : BaseObserve<DevicesApi.Api>(Api::class.java) {
observe(api.heartBeat(sosReq), object : RequestNoResultCallBack<BaseResponse>() { observe(api.heartBeat(sosReq), object : RequestNoResultCallBack<BaseResponse>() {
override fun onResult(result: BaseResponse) { override fun onResult(result: BaseResponse) {
super.onResult(result) super.onResult(result)
SimHelper.setNetStatus(true) NetworkHelper.printLog("heartbeat success")
} }
override fun onError(error: String?) { override fun onError(error: String?) {
if (error?.contains("网络") == true) { NetworkHelper.printLog("heartbeat fail : $error")
SimHelper.setNetStatus(false)
}
} }
override fun onComplete() { override fun onComplete() {
@ -46,13 +44,13 @@ class DevicesApi : BaseObserve<DevicesApi.Api>(Api::class.java) {
} }
fun getPushUrl(sn: String, callBack: RequestResultCallBack<GetRtspUrlResponse>) { fun getPushUrl(sn: String, callBack: RequestResultCallBack<GetRtspUrlResponse>) {
if (SimHelper.isNetOk()) { if (NetworkHelper.isNetworkAvailable()) {
observe(api.getPushUrl(sn), callBack) observe(api.getPushUrl(sn), callBack)
} }
} }
fun updateTrafficInfo() { fun updateTrafficInfo() {
if (SimHelper.isNetOk()) { if (NetworkHelper.isNetworkAvailable()) {
val trafficReqInfo = TrafficReqInfo() val trafficReqInfo = TrafficReqInfo()
observe(api.updateTrafficInfo(trafficReqInfo), null) observe(api.updateTrafficInfo(trafficReqInfo), null)
} }
@ -61,7 +59,7 @@ class DevicesApi : BaseObserve<DevicesApi.Api>(Api::class.java) {
suspend fun uploadGasData( suspend fun uploadGasData(
gasList: List<GasReqBean> = emptyList() gasList: List<GasReqBean> = emptyList()
): BaseResponse? { ): BaseResponse? {
if (SimHelper.isNetOk()) { if (NetworkHelper.isNetworkAvailable()) {
try { try {
val gasReq = GasRequest(detections = gasList) val gasReq = GasRequest(detections = gasList)
return api.uploadGasData(gasReq) return api.uploadGasData(gasReq)
@ -73,7 +71,7 @@ class DevicesApi : BaseObserve<DevicesApi.Api>(Api::class.java) {
} }
suspend fun getDetectionLastTime(): LastTimeResponse? { suspend fun getDetectionLastTime(): LastTimeResponse? {
if (SimHelper.isNetOk()) { if (NetworkHelper.isNetworkAvailable()) {
try { try {
return api.getDetectionLastTime(LztekUtil.getSn()) return api.getDetectionLastTime(LztekUtil.getSn())
} catch (e: Exception) { } catch (e: Exception) {
@ -84,7 +82,7 @@ class DevicesApi : BaseObserve<DevicesApi.Api>(Api::class.java) {
} }
suspend fun getVideoLastTime(): LastTimeResponse? { suspend fun getVideoLastTime(): LastTimeResponse? {
if (SimHelper.isNetOk()) { if (NetworkHelper.isNetworkAvailable()) {
try { try {
return api.getVideoLastTime(LztekUtil.getSn()) return api.getVideoLastTime(LztekUtil.getSn())
} catch (e: Exception) { } catch (e: Exception) {
@ -95,7 +93,7 @@ class DevicesApi : BaseObserve<DevicesApi.Api>(Api::class.java) {
} }
fun sendSosAlarm() { fun sendSosAlarm() {
if (SimHelper.isNetOk()) { if (NetworkHelper.isNetworkAvailable()) {
// 1sos关闭 2sos打开 // 1sos关闭 2sos打开
val sosStatus = if (LztekUtil.isSosing()) 2 else 1 val sosStatus = if (LztekUtil.isSosing()) 2 else 1
val sosReq = SosSnReq(LztekUtil.getSn(), sosStatus) val sosReq = SosSnReq(LztekUtil.getSn(), sosStatus)

@ -11,7 +11,6 @@ import com.yinuo.safetywatcher.watcher.bean.GetRtspUrlResponse
import com.yinuo.safetywatcher.watcher.constant.HEARTBEAT_TIME import com.yinuo.safetywatcher.watcher.constant.HEARTBEAT_TIME
import com.yinuo.safetywatcher.watcher.net.DevicesApi import com.yinuo.safetywatcher.watcher.net.DevicesApi
import com.yinuo.safetywatcher.watcher.utils.LztekUtil import com.yinuo.safetywatcher.watcher.utils.LztekUtil
import com.yinuo.safetywatcher.watcher.utils.SimHelper
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -45,7 +44,6 @@ class HeartbeatService : IntentService("HeartbeatService") {
private fun handleActionStart(intent: Intent) { private fun handleActionStart(intent: Intent) {
while (true) { while (true) {
heartConter++ heartConter++
// SimHelper.setNetStatus(isOnline())
// 心跳 // 心跳
devicesApi.heartBeat(LztekUtil.getSn()) devicesApi.heartBeat(LztekUtil.getSn())
// 获取推流地址 // 获取推流地址
@ -54,8 +52,6 @@ class HeartbeatService : IntentService("HeartbeatService") {
checkAndUpdateTrafficInfo() checkAndUpdateTrafficInfo()
// 睡眠30s // 睡眠30s
Thread.sleep(HEARTBEAT_TIME) Thread.sleep(HEARTBEAT_TIME)
// // 重新轮回
// handleActionStart(intent)
} }
} }

@ -14,7 +14,7 @@ import com.yinuo.safetywatcher.watcher.bean.GasReqBean
import com.yinuo.safetywatcher.watcher.constant.GAS_CLOUD_UPLOAD_SIZE_ONCE import com.yinuo.safetywatcher.watcher.constant.GAS_CLOUD_UPLOAD_SIZE_ONCE
import com.yinuo.safetywatcher.watcher.net.DevicesApi import com.yinuo.safetywatcher.watcher.net.DevicesApi
import com.yinuo.safetywatcher.watcher.net.UploadFileApi import com.yinuo.safetywatcher.watcher.net.UploadFileApi
import com.yinuo.safetywatcher.watcher.utils.SimHelper import com.yinuo.safetywatcher.watcher.utils.NetworkHelper
import com.yinuo.safetywatcher.watcher.utils.showToast import com.yinuo.safetywatcher.watcher.utils.showToast
import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -53,7 +53,7 @@ class CloudActivity : NoOptionsActivity() {
showToast(getString(R.string.repeat_click_sync_tip)) showToast(getString(R.string.repeat_click_sync_tip))
return@setOnClickListener return@setOnClickListener
} }
if (!SimHelper.isNetOk()){ if (!NetworkHelper.isNetworkAvailable()){
showToast(getString(R.string.net_off)) showToast(getString(R.string.net_off))
return@setOnClickListener return@setOnClickListener
} }
@ -68,7 +68,7 @@ class CloudActivity : NoOptionsActivity() {
showToast(getString(R.string.repeat_click_sync_tip)) showToast(getString(R.string.repeat_click_sync_tip))
return@setOnClickListener return@setOnClickListener
} }
if (!SimHelper.isNetOk()){ if (!NetworkHelper.isNetworkAvailable()){
showToast(getString(R.string.net_off)) showToast(getString(R.string.net_off))
return@setOnClickListener return@setOnClickListener
} }
@ -83,7 +83,7 @@ class CloudActivity : NoOptionsActivity() {
showToast(getString(R.string.repeat_click_sync_tip)) showToast(getString(R.string.repeat_click_sync_tip))
return@setOnClickListener return@setOnClickListener
} }
if (!SimHelper.isNetOk()){ if (!NetworkHelper.isNetworkAvailable()){
showToast(getString(R.string.net_off)) showToast(getString(R.string.net_off))
return@setOnClickListener return@setOnClickListener
} }

@ -28,10 +28,8 @@ import com.yinuo.safetywatcher.watcher.utils.BatteryHelper
import com.yinuo.safetywatcher.watcher.utils.GPIOUtils import com.yinuo.safetywatcher.watcher.utils.GPIOUtils
import com.yinuo.safetywatcher.watcher.utils.LztekUtil import com.yinuo.safetywatcher.watcher.utils.LztekUtil
import com.yinuo.safetywatcher.watcher.utils.RecordHelper import com.yinuo.safetywatcher.watcher.utils.RecordHelper
import com.yinuo.safetywatcher.watcher.utils.SimHelper
import com.yinuo.safetywatcher.watcher.utils.SoundUtils import com.yinuo.safetywatcher.watcher.utils.SoundUtils
import com.yinuo.safetywatcher.watcher.utils.SpeedUtils import com.yinuo.safetywatcher.watcher.utils.SpeedUtils
import com.yinuo.safetywatcher.watcher.utils.WifiHelper
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -299,16 +297,17 @@ class HomeActivity : NoOptionsActivity() {
private fun initTopbarHelper() { private fun initTopbarHelper() {
BatteryHelper.init(this@HomeActivity) BatteryHelper.init(this@HomeActivity)
WifiHelper.init(this@HomeActivity) // 测试用log打印
SimHelper.init(this@HomeActivity) com.yinuo.safetywatcher.watcher.utils.NetworkHelper.setLogPrinter(baseLogListener)
// 注意两个NetworkHelper的区别
com.yinuo.safetywatcher.watcher.utils.NetworkHelper.init(this)
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
BatteryHelper.release(this@HomeActivity) BatteryHelper.release(this@HomeActivity)
WifiHelper.release(this@HomeActivity) com.yinuo.safetywatcher.watcher.utils.NetworkHelper.release(this)
SimHelper.release(this@HomeActivity) mBinding.root.removeCallbacks(reStartCamera)
mBinding.root?.removeCallbacks(reStartCamera)
warnDialog?.dismiss() warnDialog?.dismiss()
Process.killProcess(Process.myPid()) Process.killProcess(Process.myPid())
} }

@ -42,6 +42,7 @@ class NetSettingActivity : NoOptionsActivity() {
val systemService = getSystemService(NETWORK_STATS_SERVICE) as NetworkStatsManager val systemService = getSystemService(NETWORK_STATS_SERVICE) as NetworkStatsManager
val statsHelper = NetworkStatsHelper(systemService) val statsHelper = NetworkStatsHelper(systemService)
val info = statsHelper.getAllDay_MonthMobileInfo(this, false) val info = statsHelper.getAllDay_MonthMobileInfo(this, false)
printLog("流量使用情况:${info.totalData} ==== 下载字节: ${info.rxBytes} ===== 上传字节:${info.txBytes}")
val showStr = if (info != null) TrafficFormat.formatByte(info.totalData) else "0B" val showStr = if (info != null) TrafficFormat.formatByte(info.totalData) else "0B"
mBinding.tvUsed.text = "流量使用情况:$showStr" mBinding.tvUsed.text = "流量使用情况:$showStr"
} }

@ -9,6 +9,7 @@ import android.util.TypedValue
import android.view.Gravity import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.View.OnClickListener
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.Space import android.widget.Space
import android.widget.TextView import android.widget.TextView
@ -16,9 +17,10 @@ import androidx.appcompat.content.res.AppCompatResources
import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.R
import com.yinuo.safetywatcher.databinding.LayoutTopbarBinding import com.yinuo.safetywatcher.databinding.LayoutTopbarBinding
import com.yinuo.safetywatcher.watcher.AppData import com.yinuo.safetywatcher.watcher.AppData
import com.yinuo.safetywatcher.watcher.interfaces.NetworkStateCallback
import com.yinuo.safetywatcher.watcher.log.LogPrintListener
import com.yinuo.safetywatcher.watcher.utils.BatteryHelper import com.yinuo.safetywatcher.watcher.utils.BatteryHelper
import com.yinuo.safetywatcher.watcher.utils.SimHelper import com.yinuo.safetywatcher.watcher.utils.NetworkHelper
import com.yinuo.safetywatcher.watcher.utils.WifiHelper
import com.yinuo.safetywatcher.watcher.utils.trySetCommonBg import com.yinuo.safetywatcher.watcher.utils.trySetCommonBg
class CommonTopBar : LinearLayout { class CommonTopBar : LinearLayout {
@ -30,6 +32,8 @@ class CommonTopBar : LinearLayout {
defStyleAttr defStyleAttr
) )
var logListener : LogPrintListener? = null
var mBinding: LayoutTopbarBinding? = null var mBinding: LayoutTopbarBinding? = null
init { init {
@ -51,10 +55,8 @@ class CommonTopBar : LinearLayout {
mBinding?.fourG?.setImageLevel(100) mBinding?.fourG?.setImageLevel(100)
post { post {
// watch battery
watchBattery() watchBattery()
watchWifi() watchNetWork()
watchSim()
} }
} }
@ -63,8 +65,7 @@ class CommonTopBar : LinearLayout {
Log.i(this@CommonTopBar.javaClass.name, "batteryCallback onLevel = $level charging = $charging") Log.i(this@CommonTopBar.javaClass.name, "batteryCallback onLevel = $level charging = $charging")
mBinding?.root?.post { mBinding?.root?.post {
mBinding?.battery?.setImageLevel(if (charging) 200 else level) mBinding?.battery?.setImageLevel(if (charging) 200 else level)
mBinding?.batteryTxt?.text = "${level.toString()}%" mBinding?.batteryTxt?.text = "${level}%"
dealForNet4()
} }
} }
} }
@ -73,54 +74,44 @@ class CommonTopBar : LinearLayout {
BatteryHelper.addCallBack(batteryCallback) BatteryHelper.addCallBack(batteryCallback)
} }
private val wifiCallback = object : WifiHelper.OnWifiLevelCallback { /**
* wifi状态和信号
* **/
private val wifiCallback = object : NetworkStateCallback {
override fun onEnable(enable: Boolean) { override fun onEnable(enable: Boolean) {
Log.i(this@CommonTopBar.javaClass.name, "wifiCallback onEnable = $enable") Log.i(this@CommonTopBar.javaClass.name, "wifiCallback onEnable = $enable")
logListener?.log("wifiCallback onEnable = $enable")
mBinding?.root?.post { mBinding?.root?.post {
if (!enable || isVirtuallyNet4()) { mBinding?.wifi?.visibility = if (enable) View.VISIBLE else View.GONE
mBinding?.wifi?.visibility = GONE
} else {
// mBinding?.wifi?.visibility = VISIBLE
}
dealForNet4()
} }
} }
override fun onLevel(level: Int) { override fun onLevel(level: Int) {
Log.i(this@CommonTopBar.javaClass.name, "wifiCallback onLevel = $level") Log.i(this@CommonTopBar.javaClass.name, "wifiCallback onLevel = $level")
logListener?.log("wifiCallback onLevel = $level")
mBinding?.root?.post { mBinding?.root?.post {
mBinding?.wifi?.visibility = if (level > 0 && !isVirtuallyNet4()) VISIBLE else GONE mBinding?.wifi?.visibility = if (level > 0) VISIBLE else GONE
val showLevel = (level + 1) * 20 val showLevel = (level + 1) * 20
mBinding?.wifi?.setImageLevel(showLevel) mBinding?.wifi?.setImageLevel(showLevel)
dealForNet4()
} }
} }
} }
private fun watchWifi() { /**
WifiHelper.addCallBack(wifiCallback) * sim卡状态和信号
} * **/
private val simCallback = object : NetworkStateCallback {
private val simCallback = object : SimHelper.OnSimLevelCallback {
override fun onEnable(enable: Boolean) { override fun onEnable(enable: Boolean) {
Log.i(this@CommonTopBar.javaClass.name, "simCallback onEnable = $enable") Log.i(this@CommonTopBar.javaClass.name, "simCallback onEnable = $enable")
logListener?.log("sim enable callback : $enable")
mBinding?.root?.post { mBinding?.root?.post {
if (enable) { mBinding?.fourG?.visibility = if (enable) View.VISIBLE else View.GONE
if (mBinding?.fourG?.visibility != VISIBLE) {
mBinding?.fourG?.visibility = VISIBLE
}
} else {
if (mBinding?.fourG?.visibility != GONE) {
mBinding?.fourG?.visibility = GONE
}
}
dealForNet4()
} }
} }
override fun onLevel(level: Int) { override fun onLevel(level: Int) {
Log.i(this@CommonTopBar.javaClass.name, "simCallback onLevel = $level") Log.i(this@CommonTopBar.javaClass.name, "simCallback onLevel = $level")
logListener?.log("simCallback onLevel = $level")
mBinding?.root?.post { mBinding?.root?.post {
var showLevel = var showLevel =
if (AppData.hasCameraData()) (level / 15 + 1) * 20 else (level + 1) * 20 if (AppData.hasCameraData()) (level / 15 + 1) * 20 else (level + 1) * 20
@ -128,25 +119,15 @@ class CommonTopBar : LinearLayout {
showLevel = 100 showLevel = 100
} }
mBinding?.fourG?.setImageLevel(showLevel) mBinding?.fourG?.setImageLevel(showLevel)
dealForNet4()
} }
} }
} }
private fun dealForNet4() { private fun watchNetWork(){
if (!isVirtuallyNet4()) { NetworkHelper.watch(wifiCallback, simCallback)
mBinding?.fourG?.visibility = GONE
} else {
mBinding?.fourG?.visibility = VISIBLE
mBinding?.wifi?.visibility = GONE
}
}
private fun watchSim() {
SimHelper.addCallBack(simCallback)
} }
open fun setTitle(title: String) { fun setTitle(title: String) {
mBinding?.backArea?.visibility = VISIBLE mBinding?.backArea?.visibility = VISIBLE
mBinding?.title?.text = title mBinding?.title?.text = title
} }
@ -202,8 +183,7 @@ class CommonTopBar : LinearLayout {
override fun onDetachedFromWindow() { override fun onDetachedFromWindow() {
super.onDetachedFromWindow() super.onDetachedFromWindow()
BatteryHelper.removeCallback(batteryCallback) BatteryHelper.removeCallback(batteryCallback)
WifiHelper.removeCallback(wifiCallback) NetworkHelper.removeNetworkCallback(wifiCallback, simCallback)
SimHelper.removeCallback(simCallback)
} }
fun tryFocusBackArea() { fun tryFocusBackArea() {
@ -213,8 +193,4 @@ class CommonTopBar : LinearLayout {
fun getBackArea(): View? { fun getBackArea(): View? {
return mBinding?.backArea return mBinding?.backArea
} }
fun isVirtuallyNet4(): Boolean {
return WifiHelper.getConnectedWifiSSID()?.contains("4G-UFI") ?: false;
}
} }

@ -0,0 +1,74 @@
package com.yinuo.safetywatcher.watcher.utils
import android.content.Context
import com.common.commonlib.CommonApplication
import com.yinuo.safetywatcher.watcher.interfaces.NetworkStateCallback
import com.yinuo.safetywatcher.watcher.log.LogPrintListener
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
object NetworkHelper {
private var lastNetworkState : Boolean = false
private var logPrinter : LogPrintListener? = null
fun init(context: Context){
WifiHelper.init(context)
SimHelper.init(context)
}
fun setLogPrinter(logPrinter: LogPrintListener?){
this.logPrinter = logPrinter
SimHelper.logListener = logPrinter
WifiHelper.logListener = logPrinter
}
fun release(context: Context){
WifiHelper.release(context)
SimHelper.release(context)
}
fun watch(wifiCallback: NetworkStateCallback, simCallback: NetworkStateCallback){
WifiHelper.addCallBack(wifiCallback)
SimHelper.addCallBack(simCallback)
}
fun removeNetworkCallback(wifiCallback: NetworkStateCallback, simCallback: NetworkStateCallback){
SimHelper.removeCallback(simCallback)
WifiHelper.removeCallback(wifiCallback)
}
/**
* 网络是否可用
* **/
fun isNetworkAvailable() : Boolean{
return WifiHelper.isWifiAvailable() || SimHelper.is4GAvailable()
}
/**
* 通知网络变化
*/
@Synchronized
fun notifyNetworkChange(){
// 当前网络状态
val currentNetworkState = isNetworkAvailable()
logPrinter?.log("网络发生变化 curr = $currentNetworkState last = $lastNetworkState")
if (currentNetworkState == lastNetworkState) {
// 网络状态无变化
return
}
// 网络状态有变化
lastNetworkState = currentNetworkState
val str = if (!currentNetworkState) "网络链接断开!" else "网络已连接!"
GlobalScope.launch(Dispatchers.Main) {
CommonApplication.getContext()?.showToast(str)
}
}
fun printLog(msg : String){
logPrinter?.log(msg)
}
}

@ -55,8 +55,8 @@ public class NetworkStatsHelper {
TrafficBean trafficBean = new TrafficBean(); TrafficBean trafficBean = new TrafficBean();
NetworkStats.Bucket bucket; NetworkStats.Bucket bucket;
try { try {
bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE,
getSubscriberId(context, ConnectivityManager.TYPE_WIFI), getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
isDayAndMonth ? TrafficFormat.getTimesmorning() : TrafficFormat.getTimesMonthmorning(), isDayAndMonth ? TrafficFormat.getTimesmorning() : TrafficFormat.getTimesMonthmorning(),
System.currentTimeMillis()); System.currentTimeMillis());
} catch (RemoteException e) { } catch (RemoteException e) {

@ -13,17 +13,17 @@ import android.telephony.SubscriptionInfo
import android.telephony.SubscriptionManager import android.telephony.SubscriptionManager
import android.telephony.TelephonyManager import android.telephony.TelephonyManager
import android.util.Log import android.util.Log
import com.common.commonlib.CommonApplication import com.yinuo.safetywatcher.watcher.interfaces.NetworkStateCallback
import com.common.commonlib.utils.LogUtils import com.yinuo.safetywatcher.watcher.log.LogPrintListener
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
object SimHelper { object SimHelper {
private var callbacks = mutableListOf<OnSimLevelCallback>() private var callbacks = mutableListOf<NetworkStateCallback>()
private var mSimState = -1; private var mSimState = -1
private var mRssi = -1; private var mRssi = -1
private val TAG = javaClass.simpleName
var logListener : LogPrintListener? = null
private val receiver = object : BroadcastReceiver() { private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) { override fun onReceive(context: Context?, intent: Intent?) {
@ -33,17 +33,18 @@ object SimHelper {
callbacks.forEach { callbacks.forEach {
it.onEnable(mSimState == TelephonyManager.SIM_STATE_READY) it.onEnable(mSimState == TelephonyManager.SIM_STATE_READY)
} }
// 通知网络发生变化,可能需要提示用户
NetworkHelper.notifyNetworkChange()
} }
Log.i( Log.i(TAG, "onReceive action = ${intent?.action}, mSimState = $mSimState")
this@SimHelper.javaClass.name,
"onReceive action = ${intent?.action}, mSimState = $mSimState" logListener?.log("onReceive action = ${intent?.action}, mSimState = $mSimState")
)
} }
} }
fun init(context: Context) { fun init(context: Context) {
// watchSimState(context) watchSimState(context)
// watchSimRssi(context) watchSimRssi(context)
} }
private fun watchSimRssi(context: Context) { private fun watchSimRssi(context: Context) {
@ -58,9 +59,10 @@ object SimHelper {
callbacks.forEach { callbacks.forEach {
it.onLevel(mRssi) it.onLevel(mRssi)
} }
Log.i( // 通知网络发生变化,可能需要提示用户
this@SimHelper.javaClass.name, "onSignalStrengthsChanged mRssi = $mRssi" NetworkHelper.notifyNetworkChange()
) Log.i(TAG, "onSignalStrengthsChanged mRssi = $mRssi")
logListener?.log("onSignalStrengthsChanged mRssi = $mRssi")
} }
}, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)
} }
@ -70,7 +72,7 @@ object SimHelper {
context.registerReceiver(receiver, filter) context.registerReceiver(receiver, filter)
} }
fun addCallBack(callBack: OnSimLevelCallback) { fun addCallBack(callBack: NetworkStateCallback) {
callbacks.add(callBack) callbacks.add(callBack)
if (mSimState != -1) { if (mSimState != -1) {
callBack.onEnable(mSimState == TelephonyManager.SIM_STATE_READY) callBack.onEnable(mSimState == TelephonyManager.SIM_STATE_READY)
@ -80,7 +82,7 @@ object SimHelper {
} }
} }
fun removeCallback(callBack: OnSimLevelCallback) { fun removeCallback(callBack: NetworkStateCallback) {
callbacks.remove(callBack) callbacks.remove(callBack)
} }
@ -89,12 +91,6 @@ object SimHelper {
context.unregisterReceiver(receiver) context.unregisterReceiver(receiver)
} }
interface OnSimLevelCallback {
fun onEnable(enable: Boolean)
fun onLevel(level: Int)
}
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
@Synchronized @Synchronized
fun getNewerSlotSubscriptionInfo(context: Context, slot: Int): SubscriptionInfo? { fun getNewerSlotSubscriptionInfo(context: Context, slot: Int): SubscriptionInfo? {
@ -102,10 +98,7 @@ object SimHelper {
if (list != null) { if (list != null) {
for (info in list) { for (info in list) {
if (slot == info.simSlotIndex) { if (slot == info.simSlotIndex) {
Log.i( Log.i(TAG, "SlotIndex : " + info.simSlotIndex + " displayName : " + info.displayName)
this@SimHelper.javaClass.name,
"SlotIndex : " + info.simSlotIndex + " displayName : " + info.displayName
)
return info return info
} }
} }
@ -113,49 +106,33 @@ object SimHelper {
return null return null
} }
private var isNetOK = false // 4G模块开发去除方法
private var counter = 0 // private var isNetOK = false
// private var counter = 0
fun setNetStatus(status: Boolean) { //
LogUtils.w("setNetStatus before=$isNetOK now =$status") // fun setNetStatus(from : String, status: Boolean) {
tryNoifyUser(status) // LogUtils.w("setNetStatus before=$isNetOK now =$status")
isNetOK = status // tryNoifyUser(status)
// UI刷新要慢 // isNetOK = status
if (counter % 6 == 0) { // // UI刷新要慢
counter = 0 // if (counter % 6 == 0) {
val netSpeed = getNetSpeed() // counter = 0
callbacks.forEach { // val netSpeed = getNetSpeed()
it.onEnable(status) // callbacks.forEach {
mSimState = if (status) { // logListener?.log("setNetStatus : onEnable : $status from : $from")
TelephonyManager.SIM_STATE_READY // it.onEnable(status)
} else { // mSimState = if (status) {
-1 // TelephonyManager.SIM_STATE_READY
} // } else {
it.onLevel(netSpeed) // -1
mRssi = netSpeed // }
} // it.onLevel(netSpeed)
} // mRssi = netSpeed
counter++ // }
} // }
// counter++
/** // }
* 尝试通知用户
* @param status
*/
private fun tryNoifyUser(status: Boolean) {
if (isNetOK == status) {
// 状态无变化
return
}
val str = if (isNetOK && !status) "网络链接断开!" else "网络已连接!"
GlobalScope.launch(Dispatchers.Main) {
CommonApplication.getContext()?.showToast(str)
}
}
fun isNetOk(): Boolean {
return isNetOK
}
private var lastTime = 0L private var lastTime = 0L
private var lastTxBytes = 0L private var lastTxBytes = 0L
@ -182,11 +159,23 @@ object SimHelper {
return ret return ret
} }
fun onWifiSwitch(open: Boolean) { /**
if (!open){ * 2024年6月26日之前无4G模块时sim状态无法实现所以跟随wifi状态
setNetStatus(false) * 4G模块上线后需要单独监听sim状态本方法失效
}else{ * **/
// TODO // fun onWifiSwitch(open: Boolean) {
} // if (!open){
// setNetStatus("wifi switch", false)
// }else{
// // TODO
// }
// }
fun is4GAvailable() : Boolean{
logListener?.log("4G state = $mSimState , enable = ${mSimState == TelephonyManager.SIM_STATE_READY} , mRssi = $mRssi")
return mSimState == TelephonyManager.SIM_STATE_READY && mRssi > 0
} }
}
}

@ -10,12 +10,17 @@ import android.net.NetworkInfo
import android.net.wifi.WifiManager import android.net.wifi.WifiManager
import android.util.Log import android.util.Log
import com.common.commonlib.CommonApplication import com.common.commonlib.CommonApplication
import com.yinuo.safetywatcher.watcher.interfaces.NetworkStateCallback
import com.yinuo.safetywatcher.watcher.log.LogPrintListener
object WifiHelper { object WifiHelper {
private var callbacks = mutableListOf<OnWifiLevelCallback>() private var callbacks = mutableListOf<NetworkStateCallback>()
private var mWifiState = -1; private var mWifiState = -1;
private var mRssi = -1; private var mRssi = -1;
private val TAG = javaClass.simpleName
var logListener : LogPrintListener? = null
private val receiver = object : BroadcastReceiver() { private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) { override fun onReceive(context: Context?, intent: Intent?) {
@ -25,13 +30,16 @@ object WifiHelper {
callbacks.forEach { callbacks.forEach {
it.onEnable(mWifiState == WifiManager.WIFI_STATE_ENABLED) it.onEnable(mWifiState == WifiManager.WIFI_STATE_ENABLED)
} }
SimHelper.onWifiSwitch(mWifiState == WifiManager.WIFI_STATE_ENABLED) // 通知网络发生变化,可能需要提示用户
NetworkHelper.notifyNetworkChange()
} else if (intent?.action.equals(WifiManager.RSSI_CHANGED_ACTION)) { } else if (intent?.action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
val rssi = intent?.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -1) val rssi = intent?.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -1)
mRssi = WifiManager.calculateSignalLevel(rssi!!, 5) mRssi = WifiManager.calculateSignalLevel(rssi!!, 5)
callbacks.forEach { callbacks.forEach {
it.onLevel(mRssi) it.onLevel(mRssi)
} }
// 通知网络发生变化,可能需要提示用户
NetworkHelper.notifyNetworkChange()
} else if (intent?.action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { } else if (intent?.action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
val networkInfo = val networkInfo =
intent?.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO) as NetworkInfo? intent?.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO) as NetworkInfo?
@ -46,14 +54,12 @@ object WifiHelper {
callbacks.forEach { callbacks.forEach {
it.onEnable(mWifiState == WifiManager.WIFI_STATE_ENABLED) it.onEnable(mWifiState == WifiManager.WIFI_STATE_ENABLED)
} }
SimHelper.onWifiSwitch(mWifiState == WifiManager.WIFI_STATE_ENABLED) // 通知网络发生变化,可能需要提示用户
NetworkHelper.notifyNetworkChange()
} }
} }
} }
Log.i( Log.i(TAG, "onReceive action = ${intent?.action}, wifiState = $mWifiState, mRssi = $mRssi")
this@WifiHelper.javaClass.name,
"onReceive action = ${intent?.action}, wifiState = $mWifiState, mRssi = $mRssi"
)
} }
} }
@ -74,7 +80,7 @@ object WifiHelper {
context.registerReceiver(receiver, filter) context.registerReceiver(receiver, filter)
} }
fun addCallBack(callBack: OnWifiLevelCallback) { fun addCallBack(callBack: NetworkStateCallback) {
callbacks.add(callBack) callbacks.add(callBack)
if (mWifiState != -1) { if (mWifiState != -1) {
callBack.onEnable(mWifiState == WifiManager.WIFI_STATE_ENABLED) callBack.onEnable(mWifiState == WifiManager.WIFI_STATE_ENABLED)
@ -84,7 +90,7 @@ object WifiHelper {
} }
} }
fun removeCallback(callBack: OnWifiLevelCallback) { fun removeCallback(callBack: NetworkStateCallback) {
callbacks.remove(callBack) callbacks.remove(callBack)
} }
@ -93,14 +99,17 @@ object WifiHelper {
context.unregisterReceiver(receiver) context.unregisterReceiver(receiver)
} }
interface OnWifiLevelCallback {
fun onEnable(enable: Boolean)
fun onLevel(level: Int)
}
fun getConnectedWifiSSID(): String? { fun getConnectedWifiSSID(): String? {
val wifiManager = val wifiManager =
CommonApplication.getContext()?.getSystemService(WIFI_SERVICE) as WifiManager? CommonApplication.getContext()?.getSystemService(WIFI_SERVICE) as WifiManager?
return wifiManager?.connectionInfo?.ssid return wifiManager?.connectionInfo?.ssid
} }
/**
* wifi是否可用
* **/
fun isWifiAvailable() : Boolean{
logListener?.log("wifi state = $mWifiState , enable = ${mWifiState == WifiManager.WIFI_STATE_ENABLED} , mRssi = $mRssi")
return mWifiState == WifiManager.WIFI_STATE_ENABLED && mRssi > 0
}
} }

@ -89,4 +89,49 @@
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="@dimen/_36dp" /> android:textSize="@dimen/_36dp" />
</RelativeLayout> </RelativeLayout>
<!--测试用-->
<ScrollView
android:layout_width="@dimen/_1080dp"
android:layout_height="match_parent"
android:id="@+id/scrollview"
android:visibility="gone"
android:layout_marginTop="@dimen/_120dp"
android:background="#80000000">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_log"
android:textColor="@color/white"
android:background="#00000000"/>
</ScrollView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="showLog"
android:id="@+id/tv_showLog"
android:padding="@dimen/_20dp"
android:background="@color/red"
android:visibility="gone"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="exit"
android:id="@+id/tv_exit"
android:layout_marginBottom="@dimen/_20dp"
android:padding="@dimen/_20dp"
android:visibility="gone"
android:layout_above="@id/tv_showLog"
android:background="@color/red"
android:layout_alignParentEnd="true"/>
</RelativeLayout> </RelativeLayout>

@ -47,8 +47,8 @@
<TextClock <TextClock
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:format12Hour="HH.mm" android:format12Hour="HH:mm"
android:format24Hour="HH.mm" android:format24Hour="HH:mm"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="@dimen/_30dp" /> android:textSize="@dimen/_30dp" />
@ -89,8 +89,7 @@
android:layout_width="@dimen/_33dp" android:layout_width="@dimen/_33dp"
android:layout_height="@dimen/_33dp" android:layout_height="@dimen/_33dp"
android:layout_marginStart="@dimen/_40dp" android:layout_marginStart="@dimen/_40dp"
android:src="@drawable/net" android:src="@drawable/net"/>
android:visibility="gone"/>
<Space <Space
android:layout_width="@dimen/_36dp" android:layout_width="@dimen/_36dp"

@ -14,7 +14,7 @@ project.ext {
compileSdkVersion : 33, compileSdkVersion : 33,
buildToolsVersion : "33.0.3", buildToolsVersion : "33.0.3",
minSdkVersion : 28, minSdkVersion : 28,
targetSdkVersion : 28, targetSdkVersion : 29,
versionCode : 1, versionCode : 1,
versionName : "1.0", versionName : "1.0",
jvmTarget : "1.8", jvmTarget : "1.8",

@ -1,2 +1,3 @@
host=http://192.168.1.102:8080 host=http://121.41.168.18:8080
#host=http://192.168.1.102:8080
#host=http://192.168.51.123:8080 #host=http://192.168.51.123:8080

@ -78,7 +78,7 @@ object RequestManager {
.client(builder.build()) .client(builder.build())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://139.196.199.45:8080") .baseUrl("http://121.41.168.18:8080")
.build() .build()
} }

Loading…
Cancel
Save