/* * 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.dashboard; import android.content.Context; import android.database.Cursor; import android.provider.BaseColumns; 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.ImageUri; import net.simonvt.cathode.provider.DatabaseContract.EpisodeColumns; import net.simonvt.cathode.provider.DatabaseContract.LastModifiedColumns; import net.simonvt.cathode.provider.DatabaseContract.ShowColumns; import net.simonvt.cathode.provider.DatabaseSchematic.Tables; import net.simonvt.cathode.scheduler.EpisodeTaskScheduler; import net.simonvt.cathode.scheduler.ShowTaskScheduler; import net.simonvt.cathode.images.ImageType; import net.simonvt.cathode.ui.adapter.AdapterNotifier; import net.simonvt.cathode.ui.adapter.BaseAdapter; import net.simonvt.cathode.util.DataHelper; import net.simonvt.cathode.widget.RemoteImageView; import net.simonvt.schematic.Cursors; public class DashboardShowsWatchlistAdapter extends BaseAdapter<RecyclerView.ViewHolder> { public static final String[] PROJECTION = new String[] { Tables.SHOWS + "." + ShowColumns.ID, Tables.SHOWS + "." + ShowColumns.TITLE, Tables.SHOWS + "." + ShowColumns.OVERVIEW, Tables.SHOWS + "." + ShowColumns.LAST_MODIFIED, }; public static final String[] PROJECTION_EPISODE = new String[] { Tables.EPISODES + "." + EpisodeColumns.ID, Tables.EPISODES + "." + EpisodeColumns.TITLE, Tables.EPISODES + "." + EpisodeColumns.FIRST_AIRED, Tables.EPISODES + "." + EpisodeColumns.SEASON, Tables.EPISODES + "." + EpisodeColumns.EPISODE, Tables.EPISODES + "." + LastModifiedColumns.LAST_MODIFIED, Tables.SHOWS + "." + ShowColumns.TITLE, }; private static final int TYPE_SHOW = 0; private static final int TYPE_EPISODE = 1; @Inject ShowTaskScheduler showScheduler; @Inject EpisodeTaskScheduler episodeScheduler; private Context context; private DashboardFragment.OverviewCallback callback; private AdapterNotifier notifier; private Cursor showsWatchlist; private Cursor episodeWatchlist; public DashboardShowsWatchlistAdapter(Context context, DashboardFragment.OverviewCallback callback) { this.context = context; this.callback = callback; CathodeApp.inject(context, this); notifier = new AdapterNotifier(this); } public void changeShowsCursor(Cursor cursor) { showsWatchlist = cursor; notifier.notifyChanged(); } public void changeEpisodeCursor(Cursor cursor) { episodeWatchlist = cursor; notifier.notifyChanged(); } @Override public int getItemViewType(int position) { if (position < showsWatchlist.getCount()) { return TYPE_SHOW; } return TYPE_EPISODE; } private Cursor getCursor(int position) { final int showCount = showsWatchlist.getCount(); if (position < showCount) { showsWatchlist.moveToPosition(position); return showsWatchlist; } else { episodeWatchlist.moveToPosition(position - showCount); return episodeWatchlist; } } @Override public long getItemId(int position) { return Cursors.getLong(getCursor(position), BaseColumns._ID); } @Override public int getItemCount() { if (showsWatchlist == null || episodeWatchlist == null) { return 0; } return showsWatchlist.getCount() + episodeWatchlist.getCount(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_SHOW) { final View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_row_dashboard_show, parent, false); final ShowViewHolder holder = new ShowViewHolder(view); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = holder.getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { Cursor cursor = getCursor(position); final long id = Cursors.getLong(cursor, ShowColumns.ID); final String title = Cursors.getString(cursor, ShowColumns.TITLE); final String overview = Cursors.getString(cursor, ShowColumns.OVERVIEW); callback.onDisplayShow(id, title, overview); } } }); return holder; } else { final View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_row_dashboard_episode, parent, false); final EpisodeViewHolder holder = new EpisodeViewHolder(view); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = holder.getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { Cursor cursor = getCursor(position); final long id = Cursors.getLong(cursor, EpisodeColumns.ID); final String showTitle = Cursors.getString(cursor, ShowColumns.TITLE); callback.onDisplayEpisode(id, showTitle); } } }); return holder; } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { Cursor cursor = getCursor(position); if (holder.getItemViewType() == TYPE_SHOW) { ShowViewHolder showHolder = (ShowViewHolder) holder; final long id = Cursors.getLong(cursor, ShowColumns.ID); final String title = Cursors.getString(cursor, ShowColumns.TITLE); final String poster = ImageUri.create(ImageUri.ITEM_SHOW, ImageType.POSTER, id); showHolder.poster.setImage(poster); showHolder.title.setText(title); } else { EpisodeViewHolder episodeHolder = (EpisodeViewHolder) holder; final long id = Cursors.getLong(cursor, EpisodeColumns.ID); final int season = Cursors.getInt(cursor, EpisodeColumns.SEASON); final int episode = Cursors.getInt(cursor, EpisodeColumns.EPISODE); final String title = DataHelper.getEpisodeTitle(context, cursor, season, episode); final String screenshotUri = ImageUri.create(ImageUri.ITEM_EPISODE, ImageType.STILL, id); episodeHolder.screenshot.setImage(screenshotUri); String episodeText = context.getString(R.string.upcoming_episode_next, season, episode, title); episodeHolder.title.setText(episodeText); } } @Override public long getLastModified(int position) { return Cursors.getLong(getCursor(position), LastModifiedColumns.LAST_MODIFIED); } static class ShowViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.poster) RemoteImageView poster; @BindView(R.id.title) TextView title; public ShowViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } static class EpisodeViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.screenshot) RemoteImageView screenshot; @BindView(R.id.title) TextView title; public EpisodeViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } }