2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-22 18:07:55 +00:00

66 lines
1.9 KiB
Kotlin
Raw Normal View History

package org.kde.kdeconnect
import org.kde.kdeconnect.Helpers.ThreadHelper
import java.net.InetAddress
class DeviceHost private constructor(private val host: String) {
// Wrapper because Kotlin doesn't allow nested nullability
data class PingResult(val latency: Long?)
/** The amount of milliseconds the ping request took or null it's in progress */
var ping: PingResult? = null
private set
/**
* Checks if the host can be reached over the network.
* @param callback Callback for updating UI elements
*/
fun checkReachable(callback: () -> Unit) {
ThreadHelper.execute {
try {
val address = InetAddress.getByName(this.host)
val startTime = System.currentTimeMillis()
val pingable = address.isReachable(PING_TIMEOUT)
val delayMillis = System.currentTimeMillis() - startTime
val pingResult = PingResult(if (pingable) delayMillis else null)
ping = pingResult
}
catch (_: Exception) {
ping = PingResult(null)
}
callback()
}
}
init {
require(isValidDeviceHost(host)) { "Invalid host" }
}
override fun toString(): String {
return this.host
}
companion object {
/** Ping timeout */
private const val PING_TIMEOUT = 3_000
2025-07-07 17:43:26 -04:00
private val hostnameValidityPattern = Regex("^[0-9A-Za-z.:_-]+$")
@JvmStatic
fun isValidDeviceHost(host: String): Boolean {
return hostnameValidityPattern.matches(host)
}
@JvmStatic
fun toDeviceHostOrNull(host: String): DeviceHost? {
return if (isValidDeviceHost(host)) {
DeviceHost(host)
} else {
null
}
}
@JvmField
val BROADCAST: DeviceHost = DeviceHost("255.255.255.255")
}
}