From 15e0bf9982b5235b3934c05093ff6b517524d86b Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 19 Oct 2015 17:08:50 -0700 Subject: #480 Add support for searching within Auto --- .../daneren2005/dsub/domain/SearchResult.java | 10 ++ .../daneren2005/dsub/util/BackgroundTask.java | 3 + .../daneren2005/dsub/util/SilentServiceTask.java | 41 ++++++ .../dsub/util/compat/RemoteControlClientLP.java | 150 ++++++++++++++++++++- 4 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/github/daneren2005/dsub/util/SilentServiceTask.java (limited to 'app/src/main/java') diff --git a/app/src/main/java/github/daneren2005/dsub/domain/SearchResult.java b/app/src/main/java/github/daneren2005/dsub/domain/SearchResult.java index 3427f2ca..4d761b02 100644 --- a/app/src/main/java/github/daneren2005/dsub/domain/SearchResult.java +++ b/app/src/main/java/github/daneren2005/dsub/domain/SearchResult.java @@ -49,4 +49,14 @@ public class SearchResult implements Serializable { public List getSongs() { return songs; } + + public boolean hasArtists() { + return !artists.isEmpty(); + } + public boolean hasAlbums() { + return !albums.isEmpty(); + } + public boolean hasSongs() { + return !songs.isEmpty(); + } } \ No newline at end of file diff --git a/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java b/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java index 30081d7d..18f245d5 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java +++ b/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java @@ -93,6 +93,9 @@ public abstract class BackgroundTask implements ProgressListener { return (context instanceof Activity) ? ((Activity) context) : null; } + protected Context getContext() { + return context; + } protected Handler getHandler() { return handler; } diff --git a/app/src/main/java/github/daneren2005/dsub/util/SilentServiceTask.java b/app/src/main/java/github/daneren2005/dsub/util/SilentServiceTask.java new file mode 100644 index 00000000..9fdfe66f --- /dev/null +++ b/app/src/main/java/github/daneren2005/dsub/util/SilentServiceTask.java @@ -0,0 +1,41 @@ +/* + This file is part of Subsonic. + + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see . + + Copyright 2015 (C) Scott Jackson +*/ + +package github.daneren2005.dsub.util; + +import android.content.Context; + +import github.daneren2005.dsub.service.MusicService; +import github.daneren2005.dsub.service.MusicServiceFactory; + +public abstract class SilentServiceTask extends SilentBackgroundTask { + protected MusicService musicService; + + public SilentServiceTask(Context context) { + super(context); + } + + @Override + protected T doInBackground() throws Throwable { + musicService = MusicServiceFactory.getMusicService(getContext()); + return doInBackground(musicService); + } + + protected abstract T doInBackground(MusicService musicService) throws Throwable; +} diff --git a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java index 7a54983d..c9f8cab8 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java +++ b/app/src/main/java/github/daneren2005/dsub/util/compat/RemoteControlClientLP.java @@ -23,16 +23,17 @@ import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.media.AudioAttributes; import android.media.MediaDescription; import android.media.MediaMetadata; -import android.media.Rating; import android.media.RemoteControlClient; import android.media.session.MediaSession; import android.media.session.PlaybackState; import android.os.Build; import android.os.Bundle; +import android.provider.MediaStore; import android.support.v7.media.MediaRouter; import java.util.ArrayList; @@ -42,10 +43,16 @@ import github.daneren2005.dsub.R; import github.daneren2005.dsub.activity.SubsonicActivity; import github.daneren2005.dsub.activity.SubsonicFragmentActivity; import github.daneren2005.dsub.domain.MusicDirectory; +import github.daneren2005.dsub.domain.Playlist; +import github.daneren2005.dsub.domain.SearchCritera; +import github.daneren2005.dsub.domain.SearchResult; import github.daneren2005.dsub.service.DownloadFile; import github.daneren2005.dsub.service.DownloadService; +import github.daneren2005.dsub.service.MusicService; import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.ImageLoader; +import github.daneren2005.dsub.util.SilentServiceTask; +import github.daneren2005.dsub.util.Util; @TargetApi(Build.VERSION_CODES.LOLLIPOP) public class RemoteControlClientLP extends RemoteControlClientBase { @@ -260,6 +267,91 @@ public class RemoteControlClientLP extends RemoteControlClientBase { builder.addCustomAction(thumbsDown).addCustomAction(star).addCustomAction(thumbsUp); } + private void searchPlaylist(final String name) { + new SilentServiceTask(downloadService) { + @Override + protected Void doInBackground(MusicService musicService) throws Throwable { + List playlists = musicService.getPlaylists(false, downloadService, null); + for(Playlist playlist: playlists) { + if(playlist.getName().equals(name)) { + getPlaylist(playlist); + return null; + } + } + + noResults(); + return null; + } + + private void getPlaylist(Playlist playlist) throws Exception { + MusicDirectory musicDirectory = musicService.getPlaylist(false, playlist.getId(), playlist.getName(), downloadService, null); + playSongs(musicDirectory.getChildren()); + } + }.execute(); + } + private void searchCriteria(final SearchCritera searchCritera) { + new SilentServiceTask(downloadService) { + @Override + protected Void doInBackground(MusicService musicService) throws Throwable { + SearchResult results = musicService.search(searchCritera, downloadService, null); + + if(results.hasArtists()) { + playFromParent(new MusicDirectory.Entry(results.getArtists().get(0))); + } else if(results.hasAlbums()) { + playFromParent(results.getAlbums().get(0)); + } else if(results.hasSongs()) { + playSong(results.getSongs().get(0)); + } else { + noResults(); + } + + return null; + } + + private void playFromParent(MusicDirectory.Entry parent) throws Exception { + List songs = new ArrayList<>(); + getSongsRecursively(parent, songs); + playSongs(songs); + } + private void getSongsRecursively(MusicDirectory.Entry parent, List songs) throws Exception { + MusicDirectory musicDirectory; + if(Util.isTagBrowsing(downloadService) && !Util.isOffline(downloadService)) { + musicDirectory = musicService.getAlbum(parent.getId(), parent.getTitle(), false, downloadService, this); + } else { + musicDirectory = musicService.getMusicDirectory(parent.getId(), parent.getTitle(), false, downloadService, this); + } + + for (MusicDirectory.Entry dir : musicDirectory.getChildren(true, false)) { + if (dir.getRating() == 1) { + continue; + } + + getSongsRecursively(dir, songs); + } + + for (MusicDirectory.Entry song : musicDirectory.getChildren(false, true)) { + if (!song.isVideo() && song.getRating() != 1) { + songs.add(song); + } + } + } + }.execute(); + } + + private void playSong(MusicDirectory.Entry entry) { + List entries = new ArrayList<>(); + entries.add(entry); + playSongs(entries); + } + private void playSongs(List entries) { + downloadService.clear(); + downloadService.download(entries, false, true, false, false); + } + + private void noResults() { + + } + private class EventCallback extends MediaSession.Callback { @Override public void onPlay() { @@ -302,6 +394,62 @@ public class RemoteControlClientLP extends RemoteControlClientBase { } } + @Override + public void onPlayFromSearch (String query, Bundle extras) { + // User just asked to playing something + if("".equals(query)) { + downloadService.setShufflePlayEnabled(true); + } else { + String mediaFocus = extras.getString(MediaStore.EXTRA_MEDIA_FOCUS); + + + // Play a specific playlist + if (MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE.equals(mediaFocus)) { + String playlist = extras.getString(MediaStore.EXTRA_MEDIA_PLAYLIST); + searchPlaylist(playlist); + } + // Play a specific genre + else if (MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE.equals(mediaFocus)) { + String genre = extras.getString(MediaStore.EXTRA_MEDIA_GENRE); + + SharedPreferences.Editor editor = Util.getPreferences(downloadService).edit(); + editor.putString(Constants.PREFERENCES_KEY_SHUFFLE_START_YEAR, null); + editor.putString(Constants.PREFERENCES_KEY_SHUFFLE_END_YEAR, null); + editor.putString(Constants.PREFERENCES_KEY_SHUFFLE_GENRE, genre); + editor.commit(); + + downloadService.setShufflePlayEnabled(true); + } + else { + int artists = 10; + int albums = 10; + int songs = 10; + + // Play a specific artist + if (MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE.equals(mediaFocus)) { + query = extras.getString(MediaStore.EXTRA_MEDIA_ARTIST); + albums = 0; + songs = 0; + } + // Play a specific album + else if (MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE.equals(mediaFocus)) { + query = extras.getString(MediaStore.EXTRA_MEDIA_ALBUM); + artists = 0; + songs = 0 ; + } + // Play a specific song + else if (MediaStore.Audio.Media.ENTRY_CONTENT_TYPE.equals(mediaFocus)) { + query = extras.getString(MediaStore.EXTRA_MEDIA_TITLE); + artists = 0; + albums = 0; + } + + SearchCritera criteria = new SearchCritera(query, artists, albums, songs); + searchCriteria(criteria); + } + } + } + @Override public void onCustomAction(String action, Bundle extras) { if(CUSTOM_ACTION_THUMBS_UP.equals(action)) { -- cgit v1.2.3