// Copyright (c) 2011, Chute Corporation. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of the Chute Corporation nor the names
// of its contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
// OF THE POSSIBILITY OF SUCH DAMAGE.
//
package com.chute.sdk.v2.api.album;
import com.chute.sdk.v2.api.base.PageRequest;
import com.chute.sdk.v2.api.parsers.ListResponseParser;
import com.chute.sdk.v2.model.AlbumModel;
import com.chute.sdk.v2.model.AssetModel;
import com.chute.sdk.v2.model.PaginationModel;
import com.chute.sdk.v2.model.response.ListResponseModel;
import com.chute.sdk.v2.model.response.ResponseModel;
import com.dg.libs.rest.HttpRequest;
import com.dg.libs.rest.callbacks.HttpCallback;
import com.dg.libs.rest.client.RequestMethod;
import java.util.ArrayList;
/**
* The {@link GCAlbums} class is a helper class that consists exclusively of
* static methods regarding {@link AlbumModel}.
* <p/>
* <p/>
* The API enables users and developers to access the following methods:
* <ul>
* <li>Create an album
* <li>Delete an album
* <li>Update an album
* <li>Get a specific asset from an album
* <li>Get a list of album assets
* <li>Import a list of asset URLs in a specific album
* <li>Add a list of asset IDs in a specific album
* <li>Remove a list of asset IDs in a specific album
* </ul>
*/
public class GCAlbums {
public static final String TAG = GCAlbums.class.getSimpleName();
/**
* A private no-args default constructor.
*/
private GCAlbums() {
}
/**
* Pulls a complete list of all albums accessible to the user.
*
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ListResponseModel<AlbumModel>}.
* @return {@link AlbumsListRequest}.
*/
public static HttpRequest list(
final HttpCallback<ListResponseModel<AlbumModel>> callback) {
return new AlbumsListRequest(false, new PaginationModel(),
callback);
}
/**
* Pulls a complete list of all albums accessible to the user.
*
* @param includeCoverAsset true if you wish to include the cover asset in the response
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ListResponseModel<AlbumModel>}.
* @return {@link AlbumsListRequest}.
*/
public static HttpRequest list(boolean includeCoverAsset,
final HttpCallback<ListResponseModel<AlbumModel>> callback) {
return new AlbumsListRequest(includeCoverAsset, new PaginationModel(),
callback);
}
/**
* Gets albums next page
*
* @param pagination {@link PaginationModel} containing page info
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ListResponseModel<AlbumModel>}.
* @return {@link PageRequest}
*/
public static HttpRequest getNextPageOfAlbums(
PaginationModel pagination,
final HttpCallback<ListResponseModel<AlbumModel>> callback) {
return new PageRequest<ListResponseModel<AlbumModel>>(RequestMethod.GET,
pagination.getNextPage(), new ListResponseParser<AlbumModel>(
AlbumModel.class), callback);
}
/**
* Pulls a complete list of all albums nested inside a specific album.
*
* @param album Parent album.
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ListResponseModel<AlbumModel>}.
* @return {@link AlbumsListRequest}.
*/
public static HttpRequest listNested(final AlbumModel album,
final HttpCallback<ListResponseModel<AlbumModel>> callback) {
return new AlbumsListNestedAlbumsRequest(album, callback);
}
/**
* Retrieves details for a specific album.
*
* @param album The album whose details are to be returned.
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ResponseModel<AlbumModel>}
* @return {@link AlbumsGetRequest}
*/
public static HttpRequest get(
final AlbumModel album,
final HttpCallback<ResponseModel<AlbumModel>> callback) {
return new AlbumsGetRequest(album, callback);
}
/**
* Overloaded method
*
* @see #create(AlbumModel, AssetModel, HttpCallback)
*/
public static HttpRequest create(
final AlbumModel album,
final HttpCallback<ResponseModel<AlbumModel>> callback) {
return create(album, null, callback);
}
/**
* Creates an album.
* <p/>
* Sending additional defined parameters will enable you to customize name,
* privileges, visibility, moderation etc.
*
* @param album The album to be created.
* @param asset The asset used as album cover
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ResponseModel<AlbumModel>}.
* @return {@link AlbumsCreateRequest}.
*/
public static HttpRequest create(
final AlbumModel album, AssetModel asset,
final HttpCallback<ResponseModel<AlbumModel>> callback) {
return new AlbumsCreateRequest(album, asset, callback);
}
/**
* Overloaded method
*
* @see #update(AlbumModel, AssetModel, HttpCallback)
*/
public static HttpRequest update(
final AlbumModel album,
final HttpCallback<ResponseModel<AlbumModel>> callback) {
return update(album, null, callback);
}
public static HttpRequest update(
final AlbumModel album, final AssetModel asset,
final HttpCallback<ResponseModel<AlbumModel>> callback) {
return new AlbumsUpdateRequest(album, asset, callback);
}
/**
* Deletes an album.
* <p/>
* Deletion will occur only if the user has the appropriate permission to
* delete the album.
*
* @param album The album to be deleted
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ResponseModel<AlbumModel>}.
* @return {@link AlbumsDeleteRequest}.
*/
public static HttpRequest delete(
final AlbumModel album,
final HttpCallback<ResponseModel<AlbumModel>> callback) {
return new AlbumsDeleteRequest(album, callback);
}
/**
* Imports assets in a specific album.
*
* @param album Album needed to place the imported assets.
* @param urls List of desired asset URLs for import.
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ListResponseModel<AssetModel>}.
* @return {@link AlbumsImportRequest}.
*/
public static HttpRequest imports(
final AlbumModel album, final ArrayList<String> urls,
final HttpCallback<ListResponseModel<AssetModel>> callback) {
return new AlbumsImportRequest(album, urls, callback);
}
/**
* The {@link Assets} class is an inner class which contains methods
* for getting a specific asset out of an album or a list of assets.
*/
public static class Assets {
/**
* Adds existing assets to an album.
* <p/>
* The assets must be already created by upload or import.
*
* @param album Album that holds the added assets.
* @param assetIds List of asset IDs to be added to the album.
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ResponseModel <Void>}.
* @return {@link AlbumsAddAssetsRequest}.
*/
public static HttpRequest add(
final AlbumModel album, final ArrayList<String> assetIds,
final HttpCallback<Void> callback) {
return new AlbumsAddAssetsRequest(album, assetIds,
callback);
}
/**
* Removes existing assets attached to an album.
*
* @param album Album that holds the assets for removal.
* @param assetIds List of asset IDs to be deleted from the given album.
* @param callback Instance of {@link HttpCallback} interface. If successful, the
* callback returns {@link ResponseModel <Void>}.
* @return {@link AlbumsRemoveAssetsRequest}.
*/
public static HttpRequest remove(
final AlbumModel album, final ArrayList<String> assetIds,
final HttpCallback<Void> callback) {
return new AlbumsRemoveAssetsRequest(album, assetIds,
callback);
}
}
}