From 59c087d6537732b6c44004dfcd24f2d008f1cebd Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Mon, 5 Oct 2020 19:32:42 -0600 Subject: [PATCH] Update semantics slightly Change some naming/structure somewhat, and move all TODOs from AuxioTODO to the project itself. --- AuxioTODO | 41 -------- .../java/org/oxycblt/auxio/MainActivity.kt | 3 + .../java/org/oxycblt/auxio/MainFragment.kt | 4 + .../auxio/detail/ArtistDetailFragment.kt | 3 + .../oxycblt/auxio/detail/DetailViewModel.kt | 5 + .../oxycblt/auxio/library/LibraryFragment.kt | 9 +- .../oxycblt/auxio/loading/LoadingFragment.kt | 95 ++++++++----------- .../java/org/oxycblt/auxio/music/Models.kt | 4 + .../org/oxycblt/auxio/music/MusicViewModel.kt | 4 +- .../oxycblt/auxio/music/coil/MosaicFetcher.kt | 9 +- .../auxio/music/processing/MusicLoader.kt | 1 + .../auxio/playback/CompactPlaybackFragment.kt | 5 + .../recycler/viewholders/ModelHolders.kt | 6 +- .../org/oxycblt/auxio/songs/SongsFragment.kt | 4 +- app/src/main/res/layout/activity_main.xml | 4 +- .../main/res/layout/fragment_album_detail.xml | 3 +- .../res/layout/fragment_artist_detail.xml | 3 +- .../res/layout/fragment_compact_playback.xml | 4 +- .../main/res/layout/fragment_genre_detail.xml | 3 +- app/src/main/res/layout/fragment_library.xml | 3 +- app/src/main/res/layout/fragment_loading.xml | 3 +- app/src/main/res/layout/fragment_main.xml | 5 +- app/src/main/res/layout/fragment_songs.xml | 3 +- app/src/main/res/layout/item_album.xml | 5 +- app/src/main/res/layout/item_album_song.xml | 3 +- app/src/main/res/layout/item_artist.xml | 3 +- app/src/main/res/layout/item_artist_album.xml | 3 +- app/src/main/res/layout/item_genre.xml | 3 +- app/src/main/res/layout/item_genre_artist.xml | 3 +- app/src/main/res/layout/item_header.xml | 3 +- app/src/main/res/layout/item_song.xml | 3 +- app/src/main/res/values/dimens.xml | 2 +- 32 files changed, 126 insertions(+), 126 deletions(-) delete mode 100644 AuxioTODO diff --git a/AuxioTODO b/AuxioTODO deleted file mode 100644 index 40b05a6cb..000000000 --- a/AuxioTODO +++ /dev/null @@ -1,41 +0,0 @@ -TODO: - -TODOs surrounded with ?s are things I want to do, but need to do more research on and may be a nightmare to implement. -TODOs surrounded with !s are things I tried to do, but failed for reasons included in the TODO. I still want to add these, but theres no way for me to do them at the moment. - -/detail/ - -- ? Implement Toolbar update functionality ? -- ! Implement shared element transitions [Return transitions are broken] ! - -/music/ - -- Add option to show all genres -- ! Move genres to songs [Wont find songs w/o genres]! -- ! Remove lists from music models [Current genre loading system makes it impossible] ! -- ! Dont determine track/album/artist counts on the fly [Audio columns for those values are broken] ! - -/songs/ - -- Search when LibraryFragment isnt enabled -- ? Sorting ? -- ? Fast Scrolling ? - -/library/ - -- Exit functionality -- ? Add icons to overflow menu items ? -- ? Add Nested Nav to Library ViewPager fragment [Hold fire on this until everything else is added, there could be sneaky bugs later on if you add it now] ? -- ! Move Adapter functionality to ListAdapter [RecyclerView scrolls to middle/bottom when data is re-sorted] ! - -/playback/ -- - -/other/ -- Highlight recycler items when they are being played - -/bugs/ -- Fix issue where fast navigations will cause the app to not display anything - -To be added: -/prefs/ \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index efac9d8a8..fe6160e80 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -7,6 +7,9 @@ import android.view.View import androidx.appcompat.app.AppCompatActivity import org.oxycblt.auxio.theme.accent +// FIXME: Fix bug where fast navigation will break the fade animation and +// lead to nothing being displayed [Possibly Un-fixable] + class MainActivity : AppCompatActivity() { override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? { diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index 84cb3026b..27365a142 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -57,6 +57,8 @@ class MainFragment : Fragment() { // --- UI SETUP --- + // TODO: Add nested viewpager navigation [If practical] + binding.lifecycleOwner = this binding.mainViewPager.adapter = PagerAdapter() @@ -70,6 +72,8 @@ class MainFragment : Fragment() { } }.attach() + binding.compactPlayback.visibility = View.GONE + // Set up the selected/deselected colors binding.mainTabs.addOnTabSelectedListener( object : TabLayout.OnTabSelectedListener { diff --git a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt index b5e9f1cbc..c2a2af799 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -16,6 +16,9 @@ import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.theme.applyDivider import org.oxycblt.auxio.theme.disable +// TODO: Add media controls to DetailFragments [Play, Shuffle] +// TODO: Implement a system where if the main info [Name, Parent, Counts] scrolls off of +// the screen, then update the toolbar to show that info w/the media controls class ArtistDetailFragment : Fragment() { private val args: ArtistDetailFragmentArgs by navArgs() diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt index 26aca157c..d00943984 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -8,6 +8,11 @@ import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.recycler.SortMode +// ViewModel for the Detail Fragments. +// TODO: +// - Implement a system where the Toolbar will update with the info [And Media Controls] when +// the main info of the detail fragment is removed. +// - Implement shared element transitions [If that is even possible] class DetailViewModel : ViewModel() { private var mIsNavigating = false val isNavigating: Boolean get() = mIsNavigating diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt index 38c174d8d..e69d589dd 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -31,6 +31,7 @@ import org.oxycblt.auxio.theme.applyColor import org.oxycblt.auxio.theme.applyDivider import org.oxycblt.auxio.theme.resolveAttr +// A Fragment to show all the music in the Library. class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { private val musicModel: MusicViewModel by activityViewModels { @@ -57,6 +58,7 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { // --- UI SETUP --- + // TODO: Add exit functionality binding.libraryToolbar.apply { overflowIcon = ContextCompat.getDrawable( requireContext(), R.drawable.ic_sort_none @@ -78,6 +80,7 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { true } + // TODO: Add icons to overflow menu items menu.apply { val item = findItem(R.id.action_search) val searchView = item.actionView as SearchView @@ -115,6 +118,8 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { } } + // TODO: Change LibraryAdapter to a ListAdapter + // [If there's a way to preserve scroll position properly] binding.libraryRecycler.apply { adapter = libraryAdapter @@ -176,8 +181,10 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { } private fun navToItem(baseModel: BaseModel) { + // TODO: Implement shared element transitions to the DetailFragments [If possible] + // If the item is a song [That was selected through search], then update the playback - // to that song instead of doing any naviagation + // to that song instead of doing any navigation if (baseModel is Song) { playbackModel.updateSong(baseModel) return diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt index 545399a31..3372a5903 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt @@ -7,7 +7,6 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment @@ -38,7 +37,7 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) { ) { granted: Boolean -> // If its actually granted, restart the loading process again. if (granted) { - wipeViews(binding) + returnToLoading(binding) musicModel.reload() } @@ -51,13 +50,45 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) { // --- VIEWMODEL SETUP --- - musicModel.response.observe(viewLifecycleOwner) { onMusicLoadResponse(it, binding) } - musicModel.doReload.observe(viewLifecycleOwner) { onRetry(it, binding) } - musicModel.doGrant.observe(viewLifecycleOwner) { onGrant(it, permLauncher) } + musicModel.response.observe(viewLifecycleOwner) { + if (it == MusicLoaderResponse.DONE) { + findNavController().navigate( + LoadingFragmentDirections.actionToMain() + ) + } else { + binding.loadingErrorText.text = + if (it == MusicLoaderResponse.NO_MUSIC) + getString(R.string.error_no_music) + else + getString(R.string.error_music_load_failed) + + // If the response wasn't a success, then show the specific error message + // depending on which error response was given, along with a retry button + showError(binding) + binding.loadingRetryButton.visibility = View.VISIBLE + } + } + + musicModel.doReload.observe(viewLifecycleOwner) { + if (it) { + returnToLoading(binding) + musicModel.doneWithReload() + } + } + + musicModel.doGrant.observe(viewLifecycleOwner) { + if (it) { + permLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE) + musicModel.doneWithGrant() + } + } // Force an error screen if the permissions are denied or the prompt needs to be shown. if (checkPerms()) { - onNoPerms(binding) + showError(binding) + + binding.loadingGrantButton.visibility = View.VISIBLE + binding.loadingErrorText.text = getString(R.string.error_no_perms) } else { musicModel.go() } @@ -78,61 +109,15 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) { ) == PackageManager.PERMISSION_DENIED } - private fun onMusicLoadResponse( - response: MusicLoaderResponse?, - binding: FragmentLoadingBinding - ) { - if (response == MusicLoaderResponse.DONE) { - findNavController().navigate( - LoadingFragmentDirections.actionToMain() - ) - } else { - binding.loadingErrorText.text = - if (response == MusicLoaderResponse.NO_MUSIC) - getString(R.string.error_no_music) - else - getString(R.string.error_music_load_failed) - - // If the response wasn't a success, then show the specific error message - // depending on which error response was given, along with a retry button - binding.loadingBar.visibility = View.GONE - binding.loadingErrorText.visibility = View.VISIBLE - binding.loadingErrorIcon.visibility = View.VISIBLE - binding.loadingRetryButton.visibility = View.VISIBLE - } - } - - private fun onNoPerms(binding: FragmentLoadingBinding) { - // If there are no perms, switch out the view elements as if an error screen was being - // shown, but show the label that Auxio needs to read external storage to function, - // along with a GRANT button - + // Remove the loading indicator and show the error groups + private fun showError(binding: FragmentLoadingBinding) { binding.loadingBar.visibility = View.GONE binding.loadingErrorIcon.visibility = View.VISIBLE - binding.loadingGrantButton.visibility = View.VISIBLE binding.loadingErrorText.visibility = View.VISIBLE - - binding.loadingErrorText.text = getString(R.string.error_no_perms) - } - - private fun onRetry(retry: Boolean, binding: FragmentLoadingBinding) { - if (retry) { - wipeViews(binding) - - musicModel.doneWithReload() - } - } - - private fun onGrant(grant: Boolean, permLauncher: ActivityResultLauncher) { - if (grant) { - permLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE) - - musicModel.doneWithGrant() - } } // Wipe views and switch back to the plain ProgressBar - private fun wipeViews(binding: FragmentLoadingBinding) { + private fun returnToLoading(binding: FragmentLoadingBinding) { binding.loadingBar.visibility = View.VISIBLE binding.loadingErrorText.visibility = View.GONE binding.loadingErrorIcon.visibility = View.GONE diff --git a/app/src/main/java/org/oxycblt/auxio/music/Models.kt b/app/src/main/java/org/oxycblt/auxio/music/Models.kt index d1b6861e9..4b2c2afd7 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Models.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Models.kt @@ -2,6 +2,10 @@ package org.oxycblt.auxio.music import android.net.Uri +// --- MUSIC MODELS --- +// TODO: Remove parent/child references so that they can be parcelable [Would require genre rework] +// TODO: Dont determine artist/album/song counts on the fly [If possible] + // The base model for all music // This is used in a lot of general functions in order to cut down on code sealed class BaseModel { diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt index ff1a30bde..052df6c56 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt @@ -17,9 +17,7 @@ import org.oxycblt.auxio.music.processing.MusicLoaderResponse import org.oxycblt.auxio.music.processing.MusicSorter // ViewModel for music storage. -// FIXME: This system can be improved in multiple ways -// - Remove lists/parents from models so that they can be parcelable -// - Move genre usage to songs [If there's a way to find songs without a genre] +// TODO: Move genre usage to songs [If there's a way to find songs without a genre] class MusicViewModel(private val app: Application) : ViewModel() { // Coroutine diff --git a/app/src/main/java/org/oxycblt/auxio/music/coil/MosaicFetcher.kt b/app/src/main/java/org/oxycblt/auxio/music/coil/MosaicFetcher.kt index 3d2bc215d..16c214637 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/coil/MosaicFetcher.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/coil/MosaicFetcher.kt @@ -21,6 +21,8 @@ import java.io.InputStream const val MOSAIC_BITMAP_SIZE = 512 const val MOSAIC_BITMAP_INCREMENT = 256 +// A Fetcher that takes multiple cover uris and turns them into a 2x2 mosaic image. +// TODO: Add 4x4 mosaics? class MosaicFetcher(private val context: Context) : Fetcher> { override suspend fun fetch( pool: BitmapPool, @@ -30,8 +32,9 @@ class MosaicFetcher(private val context: Context) : Fetcher> { ): FetchResult { val streams = mutableListOf() - for (uri in data) { - val stream: InputStream? = context.contentResolver.openInputStream(uri) + // Load the streams. + data.forEach { + val stream: InputStream? = context.contentResolver.openInputStream(it) if (stream != null) { streams.add(stream) @@ -39,7 +42,7 @@ class MosaicFetcher(private val context: Context) : Fetcher> { } // If so many streams failed that there's not enough images to make a mosaic, then - // just return the first album. + // just return the first cover image. if (streams.size < 4) { streams.forEach { it.close() } diff --git a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt index 1f2b16ded..932d1ed37 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt @@ -19,6 +19,7 @@ enum class MusicLoaderResponse { } // Class that loads music from the FileSystem. +// TODO: Add custom artist images from the filesystem class MusicLoader( private val resolver: ContentResolver, diff --git a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt index d8142266a..e23b5a98e 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt @@ -24,6 +24,8 @@ class CompactPlaybackFragment : Fragment() { ): View? { val binding = FragmentCompactPlaybackBinding.inflate(inflater) + // --- UI SETUP --- + binding.lifecycleOwner = this // Put a placeholder song in the binding & hide the playback fragment initially, @@ -31,6 +33,9 @@ class CompactPlaybackFragment : Fragment() { binding.song = musicModel.songs.value!![0] binding.root.visibility = View.GONE + // --- VIEWMODEL SETUP --- + + // TODO: Add some kind of animation to when this view becomes visible/invisible. playbackModel.currentSong.observe(viewLifecycleOwner) { if (it == null) { Log.d(this::class.simpleName, "Hiding playback bar due to no song being played.") 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 ea4afc4c2..7ae8c29f5 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 @@ -15,7 +15,9 @@ import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.recycler.ClickListener // Shared ViewHolders for each ViewModel, providing basic information -// All new instances should be created with from(context, listener) instead of direct instantiation. +// All new instances should be created with from() instead of direct instantiation. +// TODO: Add indicators to song recycler items when they're being played. + class GenreViewHolder private constructor( listener: ClickListener, private val binding: ItemGenreBinding @@ -82,6 +84,8 @@ class AlbumViewHolder private constructor( } } +// TODO: Add indicators to song recycler items when they're being played. + class SongViewHolder private constructor( listener: ClickListener, private val binding: ItemSongBinding diff --git a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt index 6514f2b20..37f01a3d4 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt @@ -12,7 +12,6 @@ import org.oxycblt.auxio.music.MusicViewModel import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.theme.applyDivider - class SongsFragment : Fragment() { private val musicModel: MusicViewModel by activityViewModels { MusicViewModel.Factory(requireActivity().application) @@ -27,6 +26,9 @@ class SongsFragment : Fragment() { ): View? { val binding = FragmentSongsBinding.inflate(inflater) + // TODO: Add option to search songs if LibraryFragment isn't enabled + // TODO: Maybe add fast scrolling or sorting + // --- UI SETUP --- binding.songRecycler.apply { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0d46882b8..c02052b06 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,5 +5,7 @@ android:name="androidx.navigation.fragment.NavHostFragment" app:defaultNavHost="true" app:navGraph="@navigation/nav_main" + tools:context=".MainActivity" xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:android="http://schemas.android.com/apk/res/android" /> \ No newline at end of file + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_album_detail.xml b/app/src/main/res/layout/fragment_album_detail.xml index 6100344b5..6376a3b22 100644 --- a/app/src/main/res/layout/fragment_album_detail.xml +++ b/app/src/main/res/layout/fragment_album_detail.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".detail.AlbumDetailFragment"> diff --git a/app/src/main/res/layout/fragment_artist_detail.xml b/app/src/main/res/layout/fragment_artist_detail.xml index 7a51b7994..cb1ab0b55 100644 --- a/app/src/main/res/layout/fragment_artist_detail.xml +++ b/app/src/main/res/layout/fragment_artist_detail.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".detail.ArtistDetailFragment"> diff --git a/app/src/main/res/layout/fragment_compact_playback.xml b/app/src/main/res/layout/fragment_compact_playback.xml index dd4db3c05..4b3869135 100644 --- a/app/src/main/res/layout/fragment_compact_playback.xml +++ b/app/src/main/res/layout/fragment_compact_playback.xml @@ -67,12 +67,12 @@ android:singleLine="true" android:marqueeRepeatLimit="marquee_forever" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" - android:text="@{@string/format_info(song.album.name, song.album.artist.name)}" + android:text="@{@string/format_info(song.album.artist.name, song.album.name)}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/album_cover" app:layout_constraintTop_toBottomOf="@+id/song_name" - tools:text="Artist / Album" /> + tools:text="Artist Name / Album Name" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_genre_detail.xml b/app/src/main/res/layout/fragment_genre_detail.xml index e41ad259e..0c78e9eca 100644 --- a/app/src/main/res/layout/fragment_genre_detail.xml +++ b/app/src/main/res/layout/fragment_genre_detail.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".detail.GenreDetailFragment"> diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 1c605d70b..cf12da316 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".library.LibraryFragment"> + xmlns:android="http://schemas.android.com/apk/res/android" + tools:context=".loading.LoadingFragment"> diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 20fed8aa4..6d96daa3d 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".MainFragment"> + xmlns:tools="http://schemas.android.com/tools" + tools:context=".songs.SongsFragment"> + xmlns:tools="http://schemas.android.com/tools" + tools:context=".recycler.viewholders.AlbumViewHolder"> @@ -58,6 +59,6 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@+id/album_cover" app:layout_constraintTop_toBottomOf="@+id/album_name" - tools:text="10 Songs" /> + tools:text="Artist / 10 Songs" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_album_song.xml b/app/src/main/res/layout/item_album_song.xml index 86d3834ba..f7dc15e2d 100644 --- a/app/src/main/res/layout/item_album_song.xml +++ b/app/src/main/res/layout/item_album_song.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".detail.adapters.DetailSongAdapter.ViewHolder"> diff --git a/app/src/main/res/layout/item_artist.xml b/app/src/main/res/layout/item_artist.xml index 6a21f98d2..df60661a3 100644 --- a/app/src/main/res/layout/item_artist.xml +++ b/app/src/main/res/layout/item_artist.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".recycler.viewholders.ArtistViewHolder"> diff --git a/app/src/main/res/layout/item_artist_album.xml b/app/src/main/res/layout/item_artist_album.xml index b08133cc7..b5a0bba9d 100644 --- a/app/src/main/res/layout/item_artist_album.xml +++ b/app/src/main/res/layout/item_artist_album.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".detail.adapters.DetailAlbumAdapter.ViewHolder"> diff --git a/app/src/main/res/layout/item_genre.xml b/app/src/main/res/layout/item_genre.xml index a156d904b..90c653d7d 100644 --- a/app/src/main/res/layout/item_genre.xml +++ b/app/src/main/res/layout/item_genre.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".recycler.viewholders.GenreViewHolder"> diff --git a/app/src/main/res/layout/item_genre_artist.xml b/app/src/main/res/layout/item_genre_artist.xml index 8207b17f5..ec8d33468 100644 --- a/app/src/main/res/layout/item_genre_artist.xml +++ b/app/src/main/res/layout/item_genre_artist.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".detail.adapters.DetailArtistAdapter.ViewHolder"> diff --git a/app/src/main/res/layout/item_header.xml b/app/src/main/res/layout/item_header.xml index dbeb83f75..47112c812 100644 --- a/app/src/main/res/layout/item_header.xml +++ b/app/src/main/res/layout/item_header.xml @@ -1,7 +1,8 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + tools:context=".recycler.viewholders.HeaderViewHolder"> diff --git a/app/src/main/res/layout/item_song.xml b/app/src/main/res/layout/item_song.xml index 4651a26db..43d0bc30a 100644 --- a/app/src/main/res/layout/item_song.xml +++ b/app/src/main/res/layout/item_song.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".recycler.viewholders.SongViewHolder"> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index f0bc138e3..0cb8c3306 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -16,7 +16,7 @@ 44dp 56dp 68dp - 230dp + 250dp 32dp 20sp