package org.xbmc.android.remote.business.cm; import java.util.ArrayList; import java.util.List; import org.xbmc.android.jsonrpc.api.AbstractCall; import org.xbmc.android.jsonrpc.api.call.VideoLibrary; import org.xbmc.android.jsonrpc.api.call.VideoLibrary.GetMovies.FilterActor; import org.xbmc.android.jsonrpc.api.model.LibraryModel; import org.xbmc.android.jsonrpc.api.model.LibraryModel.GenreDetail; import org.xbmc.android.jsonrpc.api.model.VideoModel.Cast; import org.xbmc.android.jsonrpc.api.model.VideoModel.MovieDetail; import org.xbmc.api.business.DataResponse; import org.xbmc.api.business.INotifiableManager; import org.xbmc.api.business.ISortableManager; import org.xbmc.api.business.IVideoManager; import org.xbmc.api.object.Actor; import org.xbmc.api.object.Genre; import org.xbmc.api.object.ICoverArt; import org.xbmc.api.object.Movie; import org.xbmc.httpapi.WifiStateException; import android.content.Context; import android.graphics.Bitmap; public class VideoManager extends AbstractManager implements IVideoManager, ISortableManager, INotifiableManager { public void updateMovieDetails(DataResponse<Movie> response, final Movie movie, Context context) { call(new VideoLibrary.GetMovieDetails(movie.getId(), MovieDetail.STUDIO, MovieDetail.PLOT, MovieDetail.MPAA, MovieDetail.CAST), new ApiHandler<Movie, MovieDetail>() { @Override public Movie handleResponse( AbstractCall<MovieDetail> apiCall) { MovieDetail movieDetail = apiCall.getResult(); movie.studio = movieDetail.studio; movie.plot = movieDetail.plot; movie.rated = movieDetail.mpaa; List<Cast> cast = movieDetail.cast; for(Cast member : cast) { movie.actors.add(new Actor(member)); } return movie; } }, response, context); } public void getMovies(DataResponse<ArrayList<Movie>> response, Context context) { call(new VideoLibrary.GetMovies(getSort(MovieDetail.TITLE), MovieDetail.TITLE, MovieDetail.YEAR, MovieDetail.PLAYCOUNT, MovieDetail.FILE, MovieDetail.DIRECTOR, MovieDetail.RUNTIME, MovieDetail.GENRE, MovieDetail.RATING, MovieDetail.IMDBNUMBER, MovieDetail.THUMBNAIL), new ApiHandler<ArrayList<Movie>, MovieDetail>() { @Override public ArrayList<Movie> handleResponse( AbstractCall<MovieDetail> apiCall) { List<MovieDetail> movieDetails = apiCall.getResults(); ArrayList<Movie> result = new ArrayList<Movie>(); for (MovieDetail movie : movieDetails) { result.add(new Movie(movie)); } return result; } }, response, context); } public ArrayList<Movie> getMovies(Context context) { // FIXME: fix covers return null; } public void getMovies(DataResponse<ArrayList<Movie>> response, Actor actor, Context context) { call(new VideoLibrary.GetMovies(null, getSort(MovieDetail.TITLE), new FilterActor(actor.name), MovieDetail.TITLE, MovieDetail.YEAR, MovieDetail.PLAYCOUNT, MovieDetail.FILE, MovieDetail.DIRECTOR, MovieDetail.RUNTIME, MovieDetail.GENRE, MovieDetail.RATING, MovieDetail.IMDBNUMBER, MovieDetail.THUMBNAIL), new ApiHandler<ArrayList<Movie>, MovieDetail>() { @Override public ArrayList<Movie> handleResponse( AbstractCall<MovieDetail> apiCall) { List<MovieDetail> movieDetails = apiCall.getResults(); ArrayList<Movie> result = new ArrayList<Movie>(); for (MovieDetail movie : movieDetails) { result.add(new Movie(movie)); } return result; } }, response, context); } public void getMovies(DataResponse<ArrayList<Movie>> response, Genre genre, Context context) { call(new VideoLibrary.GetMovies(null, getSort(MovieDetail.TITLE), new VideoLibrary.GetMovies.FilterGenreId(genre.id), MovieDetail.TITLE, MovieDetail.YEAR, MovieDetail.PLAYCOUNT, MovieDetail.FILE, MovieDetail.DIRECTOR, MovieDetail.RUNTIME, MovieDetail.GENRE, MovieDetail.RATING, MovieDetail.IMDBNUMBER, MovieDetail.THUMBNAIL), new ApiHandler<ArrayList<Movie>, MovieDetail>() { @Override public ArrayList<Movie> handleResponse( AbstractCall<MovieDetail> apiCall) { List<MovieDetail> movieDetails = apiCall.getResults(); ArrayList<Movie> result = new ArrayList<Movie>(); for (MovieDetail movie : movieDetails) { result.add(new Movie(movie)); } return result; } }, response, context); } public void getActors(DataResponse<ArrayList<Actor>> response,Context context) { response.value = new ArrayList<Actor>(); onFinish(response); } public void getMovieActors(DataResponse<ArrayList<Actor>> response, Context context) { // currently we cannot return this in Frodo response.value = new ArrayList<Actor>(); onFinish(response); } public void getMovieGenres(DataResponse<ArrayList<Genre>> response, Context context) { call(new VideoLibrary.GetGenres("movie", null, getSort(LibraryModel.GenreDetail.TITLE)), new ApiHandler<ArrayList<Genre>, LibraryModel.GenreDetail>() { @Override public ArrayList<Genre> handleResponse( AbstractCall<GenreDetail> apiCall) { List<GenreDetail> genreDetails = apiCall.getResults(); ArrayList<Genre> result = new ArrayList<Genre>(); for (GenreDetail genreDetail : genreDetails) { result.add(new Genre(genreDetail)); } return result; } }, response, context); } public void setPlaylistVideo(DataResponse<Boolean> response, int position, Context context) { setPlaylist(PLAYLIST_VIDEO, response, position, context); } public void removeFromPlaylist(DataResponse<Boolean> response, int position, Context context) { removeFromPlaylist(PLAYLIST_VIDEO, response, position, context); } public void getPlaylist(DataResponse<ArrayList<String>> response, Context context) { getPlaylist(PLAYLIST_VIDEO, response, context); } public void getPlaylistPosition(DataResponse<Integer> response, Context context) { getPlaylistPosition(PLAYLIST_VIDEO, response, context); } public void downloadCover(DataResponse<Bitmap> response, ICoverArt cover, int thumbSize, Context context) throws WifiStateException { response.value = getCover(cover, thumbSize, Movie.getThumbUri(cover), Movie.getFallbackThumbUri(cover)); } }