/*
* Copyright (C) 2015 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.scheduler;
import android.content.ContentValues;
import android.content.Context;
import javax.inject.Inject;
import net.simonvt.cathode.api.enumeration.Privacy;
import net.simonvt.cathode.api.service.SyncService;
import net.simonvt.cathode.provider.DatabaseContract;
import net.simonvt.cathode.provider.DatabaseContract.ListItemColumns;
import net.simonvt.cathode.provider.EpisodeDatabaseHelper;
import net.simonvt.cathode.provider.ListWrapper;
import net.simonvt.cathode.provider.MovieDatabaseHelper;
import net.simonvt.cathode.provider.PersonDatabaseHelper;
import net.simonvt.cathode.provider.ProviderSchematic;
import net.simonvt.cathode.provider.ProviderSchematic.ListItems;
import net.simonvt.cathode.provider.SeasonDatabaseHelper;
import net.simonvt.cathode.provider.ShowDatabaseHelper;
import net.simonvt.cathode.remote.action.lists.AddEpisode;
import net.simonvt.cathode.remote.action.lists.AddMovie;
import net.simonvt.cathode.remote.action.lists.AddPerson;
import net.simonvt.cathode.remote.action.lists.AddSeason;
import net.simonvt.cathode.remote.action.lists.AddShow;
import net.simonvt.cathode.remote.action.lists.CreateList;
import net.simonvt.cathode.remote.action.lists.DeleteList;
import net.simonvt.cathode.remote.action.lists.RemoveEpisode;
import net.simonvt.cathode.remote.action.lists.RemoveMovie;
import net.simonvt.cathode.remote.action.lists.RemovePerson;
import net.simonvt.cathode.remote.action.lists.RemoveSeason;
import net.simonvt.cathode.remote.action.lists.RemoveShow;
import net.simonvt.cathode.remote.action.lists.UpdateList;
public class ListsTaskScheduler extends BaseTaskScheduler {
@Inject SyncService syncService;
@Inject ShowDatabaseHelper showHelper;
@Inject SeasonDatabaseHelper seasonHelper;
@Inject EpisodeDatabaseHelper episodeHelper;
@Inject MovieDatabaseHelper movieHelper;
@Inject transient PersonDatabaseHelper personHelper;
public ListsTaskScheduler(Context context) {
super(context);
}
public void createList(final String name, final String description, final Privacy privacy,
final boolean displayNumbers, final boolean allowComments) {
execute(new Runnable() {
@Override public void run() {
final long listId =
ListWrapper.createList(context.getContentResolver(), name, description, privacy,
displayNumbers, allowComments);
queue(new CreateList(listId, name, description, privacy, displayNumbers, allowComments));
}
});
}
public void updateList(final long listId, final String name, final String description,
final Privacy privacy, final boolean displayNumbers, final boolean allowComments) {
execute(new Runnable() {
@Override public void run() {
final long traktId = ListWrapper.getTraktId(context.getContentResolver(), listId);
ListWrapper.updateList(context.getContentResolver(), listId, name, description, privacy,
displayNumbers, allowComments);
queue(new UpdateList(traktId, name, description, privacy, displayNumbers, allowComments));
}
});
}
public void deleteList(final long listId) {
execute(new Runnable() {
@Override public void run() {
final long traktId = ListWrapper.getTraktId(context.getContentResolver(), listId);
context.getContentResolver().delete(ListItems.inList(listId), null, null);
context.getContentResolver().delete(ProviderSchematic.Lists.withId(listId), null, null);
queue(new DeleteList(traktId));
}
});
}
public void addItem(final long listId, final int itemType, final long itemId) {
updateListItem(listId, itemType, itemId, true);
}
public void removeItem(final long listId, final int itemType, final long itemId) {
updateListItem(listId, itemType, itemId, false);
}
private void updateListItem(final long listId, final int itemType, final long itemId,
final boolean add) {
execute(new Runnable() {
@Override public void run() {
final long listTraktId = ListWrapper.getTraktId(context.getContentResolver(), listId);
if (add) {
ContentValues values = new ContentValues();
values.put(ListItemColumns.LIST_ID, listId);
values.put(ListItemColumns.LISTED_AT, System.currentTimeMillis());
values.put(ListItemColumns.ITEM_ID, itemId);
values.put(ListItemColumns.ITEM_TYPE, itemType);
context.getContentResolver().insert(ListItems.LIST_ITEMS, values);
} else {
context.getContentResolver()
.delete(ListItems.inList(listId),
ListItemColumns.ITEM_TYPE + "=? AND " + ListItemColumns.ITEM_ID + "=?",
new String[] {
String.valueOf(itemType), String.valueOf(itemId),
});
}
switch (itemType) {
case DatabaseContract.ItemType.SHOW: {
final long showTraktId = showHelper.getTraktId(itemId);
if (add) {
queue(new AddShow(listTraktId, showTraktId));
} else {
queue(new RemoveShow(listTraktId, showTraktId));
}
break;
}
case DatabaseContract.ItemType.SEASON: {
final long showId = seasonHelper.getShowId(itemId);
final long showTraktId = showHelper.getTraktId(showId);
final int seasonNumber = seasonHelper.getNumber(itemId);
if (add) {
queue(new AddSeason(listTraktId, showTraktId, seasonNumber));
} else {
queue(new RemoveSeason(listTraktId, showTraktId, seasonNumber));
}
break;
}
case DatabaseContract.ItemType.EPISODE: {
final long showId = episodeHelper.getShowId(itemId);
final long showTraktId = showHelper.getTraktId(showId);
final int seasonNumber = episodeHelper.getSeason(itemId);
final int episodeNumber = episodeHelper.getNumber(itemId);
if (add) {
queue(new AddEpisode(listTraktId, showTraktId, seasonNumber, episodeNumber));
} else {
queue(new RemoveEpisode(listTraktId, showTraktId, seasonNumber, episodeNumber));
}
break;
}
case DatabaseContract.ItemType.MOVIE: {
final long movieTraktId = movieHelper.getTraktId(itemId);
if (add) {
queue(new AddMovie(listTraktId, movieTraktId));
} else {
queue(new RemoveMovie(listTraktId, movieTraktId));
}
break;
}
case DatabaseContract.ItemType.PERSON: {
final long personTraktId = personHelper.getTraktId(itemId);
if (add) {
queue(new AddPerson(listTraktId, personTraktId));
} else {
queue(new RemovePerson(listTraktId, personTraktId));
}
break;
}
}
}
});
}
}