Search in sources :

Example 11 with Album

use of com.simplecity.amp_library.model.Album in project Shuttle by timusus.

the class BaseDetailFragment method getAlbumViewModels.

@NonNull
@Override
public List<ViewModel> getAlbumViewModels(List<Album> albums) {
    if (albums.isEmpty()) {
        return Collections.emptyList();
    }
    List<ViewModel> items = new ArrayList<>();
    if (setHorizontalItemsDisposable != null) {
        setHorizontalItemsDisposable.dispose();
    }
    setHorizontalItemsDisposable = horizontalRecyclerView.setItems(Stream.of(albums).map(album -> {
        HorizontalAlbumView horizontalAlbumView = new HorizontalAlbumView(album, requestManager);
        horizontalAlbumView.setClickListener(BaseDetailFragment.this);
        horizontalAlbumView.showYear(true);
        return horizontalAlbumView;
    }).collect(Collectors.toList()));
    items.add(new SubheaderView(StringUtils.makeAlbumsLabel(getContext(), albums.size())));
    items.add(horizontalRecyclerView);
    return items;
}
Also used : R(com.simplecity.amp_library.R) CompletionListUpdateCallbackAdapter(com.simplecityapps.recycler_adapter.adapter.CompletionListUpdateCallbackAdapter) Bundle(android.os.Bundle) SongView(com.simplecity.amp_library.ui.modelviews.SongView) PlaylistUtils(com.simplecity.amp_library.utils.PlaylistUtils) ImageView(android.widget.ImageView) ViewModel(com.simplecityapps.recycler_adapter.model.ViewModel) Random(java.util.Random) Drawable(android.graphics.drawable.Drawable) AndroidSchedulers(io.reactivex.android.schedulers.AndroidSchedulers) OnClick(butterknife.OnClick) BindView(butterknife.BindView) ColorStateList(android.content.res.ColorStateList) Song(com.simplecity.amp_library.model.Song) Aesthetic(com.afollestad.aesthetic.Aesthetic) Optional(com.annimon.stream.Optional) Priority(com.bumptech.glide.Priority) RequestManager(com.bumptech.glide.RequestManager) HorizontalAlbumView(com.simplecity.amp_library.ui.modelviews.HorizontalAlbumView) MenuUtils(com.simplecity.amp_library.utils.MenuUtils) View(android.view.View) ResourceUtils(com.simplecity.amp_library.utils.ResourceUtils) Schedulers(io.reactivex.schedulers.Schedulers) ViewCompat(android.support.v4.view.ViewCompat) Transition(android.transition.Transition) Unbinder(butterknife.Unbinder) ActionBarUtils(com.simplecity.amp_library.utils.ActionBarUtils) LogUtils(com.simplecity.amp_library.utils.LogUtils) ContextualToolbarHelper(com.simplecity.amp_library.utils.ContextualToolbarHelper) FloatingActionButton(android.support.design.widget.FloatingActionButton) SortManager(com.simplecity.amp_library.utils.SortManager) ObjectAnimator(android.animation.ObjectAnimator) PopupMenu(android.support.v7.widget.PopupMenu) SubMenu(android.view.SubMenu) ArtworkProvider(com.simplecity.amp_library.model.ArtworkProvider) ViewGroup(android.view.ViewGroup) MusicUtils(com.simplecity.amp_library.utils.MusicUtils) List(java.util.List) CompositeDisposable(io.reactivex.disposables.CompositeDisposable) Disposable(io.reactivex.disposables.Disposable) ContextualToolbarHost(com.simplecity.amp_library.ui.views.ContextualToolbarHost) Nullable(android.support.annotation.Nullable) MaterialDialog(com.afollestad.materialdialogs.MaterialDialog) Album(com.simplecity.amp_library.model.Album) TypefaceManager(com.simplecity.amp_library.utils.TypefaceManager) Stream(com.annimon.stream.Stream) ContextualToolbar(com.simplecity.amp_library.ui.views.ContextualToolbar) RecyclerListener(com.simplecityapps.recycler_adapter.recyclerview.RecyclerListener) ButterKnife(butterknife.ButterKnife) EmptyView(com.simplecity.amp_library.ui.modelviews.EmptyView) DrawerLockManager(com.simplecity.amp_library.ui.drawer.DrawerLockManager) TransitionListenerAdapter(com.simplecity.amp_library.ui.fragments.TransitionListenerAdapter) ViewModelAdapter(com.simplecityapps.recycler_adapter.adapter.ViewModelAdapter) NonNull(android.support.annotation.NonNull) StringUtils(com.simplecity.amp_library.utils.StringUtils) SelectableViewModel(com.simplecity.amp_library.ui.modelviews.SelectableViewModel) Single(io.reactivex.Single) MenuItem(android.view.MenuItem) ArrayList(java.util.ArrayList) AnimationUtils(android.view.animation.AnimationUtils) Toast(android.widget.Toast) DiskCacheStrategy(com.bumptech.glide.load.engine.DiskCacheStrategy) AnimatorSet(android.animation.AnimatorSet) Observable(io.reactivex.Observable) UpgradeDialog(com.simplecity.amp_library.ui.dialog.UpgradeDialog) PlaceholderProvider(com.simplecity.amp_library.utils.PlaceholderProvider) ShuttleUtils(com.simplecity.amp_library.utils.ShuttleUtils) Rx.distinctToMainThread(com.afollestad.aesthetic.Rx.distinctToMainThread) SharedElementCallback(android.support.v4.app.SharedElementCallback) AlwaysCrossFade(com.simplecity.amp_library.glide.utils.AlwaysCrossFade) TaggerDialog(com.simplecity.amp_library.tagger.TaggerDialog) Collectors(com.annimon.stream.Collectors) LayoutInflater(android.view.LayoutInflater) SubheaderView(com.simplecity.amp_library.ui.modelviews.SubheaderView) LinearLayoutManager(android.support.v7.widget.LinearLayoutManager) AlbumView(com.simplecity.amp_library.ui.modelviews.AlbumView) TimeUnit(java.util.concurrent.TimeUnit) RecyclerView(android.support.v7.widget.RecyclerView) CustomCollapsingToolbarLayout(android.support.design.widget.CustomCollapsingToolbarLayout) Glide(com.bumptech.glide.Glide) HorizontalRecyclerView(com.simplecity.amp_library.ui.modelviews.HorizontalRecyclerView) Toolbar(android.support.v7.widget.Toolbar) Pair(android.support.v4.util.Pair) TransitionInflater(android.transition.TransitionInflater) BaseFragment(com.simplecity.amp_library.ui.fragments.BaseFragment) Operators(com.simplecity.amp_library.utils.Operators) Collections(java.util.Collections) HorizontalAlbumView(com.simplecity.amp_library.ui.modelviews.HorizontalAlbumView) SubheaderView(com.simplecity.amp_library.ui.modelviews.SubheaderView) ArrayList(java.util.ArrayList) ViewModel(com.simplecityapps.recycler_adapter.model.ViewModel) SelectableViewModel(com.simplecity.amp_library.ui.modelviews.SelectableViewModel) NonNull(android.support.annotation.NonNull)

