Search in sources :

Example 6 with Rating

use of com.uwetrottmann.trakt5.enums.Rating in project SeriesGuide by UweTrottmann.

the class TraktRatingsSync method downloadForMovies.

/**
 * Downloads trakt movie ratings and applies the latest ones to the database.
 *
 * <p> To apply all ratings, set {@link TraktSettings#KEY_LAST_MOVIES_RATED_AT} to 0.
 */
public boolean downloadForMovies(OffsetDateTime ratedAt) {
    if (ratedAt == null) {
        Timber.e("downloadForMovies: null rated_at");
        return false;
    }
    long lastRatedAt = TraktSettings.getLastMoviesRatedAt(context);
    if (!TimeTools.isAfterMillis(ratedAt, lastRatedAt)) {
        // not initial sync, no ratings have changed
        Timber.d("downloadForMovies: no changes since %tF %tT", lastRatedAt, lastRatedAt);
        return true;
    }
    if (!TraktCredentials.get(context).hasCredentials()) {
        return false;
    }
    // download rated shows
    List<RatedMovie> ratedMovies;
    try {
        Response<List<RatedMovie>> response = traktSync.ratingsMovies(RatingsFilter.ALL, null, null, null).execute();
        if (response.isSuccessful()) {
            ratedMovies = response.body();
        } else {
            if (SgTrakt.isUnauthorized(context, response)) {
                return false;
            }
            Errors.logAndReport("get movie ratings", response);
            return false;
        }
    } catch (Exception e) {
        Errors.logAndReport("get movie ratings", e);
        return false;
    }
    if (ratedMovies == null) {
        Timber.e("downloadForMovies: null response");
        return false;
    }
    if (ratedMovies.isEmpty()) {
        Timber.d("downloadForMovies: no ratings on trakt");
        return true;
    }
    // trakt last activity rated_at timestamp is set after the rating timestamp
    // so include ratings that are a little older
    long ratedAtThreshold = lastRatedAt - 5 * DateUtils.MINUTE_IN_MILLIS;
    // go through ratings, latest first (trakt sends in that order)
    ArrayList<ContentProviderOperation> batch = new ArrayList<>();
    for (RatedMovie movie : ratedMovies) {
        if (movie.rating == null || movie.movie == null || movie.movie.ids == null || movie.movie.ids.tmdb == null) {
            // skip, can't handle
            continue;
        }
        if (movie.rated_at != null && TimeTools.isBeforeMillis(movie.rated_at, ratedAtThreshold)) {
            // no need to apply older ratings again
            break;
        }
        // if a movie does not exist, this update will do nothing
        ContentProviderOperation op = ContentProviderOperation.newUpdate(SeriesGuideContract.Movies.buildMovieUri(movie.movie.ids.tmdb)).withValue(SeriesGuideContract.Movies.RATING_USER, movie.rating.value).build();
        batch.add(op);
    }
    // apply database updates
    try {
        DBUtils.applyInSmallBatches(context, batch);
    } catch (OperationApplicationException e) {
        Timber.e(e, "downloadForMovies: database update failed");
        return false;
    }
    // save last rated instant
    long ratedAtTime = ratedAt.toInstant().toEpochMilli();
    PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(TraktSettings.KEY_LAST_MOVIES_RATED_AT, ratedAtTime).apply();
    Timber.d("downloadForMovies: success, last rated_at %tF %tT", ratedAtTime, ratedAtTime);
    return true;
}
Also used : ContentProviderOperation(android.content.ContentProviderOperation) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) RatedMovie(com.uwetrottmann.trakt5.entities.RatedMovie) OperationApplicationException(android.content.OperationApplicationException) OperationApplicationException(android.content.OperationApplicationException)

Example 7 with Rating

use of com.uwetrottmann.trakt5.enums.Rating in project SeriesGuide by UweTrottmann.

the class MovieLoader method loadInBackground.

