Add cover image and backdrop integration

This commit is contained in:
Antonio Cappiello 2020-11-26 16:05:58 +01:00
parent 6c26c6d889
commit a0f417fa94
50 changed files with 385 additions and 204 deletions

View file

@ -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<AlbumAdapter.ViewHolder>
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<AlbumAdapter.ViewHolder>
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);
}

View file

@ -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<AlbumArtistPageAdapter.ViewHolder> {
private static final String TAG = "RecentMusicAdapter";
private static final String TAG = "AlbumArtistPageAdapter";
private List<Album> albums;
private LayoutInflater mInflater;
private Context context;
@ -37,6 +39,11 @@ public class AlbumArtistPageAdapter extends RecyclerView.Adapter<AlbumArtistPage
Album album = albums.get(position);
holder.textAlbumName.setText(album.getTitle());
CustomGlideRequest.Builder
.from(context, album.getPrimary(), album.getBlurHash(), CustomGlideRequest.PRIMARY)
.build()
.into(holder.cover);
}
@Override
@ -46,11 +53,13 @@ public class AlbumArtistPageAdapter extends RecyclerView.Adapter<AlbumArtistPage
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textAlbumName;
ImageView cover;
ViewHolder(View itemView) {
super(itemView);
textAlbumName = itemView.findViewById(R.id.album_name_label);
cover = itemView.findViewById(R.id.artist_page_album_cover_image_view);
itemView.setOnClickListener(this);
}

View file

@ -4,13 +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 java.util.List;
@ -39,6 +40,12 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter<AlbumCatalogueAd
holder.textAlbumName.setText(album.getTitle());
holder.textArtistName.setText(album.getArtistName());
CustomGlideRequest.Builder
.from(context, album.getPrimary(), album.getBlurHash(), CustomGlideRequest.PRIMARY)
.build()
// .override(300)
.into(holder.cover);
}
@Override
@ -49,12 +56,14 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter<AlbumCatalogueAd
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_catalogue_cover_image_view);
itemView.setOnClickListener(this);
}

View file

@ -4,13 +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.Artist;
import com.cappielloantonio.play.util.Util;
import java.util.List;
@ -38,6 +39,11 @@ public class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ViewHolder
Artist artist = artists.get(position);
holder.textArtistName.setText(artist.getName());
CustomGlideRequest.Builder
.from(context, artist.getPrimary(), artist.getPrimaryBlurHash(), CustomGlideRequest.PRIMARY)
.build()
.into(holder.cover);
}
@Override
@ -47,11 +53,13 @@ public class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textArtistName;
ImageView cover;
ViewHolder(View itemView) {
super(itemView);
textArtistName = itemView.findViewById(R.id.artist_name_label);
cover = itemView.findViewById(R.id.artist_cover_image_view);
itemView.setOnClickListener(this);
}

View file

@ -4,11 +4,13 @@ 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.Artist;
import java.util.List;
@ -37,6 +39,11 @@ public class ArtistCatalogueAdapter extends RecyclerView.Adapter<ArtistCatalogue
Artist artist = artists.get(position);
holder.textArtistName.setText(artist.getName());
CustomGlideRequest.Builder
.from(context, artist.getPrimary(), artist.getPrimaryBlurHash(), CustomGlideRequest.PRIMARY)
.build()
.into(holder.cover);
}
@Override
@ -46,11 +53,13 @@ public class ArtistCatalogueAdapter extends RecyclerView.Adapter<ArtistCatalogue
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textArtistName;
ImageView cover;
ViewHolder(View itemView) {
super(itemView);
textArtistName = itemView.findViewById(R.id.artist_name_label);
cover = itemView.findViewById(R.id.artist_catalogue_cover_image_view);
itemView.setOnClickListener(this);
}

View file

@ -4,12 +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.App;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.SongRepository;
@ -40,6 +42,11 @@ public class DiscoverSongAdapter extends RecyclerView.Adapter<DiscoverSongAdapte
holder.textTitle.setText(song.getTitle());
holder.textAlbum.setText(song.getAlbumName());
CustomGlideRequest.Builder
.from(context, song.getPrimary(), song.getPrimary(), CustomGlideRequest.PRIMARY)
.build()
.into(holder.cover);
}
@Override
@ -50,12 +57,14 @@ public class DiscoverSongAdapter extends RecyclerView.Adapter<DiscoverSongAdapte
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textTitle;
TextView textAlbum;
ImageView cover;
ViewHolder(View itemView) {
super(itemView);
textTitle = itemView.findViewById(R.id.title_discover_song_label);
textAlbum = itemView.findViewById(R.id.album_discover_song_label);
cover = itemView.findViewById(R.id.discover_song_cover_image_view);
itemView.setOnClickListener(this);
}

