package vandy.mooc.view;
import vandy.mooc.R;
import vandy.mooc.common.GenericActivity;
import vandy.mooc.presenter.DownloadSongPresenter;
import vandy.mooc.utils.ParcelableCommandMusic;
import vandy.mooc.utils.ParcelableCommandMusicAsync;
import vandy.mooc.utils.ParcelableCommandMusicService;
import vandy.mooc.utils.Utils;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
/**
* This Activity downloads a song and passes it to the
* MusicCommandProcessorActivity, which plays the song.
*/
public class DownloadSongActivity
extends GenericActivity<DownloadSongActivity,
DownloadSongPresenter,
DownloadSongPresenter> {
/**
* Song to download and play.
*/
private static String DEFAULT_SONG =
"http://www.dre.vanderbilt.edu/~schmidt/braincandy.m4a";
/**
* Display progress to the user.
*/
private ProgressBar mLoadingProgressBar;
/**
* Request the ParcelableCommandMusicAsync player.
*/
private static int ASYNC_PLAYER = 0;
/**
* Request the ParcelableCommandMusicService player.
*/
private static int SERVICE_PLAYER = 1;
/**
* Hook method called when a new instance of Activity is created.
* One time initialization code goes here, e.g., runtime
* configuration changes.
*
* @param Bundle object that contains saved state information.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// Call up to initialize superclass.
super.onCreate(savedInstanceState);
// Get references to the UI components.
setContentView(R.layout.download_song_activity);
// Store the ProgressBar in a field for fast access.
mLoadingProgressBar =
(ProgressBar) findViewById(R.id.progressBar_loading);
// Invoke the special onCreate() method in GenericActivity,
// passing in the DownloadSongPresenter class to
// instantiate/manage and "this" to provide
// DownloadSoundPresenter with the DownloadSongActivity
// instance as a callback target.
super.onCreate(DownloadSongPresenter.class,
this);
// Make the ProgressBar visible.
mLoadingProgressBar.setVisibility(View.VISIBLE);
// Explain which song we're downloading.
Utils.showToast(this,
"Downloading the song at URL "
+ DEFAULT_SONG);
// Download the requested song, which runs asynchronously and
// dispatches onDownloadComplete() when it's finished.
getPresenter().downloadSong(Uri.parse(DEFAULT_SONG));
}
/**
* Send the @a songUri to the CommandProcessActivity along with
* the command to execute to play the song.
*/
public void onDownloadComplete(Uri songUri) {
// Make the ProgressBar invisible.
mLoadingProgressBar.setVisibility(View.INVISIBLE);
if (songUri == null)
Utils.showToast(this,
"songUri not downloaded properly");
else
// Start the Activity using the Async player.
startMusicCommandProcessorActivity
(ASYNC_PLAYER,
"Async",
songUri);
}
/**
* Start the MusicCommandProcessorActivity with the given @a
* playerType to play the given @a songUri.
*/
private void startMusicCommandProcessorActivity(int playerType,
String playerName,
Uri songUri) {
// Create an intent that will start an Activity to play a song
// for the user using the given type of player.
final Intent intent =
MusicCommandProcessorActivity.makeIntent
(makeParcelableCommandMusic(playerType),
songUri);
// Verify that the intent will resolve to an Activity.
if (intent.resolveActivity(getPackageManager()) != null) {
Utils.showToast(this,
"Playing song with the "
+ playerName
+ " player");
// Start the MusicCommandProcessorActivity with this
// implicit intent.
startActivityForResult(intent,
playerType);
} else
Utils.showToast(this,
"No Activity found to play songs");
}
/**
* Hook method called back by the Android Activity framework when
* an Activity that's been launched exits, giving the requestCode
* it was started with, the resultCode it returned, and any
* additional data from it.
*/
@Override
protected void onActivityResult(int requestCode,
int resultCode,
Intent data) {
// Check if the started Activity completed successfully.
if (resultCode == Activity.RESULT_OK) {
// Check if the request code is what we're expecting.
if (requestCode == ASYNC_PLAYER) {
// Start the Activity using the Service player.
startMusicCommandProcessorActivity
(SERVICE_PLAYER,
"Service",
data.getData());
} else if (requestCode == SERVICE_PLAYER) {
Utils.showToast(this,
"Shutting down");
finish();
}
}
}
/**
* Factory method that makes the appropriate type of parcelable command.
*/
private ParcelableCommandMusic makeParcelableCommandMusic(int type) {
if (type == ASYNC_PLAYER)
return new ParcelableCommandMusicAsync();
else if (type == SERVICE_PLAYER)
return new ParcelableCommandMusicService();
else
throw new IllegalArgumentException();
}
}