@Override
public MovieDetails loadInBackground() {
    // try loading from trakt and tmdb, this might return a cached response
    MovieDetails details = app.getMovieTools().getMovieDetails(mTmdbId);
    // update local database
    updateLocalMovie(getContext(), details, mTmdbId);
    // fill in details from local database
    Cursor movieQuery = getContext().getContentResolver().query(Movies.buildMovieUri(mTmdbId), MovieQuery.PROJECTION, null, null, null);
    if (movieQuery == null || !movieQuery.moveToFirst() || movieQuery.getCount() < 1) {
        if (movieQuery != null) {
            movieQuery.close();
        }
        // ensure list flags and watched flag are false on failure
        // (assumption: movie not in db, it has the truth, so can't be in any lists or watched)
        details.inCollection = false;
        details.inWatchlist = false;
        details.isWatched = false;
        return details;
    }
    // set local state for watched, collected and watchlist status
    // assumption: local db has the truth for these
    details.inCollection = DBUtils.restoreBooleanFromInt(movieQuery.getInt(MovieQuery.IN_COLLECTION));
    details.inWatchlist = DBUtils.restoreBooleanFromInt(movieQuery.getInt(MovieQuery.IN_WATCHLIST));
    details.isWatched = DBUtils.restoreBooleanFromInt(movieQuery.getInt(MovieQuery.WATCHED));
    // also use local state of user rating
    details.userRating = movieQuery.getInt(MovieQuery.RATING_USER);
    // only overwrite other info if remote data failed to load
    if (details.traktRatings() == null) {
        details.traktRatings(new Ratings());
        details.traktRatings().rating = (double) movieQuery.getInt(MovieQuery.RATING_TRAKT);
        details.traktRatings().votes = movieQuery.getInt(MovieQuery.RATING_VOTES_TRAKT);
    }
    if (details.tmdbMovie() == null) {
        details.tmdbMovie(new Movie());
        details.tmdbMovie().imdb_id = movieQuery.getString(MovieQuery.IMDB_ID);
        details.tmdbMovie().title = movieQuery.getString(MovieQuery.TITLE);
        details.tmdbMovie().overview = movieQuery.getString(MovieQuery.OVERVIEW);
        details.tmdbMovie().poster_path = movieQuery.getString(MovieQuery.POSTER);
        details.tmdbMovie().runtime = movieQuery.getInt(MovieQuery.RUNTIME_MIN);
        details.tmdbMovie().vote_average = movieQuery.getDouble(MovieQuery.RATING_TMDB);
        details.tmdbMovie().vote_count = movieQuery.getInt(MovieQuery.RATING_VOTES_TMDB);
        // if stored release date is Long.MAX, movie has no release date
        long releaseDateMs = movieQuery.getLong(MovieQuery.RELEASED_UTC_MS);
        details.tmdbMovie().release_date = MovieTools.movieReleaseDateFrom(releaseDateMs);
    }
    // clean up
    movieQuery.close();
    return details;
}
Also used : Movie(com.uwetrottmann.tmdb2.entities.Movie) Cursor(android.database.Cursor) MovieDetails(com.battlelancer.seriesguide.items.MovieDetails) Ratings(com.uwetrottmann.trakt5.entities.Ratings)

Example 8 with Rating

use of com.uwetrottmann.trakt5.enums.Rating in project SeriesGuide by UweTrottmann.

the class MovieDetailsFragment method populateMovieViews.

