/* * 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.person; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import net.simonvt.cathode.api.enumeration.Department; import net.simonvt.cathode.api.enumeration.ItemType; import net.simonvt.cathode.database.BaseAsyncLoader; import net.simonvt.cathode.images.ImageType; import net.simonvt.cathode.images.ImageUri; import net.simonvt.cathode.provider.DatabaseContract.MovieCastColumns; import net.simonvt.cathode.provider.DatabaseContract.MovieColumns; import net.simonvt.cathode.provider.DatabaseContract.MovieCrewColumns; import net.simonvt.cathode.provider.DatabaseContract.PersonColumns; import net.simonvt.cathode.provider.DatabaseContract.ShowCastColumns; import net.simonvt.cathode.provider.DatabaseContract.ShowColumns; import net.simonvt.cathode.provider.DatabaseContract.ShowCrewColumns; import net.simonvt.cathode.provider.DatabaseSchematic.Tables; import net.simonvt.cathode.provider.ProviderSchematic.MovieCast; import net.simonvt.cathode.provider.ProviderSchematic.MovieCrew; import net.simonvt.cathode.provider.ProviderSchematic.People; import net.simonvt.cathode.provider.ProviderSchematic.ShowCast; import net.simonvt.cathode.provider.ProviderSchematic.ShowCrew; import net.simonvt.cathode.util.SqlColumn; import net.simonvt.schematic.Cursors; public class PersonLoader extends BaseAsyncLoader<Person> { private static final String[] SHOW_CAST_PROJECTION = new String[] { SqlColumn.table(Tables.SHOW_CAST).column(ShowCastColumns.SHOW_ID), SqlColumn.table(Tables.SHOW_CAST).column(ShowCastColumns.CHARACTER), SqlColumn.table(Tables.SHOWS).column(ShowColumns.TITLE), SqlColumn.table(Tables.SHOWS).column(ShowColumns.OVERVIEW), SqlColumn.table(Tables.SHOWS).column(ShowColumns.YEAR), }; private static final String[] SHOW_CREW_PROJECTION = new String[] { SqlColumn.table(Tables.SHOW_CREW).column(ShowCrewColumns.SHOW_ID), SqlColumn.table(Tables.SHOWS).column(ShowColumns.TITLE), SqlColumn.table(Tables.SHOWS).column(ShowColumns.OVERVIEW), SqlColumn.table(Tables.SHOWS).column(ShowColumns.YEAR), }; private static final String[] MOVIE_CAST_PROJECTION = new String[] { SqlColumn.table(Tables.MOVIE_CAST).column(MovieCastColumns.MOVIE_ID), SqlColumn.table(Tables.MOVIE_CAST).column(MovieCastColumns.CHARACTER), SqlColumn.table(Tables.MOVIES).column(MovieColumns.TITLE), SqlColumn.table(Tables.MOVIES).column(MovieColumns.OVERVIEW), SqlColumn.table(Tables.MOVIES).column(MovieColumns.YEAR), }; private static final String[] MOVIE_CREW_PROJECTION = new String[] { SqlColumn.table(Tables.MOVIE_CREW).column(MovieCrewColumns.MOVIE_ID), SqlColumn.table(Tables.MOVIES).column(MovieColumns.TITLE), SqlColumn.table(Tables.MOVIES).column(MovieColumns.OVERVIEW), SqlColumn.table(Tables.MOVIES).column(MovieColumns.YEAR), }; private long personId; private ContentResolver resolver; public PersonLoader(Context context, long personId) { super(context); this.personId = personId; resolver = context.getContentResolver(); addNotificationUri(People.withId(personId)); addNotificationUri(ShowCast.withPerson(personId)); addNotificationUri(ShowCrew.withPerson(personId)); addNotificationUri(MovieCast.withPerson(personId)); addNotificationUri(MovieCrew.withPerson(personId)); } @Override public Person loadInBackground() { Cursor person = resolver.query(People.withId(personId), new String[] { PersonColumns.TRAKT_ID, PersonColumns.NAME, PersonColumns.BIOGRAPHY, PersonColumns.BIRTHDAY, PersonColumns.DEATH, PersonColumns.BIRTHPLACE, PersonColumns.HOMEPAGE, PersonColumns.LAST_SYNC, }, null, null, null); try { if (person.moveToFirst()) { final long traktId = Cursors.getLong(person, PersonColumns.TRAKT_ID); final String name = Cursors.getString(person, PersonColumns.NAME); final String biography = Cursors.getString(person, PersonColumns.BIOGRAPHY); final String birthday = Cursors.getString(person, PersonColumns.BIRTHDAY); final String death = Cursors.getString(person, PersonColumns.DEATH); final String birthplace = Cursors.getString(person, PersonColumns.BIRTHPLACE); final String homepage = Cursors.getString(person, PersonColumns.HOMEPAGE); final long lastSync = Cursors.getLong(person, PersonColumns.LAST_SYNC); final String headshot = ImageUri.create(ImageUri.ITEM_PERSON, ImageType.PROFILE, personId); final String screenshot = ImageUri.create(ImageUri.ITEM_PERSON, ImageType.STILL, personId); PersonCredits credits = new PersonCredits(); loadShowCredits(credits); loadMovieCredits(credits); Collections.sort(credits.getCast(), comparator); Collections.sort(credits.getProduction(), comparator); Collections.sort(credits.getArt(), comparator); Collections.sort(credits.getCrew(), comparator); Collections.sort(credits.getCostumeAndMakeUp(), comparator); Collections.sort(credits.getDirecting(), comparator); Collections.sort(credits.getWriting(), comparator); Collections.sort(credits.getSound(), comparator); Collections.sort(credits.getCamera(), comparator); return new Person(traktId, name, headshot, screenshot, biography, birthday, death, birthplace, homepage, lastSync, credits); } } finally { person.close(); } throw new RuntimeException("Person not found"); } private Comparator<PersonCredit> comparator = new Comparator<PersonCredit>() { @Override public int compare(PersonCredit credit1, PersonCredit credit2) { return credit2.getYear() - credit1.getYear(); } }; private void loadShowCredits(PersonCredits credits) { Uri castUri = ShowCast.withPerson(personId); Uri crewUri = ShowCrew.withPerson(personId); List<PersonCredit> cast = null; Cursor castCursor = resolver.query(castUri, SHOW_CAST_PROJECTION, null, null, null); if (castCursor.getCount() > 0) { cast = new ArrayList<>(); while (castCursor.moveToNext()) { final String character = Cursors.getString(castCursor, ShowCastColumns.CHARACTER); final long itemId = Cursors.getLong(castCursor, ShowCastColumns.SHOW_ID); final String title = Cursors.getString(castCursor, ShowColumns.TITLE); final String overview = Cursors.getString(castCursor, ShowColumns.OVERVIEW); final int year = Cursors.getInt(castCursor, ShowColumns.YEAR); final String poster = ImageUri.create(ImageUri.ITEM_SHOW, ImageType.POSTER, itemId); PersonCredit credit = PersonCredit.character(character, ItemType.SHOW, itemId, poster, title, overview, year); cast.add(credit); } } castCursor.close(); if (cast != null) { credits.addCast(cast); } credits.addProduction(parseShowCrew(crewUri, Department.PRODUCTION)); credits.addArt(parseShowCrew(crewUri, Department.ART)); credits.addCrew(parseShowCrew(crewUri, Department.CREW)); credits.addCostumeAndMakeUp(parseShowCrew(crewUri, Department.COSTUME_AND_MAKEUP)); credits.addDirecting(parseShowCrew(crewUri, Department.DIRECTING)); credits.addWriting(parseShowCrew(crewUri, Department.WRITING)); credits.addSound(parseShowCrew(crewUri, Department.SOUND)); credits.addCamera(parseShowCrew(crewUri, Department.CAMERA)); } private List<PersonCredit> parseShowCrew(Uri uri, Department department) { Cursor cursor = resolver.query(uri, SHOW_CREW_PROJECTION, ShowCrewColumns.CATEGORY + "=?", new String[] { department.toString(), }, null); try { if (cursor.getCount() > 0) { List<PersonCredit> credits = new ArrayList<>(); while (cursor.moveToNext()) { final long itemId = Cursors.getLong(cursor, ShowCrewColumns.SHOW_ID); final String title = Cursors.getString(cursor, ShowColumns.TITLE); final String overview = Cursors.getString(cursor, ShowColumns.OVERVIEW); final int year = Cursors.getInt(cursor, ShowColumns.YEAR); final String poster = ImageUri.create(ImageUri.ITEM_SHOW, ImageType.POSTER, itemId); PersonCredit credit = PersonCredit.job(department.toString(), ItemType.SHOW, itemId, poster, title, overview, year); credits.add(credit); } return credits; } return null; } finally { cursor.close(); } } private void loadMovieCredits(PersonCredits credits) { Uri castUri = MovieCast.withPerson(personId); Uri crewUri = MovieCrew.withPerson(personId); List<PersonCredit> cast = null; Cursor castCursor = resolver.query(castUri, MOVIE_CAST_PROJECTION, null, null, null); if (castCursor.getCount() > 0) { cast = new ArrayList<>(); while (castCursor.moveToNext()) { final String character = Cursors.getString(castCursor, MovieCastColumns.CHARACTER); final long itemId = Cursors.getLong(castCursor, MovieCastColumns.MOVIE_ID); final String title = Cursors.getString(castCursor, MovieColumns.TITLE); final String overview = Cursors.getString(castCursor, MovieColumns.OVERVIEW); final int year = Cursors.getInt(castCursor, MovieColumns.YEAR); final String poster = ImageUri.create(ImageUri.ITEM_MOVIE, ImageType.POSTER, itemId); PersonCredit credit = PersonCredit.character(character, ItemType.MOVIE, itemId, poster, title, overview, year); cast.add(credit); } } castCursor.close(); if (cast != null) { credits.addCast(cast); } credits.addProduction(parseMovieCrew(crewUri, Department.PRODUCTION)); credits.addArt(parseMovieCrew(crewUri, Department.ART)); credits.addCrew(parseMovieCrew(crewUri, Department.CREW)); credits.addCostumeAndMakeUp(parseMovieCrew(crewUri, Department.COSTUME_AND_MAKEUP)); credits.addDirecting(parseMovieCrew(crewUri, Department.DIRECTING)); credits.addWriting(parseMovieCrew(crewUri, Department.WRITING)); credits.addSound(parseMovieCrew(crewUri, Department.SOUND)); credits.addCamera(parseMovieCrew(crewUri, Department.CAMERA)); } private List<PersonCredit> parseMovieCrew(Uri uri, Department department) { Cursor cursor = resolver.query(uri, MOVIE_CREW_PROJECTION, MovieCrewColumns.CATEGORY + "=?", new String[] { department.toString(), }, null); try { if (cursor.getCount() > 0) { List<PersonCredit> credits = new ArrayList<>(); while (cursor.moveToNext()) { final long itemId = Cursors.getLong(cursor, MovieCrewColumns.MOVIE_ID); final String title = Cursors.getString(cursor, MovieColumns.TITLE); final String overview = Cursors.getString(cursor, MovieColumns.OVERVIEW); final int year = Cursors.getInt(cursor, MovieColumns.YEAR); final String poster = ImageUri.create(ImageUri.ITEM_MOVIE, ImageType.POSTER, itemId); PersonCredit credit = PersonCredit.job(department.toString(), ItemType.MOVIE, itemId, poster, title, overview, year); credits.add(credit); } return credits; } return null; } finally { cursor.close(); } } }