/* * 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.shows; import android.content.Context; import android.database.Cursor; import android.support.annotation.Nullable; 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.ShowColumns; import net.simonvt.cathode.provider.DatabaseSchematic.Tables; import net.simonvt.cathode.scheduler.ShowTaskScheduler; import net.simonvt.cathode.images.ImageType; import net.simonvt.cathode.ui.adapter.RecyclerCursorAdapter; import net.simonvt.cathode.widget.CircularProgressIndicator; import net.simonvt.cathode.widget.IndicatorView; import net.simonvt.cathode.widget.OverflowView; import net.simonvt.cathode.widget.RemoteImageView; import net.simonvt.schematic.Cursors; public class ShowDescriptionAdapter extends RecyclerCursorAdapter<ShowDescriptionAdapter.ViewHolder> { public static final String[] PROJECTION = new String[] { Tables.SHOWS + "." + ShowColumns.ID, Tables.SHOWS + "." + ShowColumns.TITLE, Tables.SHOWS + "." + ShowColumns.OVERVIEW, Tables.SHOWS + "." + ShowColumns.TVDB_ID, Tables.SHOWS + "." + ShowColumns.WATCHED_COUNT, Tables.SHOWS + "." + ShowColumns.IN_COLLECTION_COUNT, Tables.SHOWS + "." + ShowColumns.IN_WATCHLIST, Tables.SHOWS + "." + ShowColumns.RATING, Tables.SHOWS + "." + ShowColumns.LAST_MODIFIED, }; @Inject protected ShowTaskScheduler showScheduler; private ShowClickListener listener; private boolean displayRating; public ShowDescriptionAdapter(Context context, ShowClickListener listener, Cursor cursor) { this(context, listener, cursor, true); CathodeApp.inject(context, this); this.listener = listener; } public ShowDescriptionAdapter(Context context, ShowClickListener listener, Cursor cursor, boolean displayRating) { super(context, cursor); CathodeApp.inject(context, this); this.listener = listener; this.displayRating = displayRating; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v; if (displayRating) { v = LayoutInflater.from(getContext()) .inflate(R.layout.list_row_show_description_rating, parent, false); } else { v = LayoutInflater.from(getContext()) .inflate(R.layout.list_row_show_description, parent, false); } final ViewHolder holder = new ViewHolder(v); v.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 String title = Cursors.getString(cursor, ShowColumns.TITLE); final String overview = Cursors.getString(cursor, ShowColumns.OVERVIEW); listener.onShowClick(holder.getItemId(), title, overview); } } }); holder.overflow.setListener(new OverflowView.OverflowActionListener() { @Override public void onPopupShown() { } @Override public void onPopupDismissed() { } @Override public void onActionSelected(int action) { final int position = holder.getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { onOverflowActionSelected(holder.itemView, holder.getItemId(), action, position); } } }); return holder; } @Override public void onViewRecycled(ViewHolder holder) { holder.overflow.dismiss(); } @Override protected void onBindViewHolder(final ViewHolder holder, Cursor cursor, int position) { final long id = Cursors.getLong(cursor, ShowColumns.ID); final boolean watched = Cursors.getInt(cursor, ShowColumns.WATCHED_COUNT) > 0; final boolean inCollection = Cursors.getInt(cursor, ShowColumns.IN_COLLECTION_COUNT) > 1; final boolean inWatchlist = Cursors.getBoolean(cursor, ShowColumns.IN_WATCHLIST); final String poster = ImageUri.create(ImageUri.ITEM_SHOW, ImageType.POSTER, id); holder.indicator.setWatched(watched); holder.indicator.setCollected(inCollection); holder.indicator.setInWatchlist(inWatchlist); holder.poster.setImage(poster); holder.title.setText(Cursors.getString(cursor, ShowColumns.TITLE)); holder.overview.setText(Cursors.getString(cursor, ShowColumns.OVERVIEW)); if (displayRating) { final float rating = Cursors.getFloat(cursor, ShowColumns.RATING); holder.rating.setValue(rating); } holder.overflow.removeItems(); setupOverflowItems(holder.overflow, inWatchlist); } protected void setupOverflowItems(OverflowView overflow, boolean inWatchlist) { if (inWatchlist) { overflow.addItem(R.id.action_watchlist_remove, R.string.action_watchlist_remove); } else { overflow.addItem(R.id.action_watchlist_add, R.string.action_watchlist_add); } } protected void onOverflowActionSelected(View view, long id, int action, int position) { switch (action) { case R.id.action_watchlist_add: showScheduler.setIsInWatchlist(id, true); break; case R.id.action_watchlist_remove: onWatchlistRemove(id); break; } } protected void onWatchlistRemove(long showId) { showScheduler.setIsInWatchlist(showId, false); } public static class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.poster) RemoteImageView poster; @BindView(R.id.indicator) IndicatorView indicator; @BindView(R.id.title) TextView title; @BindView(R.id.overview) TextView overview; @BindView(R.id.overflow) OverflowView overflow; @BindView(R.id.rating) @Nullable CircularProgressIndicator rating; ViewHolder(View v) { super(v); ButterKnife.bind(this, v); } } }