package com.alimuzaffar.ramadanalarm;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import com.alimuzaffar.ramadanalarm.util.AlarmUtils;
import com.alimuzaffar.ramadanalarm.util.AppSettings;
import com.alimuzaffar.ramadanalarm.util.ScreenUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class SetAlarmActivity extends AppCompatActivity implements Constants,
CompoundButton.OnCheckedChangeListener, View.OnClickListener {
int mIndex = 0;
AppSettings settings;
CheckBox mAlarm;
CheckBox mAscending;
CheckBox mRandom;
CheckBox mAdhan;
TextView mRingtone;
TextView[] mPrayers = new TextView[5];
SetAlarmRamadanHelper mRamadanHelper;
Map<String, Uri> mRingtonesMap;
private Uri mLastSelectedRingtone = null;
private String mLastSelectedRingtoneName = "Default";
private MediaPlayer mMediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ScreenUtils.lockOrientation(this);
setContentView(R.layout.activity_set_alarm);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mAlarm = (CheckBox) findViewById(R.id.alarm);
mAscending = (CheckBox) findViewById(R.id.ascending_alarm);
mRandom = (CheckBox) findViewById(R.id.random_ringtone);
mAdhan = (CheckBox) findViewById(R.id.adhan_ringtone);
mRingtone = (TextView) findViewById(R.id.ringtone);
mPrayers[0] = (TextView) findViewById(R.id.fajr);
mPrayers[1] = (TextView) findViewById(R.id.dhuhr);
mPrayers[2] = (TextView) findViewById(R.id.asr);
mPrayers[3] = (TextView) findViewById(R.id.maghrib);
mPrayers[4] = (TextView) findViewById(R.id.isha);
for (int i = 0; i < mPrayers.length; i++) {
TextView tv = mPrayers[i];
tv.setOnClickListener(this);
tv.setTag(i);
}
Intent intent = getIntent();
if (intent != null && intent.hasExtra(EXTRA_ALARM_INDEX)) {
mIndex = intent.getIntExtra(EXTRA_ALARM_INDEX, 0);
}
settings = AppSettings.getInstance(this);
// Init the alarm settings
if (settings.isAlarmSetFor(mIndex)) {
mAlarm.setChecked(true);
for (int i = 0; i < mPrayers.length; i++) {
TextView tv = mPrayers[i];
tv.setEnabled(true);
boolean status = getPrayerAlarmStatus(i);
tv.setSelected(status);
}
}
mAscending.setChecked(settings.getBoolean(AppSettings.Key.IS_ASCENDING_ALARM));
mRandom.setChecked(settings.getBoolean(AppSettings.Key.IS_RANDOM_ALARM));
mAdhan.setChecked(settings.getBoolean(AppSettings.Key.USE_ADHAN));
//attach listener after init to prevent unpredictable result.
mAlarm.setOnCheckedChangeListener(this);
mAscending.setOnCheckedChangeListener(this);
mRandom.setOnCheckedChangeListener(this);
mAdhan.setOnCheckedChangeListener(this);
mRamadanHelper = new SetAlarmRamadanHelper(this, mIndex);
setupRingtoneSelection();
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int id = buttonView.getId();
if (id == mAlarm.getId()) {
settings.setAlarmFor(mIndex, isChecked);
for (int i = 0; i < mPrayers.length; i++) {
TextView tv = mPrayers[i];
tv.setEnabled(isChecked);
tv.setSelected(isChecked);
setPrayerAlarmStatus(i, isChecked);
}
if (!isChecked) {
mRamadanHelper.setRamadanOption(false);
}
mRamadanHelper.setRamadanOptionEnabled(isChecked);
} else if (id == mAscending.getId()) {
settings.set(AppSettings.Key.IS_ASCENDING_ALARM, isChecked);
} else if (id == mRandom.getId()) {
settings.set(AppSettings.Key.IS_RANDOM_ALARM, isChecked);
if (isChecked) {
mAdhan.setChecked(false);
}
} else if (id == mAdhan.getId()) {
settings.set(AppSettings.Key.USE_ADHAN, isChecked);
if (isChecked) {
mRandom.setChecked(false);
}
}
}
@Override
public void onClick(View v) {
int index = (Integer) v.getTag();
boolean isSet = getPrayerAlarmStatus(index);
setPrayerAlarmStatus(index, !isSet);
v.setSelected(!isSet);
}
private void setPrayerAlarmStatus(int prayerIndex, boolean isOn) {
String key = getPrayerKeyFromIndex(prayerIndex);
if (key != null) {
settings.set(key, isOn);
}
}
private boolean getPrayerAlarmStatus(int prayerIndex) {
String key = getPrayerKeyFromIndex(prayerIndex);
if (key != null) {
return settings.getBoolean(key);
}
return false;
}
private String getPrayerKeyFromIndex(int prayerIndex) {
String key = null;
switch (prayerIndex) {
case 0:
key = settings.getKeyFor(AppSettings.Key.IS_FAJR_ALARM_SET, mIndex);
break;
case 1:
key = settings.getKeyFor(AppSettings.Key.IS_DHUHR_ALARM_SET, mIndex);
break;
case 2:
key = settings.getKeyFor(AppSettings.Key.IS_ASR_ALARM_SET, mIndex);
break;
case 3:
key = settings.getKeyFor(AppSettings.Key.IS_MAGHRIB_ALARM_SET, mIndex);
break;
case 4:
key = settings.getKeyFor(AppSettings.Key.IS_ISHA_ALARM_SET, mIndex);
break;
}
return key;
}
@Override
public void onBackPressed() {
boolean anyAlarmSelected = false;
for (TextView tv : mPrayers) {
if (tv.isSelected()) {
anyAlarmSelected = true;
}
}
if (!anyAlarmSelected) {
mAlarm.setChecked(false);
}
Intent data = new Intent();
if (getParent() == null) {
setResult(RESULT_OK, data);
} else {
getParent().setResult(RESULT_OK, data);
}
super.onBackPressed();
}
private void setupRingtoneSelection() {
mRingtonesMap = AlarmUtils.getRingtones(SetAlarmActivity.this);
mRingtone.setText(getString(R.string.set_alarm_select_ringtone,
settings.getString(AppSettings.Key.SELECTED_RINGTONE_NAME, mLastSelectedRingtoneName)));
mRingtone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final List<String> ringtoneKeys = new ArrayList<>(mRingtonesMap.keySet());
String ringtoneUri = settings.getString(AppSettings.Key.SELECTED_RINGTONE, "");
int selected = -1;
for (int i = 0; i < ringtoneKeys.size(); i++) {
String ring = ringtoneKeys.get(i);
if (mRingtonesMap.get(ring).toString().equalsIgnoreCase(ringtoneUri)) {
selected = i;
break;
}
}
AlarmUtils.getRingtonesDialog(SetAlarmActivity.this, ringtoneKeys, selected, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { //item selected
String name = ringtoneKeys.get(which);
mLastSelectedRingtoneName = name;
mLastSelectedRingtone = mRingtonesMap.get(name);
try {
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
} else {
mMediaPlayer.stop();
mMediaPlayer.reset();
}
mMediaPlayer.setDataSource(SetAlarmActivity.this, mLastSelectedRingtone);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (IOException ioe) {
//do nothing
}
}
}, new DialogInterface.OnClickListener() { //ok
@Override
public void onClick(DialogInterface dialog, int which) {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
settings.set(AppSettings.Key.SELECTED_RINGTONE, mLastSelectedRingtone.toString());
settings.set(AppSettings.Key.SELECTED_RINGTONE_NAME, mLastSelectedRingtoneName);
//Update the textview
mRingtone.setText(getString(R.string.set_alarm_select_ringtone,
settings.getString(AppSettings.Key.SELECTED_RINGTONE_NAME, mLastSelectedRingtoneName)));
dialog.dismiss();
}
}, new DialogInterface.OnClickListener() { //cancel
@Override
public void onClick(DialogInterface dialog, int which) {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
dialog.dismiss();
}
});
}
});
}
@Override
protected void onDestroy() {
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
}
mMediaPlayer.release();
mMediaPlayer = null;
}
mRingtone.setOnClickListener(null);
super.onDestroy();
}
}