Example 12 with Album

use of com.simplecity.amp_library.model.Album in project Shuttle by timusus.

the class Operators method songsToAlbums.

public static List<Album> songsToAlbums(List<Song> songs) {
    HashMap<Long, Album> albumMap = new HashMap<>();
    for (Song song : songs) {
        // Create an album representing the album this song belongs to
        Album album = song.getAlbum();
        // Now check if there's already an equivalent album in our albumMap
        Album oldAlbum = albumMap.get(album.id);
        if (oldAlbum != null) {
            // Increment the number of songs.
            oldAlbum.numSongs++;
            // The number of discs is just the largest disc number for songs
            oldAlbum.numDiscs = Math.max(song.discNumber, oldAlbum.numDiscs);
            oldAlbum.songPlayCount += song.playCount;
            // Add any new artists
            Stream.of(album.artists).filter(artist -> !oldAlbum.artists.contains(artist)).forEach(artist -> oldAlbum.artists.add(artist));
            // Add new paths
            Stream.of(album.paths).filter(path -> !oldAlbum.paths.contains(path)).forEach(path -> oldAlbum.paths.add(path));
        } else {
            // Couldn't find an existing entry for this album. Add a new one.
            albumMap.put(album.id, album);
        }
    }
    return new ArrayList<>(albumMap.values());
}
Also used : Song(com.simplecity.amp_library.model.Song) List(java.util.List) Album(com.simplecity.amp_library.model.Album) Collectors(com.annimon.stream.Collectors) Stream(com.annimon.stream.Stream) Map(java.util.Map) AlbumArtist(com.simplecity.amp_library.model.AlbumArtist) HashMap(java.util.HashMap) Collections(java.util.Collections) Single(io.reactivex.Single) ArrayList(java.util.ArrayList) Song(com.simplecity.amp_library.model.Song) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Album(com.simplecity.amp_library.model.Album)

