package vandy.mooc.model.mediator;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import retrofit.RestAdapter;
import retrofit.mime.TypedFile;
import vandy.mooc.model.mediator.webdata.Video;
import vandy.mooc.model.mediator.webdata.VideoServiceProxy;
import vandy.mooc.model.mediator.webdata.VideoStatus;
import vandy.mooc.model.mediator.webdata.VideoStatus.VideoState;
import vandy.mooc.utils.Constants;
import vandy.mooc.utils.VideoMediaStoreUtils;
import android.content.Context;
import android.net.Uri;
/**
* Mediates communication between the Video Service and the local
* storage on the Android device. The methods in this class block, so
* they should be called from a background thread (e.g., via an
* AsyncTask).
*/
public class VideoDataMediator {
/**
* Status code to indicate that file is successfully
* uploaded.
*/
public static final String STATUS_UPLOAD_SUCCESSFUL =
"Upload succeeded";
/**
* Status code to indicate that file upload failed
* due to large video size.
*/
public static final String STATUS_UPLOAD_ERROR_FILE_TOO_LARGE =
"Upload failed: File too big";
/**
* Status code to indicate that file upload failed.
*/
public static final String STATUS_UPLOAD_ERROR =
"Upload failed";
/**
* Defines methods that communicate with the Video Service.
*/
private VideoServiceProxy mVideoServiceProxy;
/**
* Constructor that initializes the VideoDataMediator.
*
* @param context
*/
public VideoDataMediator() {
// Initialize the VideoServiceProxy.
mVideoServiceProxy = new RestAdapter
.Builder()
.setEndpoint(Constants.SERVER_URL)
.build()
.create(VideoServiceProxy.class);
}
/**
* Uploads the Video having the given Id. This Id is the Id of
* Video in Android Video Content Provider.
*
* @param videoId
* Id of the Video to be uploaded.
*
* @return A String indicating the status of the video upload operation.
*/
public String uploadVideo(Context context,
Uri videoUri) {
// Get the path of video file from videoUri.
String filePath =
VideoMediaStoreUtils.getPath(context,
videoUri);
// Get the Video from Android Video Content Provider having
// the given filePath.
Video androidVideo =
VideoMediaStoreUtils.getVideo(context,
filePath);
// Check if any such Video exists in Android Video Content
// Provider.
if (androidVideo != null) {
// Prepare to Upload the Video data.
// Create an instance of the file to upload.
File videoFile = new File(filePath);
// Check if the file size is less than the size of the
// video that can be uploaded to the server.
if (videoFile.length() < Constants.MAX_SIZE_MEGA_BYTE) {
try {
// Add the metadata of the Video to the Video Service
// and get the resulting Video that contains
// additional meta-data (e.g., Id and ContentType)
// generated by the Video Service.
Video receivedVideo =
mVideoServiceProxy.addVideo(androidVideo);
// Check if the Server returns any Video metadata.
if (receivedVideo != null) {
// Finally, upload the Video data to the server
// and get the status of the uploaded video data.
VideoStatus status =
mVideoServiceProxy.setVideoData
(receivedVideo.getId(),
new TypedFile(receivedVideo.getContentType(),
videoFile));
// Check if the Status of the Video or not.
if (status.getState() == VideoState.READY) {
// Video successfully uploaded.
return STATUS_UPLOAD_SUCCESSFUL;
}
}
} catch (Exception e) {
// Error occured while uploading the video.
return STATUS_UPLOAD_ERROR;
}
} else
// Video can't be uploaded due to large video size.
return STATUS_UPLOAD_ERROR_FILE_TOO_LARGE;
}
// Error occured while uploading the video.
return STATUS_UPLOAD_ERROR;
}
/**
* Get the List of Videos from Video Service.
*
* @return the List of Videos from Server or null if there is
* failure in getting the Videos.
*/
public List<Video> getVideoList() {
try {
return (ArrayList<Video>)
mVideoServiceProxy.getVideoList();
} catch (Exception e) {
return null;
}
}
}