/* * 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.credits; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import java.util.ArrayList; 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.ImageUri; import net.simonvt.cathode.provider.DatabaseContract.MovieCastColumns; 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.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.ShowCast; import net.simonvt.cathode.provider.ProviderSchematic.ShowCrew; import net.simonvt.cathode.images.ImageType; import net.simonvt.cathode.util.SqlColumn; import net.simonvt.schematic.Cursors; public class CreditsLoader extends BaseAsyncLoader<Credits> { 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.SHOW_CAST).column(ShowCastColumns.PERSON_ID), SqlColumn.table(Tables.PEOPLE).column(PersonColumns.NAME), }; private static final String[] SHOW_CREW_PROJECTION = new String[] { SqlColumn.table(Tables.SHOW_CREW).column(ShowCrewColumns.SHOW_ID), SqlColumn.table(Tables.SHOW_CREW).column(ShowCrewColumns.JOB), SqlColumn.table(Tables.SHOW_CREW).column(ShowCrewColumns.PERSON_ID), SqlColumn.table(Tables.PEOPLE).column(PersonColumns.NAME), }; 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.MOVIE_CAST).column(MovieCastColumns.PERSON_ID), SqlColumn.table(Tables.PEOPLE).column(PersonColumns.NAME), }; private static final String[] MOVIE_CREW_PROJECTION = new String[] { SqlColumn.table(Tables.MOVIE_CREW).column(MovieCrewColumns.MOVIE_ID), SqlColumn.table(Tables.MOVIE_CREW).column(MovieCrewColumns.JOB), SqlColumn.table(Tables.MOVIE_CREW).column(MovieCrewColumns.PERSON_ID), SqlColumn.table(Tables.PEOPLE).column(PersonColumns.NAME), }; private ItemType itemType; private long itemId; private ContentResolver resolver; public CreditsLoader(Context context, ItemType itemType, long itemId) { super(context); this.itemType = itemType; this.itemId = itemId; resolver = context.getContentResolver(); if (itemType == ItemType.SHOW) { addNotificationUri(ShowCast.fromShow(itemId)); addNotificationUri(ShowCrew.fromShow(itemId)); } else { addNotificationUri(MovieCast.fromMovie(itemId)); addNotificationUri(MovieCrew.fromMovie(itemId)); } } @Override public Credits loadInBackground() { if (itemType == ItemType.SHOW) { return loadShowCredits(); } else { return loadMovieCredits(); } } private Credits loadShowCredits() { Uri castUri = ShowCast.fromShow(itemId); Uri crewUri = ShowCrew.fromShow(itemId); List<Credit> 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 personId = Cursors.getLong(castCursor, ShowCastColumns.PERSON_ID); final String name = Cursors.getString(castCursor, PersonColumns.NAME); final String headshot = ImageUri.create(ImageUri.ITEM_PERSON, ImageType.PROFILE, personId); Credit credit = Credit.character(character, personId, name, headshot); cast.add(credit); } } castCursor.close(); List<Credit> production = parseShowCrew(crewUri, Department.PRODUCTION); List<Credit> art = parseShowCrew(crewUri, Department.ART); List<Credit> crew = parseShowCrew(crewUri, Department.CREW); List<Credit> costumeAndMakeUp = parseShowCrew(crewUri, Department.COSTUME_AND_MAKEUP); List<Credit> directing = parseShowCrew(crewUri, Department.DIRECTING); List<Credit> writing = parseShowCrew(crewUri, Department.WRITING); List<Credit> sound = parseShowCrew(crewUri, Department.SOUND); List<Credit> camera = parseShowCrew(crewUri, Department.CAMERA); Credits credits = new Credits(cast, production, art, crew, costumeAndMakeUp, directing, writing, sound, camera); return credits; } private List<Credit> 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<Credit> credits = new ArrayList<>(); while (cursor.moveToNext()) { final String character = Cursors.getString(cursor, ShowCrewColumns.JOB); final long personId = Cursors.getLong(cursor, ShowCrewColumns.PERSON_ID); final String name = Cursors.getString(cursor, PersonColumns.NAME); final String headshot = ImageUri.create(ImageUri.ITEM_PERSON, ImageType.PROFILE, personId); Credit credit = Credit.character(character, personId, name, headshot); credits.add(credit); } return credits; } return null; } finally { cursor.close(); } } private Credits loadMovieCredits() { Uri castUri = MovieCast.fromMovie(itemId); Uri crewUri = MovieCrew.fromMovie(itemId); List<Credit> 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 personId = Cursors.getLong(castCursor, MovieCastColumns.PERSON_ID); final String name = Cursors.getString(castCursor, PersonColumns.NAME); final String headshot = ImageUri.create(ImageUri.ITEM_PERSON, ImageType.PROFILE, personId); Credit credit = Credit.character(character, personId, name, headshot); cast.add(credit); } } castCursor.close(); List<Credit> production = parseMovieCrew(crewUri, Department.PRODUCTION); List<Credit> art = parseMovieCrew(crewUri, Department.ART); List<Credit> crew = parseMovieCrew(crewUri, Department.CREW); List<Credit> costumeAndMakeUp = parseMovieCrew(crewUri, Department.COSTUME_AND_MAKEUP); List<Credit> directing = parseMovieCrew(crewUri, Department.DIRECTING); List<Credit> writing = parseMovieCrew(crewUri, Department.WRITING); List<Credit> sound = parseMovieCrew(crewUri, Department.SOUND); List<Credit> camera = parseMovieCrew(crewUri, Department.CAMERA); Credits credits = new Credits(cast, production, art, crew, costumeAndMakeUp, directing, writing, sound, camera); return credits; } private List<Credit> 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<Credit> credits = new ArrayList<>(); while (cursor.moveToNext()) { final String character = Cursors.getString(cursor, MovieCrewColumns.JOB); final long personId = Cursors.getLong(cursor, MovieCrewColumns.PERSON_ID); final String name = Cursors.getString(cursor, PersonColumns.NAME); final String headshot = ImageUri.create(ImageUri.ITEM_PERSON, ImageType.PROFILE, personId); Credit credit = Credit.character(character, personId, name, headshot); credits.add(credit); } return credits; } return null; } finally { cursor.close(); } } }