package vandy.mooc.presenter;
import java.lang.ref.WeakReference;
import java.text.SimpleDateFormat;
import java.util.Date;
import vandy.mooc.common.GenericAsyncTask;
import vandy.mooc.common.GenericAsyncTaskOps;
import vandy.mooc.common.PresenterOps;
import vandy.mooc.utils.Utils;
import vandy.mooc.view.DownloadSongActivity;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
/**
* This class downloads a song and stores it in a local directory on
* the device. It plays role of the "Presenter" in the
* Model-View-Presenter pattern and can communicate with the
* DownloadSongActivity in the "View" layer.
*/
public class DownloadSongPresenter
implements GenericAsyncTaskOps<Uri, Void, Uri>,
PresenterOps<DownloadSongActivity> {
/**
* Logging tag.
*/
private final static String TAG =
DownloadSongPresenter.class.getCanonicalName();
/**
* Used to enable garbage collection.
*/
private WeakReference<DownloadSongActivity> mView;
/**
* The GenericAsyncTask used to obtain the weather in a background
* thread via the Weather Service web service.
*/
private GenericAsyncTask<Uri,
Void,
Uri,
DownloadSongPresenter> mAsyncTask;
/**
* Stores the directory to be used for all downloaded images.
*/
private Uri mDirectoryPathname = null;
/**
* Default constructor is needed by the GenericActivity framework.
*/
public DownloadSongPresenter() {
}
/**
* Hook method called when a new instance of AcronymPresenter is
* created. One time initialization code goes here, e.g., storing
* a WeakReference to the View layer and initializing the Model
* layer.
*
* @param view
* A reference to the View layer.
*/
@Override
public void onCreate(DownloadSongActivity view) {
// Set the WeakReference.
mView = new WeakReference<>(view);
// Create a timestamp that will be unique.
final String timestamp =
new SimpleDateFormat("yyyyMMdd'_'HHmm").format(new Date());
// Use the timestamp to create a pathname for the
// directory that stores downloaded images.
mDirectoryPathname =
Uri.parse(Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_DCIM)
+ "/"
+ timestamp
+ "/");
}
/**
* Hook method dispatched by the GenericActivity framework to
* initialize the DownloadSongPresenter object after a runtime
* configuration change.
*
* @param view The currently active View.
*/
@Override
public void onConfigurationChange(DownloadSongActivity view) {
// Reset the WeakReference.
mView = new WeakReference<>(view);
}
/**
* Hook method called to shutdown the Presenter layer.
*
* @param isChangeConfigurations
* True if a runtime configuration triggered the onDestroy() call.
*/
@Override
public void onDestroy(boolean isChangingConfigurations) {
// No op.
}
/**
* Download the requested song, which runs asynchronously and
* dispatches onDownloadComplete() when it's finished.
*/
public void downloadSong(Uri songUri) {
mAsyncTask = new GenericAsyncTask<>(this);
mAsyncTask.execute(songUri,
mDirectoryPathname);
}
/**
* Perform the download in background thread.
*/
public Uri doInBackground(Uri... params) {
final Uri songUri = params[0];
final Uri directoryPathname = params[1];
// Download the requested song in a background thread.
return Utils.downloadSong
(mView.get().getApplicationContext(),
songUri,
directoryPathname);
}
/**
* Send the result of background calculations to the
* DownloadSongActivity in the UI thread.
*/
public void onPostExecute(Uri pathToSongFile) {
// Return the song path back to the View layer.
mView.get().onDownloadComplete(pathToSongFile);
}
}