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