package com.geek_alarm.android.activities;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ListView;
import com.geek_alarm.android.AlarmSound;
import com.geek_alarm.android.R;
import com.geek_alarm.android.Utils;
import com.geek_alarm.android.adapters.AlarmSoundAdapter;
import com.lamerman.FileDialog;
/**
* Activity for selecting sound.
* It displays:
* 1. option to choose custom sound.
* 2. built in mario sound.
* 3. all alarm and ringtone sounds available on device.
*
*/
public class AlarmSoundPickerActivity extends Activity {
private AlarmSoundAdapter adapter;
private MediaPlayer player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.alarm_sound_picker);
findViewById(R.id.ok).setOnClickListener(new OkListener());
findViewById(R.id.cancel).setOnClickListener(new CancelListener());
setUpListView();
setSelected(Utils.getCurrentAlarmSound());
player = new MediaPlayer();
}
private void setUpListView() {
List<AlarmSound> sounds = new ArrayList<AlarmSound>();
// Add option to choose custom sound.
sounds.add(new AlarmSound(getResources().getString(R.string.custom),
null));
// Add android alarms.
sounds.addAll(getStandardAlarms());
adapter =
new AlarmSoundAdapter(this, sounds, new SoundClickListener());
ListView listView = (ListView)findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
/**
* Looks up sound in available sounds and selects option, if found.
* If no option found, sets first "Custom" selected.
* @param sound
*/
private void setSelected(Uri sound) {
// Skip sound at position 0, because it is custom sound
// with uri equals to null.
for (int i = 1; i < adapter.getCount(); i++) {
if (adapter.getItem(i).getUri().equals(sound)) {
adapter.setSelected(i);
return;
}
}
adapter.getItem(0).setUri(sound);
adapter.setSelected(0);
}
/**
* Retrieves list of standard android sounds.
* It gets TYPE_ALARM and TYPE_RINGTONE sounds.
* @return list
*/
private List<AlarmSound> getStandardAlarms() {
RingtoneManager manager = new RingtoneManager(this);
manager.setType(RingtoneManager.TYPE_ALARM | RingtoneManager.TYPE_RINGTONE);
List<AlarmSound> sounds = new ArrayList<AlarmSound>();
Cursor cursor = manager.getCursor();
int i = 0;
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext(), i++) {
String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
sounds.add(new AlarmSound(title, manager.getRingtoneUri(i)));
}
cursor.deactivate();
return sounds;
}
@Override
protected void onDestroy() {
super.onDestroy();
player.release();
}
/**
* Callback, which passed to AlarmSoundAdapter.
* It's invoked when user select any sound.
* This callback starts playing selected sound or
* open file dialog, if user selected "Custom" option.
*/
public class SoundClickListener {
public void onClick(int position) {
AlarmSound sound = adapter.getItem(position);
// Open file dialog if "Custom" option selected.
if (position == 0) {
if (player.isPlaying()) {
player.stop();
}
Intent intent = new Intent(AlarmSoundPickerActivity.this, FileDialog.class);
String startUri = adapter.getItem(0).getUri() == null ? "" : adapter.getItem(0).getUri().toString();
intent.putExtra(FileDialog.START_URI, startUri);
startActivityForResult(intent, 0);
return;
}
// Play music otherwise.
try {
player.reset();
player.setDataSource(AlarmSoundPickerActivity.this, sound.getUri());
player.prepare();
player.start();
} catch (Exception e) {
// Don't know what should I do here.
Log.e(getClass().getName(), "Can't play sound", e);
}
}
}
/**
* Invoked after user has selected music in filedialog or canceled it.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_CANCELED) {
this.adapter.selectPrevious();
} else if (resultCode == Activity.RESULT_OK) {
Uri uri = Uri.parse(data.getStringExtra(FileDialog.RESULT_URI));
this.adapter.getItem(0).setUri(uri);
saveCurrentSoundAndExit();
}
}
private void saveCurrentSoundAndExit() {
Uri uri = adapter.getItem(adapter.getSelected()).getUri();
Utils.setCurrentAlarmSound(uri);
finish();
}
private class OkListener implements OnClickListener {
@Override
public void onClick(View v) {
saveCurrentSoundAndExit();
}
}
private class CancelListener implements OnClickListener {
@Override
public void onClick(View v) {
finish();
}
}
}