mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-20 21:43:12 -07:00
Debounce Display Hosts and fix RegisteredHost equals
This commit is contained in:
parent
ffa381334a
commit
37109a1764
2 changed files with 63 additions and 5 deletions
|
@ -25,7 +25,6 @@ import io.reactivex.Flowable
|
||||||
import io.reactivex.Maybe
|
import io.reactivex.Maybe
|
||||||
import io.reactivex.Single
|
import io.reactivex.Single
|
||||||
|
|
||||||
@Suppress("ArrayInDataClass")
|
|
||||||
@Entity(tableName = "registered_host")
|
@Entity(tableName = "registered_host")
|
||||||
data class RegisteredHost(
|
data class RegisteredHost(
|
||||||
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
||||||
|
@ -51,6 +50,42 @@ data class RegisteredHost(
|
||||||
rpKeyType = registHost.rpKeyType.toInt(),
|
rpKeyType = registHost.rpKeyType.toInt(),
|
||||||
rpKey = registHost.rpKey
|
rpKey = registHost.rpKey
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean
|
||||||
|
{
|
||||||
|
if(this === other) return true
|
||||||
|
if(javaClass != other?.javaClass) return false
|
||||||
|
|
||||||
|
other as RegisteredHost
|
||||||
|
|
||||||
|
if(id != other.id) return false
|
||||||
|
if(apSsid != other.apSsid) return false
|
||||||
|
if(apBssid != other.apBssid) return false
|
||||||
|
if(apKey != other.apKey) return false
|
||||||
|
if(apName != other.apName) return false
|
||||||
|
if(ps4Mac != other.ps4Mac) return false
|
||||||
|
if(ps4Nickname != other.ps4Nickname) return false
|
||||||
|
if(!rpRegistKey.contentEquals(other.rpRegistKey)) return false
|
||||||
|
if(rpKeyType != other.rpKeyType) return false
|
||||||
|
if(!rpKey.contentEquals(other.rpKey)) return false
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int
|
||||||
|
{
|
||||||
|
var result = id.hashCode()
|
||||||
|
result = 31 * result + (apSsid?.hashCode() ?: 0)
|
||||||
|
result = 31 * result + (apBssid?.hashCode() ?: 0)
|
||||||
|
result = 31 * result + (apKey?.hashCode() ?: 0)
|
||||||
|
result = 31 * result + (apName?.hashCode() ?: 0)
|
||||||
|
result = 31 * result + ps4Mac.hashCode()
|
||||||
|
result = 31 * result + (ps4Nickname?.hashCode() ?: 0)
|
||||||
|
result = 31 * result + rpRegistKey.contentHashCode()
|
||||||
|
result = 31 * result + rpKeyType
|
||||||
|
result = 31 * result + rpKey.contentHashCode()
|
||||||
|
return result
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
|
|
|
@ -25,12 +25,16 @@ import com.metallic.chiaki.lib.DiscoveryHost
|
||||||
import com.metallic.chiaki.lib.DiscoveryService
|
import com.metallic.chiaki.lib.DiscoveryService
|
||||||
import com.metallic.chiaki.lib.DiscoveryServiceOptions
|
import com.metallic.chiaki.lib.DiscoveryServiceOptions
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||||
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
import io.reactivex.rxkotlin.addTo
|
||||||
import io.reactivex.subjects.BehaviorSubject
|
import io.reactivex.subjects.BehaviorSubject
|
||||||
import io.reactivex.subjects.Subject
|
import io.reactivex.subjects.Subject
|
||||||
import java.lang.NumberFormatException
|
import java.lang.NumberFormatException
|
||||||
import java.net.InetSocketAddress
|
import java.net.InetSocketAddress
|
||||||
import java.nio.charset.Charset
|
import java.nio.charset.Charset
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
val DiscoveryHost.ps4Mac get() = this.hostId?.hexToByteArray()?.let {
|
val DiscoveryHost.ps4Mac get() = this.hostId?.hexToByteArray()?.let {
|
||||||
if(it.size == MacAddress.LENGTH)
|
if(it.size == MacAddress.LENGTH)
|
||||||
|
@ -47,6 +51,8 @@ class DiscoveryManager
|
||||||
const val DROP_PINGS: ULong = 3U
|
const val DROP_PINGS: ULong = 3U
|
||||||
const val PING_MS: ULong = 500U
|
const val PING_MS: ULong = 500U
|
||||||
const val PORT = 987
|
const val PORT = 987
|
||||||
|
|
||||||
|
const val DEBOUNCE_EMPTY_MS = 1000L
|
||||||
}
|
}
|
||||||
|
|
||||||
private var discoveryService: DiscoveryService? = null
|
private var discoveryService: DiscoveryService? = null
|
||||||
|
@ -62,10 +68,26 @@ class DiscoveryManager
|
||||||
}
|
}
|
||||||
private var paused = false
|
private var paused = false
|
||||||
|
|
||||||
private var discoveredHostsSubject: Subject<List<DiscoveryHost>> = BehaviorSubject.create<List<DiscoveryHost>>().also {
|
private val disposable = CompositeDisposable()
|
||||||
|
|
||||||
|
private var discoveredHostsSubjectDebounced: Subject<List<DiscoveryHost>> = BehaviorSubject.create<List<DiscoveryHost>>().also {
|
||||||
it.onNext(listOf())
|
it.onNext(listOf())
|
||||||
}.toSerialized()
|
}.toSerialized()
|
||||||
val discoveredHosts: Observable<List<DiscoveryHost>> get() = discoveredHostsSubject
|
|
||||||
|
private var discoveredHostsSubjectRaw: Subject<List<DiscoveryHost>> = BehaviorSubject.create<List<DiscoveryHost>>().also { subject ->
|
||||||
|
subject.debounce { hosts ->
|
||||||
|
if(hosts.isEmpty())
|
||||||
|
Observable.timer(DEBOUNCE_EMPTY_MS, TimeUnit.MILLISECONDS)
|
||||||
|
else
|
||||||
|
Observable.empty()
|
||||||
|
}
|
||||||
|
.subscribe { hosts ->
|
||||||
|
discoveredHostsSubjectDebounced.onNext(hosts)
|
||||||
|
}
|
||||||
|
.addTo(disposable)
|
||||||
|
}
|
||||||
|
|
||||||
|
val discoveredHosts: Observable<List<DiscoveryHost>> get() = discoveredHostsSubjectDebounced
|
||||||
|
|
||||||
fun resume()
|
fun resume()
|
||||||
{
|
{
|
||||||
|
@ -82,6 +104,7 @@ class DiscoveryManager
|
||||||
fun dispose()
|
fun dispose()
|
||||||
{
|
{
|
||||||
active = false
|
active = false
|
||||||
|
disposable.dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sendWakeup(host: String, registKey: ByteArray)
|
fun sendWakeup(host: String, registKey: ByteArray)
|
||||||
|
@ -102,7 +125,7 @@ class DiscoveryManager
|
||||||
{
|
{
|
||||||
discoveryService = DiscoveryService(DiscoveryServiceOptions(
|
discoveryService = DiscoveryService(DiscoveryServiceOptions(
|
||||||
HOSTS_MAX, DROP_PINGS, PING_MS, InetSocketAddress("255.255.255.255", PORT)
|
HOSTS_MAX, DROP_PINGS, PING_MS, InetSocketAddress("255.255.255.255", PORT)
|
||||||
), discoveredHostsSubject::onNext)
|
), discoveredHostsSubjectRaw::onNext)
|
||||||
}
|
}
|
||||||
catch(e: CreateError)
|
catch(e: CreateError)
|
||||||
{
|
{
|
||||||
|
@ -114,7 +137,7 @@ class DiscoveryManager
|
||||||
val service = discoveryService ?: return
|
val service = discoveryService ?: return
|
||||||
service.dispose()
|
service.dispose()
|
||||||
discoveryService = null
|
discoveryService = null
|
||||||
discoveredHostsSubject.onNext(listOf())
|
discoveredHostsSubjectRaw.onNext(listOf())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue