Limited number of search items for each category

This commit is contained in:
CappielloAntonio 2021-04-21 14:16:07 +02:00
parent d6b5bf21c1
commit 55c335d7fc
14 changed files with 69 additions and 28 deletions

View file

@ -22,8 +22,8 @@ public interface AlbumDao {
@Query("SELECT * FROM album ORDER BY RANDOM() LIMIT :number;") @Query("SELECT * FROM album ORDER BY RANDOM() LIMIT :number;")
LiveData<List<Album>> getSample(int number); LiveData<List<Album>> getSample(int number);
@Query("SELECT * FROM album WHERE title LIKE '%' || :name || '%'") @Query("SELECT * FROM album WHERE title LIKE '%' || :name || '%' LIMIT :limit")
LiveData<List<Album>> searchAlbum(String name); LiveData<List<Album>> searchAlbum(String name, int limit);
@Insert(onConflict = OnConflictStrategy.REPLACE) @Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(Album album); void insert(Album album);

View file

@ -19,8 +19,8 @@ public interface ArtistDao {
@Query("SELECT * FROM artist ORDER BY RANDOM() LIMIT :number;") @Query("SELECT * FROM artist ORDER BY RANDOM() LIMIT :number;")
LiveData<List<Artist>> getSample(int number); LiveData<List<Artist>> getSample(int number);
@Query("SELECT * FROM artist WHERE name LIKE '%' || :name || '%'") @Query("SELECT * FROM artist WHERE name LIKE '%' || :name || '%' LIMIT :limit")
LiveData<List<Artist>> searchArtist(String name); LiveData<List<Artist>> searchArtist(String name, int limit);
@Insert(onConflict = OnConflictStrategy.REPLACE) @Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<Artist> artists); void insertAll(List<Artist> artists);

View file

@ -29,8 +29,8 @@ public interface GenreDao {
@Query("DELETE FROM genre") @Query("DELETE FROM genre")
void deleteAll(); void deleteAll();
@Query("SELECT * FROM genre WHERE name LIKE '%' || :name || '%'") @Query("SELECT * FROM genre WHERE name LIKE '%' || :name || '%' LIMIT :limit")
LiveData<List<Genre>> searchGenre(String name); LiveData<List<Genre>> searchGenre(String name, int limit);
@Query("SELECT name FROM genre WHERE name LIKE :query || '%' OR name like '% ' || :query || '%' GROUP BY name LIMIT :number") @Query("SELECT name FROM genre WHERE name LIKE :query || '%' OR name like '% ' || :query || '%' GROUP BY name LIMIT :number")
List<String> searchSuggestions(String query, int number); List<String> searchSuggestions(String query, int number);

View file

@ -21,8 +21,8 @@ public interface SongDao {
@Query("SELECT * FROM song") @Query("SELECT * FROM song")
List<Song> getAllList(); List<Song> getAllList();
@Query("SELECT * FROM song WHERE title LIKE '%' || :title || '%'") @Query("SELECT * FROM song WHERE title LIKE '%' || :title || '%' LIMIT :limit")
LiveData<List<Song>> searchSong(String title); LiveData<List<Song>> searchSong(String title, int limit);
// Da utilizzare in caso si decidesse di migliorare il viewpager nella home // Da utilizzare in caso si decidesse di migliorare il viewpager nella home
@Query("SELECT * FROM song WHERE id IN (:pseudoRandomNumber)") @Query("SELECT * FROM song WHERE id IN (:pseudoRandomNumber)")

View file

@ -41,8 +41,8 @@ public class AlbumRepository {
return listLiveSampleAlbum; return listLiveSampleAlbum;
} }
public LiveData<List<Album>> searchListLiveAlbum(String name) { public LiveData<List<Album>> searchListLiveAlbum(String name, int limit) {
searchListLiveAlbum = albumDao.searchAlbum(name); searchListLiveAlbum = albumDao.searchAlbum(name, limit);
return searchListLiveAlbum; return searchListLiveAlbum;
} }

View file

@ -33,8 +33,8 @@ public class ArtistRepository {
return listLiveSampleArtist; return listLiveSampleArtist;
} }
public LiveData<List<Artist>> searchListLiveArtist(String name) { public LiveData<List<Artist>> searchListLiveArtist(String name, int limit) {
searchListLiveArtist = artistDao.searchArtist(name); searchListLiveArtist = artistDao.searchArtist(name, limit);
return searchListLiveArtist; return searchListLiveArtist;
} }

View file

@ -114,8 +114,8 @@ public class GenreRepository {
} }
} }
public LiveData<List<Genre>> searchListLiveGenre(String name) { public LiveData<List<Genre>> searchListLiveGenre(String name, int limit) {
searchListLiveGenre = genreDao.searchGenre(name); searchListLiveGenre = genreDao.searchGenre(name, limit);
return searchListLiveGenre; return searchListLiveGenre;
} }

View file

@ -40,8 +40,8 @@ public class SongRepository {
songGenreCrossDao = database.songGenreCrossDao(); songGenreCrossDao = database.songGenreCrossDao();
} }
public LiveData<List<Song>> searchListLiveSong(String title) { public LiveData<List<Song>> searchListLiveSong(String title, int limit) {
searchListLiveSongs = songDao.searchSong(title); searchListLiveSongs = songDao.searchSong(title, limit);
return searchListLiveSongs; return searchListLiveSongs;
} }

View file

@ -1,6 +1,7 @@
package com.cappielloantonio.play.ui.fragment; package com.cappielloantonio.play.ui.fragment;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -26,6 +27,7 @@ import com.cappielloantonio.play.helper.recyclerview.GridItemDecoration;
import com.cappielloantonio.play.model.RecentSearch; import com.cappielloantonio.play.model.RecentSearch;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.ui.activities.MainActivity;
import com.cappielloantonio.play.util.PreferenceUtil;
import com.cappielloantonio.play.viewmodel.SearchViewModel; import com.cappielloantonio.play.viewmodel.SearchViewModel;
import com.paulrybitskyi.persistentsearchview.adapters.model.SuggestionItem; import com.paulrybitskyi.persistentsearchview.adapters.model.SuggestionItem;
import com.paulrybitskyi.persistentsearchview.listeners.OnSuggestionChangeListener; import com.paulrybitskyi.persistentsearchview.listeners.OnSuggestionChangeListener;
@ -70,6 +72,8 @@ public class SearchFragment extends Fragment {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
inputFocus(); inputFocus();
Log.i(TAG, "onResume: " + PreferenceUtil.getInstance(requireContext()).getSongNumber());
} }
@Override @Override
@ -179,19 +183,19 @@ public class SearchFragment extends Fragment {
} }
private void performSearch(String query) { private void performSearch(String query) {
searchViewModel.searchSong(query).observe(requireActivity(), songs -> { searchViewModel.searchSong(query, requireContext()).observe(requireActivity(), songs -> {
if(bind != null) bind.searchSongSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE); if(bind != null) bind.searchSongSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE);
songResultSearchAdapter.setItems(songs); songResultSearchAdapter.setItems(songs);
}); });
searchViewModel.searchAlbum(query).observe(requireActivity(), albums -> { searchViewModel.searchAlbum(query, requireContext()).observe(requireActivity(), albums -> {
if(bind != null) bind.searchAlbumSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); if(bind != null) bind.searchAlbumSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE);
albumAdapter.setItems(albums); albumAdapter.setItems(albums);
}); });
searchViewModel.searchArtist(query).observe(requireActivity(), artists -> { searchViewModel.searchArtist(query, requireContext()).observe(requireActivity(), artists -> {
if(bind != null) bind.searchArtistSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE); if(bind != null) bind.searchArtistSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE);
artistAdapter.setItems(artists); artistAdapter.setItems(artists);
}); });
searchViewModel.searchGenre(query).observe(requireActivity(), genres -> { searchViewModel.searchGenre(query, requireContext()).observe(requireActivity(), genres -> {
if(bind != null) bind.searchGenreSector.setVisibility(!genres.isEmpty() ? View.VISIBLE : View.GONE); if(bind != null) bind.searchGenreSector.setVisibility(!genres.isEmpty() ? View.VISIBLE : View.GONE);
genreCatalogueAdapter.setItems(genres); genreCatalogueAdapter.setItems(genres);
}); });

View file