private void populateMovieViews() {
    /**
         * Get everything from TMDb. Also get additional rating from trakt.
         */
    final Ratings traktRatings = movieDetails.traktRatings();
    final Movie tmdbMovie = movieDetails.tmdbMovie();
    final boolean inCollection = movieDetails.inCollection;
    final boolean inWatchlist = movieDetails.inWatchlist;
    final boolean isWatched = movieDetails.isWatched;
    final int rating = movieDetails.userRating;
    textViewMovieTitle.setText(tmdbMovie.title);
    getActivity().setTitle(tmdbMovie.title);
    textViewMovieDescription.setText(tmdbMovie.overview);
    // release date and runtime: "July 17, 2009 | 95 min"
    StringBuilder releaseAndRuntime = new StringBuilder();
    if (tmdbMovie.release_date != null) {
        releaseAndRuntime.append(TimeTools.formatToLocalDate(getContext(), tmdbMovie.release_date));
        releaseAndRuntime.append(" | ");
    }
    releaseAndRuntime.append(getString(R.string.runtime_minutes, String.valueOf(tmdbMovie.runtime)));
    textViewMovieDate.setText(releaseAndRuntime.toString());
    // check-in button
    final String title = tmdbMovie.title;
    buttonMovieCheckIn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // display a check-in dialog
            MovieCheckInDialogFragment f = MovieCheckInDialogFragment.newInstance(tmdbId, title);
            f.show(getFragmentManager(), "checkin-dialog");
            Utils.trackAction(getActivity(), TAG, "Check-In");
        }
    });
    CheatSheet.setup(buttonMovieCheckIn);
    // hide check-in if not connected to trakt or hexagon is enabled
    boolean isConnectedToTrakt = TraktCredentials.get(getActivity()).hasCredentials();
    boolean displayCheckIn = isConnectedToTrakt && !HexagonSettings.isEnabled(getActivity());
    buttonMovieCheckIn.setVisibility(displayCheckIn ? View.VISIBLE : View.GONE);
    dividerMovieButtons.setVisibility(displayCheckIn ? View.VISIBLE : View.GONE);
    // watched button (only supported when connected to trakt)
    if (isConnectedToTrakt) {
        buttonMovieWatched.setText(isWatched ? R.string.action_unwatched : R.string.action_watched);
        CheatSheet.setup(buttonMovieWatched, isWatched ? R.string.action_unwatched : R.string.action_watched);
        Utils.setCompoundDrawablesRelativeWithIntrinsicBounds(buttonMovieWatched, 0, isWatched ? Utils.resolveAttributeToResourceId(getActivity().getTheme(), R.attr.drawableWatched) : Utils.resolveAttributeToResourceId(getActivity().getTheme(), R.attr.drawableWatch), 0, 0);
        buttonMovieWatched.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (isWatched) {
                    MovieTools.unwatchedMovie(SgApp.from(getActivity()), tmdbId);
                    Utils.trackAction(getActivity(), TAG, "Unwatched movie");
                } else {
                    MovieTools.watchedMovie(SgApp.from(getActivity()), tmdbId);
                    Utils.trackAction(getActivity(), TAG, "Watched movie");
                }
            }
        });
        buttonMovieWatched.setVisibility(View.VISIBLE);
    } else {
        buttonMovieWatched.setVisibility(View.GONE);
    }
    // collected button
    Utils.setCompoundDrawablesRelativeWithIntrinsicBounds(buttonMovieCollected, 0, inCollection ? R.drawable.ic_collected : Utils.resolveAttributeToResourceId(getActivity().getTheme(), R.attr.drawableCollect), 0, 0);
    buttonMovieCollected.setText(inCollection ? R.string.action_collection_remove : R.string.action_collection_add);
    CheatSheet.setup(buttonMovieCollected, inCollection ? R.string.action_collection_remove : R.string.action_collection_add);
    buttonMovieCollected.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (inCollection) {
                MovieTools.removeFromCollection(SgApp.from(getActivity()), tmdbId);
                Utils.trackAction(getActivity(), TAG, "Uncollected movie");
            } else {
                MovieTools.addToCollection(SgApp.from(getActivity()), tmdbId);
                Utils.trackAction(getActivity(), TAG, "Collected movie");
            }
        }
    });
    // watchlist button
    Utils.setCompoundDrawablesRelativeWithIntrinsicBounds(buttonMovieWatchlisted, 0, inWatchlist ? R.drawable.ic_listed : Utils.resolveAttributeToResourceId(getActivity().getTheme(), R.attr.drawableList), 0, 0);
    buttonMovieWatchlisted.setText(inWatchlist ? R.string.watchlist_remove : R.string.watchlist_add);
    CheatSheet.setup(buttonMovieWatchlisted, inWatchlist ? R.string.watchlist_remove : R.string.watchlist_add);
    buttonMovieWatchlisted.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (inWatchlist) {
                MovieTools.removeFromWatchlist(SgApp.from(getActivity()), tmdbId);
                Utils.trackAction(getActivity(), TAG, "Unwatchlist movie");
            } else {
                MovieTools.addToWatchlist(SgApp.from(getActivity()), tmdbId);
                Utils.trackAction(getActivity(), TAG, "Watchlist movie");
            }
        }
    });
    // show button bar
    containerMovieButtons.setVisibility(View.VISIBLE);
    // language button
    LanguageTools.LanguageData languageData = LanguageTools.getMovieLanguageData(getContext());
    if (languageData != null) {
        currentLanguageIndex = languageData.languageIndex;
        buttonMovieLanguage.setText(languageData.languageString);
    } else {
        buttonMovieLanguage.setText(null);
    }
    buttonMovieLanguage.setVisibility(View.VISIBLE);
    // ratings
    textViewRatingsTmdbValue.setText(TraktTools.buildRatingString(tmdbMovie.vote_average));
    textViewRatingsTmdbVotes.setText(TraktTools.buildRatingVotesString(getActivity(), tmdbMovie.vote_count));
    if (traktRatings != null) {
        textViewRatingsTraktVotes.setText(TraktTools.buildRatingVotesString(getActivity(), traktRatings.votes));
        textViewRatingsTraktValue.setText(TraktTools.buildRatingString(traktRatings.rating));
    }
    // if movie is not in database, can't handle user ratings
    if (!inCollection && !inWatchlist && !isWatched) {
        textViewRatingsTraktUserLabel.setVisibility(View.GONE);
        textViewRatingsTraktUser.setVisibility(View.GONE);
        containerRatings.setClickable(false);
        // cheat sheet
        containerRatings.setLongClickable(false);
    } else {
        textViewRatingsTraktUserLabel.setVisibility(View.VISIBLE);
        textViewRatingsTraktUser.setVisibility(View.VISIBLE);
        textViewRatingsTraktUser.setText(TraktTools.buildUserRatingString(getActivity(), rating));
        containerRatings.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                rateMovie();
            }
        });
        CheatSheet.setup(containerRatings, R.string.action_rate);
    }
    containerRatings.setVisibility(View.VISIBLE);
    // genres
    textViewMovieGenresLabel.setVisibility(View.VISIBLE);
    Utils.setValueOrPlaceholder(textViewMovieGenres, TmdbTools.buildGenresString(tmdbMovie.genres));
    // trakt comments link
    buttonMovieComments.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent i = new Intent(getActivity(), TraktCommentsActivity.class);
            i.putExtras(TraktCommentsActivity.createInitBundleMovie(title, tmdbId));
            Utils.startActivityWithAnimation(getActivity(), i, v);
            Utils.trackAction(v.getContext(), TAG, "Comments");
        }
    });
    buttonMovieComments.setVisibility(View.VISIBLE);
    // load poster, cache on external storage
    if (TextUtils.isEmpty(tmdbMovie.poster_path)) {
        frameLayoutMoviePoster.setClickable(false);
        frameLayoutMoviePoster.setFocusable(false);
    } else {
        final String smallImageUrl = TmdbSettings.getImageBaseUrl(getActivity()) + TmdbSettings.POSTER_SIZE_SPEC_W342 + tmdbMovie.poster_path;
        ServiceUtils.loadWithPicasso(getActivity(), smallImageUrl).into(imageViewMoviePoster, new Callback.EmptyCallback() {

            @Override
            public void onSuccess() {
                Bitmap bitmap = ((BitmapDrawable) imageViewMoviePoster.getDrawable()).getBitmap();
                paletteAsyncTask = Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {

                    @Override
                    public void onGenerated(Palette palette) {
                        int color = palette.getVibrantColor(Color.WHITE);
                        color = ColorUtils.setAlphaComponent(color, 50);
                        rootLayoutMovie.setBackgroundColor(color);
                    }
                });
            }
        });
        // click listener for high resolution poster
        frameLayoutMoviePoster.setFocusable(true);
        frameLayoutMoviePoster.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                String largeImageUrl = TmdbSettings.getImageBaseUrl(getActivity()) + TmdbSettings.POSTER_SIZE_SPEC_ORIGINAL + tmdbMovie.poster_path;
                Intent intent = new Intent(getActivity(), FullscreenImageActivity.class);
                intent.putExtra(FullscreenImageActivity.EXTRA_PREVIEW_IMAGE, smallImageUrl);
                intent.putExtra(FullscreenImageActivity.EXTRA_IMAGE, largeImageUrl);
                Utils.startActivityWithAnimation(getActivity(), intent, view);
            }
        });
    }
}
Also used : Movie(com.uwetrottmann.tmdb2.entities.Movie) Palette(android.support.v7.graphics.Palette) MovieCheckInDialogFragment(com.battlelancer.seriesguide.ui.dialogs.MovieCheckInDialogFragment) Intent(android.content.Intent) ImageView(android.widget.ImageView) BindView(butterknife.BindView) View(android.view.View) TextView(android.widget.TextView) NestedScrollView(android.support.v4.widget.NestedScrollView) LanguageTools(com.battlelancer.seriesguide.util.LanguageTools) Ratings(com.uwetrottmann.trakt5.entities.Ratings) Bitmap(android.graphics.Bitmap) Callback(com.squareup.picasso.Callback) OnClickListener(android.view.View.OnClickListener)

