package com.distantfuture.videos.services; import android.content.Context; import android.os.Bundle; import com.distantfuture.videos.database.DatabaseTables; import com.distantfuture.videos.misc.DUtils; import com.distantfuture.videos.youtube.YouTubeAPI; public class ListServiceRequest { private static final int CLASS_TYPE_KEY = 1887; private ServiceRequest serviceRequest; private ListServiceRequest() { super(); } private ListServiceRequest(ServiceRequest serviceRequest) { super(); this.serviceRequest = serviceRequest; } public static ListServiceRequest fromBundle(Bundle bundle) { ListServiceRequest result = null; ServiceRequest request = ServiceRequest.fromBundle(bundle); Integer intValue = (Integer) request.getData(ServiceRequest.REQUEST_CLASS_TYPE_KEY); if (intValue != null) { if (intValue == CLASS_TYPE_KEY) result = new ListServiceRequest(request); } return result; } public static ListServiceRequest relatedRequest(YouTubeAPI.RelatedPlaylistType relatedPlayListType, String channelID, String containerName, int maxResults) { ListServiceRequest result = emptyRequest(RequestType.RELATED); result.serviceRequest.putInt("maxResults", maxResults); result.serviceRequest.putString("containerName", containerName); result.serviceRequest.putString("relatedType", relatedPlayListType.toString()); result.serviceRequest.putString("channel", channelID); return result; } public static ListServiceRequest videosRequest(String playlistID, String containerName) { ListServiceRequest result = emptyRequest(RequestType.VIDEOS); result.serviceRequest.putString("containerName", containerName); result.serviceRequest.putString("playlist", playlistID); return result; } public static ListServiceRequest searchRequest(String query, String containerName) { ListServiceRequest result = emptyRequest(RequestType.SEARCH); result.serviceRequest.putString("containerName", containerName); result.serviceRequest.putString("query", query); return result; } public static ListServiceRequest subscriptionsRequest(String containerName) { ListServiceRequest result = emptyRequest(RequestType.SUBSCRIPTIONS); result.serviceRequest.putString("containerName", containerName); return result; } public static ListServiceRequest categoriesRequest(String containerName) { ListServiceRequest result = emptyRequest(RequestType.CATEGORIES); result.serviceRequest.putString("containerName", containerName); return result; } public static ListServiceRequest likedRequest(String containerName) { ListServiceRequest result = emptyRequest(RequestType.LIKED); result.serviceRequest.putString("containerName", containerName); return result; } public static ListServiceRequest playlistsRequest(String channelID, String containerName, int maxResults) { ListServiceRequest result = emptyRequest(RequestType.PLAYLISTS); result.serviceRequest.putInt("maxResults", maxResults); result.serviceRequest.putString("containerName", containerName); result.serviceRequest.putString("channel", channelID); return result; } private static ListServiceRequest emptyRequest(RequestType type) { ListServiceRequest result = new ListServiceRequest(); result.serviceRequest = new ServiceRequest(); result.serviceRequest.putInt(ServiceRequest.REQUEST_CLASS_TYPE_KEY, CLASS_TYPE_KEY); result.serviceRequest.putString("type", type.toString()); return result; } public Bundle toBundle() { return ServiceRequest.toBundle(serviceRequest); } public RequestType type() { return RequestType.valueOf((String) serviceRequest.getData("type")); } public int maxResults() { int result = 0; Integer intObject = (Integer) serviceRequest.getData("maxResults"); if (intObject != null) result = intObject; return result; } public String containerName() { return (String) serviceRequest.getData("containerName"); } public String channel() { return (String) serviceRequest.getData("channel"); } public String playlist() { return (String) serviceRequest.getData("playlist"); } public String query() { return (String) serviceRequest.getData("query"); } public YouTubeAPI.RelatedPlaylistType relatedType() { return YouTubeAPI.RelatedPlaylistType.valueOf((String) serviceRequest.getData("relatedType")); } public String unitName(boolean plural) { String result = (plural) ? "Items" : "Item"; switch (type()) { case SUBSCRIPTIONS: result = (plural) ? "Subscriptions" : "Subscription"; break; case CATEGORIES: result = (plural) ? "Categories" : "Category"; break; case PLAYLISTS: result = (plural) ? "Playlists" : "Playlist"; break; case RELATED: result = (plural) ? "Videos" : "Video"; switch (relatedType()) { case UPLOADS: result = (plural) ? "Recent Uploads" : "Recent Upload"; break; case LIKES: result = (plural) ? "Liked Videos" : "Liked Video"; break; case FAVORITES: case WATCHED: case WATCHLATER: default: break; } break; case LIKED: case VIDEOS: case SEARCH: result = (plural) ? "Videos" : "Video"; break; } return result; } // =================================================================== // Parcelable - we send this to the service inside an intent private String typeToString() { String result = "YouTube"; switch (type()) { case SUBSCRIPTIONS: result = "Subscriptions"; break; case PLAYLISTS: result = "Playlists"; break; case CATEGORIES: result = "Categories"; break; case LIKED: result = "Liked"; break; case RELATED: result = "Related Playlists"; switch (relatedType()) { case FAVORITES: result = "Favorites"; break; case LIKES: result = "Likes"; break; case UPLOADS: result = "Uploads"; break; case WATCHED: result = "History"; break; case WATCHLATER: result = "Watch later"; break; } break; case VIDEOS: result = "Videos"; break; case SEARCH: result = "Search"; break; } return result; } // all items are added to db, but use group to get a specific list public String requestIdentifier() { String result = typeToString(); switch (type()) { case SUBSCRIPTIONS: break; case PLAYLISTS: result += serviceRequest.getData("channel"); break; case CATEGORIES: break; case LIKED: break; case RELATED: result += serviceRequest.getData("channel"); break; case VIDEOS: result += serviceRequest.getData("playlist"); break; case SEARCH: result += serviceRequest.getData("query"); break; } return result; } public DatabaseTables.DatabaseTable databaseTable() { switch (type()) { case RELATED: case SEARCH: case LIKED: case VIDEOS: return DatabaseTables.videoTable(); case PLAYLISTS: return DatabaseTables.playlistTable(); case SUBSCRIPTIONS: case CATEGORIES: break; } DUtils.log("databaseTable null"); return null; } public void runTask(Context context, boolean hasFetchedData, boolean refresh) { new ListServiceTask(context, this, hasFetchedData, refresh); } public enum RequestType {RELATED, SUBSCRIPTIONS, SEARCH, CATEGORIES, LIKED, PLAYLISTS, VIDEOS} }