diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index 453d6d4a5..e1a1b440b 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -46,7 +46,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat * * TODO: Use proper material attributes (Not the weird dimen attributes I currently have) * - * TODO: Test out material animation system + * TODO: Migrate to material animation system * * @author OxygenCobalt */ diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt index de6ebe883..cf6213987 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt @@ -28,7 +28,9 @@ import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.transition.TransitionManager import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.transition.MaterialFade import java.lang.reflect.Field import org.oxycblt.auxio.R import org.oxycblt.auxio.ui.AuxioAppBarLayout @@ -111,7 +113,11 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr this.titleAnimator = ValueAnimator.ofFloat(from, to).apply { addUpdateListener { titleView.alpha = it.animatedValue as Float } - duration = TOOLBAR_FADE_DURATION + duration = if (titleShown == true) { + context.resources.getInteger(R.integer.anim_fade_enter_duration).toLong() + } else { + context.resources.getInteger(R.integer.anim_fade_exit_duration).toLong() + } start() } } @@ -142,8 +148,6 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr } companion object { - private const val TOOLBAR_FADE_DURATION = 150L - private val TOOLBAR_TITLE_TEXT_FIELD: Field by lazyReflectedField(Toolbar::class, "mTitleTextView") } diff --git a/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt b/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt index f92dde359..c97cc803a 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt @@ -161,10 +161,10 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr if (isActivated) { targetVis = VISIBLE - targetDuration = 150L + targetDuration = context.resources.getInteger(R.integer.anim_fade_enter_duration).toLong() } else { targetVis = INVISIBLE - targetDuration = 84L + targetDuration = context.resources.getInteger(R.integer.anim_fade_exit_duration).toLong() } if (selectionIndicator.visibility == targetVis) { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/ui/AnimatedMaterialButton.kt b/app/src/main/java/org/oxycblt/auxio/playback/ui/AnimatedMaterialButton.kt index 2ab20dbdd..0518ace78 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/ui/AnimatedMaterialButton.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/ui/AnimatedMaterialButton.kt @@ -21,6 +21,7 @@ import android.animation.ValueAnimator import android.content.Context import android.util.AttributeSet import com.google.android.material.button.MaterialButton +import org.oxycblt.auxio.R /** * A [MaterialButton] that automatically morphs from a circle to a squircle shape appearance when it @@ -46,7 +47,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 animator?.cancel() animator = ValueAnimator.ofFloat(currentCornerRadiusRatio, target).apply { - duration = ACTIVATION_DURATION + duration = context.resources.getInteger(R.integer.anim_fade_enter_duration).toLong() addUpdateListener { updateCornerRadiusRatio(animatedValue as Float) } start() } @@ -56,8 +57,4 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 currentCornerRadiusRatio = ratio shapeAppearanceModel = shapeAppearanceModel.withCornerSize { it.width() * ratio } } - - companion object { - const val ACTIVATION_DURATION = 150L - } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/ui/StyledSeekBar.kt b/app/src/main/java/org/oxycblt/auxio/playback/ui/StyledSeekBar.kt index 6b32bde2a..b8ab58ea5 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/ui/StyledSeekBar.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/ui/StyledSeekBar.kt @@ -70,7 +70,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 // Sanity check 2: Ensure that this value is within the duration and will not crash // the app, and that the user is not currently seeking (which would cause the SeekBar // to jump around). - if (from <= durationDs && !isSelected) { + if (from <= durationDs && !isActivated) { binding.seekBarSlider.value = from.toFloat() // We would want to keep this in the callback, but the callback only fires when @@ -106,13 +106,13 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 logD("Starting seek mode") // User has begun seeking, place the SeekBar into a "Suspended" mode in which no // position updates are sent and is indicated by the position value turning accented. - isSelected = true + isActivated = true } override fun onStopTrackingTouch(slider: Slider) { logD("Confirming seek") // End of seek event, send off new value to callback. - isSelected = false + isActivated = false callback?.seekTo(slider.value.toLong()) } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/fastscroll/FastScrollRecyclerView.kt b/app/src/main/java/org/oxycblt/auxio/ui/fastscroll/FastScrollRecyclerView.kt index ebc2c02d9..ea3f3bf58 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/fastscroll/FastScrollRecyclerView.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/fastscroll/FastScrollRecyclerView.kt @@ -33,13 +33,17 @@ import androidx.core.view.isInvisible import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.transition.TransitionManager +import com.google.android.material.transition.MaterialFade import kotlin.math.abs import org.oxycblt.auxio.R import org.oxycblt.auxio.ui.recycler.AuxioRecyclerView +import org.oxycblt.auxio.util.getDimen import org.oxycblt.auxio.util.getDimenSize import org.oxycblt.auxio.util.getDrawableCompat import org.oxycblt.auxio.util.isRtl import org.oxycblt.auxio.util.isUnder +import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.systemBarInsetsCompat /** @@ -431,7 +435,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr } showingThumb = true - animateView(thumbView, 1f) + animateViewIn(thumbView) } private fun hideScrollbar() { @@ -440,7 +444,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr } showingThumb = false - animateView(thumbView, 0f) + animateViewOut(thumbView) } private fun showPopup() { @@ -449,7 +453,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr } showingPopup = true - animateView(popupView, 1f) + animateViewIn(popupView) } private fun hidePopup() { @@ -458,11 +462,22 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr } showingPopup = false - animateView(popupView, 0f) + animateViewOut(popupView) } - private fun animateView(view: View, alpha: Float) { - view.animate().alpha(alpha).setDuration(ANIM_MILLIS).start() + private fun animateViewIn(view: View) { + logD(view.translationX) + view.animate() + .alpha(1f) + .setDuration(context.resources.getInteger(R.integer.anim_fade_enter_duration).toLong()) + .start() + } + + private fun animateViewOut(view: View) { + view.animate() + .alpha(0f) + .setDuration(context.resources.getInteger(R.integer.anim_fade_exit_duration).toLong()) + .start() } // --- LAYOUT STATE --- diff --git a/app/src/main/res/color/sel_activatable_text_secondary.xml b/app/src/main/res/color/sel_activatable_text_secondary.xml new file mode 100644 index 000000000..105bf5c7a --- /dev/null +++ b/app/src/main/res/color/sel_activatable_text_secondary.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/sel_selectable_text_secondary.xml b/app/src/main/res/color/sel_selectable_text_secondary.xml index 339853789..1aa622c44 100644 --- a/app/src/main/res/color/sel_selectable_text_secondary.xml +++ b/app/src/main/res/color/sel_selectable_text_secondary.xml @@ -1,6 +1,5 @@ - \ No newline at end of file diff --git a/app/src/main/res/drawable/sel_item_ripple_bg.xml b/app/src/main/res/drawable/sel_item_ripple_bg.xml index 152b48a05..043323742 100644 --- a/app/src/main/res/drawable/sel_item_ripple_bg.xml +++ b/app/src/main/res/drawable/sel_item_ripple_bg.xml @@ -1,7 +1,7 @@ + android:enterFadeDuration="@integer/anim_fade_enter_duration" + android:exitFadeDuration="@integer/anim_fade_exit_duration"> @@ -67,7 +67,7 @@ @@ -83,7 +83,7 @@ @@ -99,7 +99,7 @@ @@ -115,7 +115,7 @@ @@ -131,7 +131,7 @@ diff --git a/app/src/main/res/layout/view_seek_bar.xml b/app/src/main/res/layout/view_seek_bar.xml index 982e02d28..60df96bb8 100644 --- a/app/src/main/res/layout/view_seek_bar.xml +++ b/app/src/main/res/layout/view_seek_bar.xml @@ -20,7 +20,7 @@ android:layout_marginStart="@dimen/spacing_medium" android:layout_marginBottom="@dimen/spacing_tiny" android:textAppearance="@style/TextAppearance.Auxio.BodySmall" - android:textColor="@color/sel_selectable_text_secondary" + android:textColor="@color/sel_activatable_text_secondary" tools:text="11:38" /> + 150 + 84 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b78c6fc6e..e73f10825 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -149,7 +149,7 @@ Loading your music library… Monitoring your music library for changes… Added to queue - Developed by OxygenCobalt + Developed by Alexander Capehart Search your library…