Example 9 with Rating

use of com.uwetrottmann.trakt5.enums.Rating in project SeriesGuide by UweTrottmann.

the class TraktTools method downloadEpisodeRatings.

/**
     * Downloads trakt episode ratings and applies the latest ones to the database.
     *
     * <p> To apply all ratings, set {@link TraktSettings#KEY_LAST_EPISODES_RATED_AT} to 0.
     */
public UpdateResult downloadEpisodeRatings(@Nullable DateTime ratedAt) {
    if (ratedAt == null) {
        Timber.e("downloadEpisodeRatings: null rated_at");
        return UpdateResult.INCOMPLETE;
    }
    long lastRatedAt = TraktSettings.getLastEpisodesRatedAt(context);
    if (!ratedAt.isAfter(lastRatedAt)) {
        // not initial sync, no ratings have changed
        Timber.d("downloadEpisodeRatings: no changes since %tF %tT", lastRatedAt, lastRatedAt);
        return UpdateResult.SUCCESS;
    }
    if (!TraktCredentials.get(context).hasCredentials()) {
        return UpdateResult.INCOMPLETE;
    }
    // download rated episodes
    List<RatedEpisode> ratedEpisodes;
    try {
        Response<List<RatedEpisode>> response = traktSync.get().ratingsEpisodes(RatingsFilter.ALL, Extended.DEFAULT_MIN).execute();
        if (response.isSuccessful()) {
            ratedEpisodes = response.body();
        } else {
            if (SgTrakt.isUnauthorized(context, response)) {
                return UpdateResult.INCOMPLETE;
            }
            SgTrakt.trackFailedRequest(context, "get episode ratings", response);
            return UpdateResult.INCOMPLETE;
        }
    } catch (IOException e) {
        SgTrakt.trackFailedRequest(context, "get episode ratings", e);
        return UpdateResult.INCOMPLETE;
    }
    if (ratedEpisodes == null) {
        Timber.e("downloadEpisodeRatings: null response");
        return UpdateResult.INCOMPLETE;
    }
    if (ratedEpisodes.isEmpty()) {
        Timber.d("downloadEpisodeRatings: no ratings on trakt");
        return UpdateResult.SUCCESS;
    }
    // trakt last activity rated_at timestamp is set after the rating timestamp
    // so include ratings that are a little older
    long ratedAtThreshold = lastRatedAt - 5 * DateUtils.MINUTE_IN_MILLIS;
    ArrayList<ContentProviderOperation> batch = new ArrayList<>();
    for (RatedEpisode episode : ratedEpisodes) {
        if (episode.rating == null || episode.episode == null || episode.episode.ids == null || episode.episode.ids.tvdb == null) {
            // skip, can't handle
            continue;
        }
        if (episode.rated_at != null && episode.rated_at.isBefore(ratedAtThreshold)) {
            // no need to apply older ratings again
            break;
        }
        // if an episode does not exist, this update will do nothing
        ContentProviderOperation op = ContentProviderOperation.newUpdate(SeriesGuideContract.Episodes.buildEpisodeUri(episode.episode.ids.tvdb)).withValue(SeriesGuideContract.Episodes.RATING_USER, episode.rating.value).build();
        batch.add(op);
    }
    // apply database updates
    try {
        DBUtils.applyInSmallBatches(context, batch);
    } catch (OperationApplicationException e) {
        Timber.e(e, "downloadEpisodeRatings: database update failed");
        return UpdateResult.INCOMPLETE;
    }
    // save last rated instant
    PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(TraktSettings.KEY_LAST_EPISODES_RATED_AT, ratedAt.getMillis()).commit();
    Timber.d("downloadEpisodeRatings: success, last rated_at %tF %tT", ratedAt.getMillis(), ratedAt.getMillis());
    return UpdateResult.SUCCESS;
}
Also used : RatedEpisode(com.uwetrottmann.trakt5.entities.RatedEpisode) ContentProviderOperation(android.content.ContentProviderOperation) ArrayList(java.util.ArrayList) List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) IOException(java.io.IOException) OperationApplicationException(android.content.OperationApplicationException)

