diff options
author | Scott Jackson <daneren2005@gmail.com> | 2015-05-16 16:00:00 -0700 |
---|---|---|
committer | Scott Jackson <daneren2005@gmail.com> | 2015-05-16 16:00:00 -0700 |
commit | 64a3b588a34c0158a5d7521697396d48ea833fb3 (patch) | |
tree | 396eb7fd688776ea1093ddaec254bd624afe128f /app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java | |
parent | e24b9cb50d9468fba9987b7309faeca9d7dbec0e (diff) | |
download | dsub-64a3b588a34c0158a5d7521697396d48ea833fb3.tar.gz dsub-64a3b588a34c0158a5d7521697396d48ea833fb3.tar.bz2 dsub-64a3b588a34c0158a5d7521697396d48ea833fb3.zip |
#453 Move to using a RecyclerView for directories
Diffstat (limited to 'app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java')
-rw-r--r-- | app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java new file mode 100644 index 00000000..6de7ce33 --- /dev/null +++ b/app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java @@ -0,0 +1,254 @@ +/* + 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 <http://www.gnu.org/licenses/>. + Copyright 2015 (C) Scott Jackson +*/ + +package github.daneren2005.dsub.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.List; + +import github.daneren2005.dsub.R; +import github.daneren2005.dsub.domain.MusicDirectory; +import github.daneren2005.dsub.domain.MusicDirectory.Entry; +import github.daneren2005.dsub.util.ImageLoader; +import github.daneren2005.dsub.view.AlbumView; +import github.daneren2005.dsub.view.SongView; +import github.daneren2005.dsub.view.UpdateView; +import github.daneren2005.dsub.view.UpdateView.UpdateViewHolder; + +public class EntryGridAdapter extends RecyclerView.Adapter<UpdateViewHolder> { + private static String TAG = EntryGridAdapter.class.getSimpleName(); + + public static int VIEW_TYPE_HEADER = 0; + public static int VIEW_TYPE_ALBUM_CELL = 1; + public static int VIEW_TYPE_ALBUM_LINE = 2; + public static int VIEW_TYPE_SONG = 3; + + protected Context context; + protected List<Entry> entries; + private ImageLoader imageLoader; + private boolean largeAlbums; + private boolean showArtist = false; + private boolean checkable = true; + private OnEntryClickedListener onEntryClickedListener; + + private View header; + private List<Entry> selected = new ArrayList<Entry>(); + private UpdateView contextView; + private Entry contextEntry; + + public EntryGridAdapter(Context context, List<Entry> entries, ImageLoader imageLoader, boolean largeCell) { + this.context = context; + this.entries = entries; + this.imageLoader = imageLoader; + this.largeAlbums = largeCell; + + // Always show artist if they aren't all the same + String artist = null; + for(MusicDirectory.Entry entry: entries) { + if(artist == null) { + artist = entry.getArtist(); + } + + if(artist != null && !artist.equals(entry.getArtist())) { + showArtist = true; + } + } + } + + @Override + public UpdateViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if(viewType == VIEW_TYPE_HEADER) { + return new UpdateViewHolder(header, false); + } + + UpdateView updateView = null; + if(viewType == VIEW_TYPE_ALBUM_LINE || viewType == VIEW_TYPE_ALBUM_CELL) { + updateView = new AlbumView(context, viewType == VIEW_TYPE_ALBUM_CELL); + } else if(viewType == VIEW_TYPE_SONG) { + updateView = new SongView(context); + } + + if(viewType != VIEW_TYPE_HEADER && updateView != null) { + final UpdateView view = updateView; + updateView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Entry entry = getEntryForView(view); + + if (view.isCheckable() && v instanceof SongView) { + SongView songView = (SongView) v; + + if (selected.contains(entry)) { + selected.remove(entry); + songView.setChecked(false); + } else { + selected.add(entry); + songView.setChecked(true); + } + } else if (onEntryClickedListener != null) { + onEntryClickedListener.onEntryClicked(entry); + } + } + }); + updateView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + Entry entry = getEntryForView(view); + + setContextEntry(view, entry); + v.showContextMenu(); + return false; + } + }); + + View moreButton = updateView.findViewById(R.id.more_button); + if(moreButton != null) { + moreButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Entry entry = getEntryForView(view); + setContextEntry(view, entry); + v.showContextMenu(); + } + }); + } + } + + return new UpdateViewHolder(updateView); + } + + @Override + public void onBindViewHolder(UpdateViewHolder holder, int position) { + // Header already created + if(header != null && position == 0) { + return; + } + + UpdateView view = holder.getUpdateView(); + + int viewType = getItemViewType(position); + Entry entry = getEntryForPosition(position); + if(viewType == VIEW_TYPE_ALBUM_CELL || viewType == VIEW_TYPE_ALBUM_LINE) { + AlbumView albumView = (AlbumView) view; + albumView.setShowArtist(showArtist); + albumView.setObject(entry, imageLoader); + } else if(viewType == VIEW_TYPE_SONG) { + SongView songView = (SongView) view; + songView.setObject(entry, checkable); + songView.setChecked(selected.contains(entry)); + } + view.setPosition(position); + } + + @Override + public int getItemCount() { + int size = entries.size(); + + if(header != null) { + size++; + } + + return size; + } + + @Override + public int getItemViewType(int position) { + if(header != null && position == 0) { + return VIEW_TYPE_HEADER; + } + + Entry entry = getEntryForPosition(position); + if(entry.isDirectory()) { + if (largeAlbums) { + return VIEW_TYPE_ALBUM_CELL; + } else { + return VIEW_TYPE_ALBUM_LINE; + } + } else { + return VIEW_TYPE_SONG; + } + } + + public Entry getEntryForView(UpdateView view) { + int position = view.getPosition(); + return getEntryForPosition(position); + } + public Entry getEntryForPosition(int position) { + if(header != null) { + position--; + } + + return entries.get(position); + } + + public void setHeader(View header) { + this.header = header; + } + + public void setShowArtist(boolean showArtist) { + this.showArtist = showArtist; + } + public void setCheckable(boolean checkable) { + this.checkable = checkable; + } + + public void setOnEntryClickedListener(OnEntryClickedListener listener) { + this.onEntryClickedListener = listener; + } + + public List<Entry> getSelected() { + List<Entry> selected = new ArrayList<>(); + selected.addAll(this.selected); + return selected; + } + public void clearSelected() { + for(Entry entry: selected) { + int index = entries.indexOf(entry); + this.notifyItemChanged(index); + } + selected.clear(); + } + + public void removeEntry(Entry entry) { + int index = entries.indexOf(entry); + if(index != -1) { + removeAt(index); + } + } + public void removeAt(int index) { + entries.remove(index); + notifyItemRemoved(index); + } + + public void setContextEntry(UpdateView view, Entry entry) { + this.contextView = view; + this.contextEntry = entry; + } + public UpdateView getContextView() { + return contextView; + } + public Entry getContextEntry() { + return contextEntry; + } + + public interface OnEntryClickedListener { + void onEntryClicked(Entry entry); + } +} |