diff --git a/android/app/build.gradle b/android/app/build.gradle index 10c753b..9af2a5b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -68,5 +68,4 @@ dependencies { kapt "androidx.room:room-compiler:$room_version" implementation "androidx.room:room-ktx:$room_version" implementation "androidx.room:room-rxjava2:$room_version" - } 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 63c94d5..30b42d8 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 @@ -37,6 +37,16 @@ class DiscoveredDisplayHost( override val host get() = discoveredHost.hostAddr ?: "" override val name get() = discoveredHost.hostName ?: registeredHost?.ps4Nickname override val id get() = discoveredHost.hostId ?: registeredHost?.ps4Mac?.toString() + + override fun equals(other: Any?): Boolean = + if(other !is DiscoveredDisplayHost) + false + else + other.discoveredHost == discoveredHost && other.registeredHost == registeredHost + + override fun hashCode() = 31 * (registeredHost?.hashCode() ?: 0) + discoveredHost.hashCode() + + override fun toString() = "DiscoveredDisplayHost{${registeredHost}, ${discoveredHost}}" } class ManualDisplayHost( @@ -47,4 +57,14 @@ class ManualDisplayHost( override val host get() = manualHost.host override val name get() = registeredHost?.ps4Nickname override val id get() = registeredHost?.ps4Mac?.toString() + + override fun equals(other: Any?): Boolean = + if(other !is ManualDisplayHost) + false + else + other.manualHost == manualHost && other.registeredHost == registeredHost + + override fun hashCode() = 31 * (registeredHost?.hashCode() ?: 0) + manualHost.hashCode() + + override fun toString() = "ManualDisplayHost{${registeredHost}, ${manualHost}}" } \ No newline at end of file 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 b733678..8c37c14 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 @@ -17,8 +17,11 @@ package com.metallic.chiaki.main +import android.util.Log import android.view.View import android.view.ViewGroup +import android.view.animation.AnimationUtils +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.metallic.chiaki.R import com.metallic.chiaki.common.DiscoveredDisplayHost @@ -27,13 +30,22 @@ import com.metallic.chiaki.common.ext.inflate import com.metallic.chiaki.lib.DiscoveryHost import kotlinx.android.synthetic.main.item_display_host.view.* +class DisplayHostDiffCallback(val old: List, val new: List): DiffUtil.Callback() +{ + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) = (old[oldItemPosition] == new[newItemPosition]) + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) = (old[oldItemPosition] == new[newItemPosition]) + override fun getOldListSize() = old.size + override fun getNewListSize() = new.size +} + class DisplayHostRecyclerViewAdapter(val clickCallback: (DisplayHost) -> Unit): RecyclerView.Adapter() { var hosts: List = listOf() set(value) { + val diff = DiffUtil.calculateDiff(DisplayHostDiffCallback(field, value)) field = value - notifyDataSetChanged() + diff.dispatchUpdatesTo(this) } class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) diff --git a/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt b/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt index 0e0dd7b..73252ac 100644 --- a/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt @@ -77,8 +77,10 @@ class MainActivity : AppCompatActivity() hostsRecyclerView.adapter = recyclerViewAdapter hostsRecyclerView.layoutManager = LinearLayoutManager(this) viewModel.displayHosts.observe(this, Observer { + val top = hostsRecyclerView.computeVerticalScrollOffset() == 0 recyclerViewAdapter.hosts = it - hostsRecyclerView.scheduleLayoutAnimation() + if(top) + hostsRecyclerView.scrollToPosition(0) }) viewModel.discoveryActive.observe(this, Observer { active -> diff --git a/android/app/src/main/java/com/metallic/chiaki/regist/ChiakiRxLog.kt b/android/app/src/main/java/com/metallic/chiaki/regist/ChiakiRxLog.kt index 362cce4..220ac00 100644 --- a/android/app/src/main/java/com/metallic/chiaki/regist/ChiakiRxLog.kt +++ b/android/app/src/main/java/com/metallic/chiaki/regist/ChiakiRxLog.kt @@ -34,7 +34,7 @@ class ChiakiRxLog(levelMask: Int) val log = ChiakiLog(levelMask, callback = { level, text -> accMutex.withLock { val cur = accSubject.value ?: "" - accSubject.onNext(cur + (if(cur.isEmpty()) "" else "\n") + text) + accSubject.onNext(cur + (if(cur.isEmpty()) "" else "\n") + ChiakiLog.formatLog(level, text)) } }) } \ No newline at end of file diff --git a/android/app/src/main/res/anim/item_drop.xml b/android/app/src/main/res/anim/item_drop.xml deleted file mode 100644 index 65728b9..0000000 --- a/android/app/src/main/res/anim/item_drop.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/anim/layout_drop.xml b/android/app/src/main/res/anim/layout_drop.xml deleted file mode 100644 index c2421a2..0000000 --- a/android/app/src/main/res/anim/layout_drop.xml +++ /dev/null @@ -1,6 +0,0 @@ - - \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml index 83b4542..0642ac5 100644 --- a/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -14,7 +14,6 @@ android:paddingBottom="8dp" android:clipToPadding="false" android:clipChildren="false" - android:layoutAnimation="@anim/layout_drop" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> + android:layout_marginBottom="32dp" + android:layout_marginRight="32dp">