package com.quran.labs.androidquran.ui.fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import com.quran.labs.androidquran.R;
import com.quran.labs.androidquran.data.QuranInfo;
import com.quran.labs.androidquran.data.SuraAyah;
import com.quran.labs.androidquran.service.util.AudioRequest;
import com.quran.labs.androidquran.ui.PagerActivity;
import com.quran.labs.androidquran.ui.helpers.HighlightType;
import com.quran.labs.androidquran.util.QuranUtils;
import com.quran.labs.androidquran.widgets.QuranSpinner;
public class AyahPlaybackFragment extends AyahActionFragment {
private static final int REPEAT_MAX = 3;
private static final int ITEM_LAYOUT = R.layout.sherlock_spinner_item;
private static final int ITEM_DROPDOWN_LAYOUT = R.layout.sherlock_spinner_dropdown_item;
private SuraAyah decidedStart;
private SuraAyah decidedEnd;
private boolean shouldEnforce;
private int rangeRepeatCount;
private int verseRepeatCount;
private Button applyButton;
private QuranSpinner startSuraSpinner;
private QuranSpinner startAyahSpinner;
private QuranSpinner endingSuraSpinner;
private QuranSpinner endingAyahSpinner;
private QuranSpinner repeatVerseSpinner;
private QuranSpinner repeatRangeSpinner;
private CheckBox restrictToRange;
private ArrayAdapter<CharSequence> startAyahAdapter;
private ArrayAdapter<CharSequence> endingAyahAdapter;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.audio_panel, container, false);
view.setOnClickListener(mOnClickListener);
startSuraSpinner = (QuranSpinner) view.findViewById(R.id.start_sura_spinner);
startAyahSpinner = (QuranSpinner) view.findViewById(R.id.start_ayah_spinner);
endingSuraSpinner = (QuranSpinner) view.findViewById(R.id.end_sura_spinner);
endingAyahSpinner = (QuranSpinner) view.findViewById(R.id.end_ayah_spinner);
repeatVerseSpinner = (QuranSpinner) view.findViewById(R.id.repeat_verse_spinner);
repeatRangeSpinner = (QuranSpinner) view.findViewById(R.id.repeat_range_spinner);
restrictToRange = (CheckBox) view.findViewById(R.id.restrict_to_range);
applyButton = (Button) view.findViewById(R.id.apply);
applyButton.setOnClickListener(mOnClickListener);
final Context context = getActivity();
startAyahAdapter = initializeAyahSpinner(context, startAyahSpinner);
endingAyahAdapter = initializeAyahSpinner(context, endingAyahSpinner);
initializeSuraSpinner(context, startSuraSpinner, startAyahAdapter);
initializeSuraSpinner(context, endingSuraSpinner, endingAyahAdapter);
final String[] repeatOptions = context.getResources().getStringArray(R.array.repeatValues);
final ArrayAdapter<CharSequence> rangeAdapter =
new ArrayAdapter<>(context, ITEM_LAYOUT, repeatOptions);
rangeAdapter.setDropDownViewResource(
ITEM_DROPDOWN_LAYOUT);
repeatRangeSpinner.setAdapter(rangeAdapter);
repeatRangeSpinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
updateEnforceBounds(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
final ArrayAdapter<CharSequence> verseAdapter =
new ArrayAdapter<>(context, ITEM_LAYOUT, repeatOptions);
verseAdapter.setDropDownViewResource(
ITEM_DROPDOWN_LAYOUT);
repeatVerseSpinner.setAdapter(verseAdapter);
return view;
}
private View.OnClickListener mOnClickListener = v -> {
switch (v.getId()) {
case R.id.apply: {
apply();
break;
}
}
};
private void apply() {
final Context context = getActivity();
if (context instanceof PagerActivity) {
final SuraAyah start = new SuraAyah(
startSuraSpinner.getSelectedItemPosition() + 1,
startAyahSpinner.getSelectedItemPosition() + 1);
final SuraAyah ending = new SuraAyah(
endingSuraSpinner.getSelectedItemPosition() + 1,
endingAyahSpinner.getSelectedItemPosition() + 1);
// force the correct order
final SuraAyah currentStart;
final SuraAyah currentEnding;
if (ending.after(start)) {
currentStart = start;
currentEnding = ending;
} else {
currentStart = ending;
currentEnding = start;
}
final int page = QuranInfo.getPageFromSuraAyah(
currentStart.sura, currentStart.ayah);
final int verseRepeat = positionToRepeat(
repeatVerseSpinner.getSelectedItemPosition());
final int rangeRepeat = positionToRepeat(
repeatRangeSpinner.getSelectedItemPosition());
final boolean enforceRange = restrictToRange.isChecked();
boolean updatedRange = false;
final PagerActivity pagerActivity = (PagerActivity) context;
if (!currentStart.equals(decidedStart) ||
!currentEnding.equals(decidedEnd)) {
// different range or not playing, so make a new request
updatedRange = true;
if (this.start != null) {
final int origPage = decidedStart == null ?
this.start.getPage() : decidedStart.getPage();
if (page != origPage) {
pagerActivity.highlightAyah(currentStart.sura,
currentStart.ayah, HighlightType.AUDIO);
}
}
pagerActivity.playFromAyah(currentStart, currentEnding, page, verseRepeat,
rangeRepeat, enforceRange, true);
} else if (shouldEnforce != enforceRange ||
rangeRepeatCount != rangeRepeat ||
verseRepeatCount != verseRepeat) {
// can just update repeat settings
if (!pagerActivity.updatePlayOptions(
rangeRepeat, verseRepeat, enforceRange)) {
// audio stopped in the process, let's start it
pagerActivity.playFromAyah(currentStart, currentEnding, page, verseRepeat,
rangeRepeat, enforceRange, true);
}
}
pagerActivity.endAyahMode();
if (updatedRange) {
pagerActivity.toggleActionBarVisibility(true);
}
}
}
private void initializeSuraSpinner(final Context context,
QuranSpinner spinner,
final ArrayAdapter<CharSequence> ayahAdapter) {
String[] suras = context.getResources().
getStringArray(R.array.sura_names);
for (int i=0; i<suras.length; i++){
suras[i] = QuranUtils.getLocalizedNumber(context, (i + 1)) +
". " + suras[i];
}
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<>(context, ITEM_LAYOUT, suras);
adapter.setDropDownViewResource(ITEM_DROPDOWN_LAYOUT);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long rowId) {
int sura = position + 1;
int ayahCount = QuranInfo.getNumAyahs(sura);
CharSequence[] ayahs = new String[ayahCount];
for (int i = 0; i < ayahCount; i++){
ayahs[i] = QuranUtils.getLocalizedNumber(context, (i + 1));
}
ayahAdapter.clear();
for (int i=0; i<ayahCount; i++){
ayahAdapter.add(ayahs[i]);
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
private ArrayAdapter<CharSequence> initializeAyahSpinner(
Context context, QuranSpinner spinner) {
final ArrayAdapter<CharSequence> ayahAdapter = new ArrayAdapter<>(context, ITEM_LAYOUT);
ayahAdapter.setDropDownViewResource(ITEM_DROPDOWN_LAYOUT);
spinner.setAdapter(ayahAdapter);
return ayahAdapter;
}
private void updateAyahSpinner(QuranSpinner spinner,
ArrayAdapter<CharSequence> adapter,
int maxAyah,
int currentAyah) {
final Context context = getActivity();
if (context != null) {
CharSequence[] ayahs = new String[maxAyah];
for (int i = 0; i < maxAyah; i++) {
ayahs[i] = QuranUtils.getLocalizedNumber(context, (i + 1));
}
adapter.clear();
for (int i = 0; i < maxAyah; i++) {
adapter.add(ayahs[i]);
}
spinner.setSelection(currentAyah - 1);
}
}
private void updateEnforceBounds(int rangeRepeatPosition) {
if (rangeRepeatPosition > 0) {
restrictToRange.setChecked(true);
restrictToRange.setEnabled(false);
} else {
restrictToRange.setEnabled(true);
}
}
private int repeatToPosition(int repeat) {
if (repeat == -1) {
return REPEAT_MAX;
} else {
return repeat;
}
}
private int positionToRepeat(int position) {
if (position >= REPEAT_MAX) {
return -1;
} else {
return position;
}
}
@Override
protected void refreshView() {
final Context context = getActivity();
if (context instanceof PagerActivity && start != null && end != null) {
final AudioRequest lastRequest =
((PagerActivity) context).getLastAudioRequest();
final SuraAyah start;
final SuraAyah ending;
if (lastRequest != null) {
start = lastRequest.getRangeStart();
ending = lastRequest.getRangeEnd();
verseRepeatCount = lastRequest.getRepeatInfo().getRepeatCount();
rangeRepeatCount = lastRequest.getRangeRepeatCount();
shouldEnforce = lastRequest.shouldEnforceBounds();
decidedStart = start;
decidedEnd = ending;
applyButton.setText(R.string.play_apply);
} else {
start = this.start;
if (this.start.equals(end)) {
final int[] pageBounds = QuranInfo.getPageBounds(start.getPage());
ending = new SuraAyah(pageBounds[2], pageBounds[3]);
shouldEnforce = false;
} else {
ending = end;
shouldEnforce = true;
}
rangeRepeatCount = 0;
verseRepeatCount = 0;
decidedStart = null;
decidedEnd = null;
applyButton.setText(R.string.play_apply_and_play);
}
final int maxAyat = QuranInfo.getNumAyahs(start.sura);
if (maxAyat == -1) {
return;
}
updateAyahSpinner(startAyahSpinner, startAyahAdapter, maxAyat, start.ayah);
final int endAyat = (ending.sura == start.sura) ? maxAyat :
QuranInfo.getNumAyahs(ending.sura);
updateAyahSpinner(endingAyahSpinner, endingAyahAdapter,
endAyat, ending.ayah);
startSuraSpinner.setSelection(start.sura - 1);
endingSuraSpinner.setSelection(ending.sura - 1);
repeatRangeSpinner.setSelection(repeatToPosition(rangeRepeatCount));
repeatVerseSpinner.setSelection(repeatToPosition(verseRepeatCount));
restrictToRange.setChecked(shouldEnforce);
}
}
}