View file

@ -4,12 +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.App;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.SongRepository;
@ -32,7 +34,7 @@ public class RecentMusicAdapter extends RecyclerView.Adapter<RecentMusicAdapter.
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.item_home_recent_track, parent, false);
View view = mInflater.inflate(R.layout.item_home_track, parent, false);
return new ViewHolder(view);
}
@ -42,6 +44,11 @@ public class RecentMusicAdapter extends RecyclerView.Adapter<RecentMusicAdapter.
holder.textTitle.setText(song.getTitle());
holder.textAlbum.setText(song.getAlbumName());
CustomGlideRequest.Builder
.from(context, song.getPrimary(), song.getPrimary(), CustomGlideRequest.PRIMARY)
.build()
.into(holder.cover);
}
@Override
@ -52,12 +59,14 @@ public class RecentMusicAdapter extends RecyclerView.Adapter<RecentMusicAdapter.
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textTitle;
TextView textAlbum;
ImageView cover;
ViewHolder(View itemView) {
super(itemView);
textTitle = itemView.findViewById(R.id.title_track_label);
textAlbum = itemView.findViewById(R.id.album_track_label);
cover = itemView.findViewById(R.id.track_cover_image_view);
itemView.setOnClickListener(this);
}

View file

@ -4,12 +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.App;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.SongRepository;
import com.cappielloantonio.play.util.Util;
@ -44,6 +46,11 @@ public class SongResultSearchAdapter extends RecyclerView.Adapter<SongResultSear
holder.songTitle.setText(song.getTitle());
holder.songArtist.setText(song.getArtistName());
holder.songDuration.setText(Util.getReadableDurationString(song.getDuration()));
CustomGlideRequest.Builder
.from(context, song.getPrimary(), song.getPrimary(), CustomGlideRequest.PRIMARY)
.build()
.into(holder.cover);
}
@Override
@ -55,6 +62,7 @@ public class SongResultSearchAdapter extends RecyclerView.Adapter<SongResultSear
TextView songTitle;
TextView songArtist;
TextView songDuration;
ImageView cover;
ViewHolder(View itemView) {
super(itemView);
@ -62,6 +70,7 @@ public class SongResultSearchAdapter extends RecyclerView.Adapter<SongResultSear
songTitle = itemView.findViewById(R.id.search_result_song_title_text_view);
songArtist = itemView.findViewById(R.id.search_result_song_artist_text_view);
songDuration = itemView.findViewById(R.id.search_result_song_duration_text_view);
cover = itemView.findViewById(R.id.song_cover_image_view);
itemView.setOnClickListener(this);
}

View file

@ -0,0 +1,88 @@
package com.cappielloantonio.play.glide;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import androidx.core.content.res.ResourcesCompat;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.signature.ObjectKey;
import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R;
import com.wolt.blurhashkt.BlurHashDecoder;
import org.jellyfin.apiclient.model.dto.ImageOptions;
import org.jellyfin.apiclient.model.entities.ImageType;
public class CustomGlideRequest {
public static final String PRIMARY = "PRIMARY";
public static final String BACKDROP = "BACKDROP";
public static final DiskCacheStrategy DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.ALL;
public static final int DEFAULT_IMAGE = R.drawable.ic_launcher_background;
public static class Builder {
private final RequestManager requestManager;
private final Object item;
private final Context context;
private Builder(Context context, String item, String placeholder, String itemType) {
this.requestManager = Glide.with(context);
this.item = item != null ? createUrl(item, itemType) : DEFAULT_IMAGE;
this.context = context;
if (placeholder != null) {
Bitmap bitmap = BlurHashDecoder.INSTANCE.decode(placeholder, 40, 40, 1, true);
BitmapDrawable drawable = new BitmapDrawable(context.getResources(), bitmap);
requestManager.applyDefaultRequestOptions(createRequestOptions(item, drawable));
} else {
Drawable drawable = ResourcesCompat.getDrawable(context.getResources(), DEFAULT_IMAGE, null);
requestManager.applyDefaultRequestOptions(createRequestOptions(item, drawable));
}
}
public static Builder from(Context context, String item, String placeholder, String itemType) {
return new Builder(context, item, placeholder, itemType);
}
public RequestBuilder<Drawable> 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);
}
}

View file

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

View file

@ -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];
}

View file

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

View file

@ -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<>());

View file

@ -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"));

View file

@ -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<>());

View file

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

View file

@ -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<>());

View file

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

View file

@ -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<>());

View file

@ -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<String> hashSet = new LinkedHashSet<>(suggestions);
ArrayList<String> suggestionsWithoutDuplicates = new ArrayList<>(hashSet);
return suggestionsWithoutDuplicates;
}
}