diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index a7d7703e9..19eeec09b 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -1,6 +1,5 @@ package org.oxycblt.auxio -import android.animation.LayoutTransition import android.content.res.ColorStateList import android.os.Bundle import android.view.LayoutInflater @@ -10,7 +9,6 @@ import android.view.ViewGroup import androidx.core.graphics.ColorUtils import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.navigation.NavController import androidx.navigation.NavOptions import androidx.navigation.fragment.NavHostFragment @@ -71,13 +69,6 @@ class MainFragment : Fragment() { binding.lifecycleOwner = this - // Apply custom interpolation effects - // The container layout types differ in the land/port layouts so it has to be cast to their parent instead. - (binding.controlsContainer as ViewGroup).layoutTransition = LayoutTransition().apply { - setInterpolator(LayoutTransition.APPEARING, FastOutSlowInInterpolator()) - setInterpolator(LayoutTransition.DISAPPEARING, FastOutSlowInInterpolator()) - } - binding.navBar.apply { itemIconTintList = navTints itemTextColor = navTints diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/AlbumDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/AlbumDetailAdapter.kt index 6ce59d35c..2ea3f5ce3 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/AlbumDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/AlbumDetailAdapter.kt @@ -13,7 +13,7 @@ import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.DiffCallback -import org.oxycblt.auxio.recycler.viewholders.BaseHolder +import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder import org.oxycblt.auxio.recycler.viewholders.Highlightable import org.oxycblt.auxio.ui.Accent import org.oxycblt.auxio.ui.applyAccents @@ -107,7 +107,7 @@ class AlbumDetailAdapter( inner class AlbumHeaderViewHolder( private val binding: ItemAlbumHeaderBinding - ) : BaseHolder(binding) { + ) : BaseViewHolder(binding) { override fun onBind(data: Album) { binding.album = data @@ -126,7 +126,7 @@ class AlbumDetailAdapter( inner class AlbumSongViewHolder( private val binding: ItemAlbumSongBinding, - ) : BaseHolder(binding, doOnClick, doOnLongClick), Highlightable { + ) : BaseViewHolder(binding, doOnClick, doOnLongClick), Highlightable { private val normalTextColor = binding.songName.currentTextColor private val inactiveTextColor = binding.songTrack.currentTextColor diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/ArtistDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/ArtistDetailAdapter.kt index d846778b2..9afda4a32 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/ArtistDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/ArtistDetailAdapter.kt @@ -13,7 +13,7 @@ import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.DiffCallback -import org.oxycblt.auxio.recycler.viewholders.BaseHolder +import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder import org.oxycblt.auxio.recycler.viewholders.Highlightable import org.oxycblt.auxio.ui.Accent import org.oxycblt.auxio.ui.applyAccents @@ -106,7 +106,7 @@ class ArtistDetailAdapter( inner class ArtistHeaderViewHolder( private val binding: ItemArtistHeaderBinding - ) : BaseHolder(binding) { + ) : BaseViewHolder(binding) { override fun onBind(data: Artist) { binding.artist = data @@ -126,7 +126,7 @@ class ArtistDetailAdapter( // Generic ViewHolder for a detail album inner class ArtistAlbumViewHolder( private val binding: ItemArtistAlbumBinding, - ) : BaseHolder(binding, doOnClick, doOnLongClick), Highlightable { + ) : BaseViewHolder(binding, doOnClick, doOnLongClick), Highlightable { private val normalTextColor = binding.albumName.currentTextColor override fun onBind(data: Album) { diff --git a/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreDetailAdapter.kt index e9f56676f..a6e43041d 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/adapters/GenreDetailAdapter.kt @@ -13,7 +13,7 @@ import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.DiffCallback -import org.oxycblt.auxio.recycler.viewholders.BaseHolder +import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder import org.oxycblt.auxio.recycler.viewholders.Highlightable import org.oxycblt.auxio.ui.Accent import org.oxycblt.auxio.ui.applyAccents @@ -108,7 +108,7 @@ class GenreDetailAdapter( inner class GenreHeaderViewHolder( private val binding: ItemGenreHeaderBinding - ) : BaseHolder(binding) { + ) : BaseViewHolder(binding) { override fun onBind(data: Genre) { binding.genre = data binding.detailModel = detailModel @@ -126,7 +126,7 @@ class GenreDetailAdapter( inner class GenreSongViewHolder( private val binding: ItemGenreSongBinding, - ) : BaseHolder(binding, doOnClick, doOnLongClick), Highlightable { + ) : BaseViewHolder(binding, doOnClick, doOnLongClick), Highlightable { private val normalTextColor = binding.songName.currentTextColor override fun onBind(data: Song) { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt index 51fe39b77..af1bb64c0 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt @@ -16,8 +16,6 @@ import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.MediaSessionCompat import android.view.KeyEvent import androidx.core.app.NotificationCompat -import androidx.media2.session.MediaController -import androidx.media2.session.MediaSession import com.google.android.exoplayer2.C import com.google.android.exoplayer2.ExoPlaybackException import com.google.android.exoplayer2.MediaItem diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt index bc115495a..646fbc59a 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt @@ -3,6 +3,7 @@ package org.oxycblt.auxio.playback.queue import android.annotation.SuppressLint import android.view.MotionEvent import android.view.ViewGroup +import androidx.appcompat.widget.TooltipCompat import androidx.recyclerview.widget.AsyncListDiffer import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView @@ -15,7 +16,7 @@ import org.oxycblt.auxio.music.Header import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.DiffCallback -import org.oxycblt.auxio.recycler.viewholders.BaseHolder +import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder import org.oxycblt.auxio.recycler.viewholders.HeaderViewHolder import org.oxycblt.auxio.ui.inflater @@ -132,7 +133,7 @@ class QueueAdapter( */ inner class QueueSongViewHolder( private val binding: ItemQueueSongBinding, - ) : BaseHolder(binding) { + ) : BaseViewHolder(binding) { @SuppressLint("ClickableViewAccessibility") override fun onBind(data: Song) { @@ -159,12 +160,13 @@ class QueueAdapter( */ inner class UserQueueHeaderViewHolder( private val binding: ItemActionHeaderBinding - ) : BaseHolder
(binding) { + ) : BaseViewHolder
(binding) { init { - binding.headerButton.contentDescription = binding.headerButton.context.getString( - R.string.description_clear_user_queue - ) + binding.headerButton.apply { + contentDescription = context.getString(R.string.description_clear_user_queue) + TooltipCompat.setTooltipText(this, contentDescription) + } } override fun onBind(data: Header) { diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseHolder.kt b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseViewHolder.kt similarity index 96% rename from app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseHolder.kt rename to app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseViewHolder.kt index e3be492cf..07ab8b2a2 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseHolder.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/BaseViewHolder.kt @@ -13,7 +13,7 @@ import org.oxycblt.auxio.music.BaseModel * @param doOnLongClick (Optional, defaults to null) Functions that specifics what to do on a long click. Null if nothing should be done. * @author OxygenCobalt */ -abstract class BaseHolder( +abstract class BaseViewHolder( private val binding: ViewDataBinding, private val doOnClick: ((data: T) -> Unit)? = null, private val doOnLongClick: ((view: View, data: T) -> Unit)? = null @@ -52,7 +52,7 @@ abstract class BaseHolder( /** * Function that performs binding operations unique to the inheriting viewholder. - * Add any specialized code to an override of this instead of [BaseHolder] itself. + * Add any specialized code to an override of this instead of [BaseViewHolder] itself. */ protected abstract fun onBind(data: T) } diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt index 73f0b4963..c63929d47 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt @@ -38,7 +38,7 @@ class SongViewHolder private constructor( private val binding: ItemSongBinding, doOnClick: (data: Song) -> Unit, doOnLongClick: (view: View, data: Song) -> Unit -) : BaseHolder(binding, doOnClick, doOnLongClick) { +) : BaseViewHolder(binding, doOnClick, doOnLongClick) { override fun onBind(data: Song) { binding.song = data @@ -73,7 +73,7 @@ class AlbumViewHolder private constructor( private val binding: ItemAlbumBinding, doOnClick: (data: Album) -> Unit, doOnLongClick: (view: View, data: Album) -> Unit -) : BaseHolder(binding, doOnClick, doOnLongClick) { +) : BaseViewHolder(binding, doOnClick, doOnLongClick) { override fun onBind(data: Album) { binding.album = data @@ -106,7 +106,7 @@ class ArtistViewHolder private constructor( private val binding: ItemArtistBinding, doOnClick: (Artist) -> Unit, doOnLongClick: (view: View, data: Artist) -> Unit -) : BaseHolder(binding, doOnClick, doOnLongClick) { +) : BaseViewHolder(binding, doOnClick, doOnLongClick) { override fun onBind(data: Artist) { binding.artist = data @@ -139,7 +139,7 @@ class GenreViewHolder private constructor( private val binding: ItemGenreBinding, doOnClick: (Genre) -> Unit, doOnLongClick: (view: View, data: Genre) -> Unit -) : BaseHolder(binding, doOnClick, doOnLongClick) { +) : BaseViewHolder(binding, doOnClick, doOnLongClick) { override fun onBind(data: Genre) { binding.genre = data @@ -168,7 +168,7 @@ class GenreViewHolder private constructor( /** * The Shared ViewHolder for a [Header]. Instantiation should be done with [from] */ -class HeaderViewHolder(private val binding: ItemHeaderBinding) : BaseHolder
(binding) { +class HeaderViewHolder(private val binding: ItemHeaderBinding) : BaseViewHolder
(binding) { override fun onBind(data: Header) { binding.header = data diff --git a/app/src/main/java/org/oxycblt/auxio/ui/SlideLinearLayout.kt b/app/src/main/java/org/oxycblt/auxio/ui/SlideLinearLayout.kt index 8f01cbc75..1ea501107 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/SlideLinearLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/SlideLinearLayout.kt @@ -1,18 +1,23 @@ package org.oxycblt.auxio.ui +import android.animation.LayoutTransition import android.content.Context import android.graphics.Canvas import android.util.AttributeSet import android.view.View import android.view.ViewGroup import android.widget.LinearLayout +import androidx.interpolator.view.animation.FastOutSlowInInterpolator import org.oxycblt.auxio.logD import org.oxycblt.auxio.logE import java.lang.reflect.Field /** * Hack layout that fixes an issue where disappearing views would draw over non-disappearing - * views when animated with a stock LayoutTransition. Adapted from this StackOverflow answer: + * views when animated with a stock LayoutTransition. If something breaks on the playback controls + * or nav bar, this is probably the culprit. + * + * Adapted from this StackOverflow answer: * https://stackoverflow.com/a/35087229 */ class SlideLinearLayout @JvmOverloads constructor( @@ -35,8 +40,14 @@ class SlideLinearLayout @JvmOverloads constructor( private var doDrawingTrick: Boolean = false init { + // Apply custom interpolation for the slide animations + layoutTransition.apply { + setInterpolator(LayoutTransition.APPEARING, FastOutSlowInInterpolator()) + setInterpolator(LayoutTransition.DISAPPEARING, FastOutSlowInInterpolator()) + } + if (disappearingChildrenField != null) { - // Create a junk view and add it, which makes all the magic happen [I think??]. + // Create a junk view and add it, which makes all the magic happen [I think]. dumpView = View(context) addView(dumpView, 0, 0) } @@ -54,15 +65,14 @@ class SlideLinearLayout @JvmOverloads constructor( override fun drawChild(canvas: Canvas?, child: View?, drawingTime: Long): Boolean { val children = getDisappearingChildren() - // I have no idea what this code does. if (doDrawingTrick && children != null) { - if (child == dumpView) { + if (child == dumpView) { // Use the dump view as a marker for when to do the trick var more = false children.forEach { - more = more or super.drawChild(canvas, it, drawingTime) + more = more or super.drawChild(canvas, it, drawingTime) // What???? } return more - } else if (children.contains(child)) { + } else if (children.contains(child)) { // Ignore the disappearing children return false } } @@ -73,7 +83,9 @@ class SlideLinearLayout @JvmOverloads constructor( private fun beforeDispatchDraw(): Boolean { val children = getDisappearingChildren() - if (children == null || children.isEmpty() || childCount <= 1) { // Junk view included + // Dont do trick if there are no disappearing children or if there arent any children other + // than the dump view. + if (children == null || children.isEmpty() || childCount <= 1) { return false } @@ -86,10 +98,9 @@ class SlideLinearLayout @JvmOverloads constructor( return disappearingChildren } - // If there is no list of disappearing children yet, attempt to get it. try { disappearingChildren = disappearingChildrenField.get(this) as List? - } catch (e: IllegalAccessException) { + } catch (e: Exception) { logD("Could not get list of disappearing children.") } diff --git a/app/src/main/res/layout-land/fragment_main.xml b/app/src/main/res/layout-land/fragment_main.xml index ce1985d26..3d9ee7549 100644 --- a/app/src/main/res/layout-land/fragment_main.xml +++ b/app/src/main/res/layout-land/fragment_main.xml @@ -26,21 +26,21 @@ android:id="@+id/controls_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" + android:animateLayoutChanges="true" android:background="?android:attr/windowBackground" android:baselineAligned="false" - android:animateLayoutChanges="true" android:elevation="@dimen/elevation_normal" + android:orientation="horizontal" app:layout_constraintBottom_toBottomOf="parent"> diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 994f5ccac..8456ddd60 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -26,10 +26,10 @@ android:id="@+id/controls_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:background="?android:attr/windowBackground" android:animateLayoutChanges="true" + android:background="?android:attr/windowBackground" android:elevation="@dimen/elevation_normal" + android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent"> - + - + + + + 재시도 + 허가 + + 보관함 + 장르 + 아티스트 + 앨범 + 노래 + 노래 + + 검색 + 필터 + 전부 + + 분류 + 기본 + А-Z + Z-A + + 재생 + 모든 곡 랜덤 재생 + 지금 재생 중 + + 대기열 + 대기열에 추가 + 가 대기열에 추가되었습니다 + 다음 곡 + + 아티스트로 가기 + 앨범으로 가기 + + 정보 + 버전 + GitHub에서 보기 + FAQ + 라이선스 + + + 설정 + + 스타일 + 테마 + 자동 + 밝은 테마 + 어두운 테마 + 강조 + + 색상화된 알림 + 미디어 스토어 앨범 커버 무시 + + 오디오 + 오디오 포커스 + 헤드셋 연결 + + 동작 + 계속 + 중단 + + + 노래를 찾을 수 없습니다 + + + 트랙 %d + + 재생/일시 정지 + + 재생 대기열 비우기 + + 오류 + + + 저장소 검색… + + + 찾은 노래 수: %d + + + 노래 + + + + 앨범 + + + \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index e495b93d0..3467bb0c5 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,6 +1,6 @@ - + Reîncearcă Permiteți diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 820ea9d99..44d21863d 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -52,6 +52,5 @@ 4dp - 8dp 4dp \ No newline at end of file