diff --git a/android/app/src/main/java/com/metallic/chiaki/common/DisplayHost.kt b/android/app/src/main/java/com/metallic/chiaki/common/DisplayHost.kt index 0aa1b98..63c94d5 100644 --- a/android/app/src/main/java/com/metallic/chiaki/common/DisplayHost.kt +++ b/android/app/src/main/java/com/metallic/chiaki/common/DisplayHost.kt @@ -25,6 +25,8 @@ sealed class DisplayHost abstract val host: String abstract val name: String? abstract val id: String? + + val isRegistered get() = registeredHost != null } class DiscoveredDisplayHost( diff --git a/android/app/src/main/java/com/metallic/chiaki/common/MacAddress.kt b/android/app/src/main/java/com/metallic/chiaki/common/MacAddress.kt index bc297fb..a648c6b 100644 --- a/android/app/src/main/java/com/metallic/chiaki/common/MacAddress.kt +++ b/android/app/src/main/java/com/metallic/chiaki/common/MacAddress.kt @@ -22,13 +22,18 @@ import java.nio.ByteOrder class MacAddress(v: Long) { + companion object + { + val LENGTH = 6 + } + constructor(data: ByteArray) : this( - if(data.size != 6) + if(data.size != LENGTH) throw IllegalArgumentException("Data has invalid length for MAC") else data.let { val buf = ByteBuffer.allocate(8) - buf.put(it, 0, 6) + buf.put(it, 0, LENGTH) buf.order(ByteOrder.LITTLE_ENDIAN) buf.getLong(0) }) diff --git a/android/app/src/main/java/com/metallic/chiaki/common/ManualHost.kt b/android/app/src/main/java/com/metallic/chiaki/common/ManualHost.kt index 516b9bd..ecc5ca5 100644 --- a/android/app/src/main/java/com/metallic/chiaki/common/ManualHost.kt +++ b/android/app/src/main/java/com/metallic/chiaki/common/ManualHost.kt @@ -34,7 +34,7 @@ import io.reactivex.Flowable data class ManualHost( @PrimaryKey(autoGenerate = true) val id: Long = 0, val host: String, - @ColumnInfo(name = "registered_host") val registeredHost: Int? + @ColumnInfo(name = "registered_host") val registeredHost: Long? ) @Dao diff --git a/android/app/src/main/java/com/metallic/chiaki/common/ext/StringHex.kt b/android/app/src/main/java/com/metallic/chiaki/common/ext/StringHex.kt new file mode 100644 index 0000000..8a5f64b --- /dev/null +++ b/android/app/src/main/java/com/metallic/chiaki/common/ext/StringHex.kt @@ -0,0 +1,22 @@ +/* + * This file is part of Chiaki. + * + * Chiaki is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Chiaki is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chiaki. If not, see . + */ + +package com.metallic.chiaki.common.ext + +fun String.hexToByteArray(): ByteArray? = ByteArray(this.length / 2) { + this.substring(it * 2, it * 2 + 2).toIntOrNull(16)?.toByte() ?: return null +} \ No newline at end of file diff --git a/android/app/src/main/java/com/metallic/chiaki/discovery/DiscoveryManager.kt b/android/app/src/main/java/com/metallic/chiaki/discovery/DiscoveryManager.kt index c11aeba..51637fc 100644 --- a/android/app/src/main/java/com/metallic/chiaki/discovery/DiscoveryManager.kt +++ b/android/app/src/main/java/com/metallic/chiaki/discovery/DiscoveryManager.kt @@ -18,6 +18,8 @@ package com.metallic.chiaki.discovery import android.util.Log +import com.metallic.chiaki.common.MacAddress +import com.metallic.chiaki.common.ext.hexToByteArray import com.metallic.chiaki.lib.CreateError import com.metallic.chiaki.lib.DiscoveryHost import com.metallic.chiaki.lib.DiscoveryService @@ -27,6 +29,13 @@ import io.reactivex.subjects.BehaviorSubject import io.reactivex.subjects.Subject import java.net.InetSocketAddress +val DiscoveryHost.ps4Mac get() = this.hostId?.hexToByteArray()?.let { + if(it.size == MacAddress.LENGTH) + MacAddress(it) + else + null +} + class DiscoveryManager { companion object diff --git a/android/app/src/main/java/com/metallic/chiaki/main/DisplayHostRecyclerViewAdapter.kt b/android/app/src/main/java/com/metallic/chiaki/main/DisplayHostRecyclerViewAdapter.kt index e7ffb15..5762a0d 100644 --- a/android/app/src/main/java/com/metallic/chiaki/main/DisplayHostRecyclerViewAdapter.kt +++ b/android/app/src/main/java/com/metallic/chiaki/main/DisplayHostRecyclerViewAdapter.kt @@ -51,7 +51,22 @@ class DisplayHostRecyclerViewAdapter: RecyclerView.Adapter + if(discoveredHost.runningAppName != null || discoveredHost.runningAppTitleid != null) + context.getString(R.string.display_host_app_title_id, discoveredHost.runningAppName ?: "", discoveredHost.runningAppTitleid ?: "") + else + "" + } ?: "" it.discoveredIndicatorLayout.visibility = if(host is DiscoveredDisplayHost) View.VISIBLE else View.GONE it.stateIndicatorImageView.setImageResource( if(host is DiscoveredDisplayHost) diff --git a/android/app/src/main/java/com/metallic/chiaki/main/MainViewModel.kt b/android/app/src/main/java/com/metallic/chiaki/main/MainViewModel.kt index fe2336a..4c665b8 100644 --- a/android/app/src/main/java/com/metallic/chiaki/main/MainViewModel.kt +++ b/android/app/src/main/java/com/metallic/chiaki/main/MainViewModel.kt @@ -23,6 +23,7 @@ import com.metallic.chiaki.common.DiscoveredDisplayHost import com.metallic.chiaki.common.ManualDisplayHost import com.metallic.chiaki.common.ext.toLiveData import com.metallic.chiaki.discovery.DiscoveryManager +import com.metallic.chiaki.discovery.ps4Mac import io.reactivex.rxkotlin.Observables class MainViewModel(val database: AppDatabase): ViewModel() @@ -30,13 +31,18 @@ class MainViewModel(val database: AppDatabase): ViewModel() val discoveryManager = DiscoveryManager().also { it.active = true /* TODO: from shared preferences */ } val displayHosts by lazy { - Observables.combineLatest(database.manualHostDao().getAll().toObservable(), discoveryManager.discoveredHosts) - { manualHosts, discoveredHosts -> + Observables.combineLatest( + database.manualHostDao().getAll().toObservable(), + database.registeredHostDao().getAll().toObservable(), + discoveryManager.discoveredHosts) + { manualHosts, registeredHosts, discoveredHosts -> + val macRegisteredHosts = registeredHosts.associateBy { it.ps4Mac } + val idRegisteredHosts = registeredHosts.associateBy { it.id } discoveredHosts.map { - DiscoveredDisplayHost(null /* TODO */, it) + DiscoveredDisplayHost(it.ps4Mac?.let { mac -> macRegisteredHosts[mac] }, it) } + manualHosts.map { - ManualDisplayHost(null /* TODO */, it) + ManualDisplayHost(it.registeredHost?.let { id -> idRegisteredHosts[id] }, it) } } .toLiveData() diff --git a/android/app/src/main/res/layout/item_display_host.xml b/android/app/src/main/res/layout/item_display_host.xml index 5f5d059..08859ec 100644 --- a/android/app/src/main/res/layout/item_display_host.xml +++ b/android/app/src/main/res/layout/item_display_host.xml @@ -60,7 +60,9 @@ tools:text="Address: Host" android:textSize="16sp" android:gravity="center" - android:textColor="?attr/colorOnSurface"/> + android:textColor="?attr/colorOnSurface" + android:maxLines="1" + android:ellipsize="end"/> + android:textColor="?attr/colorOnSurface" + android:maxLines="1" + android:ellipsize="end"/> + android:layout_marginRight="32dp" + android:layout_marginTop="8dp"/> + + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 9a0db76..de50def 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -12,7 +12,9 @@ Settings Discover Consoles Automatically Address: %s - ID: %s + ID: %s + ID: %s (registered) + App: %s\nTitle ID: %s Register Console Add Console Manually On the PS4, navigate to