diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c0f97ba..3400255 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + diff --git a/app/src/main/java/com/yuanxuan/rokid/MainActivity.kt b/app/src/main/java/com/yuanxuan/rokid/MainActivity.kt index 4dd164b..0d1c823 100644 --- a/app/src/main/java/com/yuanxuan/rokid/MainActivity.kt +++ b/app/src/main/java/com/yuanxuan/rokid/MainActivity.kt @@ -6,9 +6,12 @@ import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.view.isGone +import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.yuanxuan.rokid.databinding.ActivityMainBinding import com.yuanxuan.rokid.dependencies.AppDependencies +import com.yuanxuan.rokid.device.DeviceServiceManager import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { @@ -34,6 +37,19 @@ class MainActivity : AppCompatActivity() { */ AppDependencies.deviceServiceManager.batteryPercentage.collect { binding.batteryLevel.text = "${it}%" + binding.batteryLevelIv.setImageLevel(it) + } + } + lifecycleScope.launch { + AppDependencies.deviceServiceManager.wifiState.collect { + when (it) { + is DeviceServiceManager.WifiState.Connected -> { + binding.wifiIv.setImageLevel(it.level) + binding.wifiIv.isVisible = true + } + + DeviceServiceManager.WifiState.Unconnected -> binding.wifiIv.isGone = true + } } } diff --git a/app/src/main/java/com/yuanxuan/rokid/device/DeviceServiceManager.kt b/app/src/main/java/com/yuanxuan/rokid/device/DeviceServiceManager.kt index 63c4100..c16ab18 100644 --- a/app/src/main/java/com/yuanxuan/rokid/device/DeviceServiceManager.kt +++ b/app/src/main/java/com/yuanxuan/rokid/device/DeviceServiceManager.kt @@ -5,6 +5,11 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities +import android.net.NetworkRequest +import android.net.wifi.WifiManager import android.os.BatteryManager import com.rokid.dcg.sprite.service.IInstructListener import com.rokid.dcg.sprite.service.IInstructService @@ -29,7 +34,7 @@ import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException -class DeviceServiceManager(val context: Application) { +class DeviceServiceManager(val context: Application) : ConnectivityManager.NetworkCallback() { companion object { /** @@ -52,6 +57,15 @@ class DeviceServiceManager(val context: Application) { private val _batteryPercentage = MutableStateFlow(-1) val batteryPercentage = _batteryPercentage.asStateFlow() + /** + * wifi + */ + private val _wifiState: MutableStateFlow = MutableStateFlow(WifiState.Unconnected) + val wifiState = _wifiState.asStateFlow() + private val wifiManager by lazy { + context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager + } + lateinit var sn: String private set @@ -86,6 +100,16 @@ class DeviceServiceManager(val context: Application) { } } } + + /** + * 监听wifi状态 + */ + val connectivityManager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val request = NetworkRequest.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .build() + connectivityManager.registerNetworkCallback(request, this) } val instructListener = object : IInstructListener.Stub() { @@ -274,10 +298,29 @@ class DeviceServiceManager(val context: Application) { } } + override fun onLost(network: Network) { + _wifiState.update { WifiState.Unconnected } + } + + override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { + _wifiState.update { + val level = wifiManager.calculateSignalLevel(networkCapabilities.signalStrength) + WifiState.Connected( + // maxSignalLevel是4 level区间应该是 0-3 这里却返回了4 限制一下 + level = level.coerceAtMost(wifiManager.maxSignalLevel - 1) + ) + } + } + sealed interface InstructState { data object None : InstructState data object WaitingInstructState : InstructState } + sealed interface WifiState { + data object Unconnected : WifiState + data class Connected(val level: Int) : WifiState + } + } diff --git a/app/src/main/res/drawable/battery_level_list.xml b/app/src/main/res/drawable/battery_level_list.xml new file mode 100644 index 0000000..965d2ba --- /dev/null +++ b/app/src/main/res/drawable/battery_level_list.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_battery_0.xml b/app/src/main/res/drawable/icon_battery_0.xml new file mode 100644 index 0000000..90ea021 --- /dev/null +++ b/app/src/main/res/drawable/icon_battery_0.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/icon_battery_100.xml b/app/src/main/res/drawable/icon_battery_100.xml new file mode 100644 index 0000000..1457af5 --- /dev/null +++ b/app/src/main/res/drawable/icon_battery_100.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/drawable/icon_battery_25.xml b/app/src/main/res/drawable/icon_battery_25.xml new file mode 100644 index 0000000..59a55e9 --- /dev/null +++ b/app/src/main/res/drawable/icon_battery_25.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/drawable/icon_battery_50.xml b/app/src/main/res/drawable/icon_battery_50.xml new file mode 100644 index 0000000..fd124e9 --- /dev/null +++ b/app/src/main/res/drawable/icon_battery_50.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/drawable/icon_battery_75.xml b/app/src/main/res/drawable/icon_battery_75.xml new file mode 100644 index 0000000..67e6ffb --- /dev/null +++ b/app/src/main/res/drawable/icon_battery_75.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/drawable/icon_wifi_1.xml b/app/src/main/res/drawable/icon_wifi_1.xml new file mode 100644 index 0000000..c7be3e8 --- /dev/null +++ b/app/src/main/res/drawable/icon_wifi_1.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icon_wifi_2.xml b/app/src/main/res/drawable/icon_wifi_2.xml new file mode 100644 index 0000000..ba19648 --- /dev/null +++ b/app/src/main/res/drawable/icon_wifi_2.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/icon_wifi_3.xml b/app/src/main/res/drawable/icon_wifi_3.xml new file mode 100644 index 0000000..14054b0 --- /dev/null +++ b/app/src/main/res/drawable/icon_wifi_3.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/app/src/main/res/drawable/icon_wifi_4.xml b/app/src/main/res/drawable/icon_wifi_4.xml new file mode 100644 index 0000000..c540c5d --- /dev/null +++ b/app/src/main/res/drawable/icon_wifi_4.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/app/src/main/res/drawable/wifi_level_list.xml b/app/src/main/res/drawable/wifi_level_list.xml new file mode 100644 index 0000000..53e771b --- /dev/null +++ b/app/src/main/res/drawable/wifi_level_list.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b27951c..244e535 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -18,9 +18,23 @@ app:layout_constraintEnd_toEndOf="parent" /> + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 93c7ba3..fe0303e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,5 +1,5 @@ 12.sp - 12.dp + 16.dp \ No newline at end of file