/* * Copyright (C) 2016 Simon Vig Therkildsen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.simonvt.cathode.ui.lists; import android.content.Context; import android.database.Cursor; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import javax.inject.Inject; import net.simonvt.cathode.CathodeApp; import net.simonvt.cathode.R; import net.simonvt.cathode.images.ImageType; import net.simonvt.cathode.images.ImageUri; import net.simonvt.cathode.provider.DatabaseContract; import net.simonvt.cathode.provider.DatabaseContract.EpisodeColumns; import net.simonvt.cathode.provider.DatabaseContract.LastModifiedColumns; import net.simonvt.cathode.provider.DatabaseContract.ListItemColumns; import net.simonvt.cathode.provider.DatabaseContract.MovieColumns; import net.simonvt.cathode.provider.DatabaseContract.PersonColumns; import net.simonvt.cathode.provider.DatabaseContract.SeasonColumns; import net.simonvt.cathode.provider.DatabaseContract.ShowColumns; import net.simonvt.cathode.scheduler.EpisodeTaskScheduler; import net.simonvt.cathode.scheduler.MovieTaskScheduler; import net.simonvt.cathode.scheduler.PersonTaskScheduler; import net.simonvt.cathode.scheduler.ShowTaskScheduler; import net.simonvt.cathode.ui.adapter.RecyclerCursorAdapter; import net.simonvt.cathode.util.DataHelper; import net.simonvt.cathode.widget.OverflowView; import net.simonvt.cathode.widget.RemoteImageView; import net.simonvt.schematic.Cursors; public class ListAdapter extends RecyclerCursorAdapter<ListAdapter.ListViewHolder> { interface ListListener { void onShowClick(long showId, String title, String overview); void onSeasonClick(long showId, long seasonId, String showTitle, int seasonNumber); void onEpisodeClick(long id); void onMovieClicked(long movieId, String title, String overview); void onPersonClick(long personId); void onRemoveItem(int position, long id); } @Inject ShowTaskScheduler showScheduler; @Inject MovieTaskScheduler movieScheduler; @Inject EpisodeTaskScheduler episodeScheduler; @Inject PersonTaskScheduler personScheduler; ListListener listener; public ListAdapter(Context context, ListListener listener) { super(context); this.listener = listener; CathodeApp.inject(context, this); } @Override public int getItemViewType(int position) { Cursor cursor = getCursor(position); return Cursors.getInt(cursor, ListItemColumns.ITEM_TYPE); } @Override public long getLastModified(int position) { Cursor cursor = getCursor(position); return Cursors.getLong(cursor, LastModifiedColumns.LAST_MODIFIED); } @Override public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ListViewHolder holder; if (viewType == DatabaseContract.ItemType.SHOW) { View v = LayoutInflater.from(getContext()).inflate(R.layout.row_list_show, parent, false); final ShowViewHolder showHolder = new ShowViewHolder(v); holder = showHolder; v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = showHolder.getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { Cursor cursor = getCursor(position); final long itemId = Cursors.getLong(cursor, ListItemColumns.ITEM_ID); final String title = Cursors.getString(cursor, ShowColumns.TITLE); final String overview = Cursors.getString(cursor, ShowColumns.OVERVIEW); listener.onShowClick(itemId, title, overview); } } }); } else if (viewType == DatabaseContract.ItemType.SEASON) { View v = LayoutInflater.from(getContext()).inflate(R.layout.row_list_season, parent, false); final SeasonViewHolder seasonHolder = new SeasonViewHolder(v); holder = seasonHolder; v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = seasonHolder.getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { Cursor cursor = getCursor(position); final long showId = Cursors.getLong(cursor, SeasonColumns.SHOW_ID); final String showTitle = Cursors.getString(cursor, "seasonShowTitle"); final int seasonNumber = Cursors.getInt(cursor, SeasonColumns.SEASON); final long seasonId = Cursors.getLong(cursor, ListItemColumns.ITEM_ID); listener.onSeasonClick(showId, seasonId, showTitle, seasonNumber); } } }); } else if (viewType == DatabaseContract.ItemType.EPISODE) { View v = LayoutInflater.from(getContext()).inflate(R.layout.row_list_episode, parent, false); final EpisodeViewHolder episodeHolder = new EpisodeViewHolder(v); holder = episodeHolder; v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = episodeHolder.getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { Cursor cursor = getCursor(position); final long itemId = Cursors.getLong(cursor, ListItemColumns.ITEM_ID); listener.onEpisodeClick(itemId); } } }); } else if (viewType == DatabaseContract.ItemType.MOVIE) { View v = LayoutInflater.from(getContext()).inflate(R.layout.row_list_movie, parent, false); final MovieViewHolder movieHolder = new MovieViewHolder(v); holder = movieHolder; v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = movieHolder.getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { Cursor cursor = getCursor(position); final long itemId = Cursors.getLong(cursor, ListItemColumns.ITEM_ID); final String title = Cursors.getString(cursor, MovieColumns.TITLE); final String overview = Cursors.getString(cursor, MovieColumns.OVERVIEW); listener.onMovieClicked(itemId, title, overview); } } }); } else { View v = LayoutInflater.from(getContext()).inflate(R.layout.row_list_person, parent, false); final PersonViewHolder personHolder = new PersonViewHolder(v); holder = personHolder; v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = personHolder.getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { Cursor cursor = getCursor(position); final long itemId = Cursors.getLong(cursor, ListItemColumns.ITEM_ID); listener.onPersonClick(itemId); } } }); } final ListViewHolder finalHolder = holder; holder.overflow.addItem(R.id.action_list_remove, R.string.action_list_remove); holder.overflow.setListener(new OverflowView.OverflowActionListener() { @Override public void onPopupShown() { } @Override public void onPopupDismissed() { } @Override public void onActionSelected(int action) { final int position = finalHolder.getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { switch (action) { case R.id.action_list_remove: listener.onRemoveItem(position, finalHolder.getItemId()); break; } } } }); return holder; } @Override public void onViewRecycled(ListViewHolder holder) { holder.overflow.dismiss(); } @Override protected void onBindViewHolder(final ListViewHolder holder, Cursor cursor, int position) { final long itemId = Cursors.getLong(cursor, ListItemColumns.ITEM_ID); if (holder.getItemViewType() == DatabaseContract.ItemType.SHOW) { final ShowViewHolder showHolder = (ShowViewHolder) holder; final String poster = ImageUri.create(ImageUri.ITEM_SHOW, ImageType.POSTER, itemId); showHolder.poster.setImage(poster); showHolder.title.setText(Cursors.getString(cursor, ShowColumns.TITLE)); showHolder.overview.setText(Cursors.getString(cursor, ShowColumns.OVERVIEW)); } else if (holder.getItemViewType() == DatabaseContract.ItemType.SEASON) { final String showPoster = Cursors.getString(cursor, "seasonShowPoster"); final String showTitle = Cursors.getString(cursor, "seasonShowTitle"); final int season = Cursors.getInt(cursor, SeasonColumns.SEASON); SeasonViewHolder seasonHolder = (SeasonViewHolder) holder; seasonHolder.poster.setImage(showPoster); seasonHolder.season.setText(getContext().getResources().getString(R.string.season_x, season)); seasonHolder.show.setText(showTitle); } else if (holder.getItemViewType() == DatabaseContract.ItemType.EPISODE) { final EpisodeViewHolder episodeHolder = (EpisodeViewHolder) holder; final String showTitle = Cursors.getString(cursor, "episodeShowTitle"); final int season = Cursors.getInt(cursor, EpisodeColumns.SEASON); final int episode = Cursors.getInt(cursor, EpisodeColumns.EPISODE); final String title = DataHelper.getEpisodeTitle(getContext(), cursor, season, episode); final String screenshotUri = ImageUri.create(ImageUri.ITEM_EPISODE, ImageType.STILL, itemId); episodeHolder.screen.setImage(screenshotUri); episodeHolder.title.setText(title); episodeHolder.showTitle.setText(showTitle); } else if (holder.getItemViewType() == DatabaseContract.ItemType.MOVIE) { MovieViewHolder movieHolder = (MovieViewHolder) holder; final String poster = ImageUri.create(ImageUri.ITEM_MOVIE, ImageType.POSTER, itemId); movieHolder.poster.setImage(poster); movieHolder.title.setText(Cursors.getString(cursor, MovieColumns.TITLE)); movieHolder.overview.setText(Cursors.getString(cursor, MovieColumns.OVERVIEW)); } else { PersonViewHolder personHolder = (PersonViewHolder) holder; final String headshot = ImageUri.create(ImageUri.ITEM_PERSON, ImageType.PROFILE, itemId); personHolder.headshot.setImage(headshot); personHolder.name.setText(Cursors.getString(cursor, PersonColumns.NAME)); } } public static class ListViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.overflow) OverflowView overflow; public ListViewHolder(View v) { super(v); ButterKnife.bind(this, v); } } public static class ShowViewHolder extends ListViewHolder { @BindView(R.id.poster) RemoteImageView poster; @BindView(R.id.title) TextView title; @BindView(R.id.overview) TextView overview; public ShowViewHolder(View v) { super(v); } } public static class SeasonViewHolder extends ListViewHolder { @BindView(R.id.poster) RemoteImageView poster; @BindView(R.id.season) TextView season; @BindView(R.id.show) TextView show; public SeasonViewHolder(View v) { super(v); } } public static class EpisodeViewHolder extends ListViewHolder { @BindView(R.id.screen) RemoteImageView screen; @BindView(R.id.title) TextView title; @BindView(R.id.showTitle) TextView showTitle; EpisodeViewHolder(View v) { super(v); } } public static class MovieViewHolder extends ListViewHolder { @BindView(R.id.poster) public RemoteImageView poster; @BindView(R.id.title) public TextView title; @BindView(R.id.overview) public TextView overview; public MovieViewHolder(View v) { super(v); } } public static class PersonViewHolder extends ListViewHolder { @BindView(R.id.headshot) RemoteImageView headshot; @BindView(R.id.person_name) TextView name; public PersonViewHolder(View v) { super(v); } } }