mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-21 05:53:12 -07:00
Much better Host Animations on Android
This commit is contained in:
parent
16791b7704
commit
bf57359929
9 changed files with 40 additions and 25 deletions
|
@ -68,5 +68,4 @@ dependencies {
|
||||||
kapt "androidx.room:room-compiler:$room_version"
|
kapt "androidx.room:room-compiler:$room_version"
|
||||||
implementation "androidx.room:room-ktx:$room_version"
|
implementation "androidx.room:room-ktx:$room_version"
|
||||||
implementation "androidx.room:room-rxjava2:$room_version"
|
implementation "androidx.room:room-rxjava2:$room_version"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,16 @@ class DiscoveredDisplayHost(
|
||||||
override val host get() = discoveredHost.hostAddr ?: ""
|
override val host get() = discoveredHost.hostAddr ?: ""
|
||||||
override val name get() = discoveredHost.hostName ?: registeredHost?.ps4Nickname
|
override val name get() = discoveredHost.hostName ?: registeredHost?.ps4Nickname
|
||||||
override val id get() = discoveredHost.hostId ?: registeredHost?.ps4Mac?.toString()
|
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(
|
class ManualDisplayHost(
|
||||||
|
@ -47,4 +57,14 @@ class ManualDisplayHost(
|
||||||
override val host get() = manualHost.host
|
override val host get() = manualHost.host
|
||||||
override val name get() = registeredHost?.ps4Nickname
|
override val name get() = registeredHost?.ps4Nickname
|
||||||
override val id get() = registeredHost?.ps4Mac?.toString()
|
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}}"
|
||||||
}
|
}
|
|
@ -17,8 +17,11 @@
|
||||||
|
|
||||||
package com.metallic.chiaki.main
|
package com.metallic.chiaki.main
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import android.view.animation.AnimationUtils
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.metallic.chiaki.R
|
import com.metallic.chiaki.R
|
||||||
import com.metallic.chiaki.common.DiscoveredDisplayHost
|
import com.metallic.chiaki.common.DiscoveredDisplayHost
|
||||||
|
@ -27,13 +30,22 @@ import com.metallic.chiaki.common.ext.inflate
|
||||||
import com.metallic.chiaki.lib.DiscoveryHost
|
import com.metallic.chiaki.lib.DiscoveryHost
|
||||||
import kotlinx.android.synthetic.main.item_display_host.view.*
|
import kotlinx.android.synthetic.main.item_display_host.view.*
|
||||||
|
|
||||||
|
class DisplayHostDiffCallback(val old: List<DisplayHost>, val new: List<DisplayHost>): 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<DisplayHostRecyclerViewAdapter.ViewHolder>()
|
class DisplayHostRecyclerViewAdapter(val clickCallback: (DisplayHost) -> Unit): RecyclerView.Adapter<DisplayHostRecyclerViewAdapter.ViewHolder>()
|
||||||
{
|
{
|
||||||
var hosts: List<DisplayHost> = listOf()
|
var hosts: List<DisplayHost> = listOf()
|
||||||
set(value)
|
set(value)
|
||||||
{
|
{
|
||||||
|
val diff = DiffUtil.calculateDiff(DisplayHostDiffCallback(field, value))
|
||||||
field = value
|
field = value
|
||||||
notifyDataSetChanged()
|
diff.dispatchUpdatesTo(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
|
class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
|
||||||
|
|
|
@ -77,8 +77,10 @@ class MainActivity : AppCompatActivity()
|
||||||
hostsRecyclerView.adapter = recyclerViewAdapter
|
hostsRecyclerView.adapter = recyclerViewAdapter
|
||||||
hostsRecyclerView.layoutManager = LinearLayoutManager(this)
|
hostsRecyclerView.layoutManager = LinearLayoutManager(this)
|
||||||
viewModel.displayHosts.observe(this, Observer {
|
viewModel.displayHosts.observe(this, Observer {
|
||||||
|
val top = hostsRecyclerView.computeVerticalScrollOffset() == 0
|
||||||
recyclerViewAdapter.hosts = it
|
recyclerViewAdapter.hosts = it
|
||||||
hostsRecyclerView.scheduleLayoutAnimation()
|
if(top)
|
||||||
|
hostsRecyclerView.scrollToPosition(0)
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.discoveryActive.observe(this, Observer { active ->
|
viewModel.discoveryActive.observe(this, Observer { active ->
|
||||||
|
|
|
@ -34,7 +34,7 @@ class ChiakiRxLog(levelMask: Int)
|
||||||
val log = ChiakiLog(levelMask, callback = { level, text ->
|
val log = ChiakiLog(levelMask, callback = { level, text ->
|
||||||
accMutex.withLock {
|
accMutex.withLock {
|
||||||
val cur = accSubject.value ?: ""
|
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))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
|
@ -1,13 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:duration="200">
|
|
||||||
<translate
|
|
||||||
android:fromXDelta="20%"
|
|
||||||
android:toXDelta="0"
|
|
||||||
android:interpolator="@android:anim/decelerate_interpolator"/>
|
|
||||||
|
|
||||||
<alpha
|
|
||||||
android:fromAlpha="0.0"
|
|
||||||
android:toAlpha="1.0"
|
|
||||||
android:interpolator="@android:anim/decelerate_interpolator"/>
|
|
||||||
</set>
|
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<layoutAnimation
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:animation="@anim/item_drop"
|
|
||||||
android:delay="15%"
|
|
||||||
android:animationOrder="normal" />
|
|
|
@ -14,7 +14,6 @@
|
||||||
android:paddingBottom="8dp"
|
android:paddingBottom="8dp"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:clipChildren="false"
|
android:clipChildren="false"
|
||||||
android:layoutAnimation="@anim/layout_drop"
|
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
|
@ -108,6 +107,7 @@
|
||||||
|
|
||||||
|
|
||||||
<com.google.android.material.appbar.AppBarLayout
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appBarLayout"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="match_parent">
|
android:layout_width="match_parent">
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
|
|
@ -61,7 +61,8 @@
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
android:layout_marginBottom="32dp">
|
android:layout_marginBottom="32dp"
|
||||||
|
android:layout_marginRight="32dp">
|
||||||
|
|
||||||
<com.metallic.chiaki.touchcontrols.ButtonView
|
<com.metallic.chiaki.touchcontrols.ButtonView
|
||||||
android:id="@+id/crossButtonView"
|
android:id="@+id/crossButtonView"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue