From 7742cbdd0801352a1464e66d89e78efde005fe89 Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Tue, 27 Jul 2021 16:58:38 +0200 Subject: [PATCH] Added starred tracks, starred albums and starred artists view --- .../play/adapter/AlbumHorizontalAdapter.java | 125 +++++++++++++++++ .../play/adapter/ArtistHorizontalAdapter.java | 126 ++++++++++++++++++ ...dapter.java => SongHorizontalAdapter.java} | 12 +- .../cappielloantonio/play/model/Album.java | 1 - .../cappielloantonio/play/model/Artist.java | 9 ++ .../play/repository/AlbumRepository.java | 54 +++++++- .../play/repository/ArtistRepository.java | 36 +++++ .../play/repository/SongRepository.java | 31 +---- .../play/subsonic/models/Starred2.java | 85 +++--------- .../subsonic/models/SubsonicResponse.java | 1 + .../play/ui/fragment/AlbumPageFragment.java | 11 +- .../play/ui/fragment/ArtistPageFragment.java | 11 +- .../play/ui/fragment/HomeFragment.java | 79 ++++++++--- .../ui/fragment/PlaylistPageFragment.java | 11 +- .../play/ui/fragment/SearchFragment.java | 12 +- .../ui/fragment/SongListPageFragment.java | 12 +- .../play/util/MappingUtil.java | 12 ++ .../play/viewmodel/HomeViewModel.java | 44 +++--- app/src/main/res/layout/fragment_home.xml | 106 ++++++++++++++- .../main/res/layout/item_horizontal_album.xml | 70 ++++++++++ .../res/layout/item_horizontal_artist.xml | 70 ++++++++++ ...ult_song.xml => item_horizontal_track.xml} | 2 +- app/src/main/res/navigation/nav_graph.xml | 3 + 23 files changed, 752 insertions(+), 171 deletions(-) create mode 100644 app/src/main/java/com/cappielloantonio/play/adapter/AlbumHorizontalAdapter.java create mode 100644 app/src/main/java/com/cappielloantonio/play/adapter/ArtistHorizontalAdapter.java rename app/src/main/java/com/cappielloantonio/play/adapter/{SongResultSearchAdapter.java => SongHorizontalAdapter.java} (89%) create mode 100644 app/src/main/res/layout/item_horizontal_album.xml create mode 100644 app/src/main/res/layout/item_horizontal_artist.xml rename app/src/main/res/layout/{item_search_result_song.xml => item_horizontal_track.xml} (98%) diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumHorizontalAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumHorizontalAdapter.java new file mode 100644 index 00000000..eb100ba0 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumHorizontalAdapter.java @@ -0,0 +1,125 @@ +package com.cappielloantonio.play.adapter; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.fragment.app.FragmentManager; +import androidx.navigation.Navigation; +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.Album; +import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.repository.QueueRepository; +import com.cappielloantonio.play.service.MusicPlayerRemote; +import com.cappielloantonio.play.ui.activity.MainActivity; +import com.cappielloantonio.play.util.MusicUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class AlbumHorizontalAdapter extends RecyclerView.Adapter { + private static final String TAG = "AlbumHorizontalAdapter"; + + private List albums; + private LayoutInflater mInflater; + private MainActivity mainActivity; + private Context context; + private FragmentManager fragmentManager; + + public AlbumHorizontalAdapter(MainActivity mainActivity, Context context, FragmentManager fragmentManager) { + this.mainActivity = mainActivity; + this.context = context; + this.fragmentManager = fragmentManager; + this.mInflater = LayoutInflater.from(context); + this.albums = new ArrayList<>(); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_horizontal_album, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + Album album = albums.get(position); + + holder.albumTitle.setText(album.getTitle()); + holder.albumArtist.setText(album.getArtistName()); + + CustomGlideRequest.Builder + .from(context, album.getPrimary(), album.getBlurHash(), CustomGlideRequest.SONG_PIC) + .build() + .into(holder.cover); + } + + @Override + public int getItemCount() { + return albums.size(); + } + + public void setItems(List albums) { + this.albums = albums; + notifyDataSetChanged(); + } + + public Album getItem(int id) { + return albums.get(id); + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { + TextView albumTitle; + TextView albumArtist; + ImageView more; + ImageView cover; + + ViewHolder(View itemView) { + super(itemView); + + albumTitle = itemView.findViewById(R.id.album_title_text_view); + albumArtist = itemView.findViewById(R.id.album_artist_text_view); + more = itemView.findViewById(R.id.album_more_button); + cover = itemView.findViewById(R.id.album_cover_image_view); + + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); + + more.setOnClickListener(v -> { + openMore(v); + }); + + albumTitle.setSelected(true); + } + + @Override + public void onClick(View view) { + Bundle bundle = new Bundle(); + bundle.putParcelable("album_object", albums.get(getBindingAdapterPosition())); + + if (Objects.requireNonNull(Navigation.findNavController(view).getCurrentDestination()).getId() == R.id.homeFragment) { + Navigation.findNavController(view).navigate(R.id.action_homeFragment_to_albumPageFragment, bundle); + } + } + + @Override + public boolean onLongClick(View v) { + openMore(v); + return true; + } + + private void openMore(View view) { + Bundle bundle = new Bundle(); + bundle.putParcelable("album_object", albums.get(getBindingAdapterPosition())); + Navigation.findNavController(view).navigate(R.id.albumBottomSheetDialog, bundle); + } + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistHorizontalAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistHorizontalAdapter.java new file mode 100644 index 00000000..86c932c6 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistHorizontalAdapter.java @@ -0,0 +1,126 @@ +package com.cappielloantonio.play.adapter; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.fragment.app.FragmentManager; +import androidx.navigation.Navigation; +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.Artist; +import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.repository.QueueRepository; +import com.cappielloantonio.play.service.MusicPlayerRemote; +import com.cappielloantonio.play.ui.activity.MainActivity; +import com.cappielloantonio.play.util.MusicUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class ArtistHorizontalAdapter extends RecyclerView.Adapter { + private static final String TAG = "ArtistHorizontalAdapter"; + + private List artists; + private LayoutInflater mInflater; + private MainActivity mainActivity; + private Context context; + private FragmentManager fragmentManager; + + public ArtistHorizontalAdapter(MainActivity mainActivity, Context context, FragmentManager fragmentManager) { + this.mainActivity = mainActivity; + this.context = context; + this.fragmentManager = fragmentManager; + this.mInflater = LayoutInflater.from(context); + this.artists = new ArrayList<>(); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_horizontal_artist, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + Artist artist = artists.get(position); + + holder.artistName.setText(artist.getName()); + holder.artistInfo.setText("--"); + + CustomGlideRequest.Builder + .from(context, artist.getPrimary(), artist.getPrimaryBlurHash(), CustomGlideRequest.SONG_PIC) + .build() + .into(holder.cover); + } + + @Override + public int getItemCount() { + return artists.size(); + } + + public void setItems(List artists) { + this.artists = artists; + notifyDataSetChanged(); + } + + public Artist getItem(int id) { + return artists.get(id); + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { + TextView artistName; + TextView artistInfo; + + ImageView more; + ImageView cover; + + ViewHolder(View itemView) { + super(itemView); + + artistName = itemView.findViewById(R.id.artist_name_text_view); + artistInfo = itemView.findViewById(R.id.artist_info_text_view); + more = itemView.findViewById(R.id.artist_more_button); + cover = itemView.findViewById(R.id.artist_cover_image_view); + + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); + + more.setOnClickListener(v -> { + openMore(v); + }); + + artistName.setSelected(true); + } + + @Override + public void onClick(View view) { + Bundle bundle = new Bundle(); + bundle.putParcelable("artist_object", artists.get(getBindingAdapterPosition())); + + if (Objects.requireNonNull(Navigation.findNavController(view).getCurrentDestination()).getId() == R.id.homeFragment) { + Navigation.findNavController(view).navigate(R.id.action_homeFragment_to_artistPageFragment, bundle); + } + } + + @Override + public boolean onLongClick(View v) { + openMore(v); + return true; + } + + private void openMore(View view) { + Bundle bundle = new Bundle(); + bundle.putParcelable("song_object", artists.get(getBindingAdapterPosition())); + Navigation.findNavController(view).navigate(R.id.songBottomSheetDialog, bundle); + } + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/SongHorizontalAdapter.java similarity index 89% rename from app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java rename to app/src/main/java/com/cappielloantonio/play/adapter/SongHorizontalAdapter.java index 8faf1b67..424ffc44 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/SongHorizontalAdapter.java @@ -20,21 +20,19 @@ import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.MusicUtil; -import com.cappielloantonio.play.util.PreferenceUtil; import java.util.ArrayList; import java.util.List; -public class SongResultSearchAdapter extends RecyclerView.Adapter { - private static final String TAG = "SongResultSearchAdapter"; - +public class SongHorizontalAdapter extends RecyclerView.Adapter { + private static final String TAG = "SongHorizontalAdapter"; private List songs; private LayoutInflater mInflater; private MainActivity mainActivity; private Context context; private FragmentManager fragmentManager; - public SongResultSearchAdapter(MainActivity mainActivity, Context context, FragmentManager fragmentManager) { + public SongHorizontalAdapter(MainActivity mainActivity, Context context, FragmentManager fragmentManager) { this.mainActivity = mainActivity; this.context = context; this.fragmentManager = fragmentManager; @@ -44,7 +42,7 @@ public class SongResultSearchAdapter extends RecyclerView.Adapter> listLiveAlbums; private LiveData> artistListLiveAlbums; private LiveData> listLiveSampleAlbum; private LiveData> searchListLiveAlbum; + private MutableLiveData> listLiveRecentlyAddedAlbums = new MutableLiveData<>(); + private MutableLiveData> listLiveMostPlayedAlbums = new MutableLiveData<>(); + private MutableLiveData> listLiveRecentlyPlayedAlbums = new MutableLiveData<>(); public AlbumRepository(Application application) { albumSongListClient = App.getSubsonicClientInstance(application, false).getAlbumSongListClient(); @@ -41,15 +45,24 @@ public class AlbumRepository { } public LiveData> getListLiveAlbums(String type, int size) { - MutableLiveData> listLiveAlbums = new MutableLiveData<>(); - albumSongListClient .getAlbumList2(type, size, 0) .enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { List albums = new ArrayList<>(MappingUtil.mapAlbum(response.body().getAlbumList2().getAlbums())); - listLiveAlbums.setValue(albums); + + switch (type) { + case "newest": + listLiveRecentlyAddedAlbums.setValue(albums); + break; + case "frequent": + listLiveMostPlayedAlbums.setValue(albums); + break; + case "recent": + listLiveRecentlyPlayedAlbums.setValue(albums); + break; + } } @Override @@ -58,7 +71,38 @@ public class AlbumRepository { } }); - return listLiveAlbums; + switch (type) { + case "newest": + return listLiveRecentlyAddedAlbums; + case "frequent": + return listLiveMostPlayedAlbums; + case "recent": + return listLiveRecentlyPlayedAlbums; + default: + return new MutableLiveData<>(); + } + } + + public MutableLiveData> getStarredAlbums() { + MutableLiveData> starredAlbums = new MutableLiveData<>(); + + albumSongListClient + .getStarred2() + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List albums = new ArrayList<>(MappingUtil.mapAlbum(response.body().getStarred2().getAlbums())); + starredAlbums.setValue(albums); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + } + }); + + return starredAlbums; } public LiveData> getArtistListLiveAlbums(String artistId) { diff --git a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java index 026c2544..85757366 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java @@ -3,26 +3,62 @@ package com.cappielloantonio.play.repository; import android.app.Application; import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.database.AppDatabase; import com.cappielloantonio.play.database.dao.ArtistDao; +import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.subsonic.api.albumsonglist.AlbumSongListClient; +import com.cappielloantonio.play.subsonic.models.ResponseStatus; +import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.util.MappingUtil; import java.util.ArrayList; import java.util.List; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + public class ArtistRepository { + private AlbumSongListClient albumSongListClient; + private ArtistDao artistDao; private LiveData> listLiveArtists; private LiveData> listLiveSampleArtist; private LiveData> searchListLiveArtist; + private MutableLiveData> starredArtists = new MutableLiveData<>(); public ArtistRepository(Application application) { + albumSongListClient = App.getSubsonicClientInstance(application, false).getAlbumSongListClient(); + AppDatabase database = AppDatabase.getInstance(application); artistDao = database.artistDao(); } + public MutableLiveData> getStarredArtists() { + albumSongListClient + .getStarred2() + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List artists = new ArrayList<>(MappingUtil.mapArtist(response.body().getStarred2().getArtists())); + starredArtists.setValue(artists); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + } + }); + + return starredArtists; + } + public LiveData> getListLiveArtists() { listLiveArtists = artistDao.getAll(); return listLiveArtists; diff --git a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java index 41c0ae9d..31ae59e6 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java @@ -50,6 +50,8 @@ public class SongRepository { private LiveData> listLiveSampleDownloadedSong; private LiveData> listLiveDownloadedSong; + private MutableLiveData> starredSongs = new MutableLiveData<>(); + public SongRepository(Application application) { albumSongListClient = App.getSubsonicClientInstance(application, false).getAlbumSongListClient(); browsingClient = App.getSubsonicClientInstance(application, false).getBrowsingClient(); @@ -59,17 +61,15 @@ public class SongRepository { songGenreCrossDao = database.songGenreCrossDao(); } - public MutableLiveData> getSongs() { - MutableLiveData> liveSongs = new MutableLiveData<>(); - + public MutableLiveData> getStarredSongs() { albumSongListClient - .getRandomSongs(10) + .getStarred2() .enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { - List songs = new ArrayList<>(MappingUtil.mapSong(response.body().getRandomSongs().getSongs())); - liveSongs.setValue(songs); + List songs = new ArrayList<>(MappingUtil.mapSong(response.body().getStarred2().getSongs())); + starredSongs.setValue(songs); } } @@ -79,7 +79,7 @@ public class SongRepository { } }); - return liveSongs; + return starredSongs; } public void getInstantMix(Song song, int count, MediaCallback callback) { @@ -344,23 +344,6 @@ public class SongRepository { thread.start(); } - /*public List getRandomSample(int number) { - List sample = new ArrayList<>(); - - PickRandomThreadSafe randomThread = new PickRandomThreadSafe(songDao, number); - Thread thread = new Thread(randomThread); - thread.start(); - - try { - thread.join(); - sample = randomThread.getSample(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return sample; - }*/ - public void getRandomSample(int number, MediaCallback callback) { albumSongListClient .getRandomSongs(number) diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/models/Starred2.java b/app/src/main/java/com/cappielloantonio/play/subsonic/models/Starred2.java index 442fff52..55961335 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/models/Starred2.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/models/Starred2.java @@ -1,91 +1,50 @@ package com.cappielloantonio.play.subsonic.models; +import com.tickaroo.tikxml.annotation.Element; +import com.tickaroo.tikxml.annotation.Xml; + import java.util.ArrayList; import java.util.List; +@Xml public class Starred2 { + @Element(name = "artist") protected List artists; + @Element(name = "album") protected List albums; + @Element(name = "song") protected List songs; - /** - * Gets the value of the artists property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the artists property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getArtists().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link ArtistID3 } - */ public List getArtists() { if (artists == null) { - artists = new ArrayList(); + artists = new ArrayList<>(); } return this.artists; } - /** - * Gets the value of the albums property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the albums property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getAlbums().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link AlbumID3 } - */ + public void setArtists(List artists) { + this.artists = artists; + } + public List getAlbums() { if (albums == null) { - albums = new ArrayList(); + albums = new ArrayList<>(); } return this.albums; } - /** - * Gets the value of the songs property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the songs property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getSongs().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link Child } - */ + public void setAlbums(List albums) { + this.albums = albums; + } + public List getSongs() { if (songs == null) { - songs = new ArrayList(); + songs = new ArrayList<>(); } return this.songs; } + + public void setSongs(List songs) { + this.songs = songs; + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/models/SubsonicResponse.java b/app/src/main/java/com/cappielloantonio/play/subsonic/models/SubsonicResponse.java index d5740b62..015df222 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/models/SubsonicResponse.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/models/SubsonicResponse.java @@ -17,6 +17,7 @@ public class SubsonicResponse { private ArtistInfo2 artistInfo2; private ArtistInfo artistInfo; private AlbumInfo albumInfo; + @Element(name = "starred2") private Starred2 starred2; private Starred starred; private Shares shares; 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 b411ad06..78a73e0c 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 @@ -11,7 +11,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; @@ -19,7 +18,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumArtistPageOrSimilarAdapter; -import com.cappielloantonio.play.adapter.SongResultSearchAdapter; +import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentAlbumPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.interfaces.MediaCallback; @@ -45,7 +44,7 @@ public class AlbumPageFragment extends Fragment { private MainActivity activity; private AlbumPageViewModel albumPageViewModel; - private SongResultSearchAdapter songResultSearchAdapter; + private SongHorizontalAdapter songHorizontalAdapter; private AlbumArtistPageOrSimilarAdapter albumArtistPageOrSimilarAdapter; @Override @@ -189,11 +188,11 @@ public class AlbumPageFragment extends Fragment { bind.songRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); bind.songRecyclerView.setHasFixedSize(true); - songResultSearchAdapter = new SongResultSearchAdapter(activity, requireContext(), getChildFragmentManager()); - bind.songRecyclerView.setAdapter(songResultSearchAdapter); + songHorizontalAdapter = new SongHorizontalAdapter(activity, requireContext(), getChildFragmentManager()); + bind.songRecyclerView.setAdapter(songHorizontalAdapter); albumPageViewModel.getAlbumSongLiveList().observe(requireActivity(), songs -> { - songResultSearchAdapter.setItems(songs); + songHorizontalAdapter.setItems(songs); }); } 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 ef85baef..2ae1875d 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 @@ -18,11 +18,10 @@ import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumArtistPageOrSimilarAdapter; import com.cappielloantonio.play.adapter.ArtistSimilarAdapter; -import com.cappielloantonio.play.adapter.SongResultSearchAdapter; +import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentArtistPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.interfaces.MediaCallback; -import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.model.Song; @@ -41,7 +40,7 @@ public class ArtistPageFragment extends Fragment { private MainActivity activity; private ArtistPageViewModel artistPageViewModel; - private SongResultSearchAdapter songResultSearchAdapter; + private SongHorizontalAdapter songHorizontalAdapter; private AlbumArtistPageOrSimilarAdapter albumArtistPageOrSimilarAdapter; private ArtistSimilarAdapter artistSimilarAdapter; @@ -155,9 +154,9 @@ public class ArtistPageFragment extends Fragment { private void initTopSongsView() { bind.mostStreamedSongRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); - songResultSearchAdapter = new SongResultSearchAdapter(activity, requireContext(), getChildFragmentManager()); - bind.mostStreamedSongRecyclerView.setAdapter(songResultSearchAdapter); - artistPageViewModel.getArtistTopSongList().observe(requireActivity(), songs -> songResultSearchAdapter.setItems(songs)); + songHorizontalAdapter = new SongHorizontalAdapter(activity, requireContext(), getChildFragmentManager()); + bind.mostStreamedSongRecyclerView.setAdapter(songHorizontalAdapter); + artistPageViewModel.getArtistTopSongList().observe(requireActivity(), songs -> songHorizontalAdapter.setItems(songs)); } private void initAlbumsView() { diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java index 7e27b6d8..f92d044a 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java @@ -18,9 +18,11 @@ import androidx.viewpager2.widget.ViewPager2; import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumAdapter; +import com.cappielloantonio.play.adapter.AlbumHorizontalAdapter; +import com.cappielloantonio.play.adapter.ArtistHorizontalAdapter; import com.cappielloantonio.play.adapter.DiscoverSongAdapter; import com.cappielloantonio.play.adapter.RecentMusicAdapter; -import com.cappielloantonio.play.adapter.SongResultSearchAdapter; +import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.adapter.YearAdapter; import com.cappielloantonio.play.databinding.FragmentHomeBinding; import com.cappielloantonio.play.interfaces.MediaCallback; @@ -37,9 +39,10 @@ public class HomeFragment extends Fragment { private MainActivity activity; private HomeViewModel homeViewModel; - private YearAdapter yearAdapter; - private SongResultSearchAdapter favoriteSongAdapter; + private SongHorizontalAdapter starredSongAdapter; + private AlbumHorizontalAdapter starredAlbumAdapter; + private ArtistHorizontalAdapter starredArtistAdapter; private RecentMusicAdapter dowanloadedMusicAdapter; // ---------------------------------------------------- SUBSONIC ADAPTER @@ -69,7 +72,9 @@ public class HomeFragment extends Fragment { initDiscoverSongSlideView(); initMostPlayedAlbumView(); initRecentPlayedAlbumView(); - initFavoritesSongView(); + initStarredTracksView(); + initStarredAlbumsView(); + initStarredArtistsView(); initYearSongView(); initRecentAddedAlbumView(); initDownloadedSongView(); @@ -107,7 +112,19 @@ public class HomeFragment extends Fragment { activity.navController.navigate(R.id.action_homeFragment_to_songListPageFragment, bundle); }); - bind.favoritesTracksTextViewClickable.setOnClickListener(v -> { + bind.starredTracksTextViewClickable.setOnClickListener(v -> { + Bundle bundle = new Bundle(); + bundle.putString(Song.IS_FAVORITE, Song.IS_FAVORITE); + activity.navController.navigate(R.id.action_homeFragment_to_songListPageFragment, bundle); + }); + + bind.starredAlbumsTextViewClickable.setOnClickListener(v -> { + Bundle bundle = new Bundle(); + bundle.putString(Song.IS_FAVORITE, Song.IS_FAVORITE); + activity.navController.navigate(R.id.action_homeFragment_to_songListPageFragment, bundle); + }); + + bind.starredArtistsTextViewClickable.setOnClickListener(v -> { Bundle bundle = new Bundle(); bundle.putString(Song.IS_FAVORITE, Song.IS_FAVORITE); activity.navController.navigate(R.id.action_homeFragment_to_songListPageFragment, bundle); @@ -180,19 +197,49 @@ public class HomeFragment extends Fragment { bind.yearsRecyclerView.setAdapter(yearAdapter); } - private void initFavoritesSongView() { - bind.favoritesTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 5, GridLayoutManager.HORIZONTAL, false)); - bind.favoritesTracksRecyclerView.setHasFixedSize(true); + private void initStarredTracksView() { + bind.starredTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 5, GridLayoutManager.HORIZONTAL, false)); + bind.starredTracksRecyclerView.setHasFixedSize(true); - favoriteSongAdapter = new SongResultSearchAdapter(activity, requireContext(), getChildFragmentManager()); - bind.favoritesTracksRecyclerView.setAdapter(favoriteSongAdapter); - homeViewModel.getFavorites().observe(requireActivity(), songs -> { - if(bind != null) bind.homeFavoriteTracksSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE); - favoriteSongAdapter.setItems(songs); + starredSongAdapter = new SongHorizontalAdapter(activity, requireContext(), getChildFragmentManager()); + bind.starredTracksRecyclerView.setAdapter(starredSongAdapter); + homeViewModel.getStarredTracks().observe(requireActivity(), songs -> { + if(bind != null) bind.homeStarredTracksSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE); + starredSongAdapter.setItems(songs); }); PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); - pagerSnapHelper.attachToRecyclerView(bind.favoritesTracksRecyclerView); + pagerSnapHelper.attachToRecyclerView(bind.starredTracksRecyclerView); + } + + private void initStarredAlbumsView() { + bind.starredAlbumsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 5, GridLayoutManager.HORIZONTAL, false)); + bind.starredAlbumsRecyclerView.setHasFixedSize(true); + + starredAlbumAdapter = new AlbumHorizontalAdapter(activity, requireContext(), getChildFragmentManager()); + bind.starredAlbumsRecyclerView.setAdapter(starredAlbumAdapter); + homeViewModel.getStarredAlbums().observe(requireActivity(), albums -> { + if(bind != null) bind.homeStarredAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); + starredAlbumAdapter.setItems(albums); + }); + + PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); + pagerSnapHelper.attachToRecyclerView(bind.starredAlbumsRecyclerView); + } + + private void initStarredArtistsView() { + bind.starredArtistsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 5, GridLayoutManager.HORIZONTAL, false)); + bind.starredArtistsRecyclerView.setHasFixedSize(true); + + starredArtistAdapter = new ArtistHorizontalAdapter(activity, requireContext(), getChildFragmentManager()); + bind.starredArtistsRecyclerView.setAdapter(starredArtistAdapter); + homeViewModel.getStarredArtists().observe(requireActivity(), artists -> { + if(bind != null) bind.homeStarredArtistsSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE); + starredArtistAdapter.setItems(artists); + }); + + PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); + pagerSnapHelper.attachToRecyclerView(bind.starredArtistsRecyclerView); } private void initRecentAddedAlbumView() { @@ -246,7 +293,9 @@ public class HomeFragment extends Fragment { bind.homeLinearLayoutContainer.addView(bind.homeDiscoverSector); bind.homeLinearLayoutContainer.addView(bind.homeRecentlyAddedAlbumsSector); bind.homeLinearLayoutContainer.addView(bind.homeFlashbackSector); - bind.homeLinearLayoutContainer.addView(bind.homeFavoriteTracksSector); + bind.homeLinearLayoutContainer.addView(bind.homeStarredTracksSector); + bind.homeLinearLayoutContainer.addView(bind.homeStarredAlbumsSector); + bind.homeLinearLayoutContainer.addView(bind.homeStarredArtistsSector); bind.homeLinearLayoutContainer.addView(bind.homeDownloadedTracksSector); bind.homeLinearLayoutContainer.addView(bind.homeMostPlayedAlbumsSector); bind.homeLinearLayoutContainer.addView(bind.homeRecentlyPlayedAlbumsSector); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java index ec670207..e464df03 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java @@ -18,14 +18,13 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; -import com.cappielloantonio.play.adapter.SongResultSearchAdapter; +import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentPlaylistPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.DownloadUtil; -import com.cappielloantonio.play.util.PreferenceUtil; import com.cappielloantonio.play.viewmodel.PlaylistPageViewModel; import java.util.Collections; @@ -36,7 +35,7 @@ public class PlaylistPageFragment extends Fragment { private MainActivity activity; private PlaylistPageViewModel playlistPageViewModel; - private SongResultSearchAdapter songResultSearchAdapter; + private SongHorizontalAdapter songHorizontalAdapter; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -159,10 +158,10 @@ public class PlaylistPageFragment extends Fragment { bind.playlistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); bind.playlistRecyclerView.setHasFixedSize(true); - songResultSearchAdapter = new SongResultSearchAdapter(activity, requireContext(), getChildFragmentManager()); - bind.playlistRecyclerView.setAdapter(songResultSearchAdapter); + songHorizontalAdapter = new SongHorizontalAdapter(activity, requireContext(), getChildFragmentManager()); + bind.playlistRecyclerView.setAdapter(songHorizontalAdapter); playlistPageViewModel.getPlaylistSongLiveList().observe(requireActivity(), songs -> { - songResultSearchAdapter.setItems(songs); + songHorizontalAdapter.setItems(songs); }); } } \ No newline at end of file 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 88c9ffa0..0c8fb3ad 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 @@ -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; @@ -18,12 +17,11 @@ import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumAdapter; import com.cappielloantonio.play.adapter.ArtistAdapter; import com.cappielloantonio.play.adapter.GenreCatalogueAdapter; -import com.cappielloantonio.play.adapter.SongResultSearchAdapter; +import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentSearchBinding; import com.cappielloantonio.play.helper.recyclerview.GridItemDecoration; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.ui.activity.MainActivity; -import com.cappielloantonio.play.util.PreferenceUtil; import com.cappielloantonio.play.viewmodel.SearchViewModel; import com.paulrybitskyi.persistentsearchview.adapters.model.SuggestionItem; import com.paulrybitskyi.persistentsearchview.listeners.OnSuggestionChangeListener; @@ -36,7 +34,7 @@ public class SearchFragment extends Fragment { private MainActivity activity; private SearchViewModel searchViewModel; - private SongResultSearchAdapter songResultSearchAdapter; + private SongHorizontalAdapter songHorizontalAdapter; private AlbumAdapter albumAdapter; private ArtistAdapter artistAdapter; private GenreCatalogueAdapter genreCatalogueAdapter; @@ -79,8 +77,8 @@ public class SearchFragment extends Fragment { bind.searchResultTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); bind.searchResultTracksRecyclerView.setHasFixedSize(true); - songResultSearchAdapter = new SongResultSearchAdapter(activity, requireContext(), getChildFragmentManager()); - bind.searchResultTracksRecyclerView.setAdapter(songResultSearchAdapter); + songHorizontalAdapter = new SongHorizontalAdapter(activity, requireContext(), getChildFragmentManager()); + bind.searchResultTracksRecyclerView.setAdapter(songHorizontalAdapter); // Albums bind.searchResultAlbumRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); @@ -177,7 +175,7 @@ public class SearchFragment extends Fragment { private void performSearch(String query) { searchViewModel.searchSong(query, requireContext()).observe(requireActivity(), songs -> { if(bind != null) bind.searchSongSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE); - songResultSearchAdapter.setItems(songs); + songHorizontalAdapter.setItems(songs); }); searchViewModel.searchAlbum(query, requireContext()).observe(requireActivity(), albums -> { if(bind != null) bind.searchAlbumSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java index d52b5026..29c70c35 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.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.core.view.ViewCompat; import androidx.fragment.app.Fragment; @@ -12,7 +11,7 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.App; -import com.cappielloantonio.play.adapter.SongResultSearchAdapter; +import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentSongListPageBinding; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.QueueRepository; @@ -21,7 +20,6 @@ import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.viewmodel.SongListPageViewModel; import java.util.Collections; -import java.util.List; public class SongListPageFragment extends Fragment { @@ -29,7 +27,7 @@ public class SongListPageFragment extends Fragment { private MainActivity activity; private SongListPageViewModel songListPageViewModel; - private SongResultSearchAdapter songResultSearchAdapter; + private SongHorizontalAdapter songHorizontalAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -161,8 +159,8 @@ public class SongListPageFragment extends Fragment { bind.songListRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); bind.songListRecyclerView.setHasFixedSize(true); - songResultSearchAdapter = new SongResultSearchAdapter(activity, requireContext(), getChildFragmentManager()); - bind.songListRecyclerView.setAdapter(songResultSearchAdapter); - songListPageViewModel.getSongList().observe(requireActivity(), songs -> songResultSearchAdapter.setItems(songs)); + songHorizontalAdapter = new SongHorizontalAdapter(activity, requireContext(), getChildFragmentManager()); + bind.songListRecyclerView.setAdapter(songHorizontalAdapter); + songListPageViewModel.getSongList().observe(requireActivity(), songs -> songHorizontalAdapter.setItems(songs)); } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java b/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java index 1452ce9d..8f1c92be 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java +++ b/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java @@ -1,8 +1,10 @@ package com.cappielloantonio.play.util; import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.subsonic.models.AlbumID3; +import com.cappielloantonio.play.subsonic.models.ArtistID3; import com.cappielloantonio.play.subsonic.models.Child; import java.util.ArrayList; @@ -28,4 +30,14 @@ public class MappingUtil { return albums; } + + public static ArrayList mapArtist(List albumID3List) { + ArrayList artists = new ArrayList(); + + for(ArtistID3 artistID3 : albumID3List){ + artists.add(new Artist(artistID3)); + } + + return artists; + } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java index f52c14a0..5aa290f5 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java @@ -8,8 +8,10 @@ import androidx.lifecycle.LiveData; import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.AlbumRepository; +import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.SongRepository; import java.util.ArrayList; @@ -19,28 +21,28 @@ public class HomeViewModel extends AndroidViewModel { private static final String TAG = "HomeViewModel"; private SongRepository songRepository; private AlbumRepository albumRepository; + private ArtistRepository artistRepository; - private List dicoverSongSample = new ArrayList<>(); - private LiveData> recentlyPlayedSongSample; - private LiveData> recentlyAddedSongSample; - private LiveData> mostPlayedSongSample; private LiveData> favoritesSongSample; private LiveData> downloadedSongSample; private List years; + private List dicoverSongSample = new ArrayList<>(); private LiveData> mostPlayedAlbumSample; private LiveData> recentlyAddedAlbumSample; private LiveData> recentlyPlayedAlbumSample; + private LiveData> starredTracks; + private LiveData> starredAlbums; + private LiveData> starredArtists; + public HomeViewModel(@NonNull Application application) { super(application); songRepository = new SongRepository(application); albumRepository = new AlbumRepository(application); + artistRepository = new ArtistRepository(application); - recentlyPlayedSongSample = songRepository.getListLiveRecentlyPlayedSampleSong(20); - recentlyAddedSongSample = songRepository.getListLiveRecentlyAddedSampleSong(20); - mostPlayedSongSample = songRepository.getListLiveMostPlayedSampleSong(20); favoritesSongSample = songRepository.getListLiveFavoritesSampleSong(20); downloadedSongSample = songRepository.getListLiveDownloadedSampleSong(20); years = songRepository.getYearList(); @@ -48,24 +50,16 @@ public class HomeViewModel extends AndroidViewModel { mostPlayedAlbumSample = albumRepository.getListLiveAlbums("frequent", 20); recentlyAddedAlbumSample = albumRepository.getListLiveAlbums("newest", 20); recentlyPlayedAlbumSample = albumRepository.getListLiveAlbums("recent", 20); + + starredTracks = songRepository.getStarredSongs(); + starredAlbums = albumRepository.getStarredAlbums(); + starredArtists = artistRepository.getStarredArtists(); } public SongRepository getSongRepository() { return songRepository; } - public LiveData> getRecentlyAddedSongList() { - return recentlyAddedSongSample; - } - - public LiveData> getRecentlyPlayedSongList() { - return recentlyPlayedSongSample; - } - - public LiveData> getMostPlayedSongList() { - return mostPlayedSongSample; - } - public List getYearList() { return years; } @@ -74,6 +68,18 @@ public class HomeViewModel extends AndroidViewModel { return favoritesSongSample; } + public LiveData> getStarredTracks() { + return starredTracks; + } + + public LiveData> getStarredAlbums() { + return starredAlbums; + } + + public LiveData> getStarredArtists() { + return starredArtists; + } + public LiveData> getDownloaded() { return downloadedSongSample; } diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 87b59cf2..bef99add 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -201,7 +201,7 @@ @@ -223,11 +223,11 @@ android:paddingStart="8dp" android:paddingTop="12dp" android:paddingEnd="8dp" - android:text="Favorites" /> + android:text="Starred tracks" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_horizontal_artist.xml b/app/src/main/res/layout/item_horizontal_artist.xml new file mode 100644 index 00000000..6f827a56 --- /dev/null +++ b/app/src/main/res/layout/item_horizontal_artist.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + \ 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_horizontal_track.xml similarity index 98% rename from app/src/main/res/layout/item_search_result_song.xml rename to app/src/main/res/layout/item_horizontal_track.xml index 247cd824..88944cd8 100644 --- a/app/src/main/res/layout/item_search_result_song.xml +++ b/app/src/main/res/layout/item_horizontal_track.xml @@ -49,7 +49,7 @@ app:layout_constraintTop_toBottomOf="@+id/search_result_song_title_text_view"> +