diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 03e07a5f..ba99cfae 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,7 +6,6 @@
-
{
@@ -26,6 +27,7 @@ public class AlbumAdapter extends RecyclerView.Adapter
public AlbumAdapter(Context context) {
this.context = context;
this.inflater = LayoutInflater.from(context);
+ this.albums = new ArrayList<>();
}
@Override
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 e3347e1e..43daae57 100644
--- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java
@@ -13,6 +13,7 @@ import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Album;
+import java.util.ArrayList;
import java.util.List;
public class AlbumArtistPageAdapter extends RecyclerView.Adapter {
@@ -26,6 +27,7 @@ public class AlbumArtistPageAdapter extends RecyclerView.Adapter();
}
@Override
diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java
index 489475eb..21f6eb75 100644
--- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java
@@ -13,6 +13,7 @@ import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Album;
+import java.util.ArrayList;
import java.util.List;
public class AlbumCatalogueAdapter extends RecyclerView.Adapter {
@@ -26,6 +27,7 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter();
}
@Override
diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java
index 7db045dc..28b3a333 100644
--- a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java
@@ -13,6 +13,7 @@ import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Artist;
+import java.util.ArrayList;
import java.util.List;
public class ArtistAdapter extends RecyclerView.Adapter {
@@ -26,6 +27,7 @@ public class ArtistAdapter extends RecyclerView.Adapter();
}
@Override
diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java
index 052b5405..15d974bb 100644
--- a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java
@@ -13,6 +13,7 @@ import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Artist;
+import java.util.ArrayList;
import java.util.List;
public class ArtistCatalogueAdapter extends RecyclerView.Adapter {
@@ -26,6 +27,7 @@ public class ArtistCatalogueAdapter extends RecyclerView.Adapter();
}
@Override
diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java
index f1a474e0..e6a28267 100644
--- a/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java
@@ -72,7 +72,7 @@ public class DiscoverSongAdapter extends RecyclerView.Adapter {
@@ -24,6 +25,7 @@ public class GenreAdapter extends RecyclerView.Adapter
public GenreAdapter(Context context) {
this.context = context;
this.mInflater = LayoutInflater.from(context);
+ this.genres = new ArrayList<>();
}
@Override
diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java
index 6db9e725..50452363 100644
--- a/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java
@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.model.Genre;
+import java.util.ArrayList;
import java.util.List;
public class GenreCatalogueAdapter extends RecyclerView.Adapter {
@@ -24,6 +25,7 @@ public class GenreCatalogueAdapter extends RecyclerView.Adapter();
}
// inflates the row layout from xml when needed
diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/PlaylistAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/PlaylistAdapter.java
index 64c12551..1d3cdcd6 100644
--- a/app/src/main/java/com/cappielloantonio/play/adapter/PlaylistAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/play/adapter/PlaylistAdapter.java
@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.model.Playlist;
+import java.util.ArrayList;
import java.util.List;
public class PlaylistAdapter extends RecyclerView.Adapter {
@@ -24,6 +25,7 @@ public class PlaylistAdapter extends RecyclerView.Adapter();
}
@Override
diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/RecentMusicAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/RecentMusicAdapter.java
index 547fb47d..f3375e3d 100644
--- a/app/src/main/java/com/cappielloantonio/play/adapter/RecentMusicAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/play/adapter/RecentMusicAdapter.java
@@ -15,6 +15,7 @@ import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.SongRepository;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -30,6 +31,7 @@ public class RecentMusicAdapter extends RecyclerView.Adapter();
}
@Override
@@ -74,7 +76,7 @@ public class RecentMusicAdapter extends RecyclerView.Adapter {
@@ -24,6 +25,7 @@ public class RecentSearchAdapter extends RecyclerView.Adapter();
}
@Override
diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java
index b2c35061..b89a13bf 100644
--- a/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java
@@ -7,6 +7,7 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.play.App;
@@ -14,8 +15,10 @@ 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.ui.fragment.bottomsheetdialog.SongBottomSheetDialog;
import com.cappielloantonio.play.util.Util;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -27,10 +30,13 @@ public class SongResultSearchAdapter extends RecyclerView.Adapter songs;
private LayoutInflater mInflater;
private Context context;
+ private FragmentManager fragmentManager;
- public SongResultSearchAdapter(Context context) {
+ public SongResultSearchAdapter(Context context, FragmentManager fragmentManager) {
this.context = context;
+ this.fragmentManager = fragmentManager;
this.mInflater = LayoutInflater.from(context);
+ this.songs = new ArrayList<>();
}
@Override
@@ -58,7 +64,7 @@ public class SongResultSearchAdapter extends RecyclerView.Adapter> getAll();
+ @Query("SELECT * FROM song WHERE id = :id")
+ LiveData getOne(String id);
+
@Query("SELECT * FROM song")
List getAllList();
@@ -33,7 +36,7 @@ public interface SongDao {
@Query("SELECT * FROM song WHERE play_count != 0 ORDER BY play_count DESC LIMIT :number")
LiveData> getMostPlayedSample(int number);
- @Query("SELECT * FROM song WHERE play_count != 0 AND artistId = :artistID ORDER BY play_count DESC LIMIT :number")
+ @Query("SELECT * FROM song WHERE artistId = :artistID ORDER BY play_count DESC LIMIT :number")
LiveData> getArtistTopSongsSample(String artistID, int number);
@Query("SELECT * FROM song WHERE artistId = :artistID ORDER BY play_count DESC")
@@ -48,6 +51,12 @@ public interface SongDao {
@Query("SELECT * FROM song INNER Join song_genre_cross ON song.id = song_genre_cross.song_id AND song_genre_cross.genre_id IN (:filters) GROUP BY song.id")
LiveData> getFilteredSong(ArrayList filters);
+ @Query("SELECT * FROM song WHERE favorite = 1 ORDER BY play_count DESC LIMIT :number")
+ LiveData> getFavoriteSongSample(int number);
+
+ @Query("SELECT * FROM song WHERE favorite = 1 ORDER BY play_count DESC")
+ LiveData> getFavoriteSong();
+
@Query("SELECT EXISTS(SELECT * FROM song WHERE id = :id)")
boolean exist(String id);
diff --git a/app/src/main/java/com/cappielloantonio/play/model/Song.java b/app/src/main/java/com/cappielloantonio/play/model/Song.java
index a82a87a6..e28f609c 100644
--- a/app/src/main/java/com/cappielloantonio/play/model/Song.java
+++ b/app/src/main/java/com/cappielloantonio/play/model/Song.java
@@ -40,6 +40,9 @@ public class Song implements Parcelable {
@Ignore
public static final String BY_YEAR = "BY_YEAR";
+ @Ignore
+ public static final String IS_FAVORITE = "IS_FAVORITE";
+
@NonNull
@PrimaryKey
@ColumnInfo(name = "id")
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 d4554685..fb40212e 100644
--- a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java
+++ b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java
@@ -17,6 +17,7 @@ public class SongRepository {
private SongDao songDao;
private SongGenreCrossDao songGenreCrossDao;
private LiveData> searchListLiveSongs;
+ private LiveData liveDataSong;
private LiveData> listLiveSampleRecentlyAddedSongs;
private LiveData> listLiveSampleRecentlyPlayedSongs;
private LiveData> listLiveSampleMostPlayedSongs;
@@ -25,6 +26,8 @@ public class SongRepository {
private LiveData> listLiveSongByGenre;
private LiveData> listLiveFilteredSongs;
private LiveData> listLiveSongByYear;
+ private LiveData> listLiveSampleFavoritesSong;
+ private LiveData> listLiveFavoritesSong;
public SongRepository(Application application) {
@@ -38,6 +41,11 @@ public class SongRepository {
return searchListLiveSongs;
}
+ public LiveData getLiveDataSong(String id) {
+ liveDataSong = songDao.getOne(id);
+ return liveDataSong;
+ }
+
public LiveData> getListLiveRecentlyAddedSampleSong(int number) {
listLiveSampleRecentlyAddedSongs = songDao.getRecentlyAddedSample(number);
return listLiveSampleRecentlyAddedSongs;
@@ -138,6 +146,16 @@ public class SongRepository {
return listLiveSongByYear;
}
+ public LiveData> getListLiveFavoritesSampleSong(int number) {
+ listLiveSampleFavoritesSong = songDao.getFavoriteSongSample(number);
+ return listLiveSampleFavoritesSong;
+ }
+
+ public LiveData> getListLiveFavoritesSong() {
+ listLiveFavoritesSong = songDao.getFavoriteSong();
+ return listLiveFavoritesSong;
+ }
+
public boolean exist(Song song) {
boolean exist = false;
@@ -173,7 +191,7 @@ public class SongRepository {
thread.start();
}
- public void update(Song song) {
+ public void increasePlayCount(Song song) {
song.nowPlaying();
UpdateThreadSafe update = new UpdateThreadSafe(songDao, song);
@@ -181,6 +199,12 @@ public class SongRepository {
thread.start();
}
+ public void setFavoriteStatus(Song song) {
+ UpdateThreadSafe update = new UpdateThreadSafe(songDao, song);
+ Thread thread = new Thread(update);
+ thread.start();
+ }
+
public void getAll() {
GetCatalogueThreadSafe catalogue = new GetCatalogueThreadSafe(songDao);
Thread thread = new Thread(catalogue);
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 b45360e5..40cf9766 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
@@ -1,5 +1,7 @@
package com.cappielloantonio.play.ui.activities;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.View;
@@ -10,6 +12,7 @@ import androidx.navigation.ui.NavigationUI;
import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R;
+import com.cappielloantonio.play.broadcast.receiver.ConnectivityStatusBroadcastReceiver;
import com.cappielloantonio.play.databinding.ActivityMainBinding;
import com.cappielloantonio.play.ui.activities.base.BaseActivity;
import com.cappielloantonio.play.util.PreferenceUtil;
@@ -26,23 +29,33 @@ import java.util.Objects;
public class MainActivity extends BaseActivity {
private static final String TAG = "MainActivity";
- private ActivityMainBinding activityMainBinding;
+ public ActivityMainBinding activityMainBinding;
private FragmentManager fragmentManager;
private NavHostFragment navHostFragment;
private BottomNavigationView bottomNavigationView;
public NavController navController;
+ ConnectivityStatusBroadcastReceiver connectivityStatusBroadcastReceiver;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
View view = activityMainBinding.getRoot();
setContentView(view);
+ connectivityStatusBroadcastReceiver = new ConnectivityStatusBroadcastReceiver(this);
+ connectivityStatusReceiverManager(true);
init();
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ connectivityStatusReceiverManager(false);
+ }
+
public void init() {
fragmentManager = getSupportFragmentManager();
bottomNavigationView = findViewById(R.id.bottom_navigation);
@@ -76,7 +89,7 @@ public class MainActivity extends BaseActivity {
@Override
public void onError(Exception exception) {
- goToLogin();
+ goFromLogin();
}
});
}
@@ -130,4 +143,14 @@ public class MainActivity extends BaseActivity {
goToSync();
}
}
+
+ private void connectivityStatusReceiverManager(boolean isActive) {
+ if(isActive) {
+ IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
+ registerReceiver(connectivityStatusBroadcastReceiver, filter);
+ }
+ else {
+ unregisterReceiver(connectivityStatusBroadcastReceiver);
+ }
+ }
}
\ No newline at end of file
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 866833bd..97b3bf06 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
@@ -38,6 +38,12 @@ public class AlbumCatalogueFragment extends Fragment {
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(false);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
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 6fc02575..6baa5371 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
@@ -13,10 +13,9 @@ import com.cappielloantonio.play.adapter.SongResultSearchAdapter;
import com.cappielloantonio.play.databinding.FragmentAlbumPageBinding;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.ui.activities.MainActivity;
+import com.cappielloantonio.play.ui.fragment.bottomsheetdialog.AlbumBottomSheetDialog;
import com.cappielloantonio.play.viewmodel.AlbumPageViewModel;
-import java.util.ArrayList;
-
public class AlbumPageFragment extends Fragment {
private FragmentAlbumPageBinding bind;
@@ -26,7 +25,7 @@ public class AlbumPageFragment extends Fragment {
private SongResultSearchAdapter songResultSearchAdapter;
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
activity = (MainActivity) getActivity();
bind = FragmentAlbumPageBinding.inflate(inflater, container, false);
@@ -34,12 +33,19 @@ public class AlbumPageFragment extends Fragment {
albumPageViewModel = new ViewModelProvider(requireActivity()).get(AlbumPageViewModel.class);
init();
+ initBottomSheetDialog();
initBackCover();
initSongsView();
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(false);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
@@ -59,11 +65,18 @@ public class AlbumPageFragment extends Fragment {
bind.albumTitleLabel.setText(albumPageViewModel.getAlbum().getTitle());
}
+ private void initBottomSheetDialog() {
+ bind.albumSettingsImageButton.setOnClickListener(v -> {
+ AlbumBottomSheetDialog albumBottomSheetDialog = new AlbumBottomSheetDialog(albumPageViewModel.getAlbum());
+ albumBottomSheetDialog.show(this.getChildFragmentManager(), null);
+ });
+ }
+
private void initSongsView() {
bind.songRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
bind.songRecyclerView.setHasFixedSize(true);
- songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), new ArrayList<>());
+ songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), getChildFragmentManager());
bind.songRecyclerView.setAdapter(songResultSearchAdapter);
albumPageViewModel.getAlbumSongList().observe(requireActivity(), songs -> songResultSearchAdapter.setItems(songs));
}
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 2a43590a..f361f65f 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
@@ -38,6 +38,12 @@ public class ArtistCatalogueFragment extends Fragment {
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(false);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
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 2577aebd..195c70df 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,8 +18,6 @@ import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.ui.activities.MainActivity;
import com.cappielloantonio.play.viewmodel.ArtistPageViewModel;
-import java.util.ArrayList;
-
public class ArtistPageFragment extends Fragment {
private FragmentArtistPageBinding bind;
@@ -45,6 +43,13 @@ public class ArtistPageFragment extends Fragment {
return view;
}
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(false);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
@@ -74,7 +79,7 @@ public class ArtistPageFragment extends Fragment {
bind.mostStreamedSongRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
bind.mostStreamedSongRecyclerView.setHasFixedSize(true);
- songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), new ArrayList<>());
+ songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), getChildFragmentManager());
bind.mostStreamedSongRecyclerView.setAdapter(songResultSearchAdapter);
artistPageViewModel.getArtistTopSongList().observe(requireActivity(), songs -> songResultSearchAdapter.setItems(songs));
}
diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/FilterFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/FilterFragment.java
index e18c02f0..8e13f028 100644
--- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/FilterFragment.java
+++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/FilterFragment.java
@@ -4,7 +4,6 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.CompoundButton;
import android.widget.Toast;
import androidx.annotation.NonNull;
@@ -41,6 +40,12 @@ public class FilterFragment extends Fragment {
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(false);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
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 03c6f62e..aa279215 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
@@ -40,6 +40,12 @@ public class GenreCatalogueFragment extends Fragment {
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(false);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
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 0b57a267..c9b435bc 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
@@ -7,15 +7,18 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
+import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.viewpager2.widget.ViewPager2;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.adapter.DiscoverSongAdapter;
import com.cappielloantonio.play.adapter.RecentMusicAdapter;
+import com.cappielloantonio.play.adapter.SongResultSearchAdapter;
import com.cappielloantonio.play.adapter.YearAdapter;
import com.cappielloantonio.play.databinding.FragmentHomeBinding;
import com.cappielloantonio.play.model.Song;
@@ -33,6 +36,7 @@ public class HomeFragment extends Fragment {
private DiscoverSongAdapter discoverSongAdapter;
private RecentMusicAdapter recentlyAddedMusicAdapter;
private YearAdapter yearAdapter;
+ private SongResultSearchAdapter favoriteSongAdapter;
private RecentMusicAdapter recentlyPlayedMusicAdapter;
private RecentMusicAdapter mostPlayedMusicAdapter;
@@ -46,15 +50,23 @@ public class HomeFragment extends Fragment {
homeViewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
init();
+ initSwipeToRefresh();
initDiscoverSongSlideView();
initRecentAddedSongView();
+ initFavoritesSongView();
initYearSongView();
- initRecentPlayedSongView();
initMostPlayedSongView();
+ initRecentPlayedSongView();
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(true);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
@@ -62,12 +74,6 @@ public class HomeFragment extends Fragment {
}
private void init() {
- bind.resyncButton.setOnClickListener(v -> {
- PreferenceUtil.getInstance(requireContext()).setSync(false);
- PreferenceUtil.getInstance(requireContext()).setSongGenreSync(false);
- activity.goToSync();
- });
-
bind.recentlyAddedTracksTextViewClickable.setOnClickListener(v -> {
Bundle bundle = new Bundle();
bundle.putString(Song.RECENTLY_ADDED, Song.RECENTLY_ADDED);
@@ -85,6 +91,29 @@ public class HomeFragment extends Fragment {
bundle.putString(Song.MOST_PLAYED, Song.MOST_PLAYED);
activity.navController.navigate(R.id.action_homeFragment_to_songListPageFragment, bundle);
});
+
+ bind.favoritesTracksTextViewClickable.setOnClickListener(v -> {
+ Bundle bundle = new Bundle();
+ bundle.putString(Song.IS_FAVORITE, Song.IS_FAVORITE);
+ activity.navController.navigate(R.id.action_homeFragment_to_songListPageFragment, bundle);
+ });
+ }
+
+ private void initSwipeToRefresh() {
+ bind.pullToRefreshLayout.setOnRefreshListener(() -> {
+ AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
+ builder.setMessage("Force reload your entire music library")
+ .setTitle("Force sync")
+ .setNegativeButton(R.string.ignore, null)
+ .setPositiveButton("Sync", (dialog, id) -> {
+ PreferenceUtil.getInstance(requireContext()).setSync(false);
+ PreferenceUtil.getInstance(requireContext()).setSongGenreSync(false);
+ activity.goToSync();
+ })
+ .show();
+
+ bind.pullToRefreshLayout.setRefreshing(false);
+ });
}
private void initDiscoverSongSlideView() {
@@ -119,13 +148,13 @@ public class HomeFragment extends Fragment {
bind.yearsRecyclerView.setAdapter(yearAdapter);
}
- private void initRecentPlayedSongView() {
- bind.recentlyPlayedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false));
- bind.recentlyPlayedTracksRecyclerView.setHasFixedSize(true);
+ private void initFavoritesSongView() {
+ bind.favoritesTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 3, GridLayoutManager.HORIZONTAL, false));
+ bind.favoritesTracksRecyclerView.setHasFixedSize(true);
- recentlyPlayedMusicAdapter = new RecentMusicAdapter(requireContext());
- bind.recentlyPlayedTracksRecyclerView.setAdapter(recentlyPlayedMusicAdapter);
- homeViewModel.getRecentlyPlayedSongList().observe(requireActivity(), songs -> recentlyPlayedMusicAdapter.setItems(songs));
+ favoriteSongAdapter = new SongResultSearchAdapter(requireContext(), getChildFragmentManager());
+ bind.favoritesTracksRecyclerView.setAdapter(favoriteSongAdapter);
+ homeViewModel.getFavorites().observe(requireActivity(), songs -> favoriteSongAdapter.setItems(songs));
}
private void initMostPlayedSongView() {
@@ -137,6 +166,15 @@ public class HomeFragment extends Fragment {
homeViewModel.getMostPlayedSongList().observe(requireActivity(), songs -> mostPlayedMusicAdapter.setItems(songs));
}
+ private void initRecentPlayedSongView() {
+ bind.recentlyPlayedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false));
+ bind.recentlyPlayedTracksRecyclerView.setHasFixedSize(true);
+
+ recentlyPlayedMusicAdapter = new RecentMusicAdapter(requireContext());
+ bind.recentlyPlayedTracksRecyclerView.setAdapter(recentlyPlayedMusicAdapter);
+ homeViewModel.getRecentlyPlayedSongList().observe(requireActivity(), songs -> recentlyPlayedMusicAdapter.setItems(songs));
+ }
+
private void settDiscoverSongSlideViewOffset(float pageOffset, float pageMargin) {
bind.discoverSongViewPager.setPageTransformer((page, position) -> {
float myOffset = position * -(2 * pageOffset + pageMargin);
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 ae7176df..942e767e 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
@@ -56,6 +56,12 @@ public class LibraryFragment extends Fragment {
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(true);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
@@ -66,7 +72,6 @@ public class LibraryFragment extends Fragment {
bind.albumCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_albumCatalogueFragment));
bind.artistCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_artistCatalogueFragment));
bind.genreCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_genreCatalogueFragment));
- bind.syncGenreButton.setOnClickListener(v -> syncSongsPerGenre());
}
private void initAlbumView() {
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 62a7c95c..11cbc971 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
@@ -58,6 +58,12 @@ public class SearchFragment extends Fragment {
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(true);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
@@ -87,7 +93,7 @@ public class SearchFragment extends Fragment {
bind.searchResultTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
bind.searchResultTracksRecyclerView.setHasFixedSize(true);
- songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), new ArrayList<>());
+ songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), getChildFragmentManager());
bind.searchResultTracksRecyclerView.setAdapter(songResultSearchAdapter);
// Albums
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 43d747d0..6966cb50 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
@@ -15,8 +15,6 @@ import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.ui.activities.MainActivity;
import com.cappielloantonio.play.viewmodel.SongListPageViewModel;
-import java.util.ArrayList;
-
public class SongListPageFragment extends Fragment {
private FragmentSongListPageBinding bind;
@@ -39,6 +37,12 @@ public class SongListPageFragment extends Fragment {
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ activity.setBottomNavigationBarVisibility(false);
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
@@ -79,13 +83,17 @@ public class SongListPageFragment extends Fragment {
songListPageViewModel.year = getArguments().getInt("year_object");
bind.pageTitleLabel.setText("Year " + songListPageViewModel.year);
}
+ else if(getArguments().getString(Song.IS_FAVORITE) != null) {
+ songListPageViewModel.title = Song.IS_FAVORITE;
+ bind.pageTitleLabel.setText("Favourite song");
+ }
}
private void initSongListView() {
bind.songListRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
bind.songListRecyclerView.setHasFixedSize(true);
- songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), new ArrayList<>());
+ songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), getChildFragmentManager());
bind.songListRecyclerView.setAdapter(songResultSearchAdapter);
songListPageViewModel.getSongList().observe(requireActivity(), songs -> songResultSearchAdapter.setItems(songs));
}
diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SyncFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SyncFragment.java
index 0f463b02..0cc693ce 100644
--- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SyncFragment.java
+++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SyncFragment.java
@@ -99,7 +99,6 @@ public class SyncFragment extends Fragment {
}
private void syncAlbums() {
- Log.d(TAG, "syncAlbums");
SyncUtil.getAlbums(requireContext(), new MediaCallback() {
@Override
public void onError(Exception exception) {
@@ -117,7 +116,6 @@ public class SyncFragment extends Fragment {
}
private void syncArtists() {
- Log.d(TAG, "syncArtists");
SyncUtil.getArtists(requireContext(), new MediaCallback() {
@Override
public void onError(Exception exception) {
@@ -135,7 +133,6 @@ public class SyncFragment extends Fragment {
}
private void syncGenres() {
- Log.d(TAG, "syncGenres");
SyncUtil.getGenres(requireContext(), new MediaCallback() {
@Override
public void onError(Exception exception) {
@@ -156,7 +153,6 @@ public class SyncFragment extends Fragment {
}
private void syncPlaylist() {
- Log.d(TAG, "syncPlaylist");
SyncUtil.getPlaylists(requireContext(), new MediaCallback() {
@Override
public void onError(Exception exception) {
@@ -174,7 +170,6 @@ public class SyncFragment extends Fragment {
}
private void syncSongs() {
- Log.d(TAG, "syncSongs");
SyncUtil.getSongs(requireContext(), syncViewModel.getCatalogue(), new MediaCallback() {
@Override
public void onError(Exception exception) {
@@ -193,8 +188,6 @@ public class SyncFragment extends Fragment {
}
private void syncSongsPerGenre(List genres) {
- Log.d(TAG, "syncSongsPerGenre");
-
for (Genre genre : genres) {
SyncUtil.getSongsPerGenre(requireContext(), new MediaCallback() {
@Override
@@ -210,29 +203,23 @@ public class SyncFragment extends Fragment {
}, genre.id);
}
- Log.d(TAG, "syncSongsPerGenre: set progress");
-
animateProgressBar(true);
PreferenceUtil.getInstance(requireContext()).setSongGenreSync(true);
}
private void animateProgressBar(boolean step) {
- Log.d(TAG, "animateProgressBar: PROGRESS " + step);
syncViewModel.setProgress(step);
bind.loadingProgressBar.setProgress(syncViewModel.getProgressBarInfo(), true);
countProgress();
}
private void countProgress() {
- Log.d(TAG, "countProgress = " + syncViewModel.getProgress());
- Log.d(TAG, "progressbar = " + syncViewModel.getProgressBarInfo());
-
if (syncViewModel.getProgress() == syncViewModel.getStep()) {
- if (syncViewModel.getProgressBarInfo() >= 100)
- terminate();
- else
+ if (syncViewModel.getProgressBarInfo() < 100)
Toast.makeText(requireContext(), "Sync error", Toast.LENGTH_SHORT).show();
+
+ terminate();
}
}
diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java
new file mode 100644
index 00000000..5231d205
--- /dev/null
+++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java
@@ -0,0 +1,54 @@
+package com.cappielloantonio.play.ui.fragment.bottomsheetdialog;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+
+import com.cappielloantonio.play.R;
+import com.cappielloantonio.play.model.Album;
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener {
+ private static final String TAG = "AlbumBottomSheetDialog";
+
+ private Album album;
+
+ public AlbumBottomSheetDialog(Album album) {
+ this.album = album;
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.bottom_sheet_album_dialog, container, false);
+
+ init(view);
+
+ return view;
+ }
+
+ private void init(View view) {
+ Button button1 = view.findViewById(R.id.button1);
+ Button button2 = view.findViewById(R.id.button2);
+
+ button1.setOnClickListener(v -> {
+ Toast.makeText(requireContext(), album.getTitle(), Toast.LENGTH_SHORT).show();
+ dismiss();
+ });
+
+ button2.setOnClickListener(v -> {
+ Toast.makeText(requireContext(), album.getArtistName(), Toast.LENGTH_SHORT).show();
+ dismiss();
+ });
+ }
+
+ @Override
+ public void onClick(View v) {
+ dismiss();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java
new file mode 100644
index 00000000..c1f785c5
--- /dev/null
+++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java
@@ -0,0 +1,121 @@
+package com.cappielloantonio.play.ui.fragment.bottomsheetdialog;
+
+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 android.widget.Toast;
+import android.widget.ToggleButton;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.cappielloantonio.play.R;
+import com.cappielloantonio.play.glide.CustomGlideRequest;
+import com.cappielloantonio.play.model.Song;
+import com.cappielloantonio.play.viewmodel.AlbumBottomSheetViewModel;
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+public class SongBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener {
+ private static final String TAG = "AlbumBottomSheetDialog";
+
+ private AlbumBottomSheetViewModel albumBottomSheetViewModel;
+ private Song song;
+
+ private ImageView coverSong;
+ private TextView titleSong;
+ private TextView artistSong;
+ private ToggleButton thumbToggle;
+
+ private TextView playRadio;
+ private TextView playNext;
+ private TextView addToQueue;
+ private TextView Download;
+ private TextView addToPlaylist;
+ private TextView goToArtist;
+
+
+ public SongBottomSheetDialog(Song song) {
+ this.song = song;
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.bottom_sheet_song_dialog, container, false);
+ albumBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(AlbumBottomSheetViewModel.class);
+ albumBottomSheetViewModel.setSong(song);
+
+ init(view);
+
+ return view;
+ }
+
+ private void init(View view) {
+ coverSong = view.findViewById(R.id.song_cover_image_view);
+ CustomGlideRequest.Builder
+ .from(requireContext(), albumBottomSheetViewModel.getSong().getPrimary(), albumBottomSheetViewModel.getSong().getBlurHash(), CustomGlideRequest.PRIMARY, CustomGlideRequest.TOP_QUALITY)
+ .build()
+ .into(coverSong);
+
+ titleSong = view.findViewById(R.id.song_title_text_view);
+ titleSong.setText(albumBottomSheetViewModel.getSong().getTitle());
+
+ artistSong = view.findViewById(R.id.song_artist_text_view);
+ artistSong.setText(albumBottomSheetViewModel.getSong().getArtistName());
+
+ thumbToggle = view.findViewById(R.id.button_favorite);
+ thumbToggle.setChecked(albumBottomSheetViewModel.getSong().isFavorite());
+ thumbToggle.setOnClickListener(v -> {
+ albumBottomSheetViewModel.setFavorite();
+ dismissBottomSheet();
+ });
+
+ playRadio = view.findViewById(R.id.play_radio_text_view);
+ playRadio.setOnClickListener(v -> {
+ Toast.makeText(requireContext(), "Play radio", Toast.LENGTH_SHORT).show();
+ dismissBottomSheet();
+ });
+
+ playNext = view.findViewById(R.id.play_next_text_view);
+ playNext.setOnClickListener(v -> {
+ Toast.makeText(requireContext(), "Play next", Toast.LENGTH_SHORT).show();
+ dismissBottomSheet();
+ });
+
+ addToQueue = view.findViewById(R.id.add_to_queue_text_view);
+ addToQueue.setOnClickListener(v -> {
+ Toast.makeText(requireContext(), "Add to queue", Toast.LENGTH_SHORT).show();
+ dismissBottomSheet();
+ });
+
+ Download = view.findViewById(R.id.download_text_view);
+ Download.setOnClickListener(v -> {
+ Toast.makeText(requireContext(), "Download", Toast.LENGTH_SHORT).show();
+ dismissBottomSheet();
+ });
+
+ addToPlaylist = view.findViewById(R.id.add_to_playlist_text_view);
+ addToPlaylist.setOnClickListener(v -> {
+ Toast.makeText(requireContext(), "Add to playlist", Toast.LENGTH_SHORT).show();
+ dismissBottomSheet();
+ });
+
+ goToArtist = view.findViewById(R.id.go_to_artist_text_view);
+ goToArtist.setOnClickListener(v -> {
+ Toast.makeText(requireContext(), "Go to artist", Toast.LENGTH_SHORT).show();
+ dismissBottomSheet();
+ });
+ }
+
+ @Override
+ public void onClick(View v) {
+ dismissBottomSheet();
+ }
+
+ private void dismissBottomSheet() {
+ dismiss();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java
new file mode 100644
index 00000000..71f78669
--- /dev/null
+++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java
@@ -0,0 +1,39 @@
+package com.cappielloantonio.play.viewmodel;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+
+import com.cappielloantonio.play.model.Song;
+import com.cappielloantonio.play.repository.SongRepository;
+
+public class AlbumBottomSheetViewModel extends AndroidViewModel {
+ private SongRepository songRepository;
+ private Song song;
+
+ public AlbumBottomSheetViewModel(@NonNull Application application) {
+ super(application);
+
+ songRepository = new SongRepository(application);
+ }
+
+ public void setSong(Song song) {
+ this.song = song;
+ }
+
+ public Song getSong() {
+ return song;
+ }
+
+ public void setFavorite() {
+ if(song.isFavorite()) {
+ song.setFavorite(false);
+ }
+ else {
+ song.setFavorite(true);
+ }
+
+ songRepository.setFavoriteStatus(song);
+ }
+}
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 733a2d0f..b26a25b8 100644
--- a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java
+++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.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;
@@ -20,6 +19,7 @@ public class HomeViewModel extends AndroidViewModel {
private LiveData> recentlyPlayedSongSample;
private LiveData> recentlyAddedSongSample;
private LiveData> mostPlayedSongSample;
+ private LiveData> favoritesSongSample;
private List years;
public HomeViewModel(@NonNull Application application) {
@@ -31,6 +31,7 @@ public class HomeViewModel extends AndroidViewModel {
recentlyPlayedSongSample = songRepository.getListLiveRecentlyPlayedSampleSong(20);
recentlyAddedSongSample = songRepository.getListLiveRecentlyAddedSampleSong(20);
mostPlayedSongSample = songRepository.getListLiveMostPlayedSampleSong(20);
+ favoritesSongSample = songRepository.getListLiveFavoritesSampleSong(20);
years = songRepository.getYearList();
}
@@ -56,7 +57,10 @@ public class HomeViewModel extends AndroidViewModel {
}
public List getYearList() {
- Log.d(TAG, "getYearList: " + years.toString());
return years;
}
+
+ public LiveData> getFavorites() {
+ return favoritesSongSample;
+ }
}
diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java
index 199bcfff..cd1b9206 100644
--- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java
+++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java
@@ -56,6 +56,9 @@ public class SongListPageViewModel extends AndroidViewModel {
case Song.BY_YEAR:
songList = songRepository.getSongByYearListLive(year);
break;
+ case Song.IS_FAVORITE:
+ songList = songRepository.getListLiveFavoritesSong();
+ break;
}
return songList;
diff --git a/app/src/main/res/drawable/button_favorite_selector.xml b/app/src/main/res/drawable/button_favorite_selector.xml
new file mode 100644
index 00000000..02918708
--- /dev/null
+++ b/app/src/main/res/drawable/button_favorite_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_more.xml b/app/src/main/res/drawable/ic_more.xml
new file mode 100644
index 00000000..568cbb4d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_more.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_play.xml b/app/src/main/res/drawable/ic_play.xml
new file mode 100644
index 00000000..76d03c34
--- /dev/null
+++ b/app/src/main/res/drawable/ic_play.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_shuffle.xml b/app/src/main/res/drawable/ic_shuffle.xml
new file mode 100644
index 00000000..d1c64b42
--- /dev/null
+++ b/app/src/main/res/drawable/ic_shuffle.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_thumb_up.xml b/app/src/main/res/drawable/ic_thumb_up.xml
new file mode 100644
index 00000000..3fc92f22
--- /dev/null
+++ b/app/src/main/res/drawable/ic_thumb_up.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_thumb_up_outlined.xml b/app/src/main/res/drawable/ic_thumb_up_outlined.xml
new file mode 100644
index 00000000..bd54a0d0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_thumb_up_outlined.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 46b24862..4ad7d5f8 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -28,5 +28,23 @@
app:labelVisibilityMode="unlabeled"
app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
app:layout_scrollFlags="scroll|enterAlways|snap"
- app:menu="@menu/bottom_nav_menu" />
+ app:menu="@menu/bottom_nav_menu">
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/bottom_sheet_album_dialog.xml b/app/src/main/res/layout/bottom_sheet_album_dialog.xml
new file mode 100644
index 00000000..ee01a88b
--- /dev/null
+++ b/app/src/main/res/layout/bottom_sheet_album_dialog.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/bottom_sheet_song_dialog.xml b/app/src/main/res/layout/bottom_sheet_song_dialog.xml
new file mode 100644
index 00000000..5c07d3ab
--- /dev/null
+++ b/app/src/main/res/layout/bottom_sheet_song_dialog.xml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_album_page.xml b/app/src/main/res/layout/fragment_album_page.xml
index 04dd4116..2c8c499e 100644
--- a/app/src/main/res/layout/fragment_album_page.xml
+++ b/app/src/main/res/layout/fragment_album_page.xml
@@ -1,5 +1,6 @@
-
@@ -21,7 +22,8 @@
app:layout_constraintDimensionRatio="W, 4:5"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
- app:layout_constraintTop_toTopOf="parent">
+ app:layout_constraintTop_toTopOf="parent"
+ app:cardCornerRadius="0dp">
-
-
+ android:layout_marginTop="12dp"
+ android:orientation="horizontal"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp">
+
+
+
+
+
+
+ android:paddingBottom="8dp" />
diff --git a/app/src/main/res/layout/fragment_artist_page.xml b/app/src/main/res/layout/fragment_artist_page.xml
index 930d6939..0f95db81 100644
--- a/app/src/main/res/layout/fragment_artist_page.xml
+++ b/app/src/main/res/layout/fragment_artist_page.xml
@@ -21,7 +21,8 @@
app:layout_constraintDimensionRatio="W, 4:5"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
- app:layout_constraintTop_toTopOf="parent">
+ app:layout_constraintTop_toTopOf="parent"
+ app:cardCornerRadius="0dp">
-
-
@@ -113,9 +105,7 @@
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:clipToPadding="false"
- android:paddingStart="16dp"
android:paddingTop="8dp"
- android:paddingEnd="8dp"
android:paddingBottom="8dp" />
+ android:paddingBottom="8dp" />
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 00eb9d12..d5dce348 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -1,257 +1,305 @@
-
+ android:layout_height="match_parent">
-
+ android:layout_height="match_parent"
+ app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
+ android:paddingTop="20dp">
-
+ android:orientation="vertical"
+ android:paddingBottom="8dp">
-
-
-
-
-
-
-
-
-
-
+
+ android:orientation="vertical">
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ android:orientation="vertical">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ android:paddingBottom="8dp" />
-
-
-
-
-
-
-
+
+ android:orientation="vertical">
-
+
+ android:paddingTop="8dp"
+ android:paddingEnd="8dp">
+
+
-
+
+
+
+
-
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp"
+ android:clipToPadding="false"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp" />
-
+
+ android:orientation="vertical">
-
+
+
+
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml
index 58f38c3b..d8b27a8f 100644
--- a/app/src/main/res/layout/fragment_library.xml
+++ b/app/src/main/res/layout/fragment_library.xml
@@ -197,19 +197,6 @@
android:paddingTop="8dp"
android:paddingEnd="8dp"/>
-
diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml
index f80af9c3..a961f0e5 100644
--- a/app/src/main/res/layout/fragment_search.xml
+++ b/app/src/main/res/layout/fragment_search.xml
@@ -141,9 +141,7 @@
android:layout_marginTop="4dp"
android:clipToPadding="false"
android:overScrollMode="never"
- android:paddingStart="16dp"
android:paddingTop="8dp"
- android:paddingEnd="8dp"
android:paddingBottom="24dp" />
diff --git a/app/src/main/res/layout/item_artist_page_album.xml b/app/src/main/res/layout/item_artist_page_album.xml
index ece21273..bc76e367 100644
--- a/app/src/main/res/layout/item_artist_page_album.xml
+++ b/app/src/main/res/layout/item_artist_page_album.xml
@@ -28,7 +28,7 @@
android:layout_height="wrap_content"
android:ellipsize="end"
android:fontFamily="@font/open_sans_font_family"
- android:maxWidth="172dp"
+ android:maxWidth="256dp"
android:maxLines="2"
android:paddingStart="2dp"
android:paddingTop="8dp"
diff --git a/app/src/main/res/layout/item_home_track.xml b/app/src/main/res/layout/item_home_track.xml
index 8ad1480e..9f2a4586 100644
--- a/app/src/main/res/layout/item_home_track.xml
+++ b/app/src/main/res/layout/item_home_track.xml
@@ -19,7 +19,7 @@
+ android:layout_height="172dp"/>
+ android:paddingStart="16dp"
+ android:paddingTop="3dp"
+ android:paddingEnd="12dp"
+ android:paddingBottom="3dp"
+ android:background="?attr/selectableItemBackground">
+ android:layout_width="52dp"
+ android:layout_height="52dp" />