@ -14,6 +14,8 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public class PreferenceUtil { public class PreferenceUtil {
private static final String TAG = "PreferenceUtil";
public static final String SERVER = "server"; public static final String SERVER = "server";
public static final String USER = "user"; public static final String USER = "user";
public static final String TOKEN = "token"; public static final String TOKEN = "token";
@ -24,6 +26,7 @@ public class PreferenceUtil {
public static final String SYNC = "sync"; public static final String SYNC = "sync";
public static final String SONG_GENRE_SYNC = "song_genre_sync"; public static final String SONG_GENRE_SYNC = "song_genre_sync";
public static final String SEARCH_ELEMENT_PER_CATEGORY = "search_element_per_category";
public static final String IMAGE_CACHE_SIZE = "image_cache_size"; public static final String IMAGE_CACHE_SIZE = "image_cache_size";
public static final String MEDIA_CACHE_SIZE = "media_cache_size"; public static final String MEDIA_CACHE_SIZE = "media_cache_size";
@ -141,6 +144,10 @@ public class PreferenceUtil {
return Integer.parseInt(mPreferences.getString(INSTANT_MIX_SONG_NUMBER, "10")); return Integer.parseInt(mPreferences.getString(INSTANT_MIX_SONG_NUMBER, "10"));
} }
public final int getSearchElementPerCategory() {
return Integer.parseInt(mPreferences.getString(SEARCH_ELEMENT_PER_CATEGORY, "10"));
}
public final String getTranscodeCodec() { public final String getTranscodeCodec() {
return mPreferences.getString(TRANSCODE_CODEC, "aac"); return mPreferences.getString(TRANSCODE_CODEC, "aac");
} }
@ -178,10 +185,16 @@ public class PreferenceUtil {
return mPreferences.getBoolean(AUDIO_DUCKING, true); return mPreferences.getBoolean(AUDIO_DUCKING, true);
} }
/*
* Numero di canzoni salvate nel db
*/
public int getSongNumber() { public int getSongNumber() {
return mPreferences.getInt(SONG_NUMBER, 0); return mPreferences.getInt(SONG_NUMBER, 0);
} }
/*
* Numero di canzoni salvate nel db
*/
public void setSongNumber(int number) { public void setSongNumber(int number) {
final SharedPreferences.Editor editor = mPreferences.edit(); final SharedPreferences.Editor editor = mPreferences.edit();
editor.putInt(SONG_NUMBER, number); editor.putInt(SONG_NUMBER, number);

View file

@ -1,6 +1,7 @@
package com.cappielloantonio.play.viewmodel; package com.cappielloantonio.play.viewmodel;
import android.app.Application; import android.app.Application;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.AndroidViewModel;
@ -16,6 +17,7 @@ import com.cappielloantonio.play.repository.ArtistRepository;
import com.cappielloantonio.play.repository.GenreRepository; import com.cappielloantonio.play.repository.GenreRepository;
import com.cappielloantonio.play.repository.RecentSearchRepository; import com.cappielloantonio.play.repository.RecentSearchRepository;
import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.repository.SongRepository;
import com.cappielloantonio.play.util.PreferenceUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
@ -59,23 +61,23 @@ public class SearchViewModel extends AndroidViewModel {
} }
} }
public LiveData<List<Song>> searchSong(String title) { public LiveData<List<Song>> searchSong(String title, Context context) {
searchSong = songRepository.searchListLiveSong(title); searchSong = songRepository.searchListLiveSong(title, PreferenceUtil.getInstance(context).getSearchElementPerCategory());
return searchSong; return searchSong;
} }
public LiveData<List<Album>> searchAlbum(String name) { public LiveData<List<Album>> searchAlbum(String name, Context context) {
searchAlbum = albumRepository.searchListLiveAlbum(name); searchAlbum = albumRepository.searchListLiveAlbum(name, PreferenceUtil.getInstance(context).getSearchElementPerCategory());
return searchAlbum; return searchAlbum;
} }
public LiveData<List<Artist>> searchArtist(String name) { public LiveData<List<Artist>> searchArtist(String name, Context context) {
searchArtist = artistRepository.searchListLiveArtist(name); searchArtist = artistRepository.searchListLiveArtist(name, PreferenceUtil.getInstance(context).getSearchElementPerCategory());
return searchArtist; return searchArtist;
} }
public LiveData<List<Genre>> searchGenre(String name) { public LiveData<List<Genre>> searchGenre(String name, Context context) {
searchGenre = genreRepository.searchListLiveGenre(name); searchGenre = genreRepository.searchListLiveGenre(name, PreferenceUtil.getInstance(context).getSearchElementPerCategory());
return searchGenre; return searchGenre;
} }

View file

@ -50,4 +50,16 @@
<item>25</item> <item>25</item>
<item>50</item> <item>50</item>
</string-array> </string-array>
<string-array name="search_element_per_category_titles">
<item>10</item>
<item>20</item>
<item>30</item>
</string-array>
<string-array name="search_element_per_category_values">
<item>10</item>
<item>20</item>
<item>30</item>
</string-array>
</resources> </resources>

View file

@ -14,6 +14,7 @@
<string name="label_dot_separator"></string> <string name="label_dot_separator"></string>
<string name="save_filters">Save filters between sessions</string> <string name="save_filters">Save filters between sessions</string>
<string name="instant_mix_song_number">Number of songs generated by Instant Mix</string> <string name="instant_mix_song_number">Number of songs generated by Instant Mix</string>
<string name="search_element_per_category">Number of items searched for each category</string>
<string name="sync_header">Synchronization</string> <string name="sync_header">Synchronization</string>
<string name="music_sync">Music sync</string> <string name="music_sync">Music sync</string>

View file

@ -36,6 +36,15 @@
app:key="instant_mix_song_number" app:key="instant_mix_song_number"
app:title="@string/instant_mix_song_number" app:title="@string/instant_mix_song_number"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<ListPreference
app:defaultValue="10"
app:dialogTitle="@string/search_element_per_category"
app:entries="@array/search_element_per_category_titles"
app:entryValues="@array/search_element_per_category_values"
app:key="search_element_per_category"
app:title="@string/search_element_per_category"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory app:title="@string/sync_header"> <PreferenceCategory app:title="@string/sync_header">