package com.battlelancer.seriesguide.util.tasks; import android.content.Context; import android.support.annotation.NonNull; import com.battlelancer.seriesguide.SgApp; import com.battlelancer.seriesguide.backend.HexagonTools; import com.battlelancer.seriesguide.settings.TraktCredentials; import com.battlelancer.seriesguide.traktapi.SgTrakt; import com.battlelancer.seriesguide.util.MovieTools; import com.uwetrottmann.seriesguide.backend.movies.Movies; import com.uwetrottmann.seriesguide.backend.movies.model.Movie; import com.uwetrottmann.seriesguide.backend.movies.model.MovieList; import com.uwetrottmann.trakt5.entities.MovieIds; import com.uwetrottmann.trakt5.entities.SyncItems; import com.uwetrottmann.trakt5.entities.SyncMovie; import com.uwetrottmann.trakt5.entities.SyncResponse; import com.uwetrottmann.trakt5.services.Sync; import dagger.Lazy; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.greenrobot.eventbus.EventBus; import retrofit2.Call; import retrofit2.Response; /** * Base class for executing movie actions. */ public abstract class BaseMovieActionTask extends BaseActionTask { @Inject Lazy<Sync> traktSync; private final int movieTmdbId; public BaseMovieActionTask(SgApp app, int movieTmdbId) { super(app); app.getServicesComponent().inject(this); this.movieTmdbId = movieTmdbId; } @Override protected Integer doBackgroundAction(Void... params) { // send to hexagon if (isSendingToHexagon()) { Movie movie = new Movie(); movie.setTmdbId(movieTmdbId); setHexagonMovieProperties(movie); List<Movie> movies = new ArrayList<>(); movies.add(movie); MovieList movieList = new MovieList(); movieList.setMovies(movies); try { Movies moviesService = getContext().getHexagonTools().getMoviesService(); if (moviesService == null) { return ERROR_HEXAGON_API; } moviesService.save(movieList).execute(); } catch (IOException e) { HexagonTools.trackFailedRequest(getContext(), "save movie", e); return ERROR_HEXAGON_API; } } // send to trakt if (isSendingToTrakt()) { if (!TraktCredentials.get(getContext()).hasCredentials()) { return ERROR_TRAKT_AUTH; } SyncItems items = new SyncItems().movies( new SyncMovie().id(MovieIds.tmdb(movieTmdbId))); try { Response<SyncResponse> response = doTraktAction(traktSync.get(), items).execute(); if (response.isSuccessful()) { if (isMovieNotFound(response.body())) { return ERROR_TRAKT_API_NOT_FOUND; } } else { if (SgTrakt.isUnauthorized(getContext(), response)) { return ERROR_TRAKT_AUTH; } SgTrakt.trackFailedRequest(getContext(), getTraktAction(), response); return ERROR_TRAKT_API; } } catch (IOException e) { SgTrakt.trackFailedRequest(getContext(), getTraktAction(), e); return ERROR_TRAKT_API; } } // update local state if (!doDatabaseUpdate(getContext(), movieTmdbId)) { return ERROR_DATABASE; } return SUCCESS; } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); // post event to update button states EventBus.getDefault().post(new MovieTools.MovieChangedEvent(movieTmdbId)); } private static boolean isMovieNotFound(SyncResponse response) { return response.not_found != null && response.not_found.movies != null && response.not_found.movies.size() != 0; } protected abstract boolean doDatabaseUpdate(Context context, int movieTmdbId); /** * Set properties to send to hexagon. To disable hexagon uploading, override {@link * #isSendingToHexagon()}}. */ protected abstract void setHexagonMovieProperties(Movie movie); @NonNull protected abstract String getTraktAction(); @NonNull protected abstract Call<SyncResponse> doTraktAction(Sync traktSync, SyncItems items); }