diff --git a/app/build.gradle b/app/build.gradle index 29a5acd5..f7680b0a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,7 @@ dependencies { // Glide implementation 'com.github.bumptech.glide:glide:4.11.0' + implementation "com.github.woltapp:blurhash:f41a23cc50" annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' annotationProcessor "androidx.room:room-compiler:2.2.5" diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java index 6a9e15e5..199b6789 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java @@ -4,14 +4,14 @@ import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.R; +import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.model.Album; -import com.cappielloantonio.play.model.Artist; -import com.cappielloantonio.play.util.Util; import java.util.List; @@ -40,6 +40,11 @@ public class AlbumAdapter extends RecyclerView.Adapter holder.textAlbumName.setText(album.getTitle()); holder.textArtistName.setText(album.getArtistName()); + + CustomGlideRequest.Builder + .from(context, album.getPrimary(), album.getBlurHash(), CustomGlideRequest.PRIMARY) + .build() + .into(holder.cover); } @Override @@ -50,12 +55,14 @@ public class AlbumAdapter extends RecyclerView.Adapter public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView textAlbumName; TextView textArtistName; + ImageView cover; ViewHolder(View itemView) { super(itemView); textAlbumName = itemView.findViewById(R.id.album_name_label); textArtistName = itemView.findViewById(R.id.artist_name_label); + cover = itemView.findViewById(R.id.album_cover_image_view); itemView.setOnClickListener(this); } diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java index cfe4dfa2..91e0a1cb 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java @@ -4,17 +4,19 @@ import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.R; +import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.model.Album; import java.util.List; public class AlbumArtistPageAdapter extends RecyclerView.Adapter { - private static final String TAG = "RecentMusicAdapter"; + private static final String TAG = "AlbumArtistPageAdapter"; private List albums; private LayoutInflater mInflater; private Context context; @@ -37,6 +39,11 @@ public class AlbumArtistPageAdapter extends RecyclerView.Adapter build() { + return requestManager.load(item); + } + } + + public static RequestOptions createRequestOptions(String item, Drawable placeholder) { + RequestOptions options = new RequestOptions() + .placeholder(placeholder) + .error(DEFAULT_IMAGE) + .diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) + .signature(new ObjectKey(item != null ? item : 0)) + .centerCrop(); + + return options; + } + + public static String createUrl(String item, String itemType) { + ImageOptions options = new ImageOptions(); + switch(itemType) { + case PRIMARY: { + options.setImageType(ImageType.Primary); + break; + } + case BACKDROP: { + options.setImageType(ImageType.Backdrop); + break; + } + } + options.setQuality(100); + options.setMaxHeight(500); + options.setEnableImageEnhancers(true); + + return App.getApiClientInstance(App.getInstance()).GetImageUrl(item, options); + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/helper/recyclerview/ItemlDecoration.java b/app/src/main/java/com/cappielloantonio/play/helper/recyclerview/ItemDecoration.java similarity index 90% rename from app/src/main/java/com/cappielloantonio/play/helper/recyclerview/ItemlDecoration.java rename to app/src/main/java/com/cappielloantonio/play/helper/recyclerview/ItemDecoration.java index a0d61672..32b12edc 100644 --- a/app/src/main/java/com/cappielloantonio/play/helper/recyclerview/ItemlDecoration.java +++ b/app/src/main/java/com/cappielloantonio/play/helper/recyclerview/ItemDecoration.java @@ -5,12 +5,12 @@ import android.view.View; import androidx.recyclerview.widget.RecyclerView; -public class ItemlDecoration extends RecyclerView.ItemDecoration { +public class ItemDecoration extends RecyclerView.ItemDecoration { private int spanCount; private int spacing; private boolean includeEdge; - public ItemlDecoration(int spanCount, int spacing, boolean includeEdge) { + public ItemDecoration(int spanCount, int spacing, boolean includeEdge) { this.spanCount = spanCount; this.spacing = spacing; this.includeEdge = includeEdge; diff --git a/app/src/main/java/com/cappielloantonio/play/model/Artist.java b/app/src/main/java/com/cappielloantonio/play/model/Artist.java index 2b363a5d..ec6bd14d 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Artist.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Artist.java @@ -59,13 +59,13 @@ public class Artist implements Parcelable { this.id = itemDto.getId(); this.name = itemDto.getName(); - this.primary = itemDto.getImageTags().getOrDefault(ImageType.Primary, null); + this.primary = itemDto.getImageTags().containsKey(ImageType.Primary) ? id : null; if (itemDto.getImageBlurHashes() != null && itemDto.getImageBlurHashes().get(ImageType.Primary) != null) { this.primaryBlurHash = (String) itemDto.getImageBlurHashes().get(ImageType.Primary).values().toArray()[0]; } try { - this.backdrop = itemDto.getBackdropImageTags().get(0); + this.backdrop = !itemDto.getBackdropImageTags().get(0).isEmpty() ? id : null; if (itemDto.getImageBlurHashes() != null && itemDto.getBackdropImageTags().get(0) != null) { this.backdropBlurHash = (String) itemDto.getImageBlurHashes().get(ImageType.Backdrop).values().toArray()[0]; } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/activities/MainActivity.java b/app/src/main/java/com/cappielloantonio/play/ui/activities/MainActivity.java index fa02315e..893afea6 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/activities/MainActivity.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/activities/MainActivity.java @@ -88,14 +88,19 @@ public class MainActivity extends BaseActivity { public void goToSync() { bottomNavigationView.setVisibility(View.GONE); - Bundle bundle = SyncUtil.getSyncBundle(true, true, true, true, true, false); if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.landingFragment) { + Bundle bundle = SyncUtil.getSyncBundle(true, true, true, true, true, false); navController.navigate(R.id.action_landingFragment_to_syncFragment, bundle); } else if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.loginFragment) { + Bundle bundle = SyncUtil.getSyncBundle(true, true, true, true, true, false); navController.navigate(R.id.action_loginFragment_to_syncFragment, bundle); } else if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.homeFragment) { + Bundle bundle = SyncUtil.getSyncBundle(true, true, true, true, true, false); navController.navigate(R.id.action_homeFragment_to_syncFragment, bundle); + } else if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.libraryFragment) { + Bundle bundle = SyncUtil.getSyncBundle(false, false, true, false, false, true); + navController.navigate(R.id.action_libraryFragment_to_syncFragment, bundle); } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java index 1b9ac1d5..c1bfe88b 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java @@ -4,7 +4,6 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; @@ -13,7 +12,7 @@ import androidx.recyclerview.widget.GridLayoutManager; import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumCatalogueAdapter; import com.cappielloantonio.play.databinding.FragmentAlbumCatalogueBinding; -import com.cappielloantonio.play.helper.recyclerview.ItemlDecoration; +import com.cappielloantonio.play.helper.recyclerview.ItemDecoration; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.AlbumCatalogueViewModel; @@ -49,7 +48,7 @@ public class AlbumCatalogueFragment extends Fragment { private void initAlbumCatalogueView() { bind.albumCatalogueRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); - bind.albumCatalogueRecyclerView.addItemDecoration(new ItemlDecoration(2, 20, false)); + bind.albumCatalogueRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); bind.albumCatalogueRecyclerView.setHasFixedSize(true); albumAdapter = new AlbumCatalogueAdapter(requireContext(), new ArrayList<>()); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java index 7222f5d0..14f318b6 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java @@ -9,14 +9,11 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; -import com.cappielloantonio.play.adapter.AlbumArtistPageAdapter; import com.cappielloantonio.play.adapter.SongResultSearchAdapter; import com.cappielloantonio.play.databinding.FragmentAlbumPageBinding; -import com.cappielloantonio.play.databinding.FragmentArtistPageBinding; -import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.AlbumPageViewModel; -import com.cappielloantonio.play.viewmodel.ArtistPageViewModel; import java.util.ArrayList; @@ -37,6 +34,7 @@ public class AlbumPageFragment extends Fragment { albumPageViewModel = new ViewModelProvider(requireActivity()).get(AlbumPageViewModel.class); init(); + initBackCover(); initSongsView(); return view; @@ -48,6 +46,13 @@ public class AlbumPageFragment extends Fragment { bind = null; } + private void initBackCover() { + CustomGlideRequest.Builder + .from(requireContext(), albumPageViewModel.getAlbum().getPrimary(), albumPageViewModel.getAlbum().getBlurHash(), CustomGlideRequest.PRIMARY) + .build() + .into(bind.albumBackCoverImageView); + } + private void init() { albumPageViewModel.setAlbum(getArguments().getParcelable("album_object")); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.java index e0b417e8..017edf33 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.java @@ -4,26 +4,19 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import androidx.fragment.app.Fragment; -import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.R; -import com.cappielloantonio.play.adapter.ArtistAdapter; import com.cappielloantonio.play.adapter.ArtistCatalogueAdapter; -import com.cappielloantonio.play.adapter.RecentMusicAdapter; import com.cappielloantonio.play.databinding.FragmentArtistCatalogueBinding; -import com.cappielloantonio.play.helper.recyclerview.ItemlDecoration; -import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.helper.recyclerview.ItemDecoration; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.ArtistCatalogueViewModel; import java.util.ArrayList; -import java.util.List; public class ArtistCatalogueFragment extends Fragment { private static final String TAG = "ArtistCatalogueFragment"; @@ -55,7 +48,7 @@ public class ArtistCatalogueFragment extends Fragment { private void initArtistCatalogueView() { bind.artistCatalogueRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); - bind.artistCatalogueRecyclerView.addItemDecoration(new ItemlDecoration(2, 20, false)); + bind.artistCatalogueRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); bind.artistCatalogueRecyclerView.setHasFixedSize(true); artistAdapter = new ArtistCatalogueAdapter(requireContext(), new ArrayList<>()); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistPageFragment.java index 9fbca863..b770f2f3 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistPageFragment.java @@ -1,25 +1,22 @@ package com.cappielloantonio.play.ui.fragment; import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumArtistPageAdapter; -import com.cappielloantonio.play.adapter.RecentMusicAdapter; import com.cappielloantonio.play.adapter.SongResultSearchAdapter; import com.cappielloantonio.play.databinding.FragmentArtistPageBinding; -import com.cappielloantonio.play.databinding.FragmentHomeBinding; +import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.ArtistPageViewModel; -import com.cappielloantonio.play.viewmodel.HomeViewModel; import java.util.ArrayList; @@ -41,6 +38,7 @@ public class ArtistPageFragment extends Fragment { artistPageViewModel = new ViewModelProvider(requireActivity()).get(ArtistPageViewModel.class); init(); + initBackdrop(); initTopSongsView(); initAlbumsView(); @@ -68,6 +66,13 @@ public class ArtistPageFragment extends Fragment { }); } + private void initBackdrop() { + CustomGlideRequest.Builder + .from(requireContext(), artistPageViewModel.getArtist().getBackdrop(), artistPageViewModel.getArtist().getBackdropBlurHash(), CustomGlideRequest.BACKDROP) + .build() + .into(bind.artistBackdropImageView); + } + private void initTopSongsView() { bind.mostStreamedSongRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); bind.mostStreamedSongRecyclerView.setHasFixedSize(true); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java index 71224a9c..41d64f2e 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java @@ -1,40 +1,23 @@ package com.cappielloantonio.play.ui.fragment; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; -import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; -import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; -import com.cappielloantonio.play.adapter.ArtistCatalogueAdapter; -import com.cappielloantonio.play.adapter.GenreAdapter; import com.cappielloantonio.play.adapter.GenreCatalogueAdapter; -import com.cappielloantonio.play.databinding.FragmentArtistCatalogueBinding; import com.cappielloantonio.play.databinding.FragmentGenreCatalogueBinding; -import com.cappielloantonio.play.helper.recyclerview.ItemlDecoration; -import com.cappielloantonio.play.interfaces.MediaCallback; -import com.cappielloantonio.play.model.Genre; +import com.cappielloantonio.play.helper.recyclerview.ItemDecoration; import com.cappielloantonio.play.model.Song; -import com.cappielloantonio.play.model.SongGenreCross; -import com.cappielloantonio.play.repository.GenreRepository; import com.cappielloantonio.play.ui.activities.MainActivity; -import com.cappielloantonio.play.util.PreferenceUtil; -import com.cappielloantonio.play.util.SyncUtil; -import com.cappielloantonio.play.viewmodel.ArtistCatalogueViewModel; import com.cappielloantonio.play.viewmodel.GenreCatalogueViewModel; -import com.google.android.material.snackbar.BaseTransientBottomBar; -import com.google.android.material.snackbar.Snackbar; import java.util.ArrayList; -import java.util.List; public class GenreCatalogueFragment extends Fragment { private static final String TAG = "GenreCatalogueFragment";; @@ -71,7 +54,7 @@ public class GenreCatalogueFragment extends Fragment { private void initArtistCatalogueView() { bind.genreCatalogueRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); - bind.genreCatalogueRecyclerView.addItemDecoration(new ItemlDecoration(2, 16, false)); + bind.genreCatalogueRecyclerView.addItemDecoration(new ItemDecoration(2, 16, false)); bind.genreCatalogueRecyclerView.setHasFixedSize(true); genreCatalogueAdapter = new GenreCatalogueAdapter(requireContext(), new ArrayList<>()); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java index 937ae0e1..928c851a 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java @@ -1,7 +1,6 @@ package com.cappielloantonio.play.ui.fragment; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -10,37 +9,23 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; -import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; -import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumAdapter; import com.cappielloantonio.play.adapter.ArtistAdapter; import com.cappielloantonio.play.adapter.GenreAdapter; import com.cappielloantonio.play.adapter.PlaylistAdapter; import com.cappielloantonio.play.databinding.FragmentLibraryBinding; -import com.cappielloantonio.play.interfaces.MediaCallback; -import com.cappielloantonio.play.model.Album; -import com.cappielloantonio.play.model.Artist; -import com.cappielloantonio.play.model.Genre; -import com.cappielloantonio.play.model.Playlist; import com.cappielloantonio.play.model.Song; -import com.cappielloantonio.play.model.SongGenreCross; -import com.cappielloantonio.play.repository.GenreRepository; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.util.PreferenceUtil; -import com.cappielloantonio.play.util.SyncUtil; import com.cappielloantonio.play.viewmodel.LibraryViewModel; -import com.google.android.material.snackbar.BaseTransientBottomBar; -import com.google.android.material.snackbar.Snackbar; import java.util.ArrayList; -import java.util.List; public class LibraryFragment extends Fragment { private static final String TAG = "LibraryFragment"; @@ -151,7 +136,6 @@ public class LibraryFragment extends Fragment { } private void syncSongsPerGenre() { - Bundle bundle = SyncUtil.getSyncBundle(false, false, true, false, false, true); - activity.navController.navigate(R.id.action_libraryFragment_to_syncFragment, bundle); + activity.goToSync(); } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java index 20643489..39d7fc3c 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java @@ -19,7 +19,7 @@ import com.cappielloantonio.play.adapter.ArtistCatalogueAdapter; import com.cappielloantonio.play.adapter.RecentSearchAdapter; import com.cappielloantonio.play.adapter.SongResultSearchAdapter; import com.cappielloantonio.play.databinding.FragmentSearchBinding; -import com.cappielloantonio.play.helper.recyclerview.ItemlDecoration; +import com.cappielloantonio.play.helper.recyclerview.ItemDecoration; import com.cappielloantonio.play.model.RecentSearch; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.SearchViewModel; @@ -92,7 +92,7 @@ public class SearchFragment extends Fragment { // Albums bind.searchResultAlbumRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); - bind.searchResultAlbumRecyclerView.addItemDecoration(new ItemlDecoration(2, 20, false)); + bind.searchResultAlbumRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); bind.searchResultAlbumRecyclerView.setHasFixedSize(true); albumResultSearchAdapter = new AlbumCatalogueAdapter(requireContext(), new ArrayList<>()); @@ -105,7 +105,7 @@ public class SearchFragment extends Fragment { // Artist bind.searchResultArtistRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); - bind.searchResultArtistRecyclerView.addItemDecoration(new ItemlDecoration(2, 20, false)); + bind.searchResultArtistRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); bind.searchResultArtistRecyclerView.setHasFixedSize(true); artistResultSearchAdapter = new ArtistCatalogueAdapter(requireContext(), new ArrayList<>()); diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java index 96ac25dc..9765c515 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java @@ -1,7 +1,6 @@ package com.cappielloantonio.play.viewmodel; import android.app.Application; -import android.util.Log; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; @@ -9,17 +8,15 @@ import androidx.lifecycle.LiveData; import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; -import com.cappielloantonio.play.model.Genre; import com.cappielloantonio.play.model.RecentSearch; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.AlbumRepository; import com.cappielloantonio.play.repository.ArtistRepository; -import com.cappielloantonio.play.repository.GenreRepository; import com.cappielloantonio.play.repository.RecentSearchRepository; import com.cappielloantonio.play.repository.SongRepository; -import com.paulrybitskyi.persistentsearchview.adapters.model.SuggestionItem; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; public class SearchViewModel extends AndroidViewModel { @@ -78,6 +75,9 @@ public class SearchViewModel extends AndroidViewModel { suggestions.addAll(albumRepository.getSearchSuggestion(query)); suggestions.addAll(artistRepository.getSearchSuggestion(query)); - return suggestions; + LinkedHashSet hashSet = new LinkedHashSet<>(suggestions); + ArrayList suggestionsWithoutDuplicates = new ArrayList<>(hashSet); + + return suggestionsWithoutDuplicates; } } diff --git a/app/src/main/res/drawable/bottom_nav_shape.xml b/app/src/main/res/drawable/bottom_nav_shape.xml index 1a94901f..27aae4b1 100644 --- a/app/src/main/res/drawable/bottom_nav_shape.xml +++ b/app/src/main/res/drawable/bottom_nav_shape.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/discover_background_image.xml b/app/src/main/res/drawable/discover_background_image.xml new file mode 100644 index 00000000..f034255a --- /dev/null +++ b/app/src/main/res/drawable/discover_background_image.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_background_image.xml b/app/src/main/res/drawable/gradient_background_image.xml new file mode 100644 index 00000000..7d92f503 --- /dev/null +++ b/app/src/main/res/drawable/gradient_background_image.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 61a83162..46b24862 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -12,6 +12,7 @@ android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" + android:fitsSystemWindows="true" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" /> diff --git a/app/src/main/res/layout/fragment_album_page.xml b/app/src/main/res/layout/fragment_album_page.xml index 52a9b3db..fa5cc033 100644 --- a/app/src/main/res/layout/fragment_album_page.xml +++ b/app/src/main/res/layout/fragment_album_page.xml @@ -28,12 +28,26 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + + + + + + + android:layout_height="match_parent" + android:paddingTop="20dp"> - + android:layout_height="match_parent" + android:paddingTop="20dp"> + app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior" + android:paddingTop="20dp"> + app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior" + android:paddingTop="20dp"> diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index a6081a35..8466b13d 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -5,7 +5,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" - android:orientation="vertical"> + android:orientation="vertical" + android:paddingTop="20dp"> + android:layout_height="match_parent" + android:paddingTop="20dp"> + android:layout_height="match_parent" + android:paddingTop="20dp"> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_song_list_page.xml b/app/src/main/res/layout/fragment_song_list_page.xml index d5804417..e795088b 100644 --- a/app/src/main/res/layout/fragment_song_list_page.xml +++ b/app/src/main/res/layout/fragment_song_list_page.xml @@ -2,7 +2,8 @@ + android:layout_height="wrap_content" + android:paddingTop="20dp"> + android:layout_height="match_parent" + android:paddingTop="20dp"> + card_view:cardUseCompatPadding="true"> + + + diff --git a/app/src/main/res/layout/item_home_discover_song.xml b/app/src/main/res/layout/item_home_discover_song.xml index f639e050..aa6c1b0e 100644 --- a/app/src/main/res/layout/item_home_discover_song.xml +++ b/app/src/main/res/layout/item_home_discover_song.xml @@ -3,12 +3,22 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:backgroundTint="@color/cardColor" - app:cardCornerRadius="4dp" - android:layout_marginTop="8dp" - android:layout_marginBottom="16dp" android:layout_marginStart="16dp" - android:layout_marginEnd="16dp"> + android:layout_marginTop="8dp" + android:layout_marginEnd="16dp" + android:layout_marginBottom="16dp" + android:backgroundTint="@color/cardColor" + app:cardCornerRadius="4dp"> + + + + diff --git a/app/src/main/res/layout/item_home_recent_track.xml b/app/src/main/res/layout/item_home_track.xml similarity index 75% rename from app/src/main/res/layout/item_home_recent_track.xml rename to app/src/main/res/layout/item_home_track.xml index 4bd79c58..8ad1480e 100644 --- a/app/src/main/res/layout/item_home_recent_track.xml +++ b/app/src/main/res/layout/item_home_track.xml @@ -7,21 +7,29 @@ + card_view:cardUseCompatPadding="true"> + + + diff --git a/app/src/main/res/layout/item_library_album.xml b/app/src/main/res/layout/item_library_album.xml index 41182647..3dc08e4c 100644 --- a/app/src/main/res/layout/item_library_album.xml +++ b/app/src/main/res/layout/item_library_album.xml @@ -7,25 +7,32 @@ + card_view:cardUseCompatPadding="true"> + + + @@ -34,11 +41,12 @@ android:id="@+id/artist_name_label" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:ellipsize="end" android:fontFamily="@font/open_sans_font_family" android:maxWidth="172dp" + android:maxLines="1" android:paddingStart="2dp" android:singleLine="false" - android:text="@string/label_placeholder" android:textColor="@color/titleTextColor" android:textSize="12sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_library_artist.xml b/app/src/main/res/layout/item_library_artist.xml index ea3abe64..de41066f 100644 --- a/app/src/main/res/layout/item_library_artist.xml +++ b/app/src/main/res/layout/item_library_artist.xml @@ -1,31 +1,39 @@ - + card_view:cardUseCompatPadding="true"> + + + diff --git a/app/src/main/res/layout/item_library_catalogue_album.xml b/app/src/main/res/layout/item_library_catalogue_album.xml index 25e2b128..3e82a8d5 100644 --- a/app/src/main/res/layout/item_library_catalogue_album.xml +++ b/app/src/main/res/layout/item_library_catalogue_album.xml @@ -17,17 +17,24 @@ card_view:cardCornerRadius="4dp" card_view:cardElevation="2dp" card_view:cardPreventCornerOverlap="false" - card_view:cardUseCompatPadding="true" /> + card_view:cardUseCompatPadding="true"> + + + + card_view:cardUseCompatPadding="true"> + + + - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_search_result_song.xml b/app/src/main/res/layout/item_search_result_song.xml index 56e78fe2..e5316213 100644 --- a/app/src/main/res/layout/item_search_result_song.xml +++ b/app/src/main/res/layout/item_search_result_song.xml @@ -1,5 +1,6 @@ - + card_view:cardUseCompatPadding="false"> + + + @color/colorAccent @color/colorPrimary - @color/colorPrimary + @android:color/transparent @color/colorPrimary false diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index cd3f043b..c111c32a 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -5,7 +5,7 @@ @color/colorPrimaryDark @color/colorAccent - @color/colorPrimary + @android:color/transparent false true diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml index 2dd53335..0269ad89 100644 --- a/app/src/main/res/values-v27/styles.xml +++ b/app/src/main/res/values-v27/styles.xml @@ -6,7 +6,7 @@ @color/colorAccent @color/colorPrimary - @color/colorPrimary + @android:color/transparent @color/colorPrimary true diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 1193f4b1..a41a14a0 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,12 +5,14 @@ #3700B3 #733ae6 + #FFFFFF + #BFBFBF + #FFFFFF #FFFFFF #FFFFFF - #FFFFFF #252525 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 50184eb4..484c84c3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,14 +5,11 @@ @color/colorPrimaryDark @color/colorAccent - @color/colorPrimary - + @android:color/transparent true true false - - @style/AppTheme.Dialog @style/AppTheme.Dialog