Example 10 with Rating

use of com.uwetrottmann.trakt5.enums.Rating in project SeriesGuide by UweTrottmann.

the class TraktTools method downloadMovieRatings.

/**
     * Downloads trakt movie ratings and applies the latest ones to the database.
     *
     * <p> To apply all ratings, set {@link TraktSettings#KEY_LAST_MOVIES_RATED_AT} to 0.
     */
public UpdateResult downloadMovieRatings(DateTime ratedAt) {
    if (ratedAt == null) {
        Timber.e("downloadMovieRatings: null rated_at");
        return UpdateResult.INCOMPLETE;
    }
    long lastRatedAt = TraktSettings.getLastMoviesRatedAt(context);
    if (!ratedAt.isAfter(lastRatedAt)) {
        // not initial sync, no ratings have changed
        Timber.d("downloadMovieRatings: no changes since %tF %tT", lastRatedAt, lastRatedAt);
        return UpdateResult.SUCCESS;
    }
    if (!TraktCredentials.get(context).hasCredentials()) {
        return UpdateResult.INCOMPLETE;
    }
    // download rated shows
    List<RatedMovie> ratedMovies;
    try {
        Response<List<RatedMovie>> response = traktSync.get().ratingsMovies(RatingsFilter.ALL, Extended.DEFAULT_MIN).execute();
        if (response.isSuccessful()) {
            ratedMovies = response.body();
        } else {
            if (SgTrakt.isUnauthorized(context, response)) {
                return UpdateResult.INCOMPLETE;
            }
            SgTrakt.trackFailedRequest(context, "get movie ratings", response);
            return UpdateResult.INCOMPLETE;
        }
    } catch (IOException e) {
        SgTrakt.trackFailedRequest(context, "get movie ratings", e);
        return UpdateResult.INCOMPLETE;
    }
    if (ratedMovies == null) {
        Timber.e("downloadMovieRatings: null response");
        return UpdateResult.INCOMPLETE;
    }
    if (ratedMovies.isEmpty()) {
        Timber.d("downloadMovieRatings: no ratings on trakt");
        return UpdateResult.SUCCESS;
    }
    // trakt last activity rated_at timestamp is set after the rating timestamp
    // so include ratings that are a little older
    long ratedAtThreshold = lastRatedAt - 5 * DateUtils.MINUTE_IN_MILLIS;
    // go through ratings, latest first (trakt sends in that order)
    ArrayList<ContentProviderOperation> batch = new ArrayList<>();
    for (RatedMovie movie : ratedMovies) {
        if (movie.rating == null || movie.movie == null || movie.movie.ids == null || movie.movie.ids.tmdb == null) {
            // skip, can't handle
            continue;
        }
        if (movie.rated_at != null && movie.rated_at.isBefore(ratedAtThreshold)) {
            // no need to apply older ratings again
            break;
        }
        // if a movie does not exist, this update will do nothing
        ContentProviderOperation op = ContentProviderOperation.newUpdate(SeriesGuideContract.Movies.buildMovieUri(movie.movie.ids.tmdb)).withValue(SeriesGuideContract.Movies.RATING_USER, movie.rating.value).build();
        batch.add(op);
    }
    // apply database updates
    try {
        DBUtils.applyInSmallBatches(context, batch);
    } catch (OperationApplicationException e) {
        Timber.e(e, "downloadMovieRatings: database update failed");
        return UpdateResult.INCOMPLETE;
    }
    // save last rated instant
    PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(TraktSettings.KEY_LAST_MOVIES_RATED_AT, ratedAt.getMillis()).commit();
    Timber.d("downloadMovieRatings: success, last rated_at %tF %tT", ratedAt.getMillis(), ratedAt.getMillis());
    return UpdateResult.SUCCESS;
}
Also used : ContentProviderOperation(android.content.ContentProviderOperation) ArrayList(java.util.ArrayList) List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) RatedMovie(com.uwetrottmann.trakt5.entities.RatedMovie) IOException(java.io.IOException) OperationApplicationException(android.content.OperationApplicationException)

Aggregations

OperationApplicationException (android.content.OperationApplicationException)6 ArrayList (java.util.ArrayList)6 List (java.util.List)6 ContentProviderOperation (android.content.ContentProviderOperation)4 Ratings (com.uwetrottmann.trakt5.entities.Ratings)3 IOException (java.io.IOException)3 LinkedList (java.util.LinkedList)3 Movie (com.uwetrottmann.tmdb2.entities.Movie)2 RatedEpisode (com.uwetrottmann.trakt5.entities.RatedEpisode)2 RatedMovie (com.uwetrottmann.trakt5.entities.RatedMovie)2 RatedShow (com.uwetrottmann.trakt5.entities.RatedShow)2 HashMap (java.util.HashMap)2 Intent (android.content.Intent)1 Cursor (android.database.Cursor)1 Bitmap (android.graphics.Bitmap)1 NestedScrollView (android.support.v4.widget.NestedScrollView)1 Palette (android.support.v7.graphics.Palette)1 View (android.view.View)1 OnClickListener (android.view.View.OnClickListener)1 ImageView (android.widget.ImageView)1