Example 13 with Album

use of com.simplecity.amp_library.model.Album in project Shuttle by timusus.

the class Operators method albumsToAlbumArtists.

public static List<AlbumArtist> albumsToAlbumArtists(List<Album> albums) {
    HashMap<String, AlbumArtist> albumArtistMap = new HashMap<>();
    for (Album album : albums) {
        // Create an album-artist representing the album-artist this album belongs to
        AlbumArtist albumArtist = album.getAlbumArtist();
        // Check if there's already an equivalent album-artist in our albumArtistMap
        AlbumArtist oldAlbumArtist = albumArtistMap.get(albumArtist.name);
        if (oldAlbumArtist != null) {
            // Add this album to the album artist's albums
            if (!oldAlbumArtist.albums.contains(album)) {
                oldAlbumArtist.albums.add(album);
            }
        } else {
            albumArtistMap.put(albumArtist.name, albumArtist);
        }
    }
    return new ArrayList<>(albumArtistMap.values());
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Album(com.simplecity.amp_library.model.Album) AlbumArtist(com.simplecity.amp_library.model.AlbumArtist)

Example 14 with Album

use of com.simplecity.amp_library.model.Album in project Shuttle by timusus.

the class ArtworkUtils method getFolderArtwork.

/**
 * Searches the parent directory of the passed in path for [cover/album/artwork].[png/jpg/jpeg]
 * using regex and returns a {@link InputStream} representing the artwork
 */
@WorkerThread
public static InputStream getFolderArtwork(@Nullable final String path) {
    InputStream fileInputStream = null;
    if (path != null) {
        File[] files;
        File file = new File(path);
        File parent = file.getParentFile();
        if (parent.exists() && parent.isDirectory()) {
            final Pattern pattern = Pattern.compile("(folder|cover|album).*\\.(jpg|jpeg|png)", Pattern.CASE_INSENSITIVE);
            files = parent.listFiles(file1 -> pattern.matcher(file1.getName()).matches());
            if (files.length > 0) {
                try {
                    File artworkFile = Stream.of(files).filter(aFile -> aFile.exists() && aFile.length() > 1024).max((a, b) -> (int) (a.length() / 1024 - b.length() / 1024)).get();
                    fileInputStream = getFileArtwork(artworkFile);
                } catch (NoSuchElementException e) {
                    Log.e(TAG, "getFolderArtwork failed: " + e.toString());
                }
            }
        }
    }
    return fileInputStream;
}
Also used : ReadOnlyFileException(org.jaudiotagger.audio.exceptions.ReadOnlyFileException) CannotReadException(org.jaudiotagger.audio.exceptions.CannotReadException) Album(com.simplecity.amp_library.model.Album) Stream(com.annimon.stream.Stream) Uri(android.net.Uri) NonNull(android.support.annotation.NonNull) ArrayList(java.util.ArrayList) Song(com.simplecity.amp_library.model.Song) AudioFile(org.jaudiotagger.audio.AudioFile) ByteArrayInputStream(java.io.ByteArrayInputStream) MediaStore(android.provider.MediaStore) NoSuchElementException(java.util.NoSuchElementException) Log(android.util.Log) Cursor(android.database.Cursor) IOException(java.io.IOException) Tag(org.jaudiotagger.tag.Tag) FileInputStream(java.io.FileInputStream) WorkerThread(android.support.annotation.WorkerThread) File(java.io.File) FileNotFoundException(java.io.FileNotFoundException) ShuttleApplication(com.simplecity.amp_library.ShuttleApplication) List(java.util.List) TagException(org.jaudiotagger.tag.TagException) AudioFileIO(org.jaudiotagger.audio.AudioFileIO) InvalidAudioFrameException(org.jaudiotagger.audio.exceptions.InvalidAudioFrameException) Pattern(java.util.regex.Pattern) Nullable(android.support.annotation.Nullable) ContentUris(android.content.ContentUris) InputStream(java.io.InputStream) Pattern(java.util.regex.Pattern) ByteArrayInputStream(java.io.ByteArrayInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) AudioFile(org.jaudiotagger.audio.AudioFile) File(java.io.File) NoSuchElementException(java.util.NoSuchElementException) WorkerThread(android.support.annotation.WorkerThread)

Example 15 with Album

use of com.simplecity.amp_library.model.Album in project Shuttle by timusus.

the class MainActivity method onOptionsItemSelected.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.action_search:
            Intent intent = new Intent(MainActivity.this, SearchActivity.class);
            intent.putExtra(SearchManager.QUERY, "");
            startActivityForResult(intent, REQUEST_SEARCH);
            return true;
        case EQUALIZER:
            final Intent equalizerIntent = new Intent(this, EqualizerActivity.class);
            startActivity(equalizerIntent);
            return true;
        case GO_TO_ARTIST:
            long time = System.currentTimeMillis();
            Album currentAlbum = MusicUtils.getAlbum();
            if (currentAlbum != null) {
                DataManager.getInstance().getAlbumArtistsRelay().first().flatMap(Observable::from).filter(albumArtist -> albumArtist.name.equals(currentAlbum.albumArtistName) && com.annimon.stream.Stream.of(albumArtist.albums).anyMatch(album -> album.id == currentAlbum.id)).observeOn(AndroidSchedulers.mainThread()).subscribe(albumArtist -> {
                    swapFragments(DetailFragment.newInstance(albumArtist), true);
                    new Handler().postDelayed(() -> mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED, true), time - System.currentTimeMillis() + 250);
                });
            }
            return true;
        case GO_TO_ALBUM:
            time = System.currentTimeMillis();
            currentAlbum = MusicUtils.getAlbum();
            if (currentAlbum != null) {
                DataManager.getInstance().getAlbumsRelay().first().flatMap(Observable::from).filter(album -> album.id == currentAlbum.id).observeOn(AndroidSchedulers.mainThread()).subscribe(album -> {
                    swapFragments(DetailFragment.newInstance(album), true);
                    new Handler().postDelayed(() -> mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED, true), time - System.currentTimeMillis() + 250);
                });
            }
            return true;
        case TIMER:
            SleepTimer.createTimer(this, MusicUtils.getTimerActive(), MusicUtils.getTimeRemaining());
            return true;
        case DELETE_ITEM:
            new DialogUtils.DeleteDialogBuilder().context(this).singleMessageId(R.string.delete_song_desc).multipleMessage(R.string.delete_song_desc_multiple).itemNames(Collections.singletonList(MusicUtils.getSongName())).songsToDelete(Observable.just(Collections.singletonList(MusicUtils.getSong()))).build().show();
            return true;
        case NEW_PLAYLIST:
            PlaylistUtils.createPlaylistDialog(this, MusicUtils.getQueue());
            return true;
        case PLAYLIST_SELECTED:
            List<Song> songs = MusicUtils.getQueue();
            Playlist playlist = (Playlist) item.getIntent().getSerializableExtra(ShuttleUtils.ARG_PLAYLIST);
            PlaylistUtils.addToPlaylist(this, playlist, songs);
            return true;
        case CLEAR_QUEUE:
            MusicUtils.clearQueue();
            intent = new Intent(this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            finish();
            return true;
        case TAGGER:
            TaggerDialog.newInstance(MusicUtils.getSong()).show(getSupportFragmentManager());
            return true;
        case VIEW_INFO:
            DialogUtils.showSongInfoDialog(this, MusicUtils.getSong());
            return true;
        case R.id.menu_favorite:
            PlaylistUtils.toggleFavorite(this);
            return true;
        case R.id.menu_share:
            DialogUtils.showShareDialog(MainActivity.this, MusicUtils.getSong());
            return true;
        case R.id.menu_queue:
            Fragment playingFragment = getSupportFragmentManager().findFragmentById(R.id.player_container);
            if (playingFragment != null) {
                ((PlayerFragment) playingFragment).toggleQueue();
            }
            return true;
        case android.R.id.home:
            playingFragment = getSupportFragmentManager().findFragmentById(R.id.player_container);
            if (playingFragment != null) {
                Fragment childFragment = playingFragment.getChildFragmentManager().findFragmentById(R.id.queue_container);
                if (childFragment != null && childFragment instanceof QueueFragment) {
                    ((PlayerFragment) playingFragment).toggleQueue();
                    toggleQueue(false);
                    return true;
                }
            }
            if (mSlidingUpPanelLayout != null) {
                if (mSlidingUpPanelLayout.getPanelState() != SlidingUpPanelLayout.PanelState.COLLAPSED && mSlidingUpPanelLayout.getPanelState() != SlidingUpPanelLayout.PanelState.HIDDEN) {
                    mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED, true);
                    return true;
                }
            }
            break;
    }
    return super.onOptionsItemSelected(item);
}
Also used : Album(com.simplecity.amp_library.model.Album) Handler(android.os.Handler) Intent(android.content.Intent) QueueFragment(com.simplecity.amp_library.ui.fragments.QueueFragment) FolderFragment(com.simplecity.amp_library.ui.fragments.FolderFragment) Fragment(android.support.v4.app.Fragment) QueuePagerFragment(com.simplecity.amp_library.ui.fragments.QueuePagerFragment) PlayerFragment(com.simplecity.amp_library.ui.fragments.PlayerFragment) QueueFragment(com.simplecity.amp_library.ui.fragments.QueueFragment) AlbumArtistFragment(com.simplecity.amp_library.ui.fragments.AlbumArtistFragment) NavigationDrawerFragment(com.simplecity.amp_library.ui.fragments.NavigationDrawerFragment) PlaylistFragment(com.simplecity.amp_library.ui.fragments.PlaylistFragment) GenreFragment(com.simplecity.amp_library.ui.fragments.GenreFragment) DetailFragment(com.simplecity.amp_library.ui.fragments.DetailFragment) SuggestedFragment(com.simplecity.amp_library.ui.fragments.SuggestedFragment) MainFragment(com.simplecity.amp_library.ui.fragments.MainFragment) AlbumFragment(com.simplecity.amp_library.ui.fragments.AlbumFragment) MiniPlayerFragment(com.simplecity.amp_library.ui.fragments.MiniPlayerFragment) DialogUtils(com.simplecity.amp_library.utils.DialogUtils) Song(com.simplecity.amp_library.model.Song) Playlist(com.simplecity.amp_library.model.Playlist) PlayerFragment(com.simplecity.amp_library.ui.fragments.PlayerFragment) MiniPlayerFragment(com.simplecity.amp_library.ui.fragments.MiniPlayerFragment)

Aggregations

Album (com.simplecity.amp_library.model.Album)28 Song (com.simplecity.amp_library.model.Song)21 List (java.util.List)19 Stream (com.annimon.stream.Stream)18 AlbumArtist (com.simplecity.amp_library.model.AlbumArtist)18 ArrayList (java.util.ArrayList)18 Collections (java.util.Collections)17 Bundle (android.os.Bundle)16 PopupMenu (android.support.v7.widget.PopupMenu)16 R (com.simplecity.amp_library.R)16 MusicUtils (com.simplecity.amp_library.utils.MusicUtils)16 View (android.view.View)15 Toast (android.widget.Toast)15 RequestManager (com.bumptech.glide.RequestManager)14 Context (android.content.Context)13 LayoutInflater (android.view.LayoutInflater)13 ViewGroup (android.view.ViewGroup)13 Playlist (com.simplecity.amp_library.model.Playlist)13 DataManager (com.simplecity.amp_library.utils.DataManager)13 MenuUtils (com.simplecity.amp_library.utils.MenuUtils)13