1
0
mirror of https://git.sr.ht/~thestr4ng3r/chiaki synced 2025-03-12 05:25:23 -07:00

Much better Host Animations on Android

This commit is contained in:
Florian Märkl 2019-10-26 17:55:02 +02:00
parent 16791b7704
commit bf57359929
No known key found for this signature in database
GPG Key ID: 125BC8A5A6A1E857
9 changed files with 40 additions and 25 deletions

@ -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"
}

@ -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}}"
}

@ -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<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>()
{
var hosts: List<DisplayHost> = listOf()
set(value)
{
val diff = DiffUtil.calculateDiff(DisplayHostDiffCallback(field, value))
field = value
notifyDataSetChanged()
diff.dispatchUpdatesTo(this)
}
class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)

@ -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 ->

@ -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))
}
})
}

@ -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:clipToPadding="false"
android:clipChildren="false"
android:layoutAnimation="@anim/layout_drop"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<FrameLayout
@ -108,6 +107,7 @@
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<com.google.android.material.appbar.MaterialToolbar

@ -61,7 +61,8 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="32dp">
android:layout_marginBottom="32dp"
android:layout_marginRight="32dp">
<com.metallic.chiaki.touchcontrols.ButtonView
android:id="@+id/crossButtonView"