package yuku.alkitab.base.dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import yuku.afw.V; import yuku.alkitab.base.S; import yuku.alkitab.base.U; import yuku.alkitab.base.dialog.base.BaseDialog; import yuku.alkitab.base.model.MVersion; import yuku.alkitab.base.util.Appearances; import yuku.alkitab.base.widget.VersesView; import yuku.alkitab.base.widget.VersesView.VerseSelectionMode; import yuku.alkitab.debug.R; import yuku.alkitab.model.SingleChapterVerses; import yuku.alkitab.model.Version; import yuku.alkitab.util.Ari; import yuku.alkitab.util.IntArrayList; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Dialog that shows a list of verses. There are two modes: * "normal mode" that is created via {@link #newInstance(yuku.alkitab.util.IntArrayList)} to show a list of verses from a single version. * -- field ariRanges is used, compareMode==false. * "compare mode" that is created via {@link #newCompareInstance(int)} to show a list of different version of a verse. * -- field ari is used, compareMode==true. */ public class VersesDialog extends BaseDialog { public static final String TAG = VersesDialog.class.getSimpleName(); private static final String EXTRA_ariRanges = "ariRanges"; private static final String EXTRA_ari = "ari"; private static final String EXTRA_compareMode = "compareMode"; public static abstract class VersesDialogListener { public void onVerseSelected(VersesDialog dialog, int ari) {} public void onComparedVerseSelected(VersesDialog dialog, int ari, MVersion mversion) {} } TextView tReference; VersesView versesView; VersesDialogListener listener; int ari; boolean compareMode; IntArrayList ariRanges; // data that will be passed when one verse is clicked Object[] customCallbackData; Version sourceVersion = S.activeVersion; String sourceVersionId = S.activeVersionId; float textSizeMult = S.getDb().getPerVersionSettings(sourceVersionId).fontSizeMultiplier; DialogInterface.OnDismissListener onDismissListener; public VersesDialog() { } public static VersesDialog newInstance(final IntArrayList ariRanges) { VersesDialog res = new VersesDialog(); Bundle args = new Bundle(); args.putParcelable(EXTRA_ariRanges, ariRanges); res.setArguments(args); return res; } @Override public void onDismiss(final DialogInterface dialog) { super.onDismiss(dialog); if (onDismissListener != null) { onDismissListener.onDismiss(dialog); } } public static VersesDialog newCompareInstance(final int ari) { VersesDialog res = new VersesDialog(); Bundle args = new Bundle(); args.putInt(EXTRA_ari, ari); args.putBoolean(EXTRA_compareMode, true); res.setArguments(args); return res; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, 0); ariRanges = getArguments().getParcelable(EXTRA_ariRanges); ari = getArguments().getInt(EXTRA_ari); compareMode = getArguments().getBoolean(EXTRA_compareMode); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View res = inflater.inflate(R.layout.dialog_verses, container, false); tReference = V.get(res, R.id.tReference); versesView = V.get(res, R.id.versesView); res.setBackgroundColor(S.applied.backgroundColor); versesView.setCacheColorHint(S.applied.backgroundColor); versesView.setVerseSelectionMode(VerseSelectionMode.singleClick); versesView.setSelectedVersesListener(versesView_selectedVerses); // build reference label final StringBuilder sb = new StringBuilder(); if (!compareMode) { for (int i = 0; i < ariRanges.size(); i += 2) { final int ari_start = ariRanges.get(i); final int ari_end = ariRanges.get(i + 1); if (sb.length() > 0) { sb.append("; "); } sb.append(sourceVersion.referenceRange(ari_start, ari_end)); } } else { sb.append(sourceVersion.reference(ari)); } Appearances.applyTextAppearance(tReference, textSizeMult); tReference.setText(sb); if (!compareMode) { final IntArrayList displayedAris = new IntArrayList(); final List<String> displayedVerseTexts = new ArrayList<>(); final List<String> displayedVerseNumberTexts = new ArrayList<>(); final int verse_count = sourceVersion.loadVersesByAriRanges(ariRanges, displayedAris, displayedVerseTexts); customCallbackData = new Object[verse_count]; if (verse_count > 0) { // set up verse number texts for (int i = 0; i < verse_count; i++) { final int ari = displayedAris.get(i); displayedVerseNumberTexts.add(Ari.toChapter(ari) + ":" + Ari.toVerse(ari)); customCallbackData[i] = ari; } class Verses extends SingleChapterVerses { @Override public String getVerse(int verse_0) { return displayedVerseTexts.get(verse_0); } @Override public int getVerseCount() { return displayedVerseTexts.size(); } @Override public String getVerseNumberText(int verse_0) { return displayedVerseNumberTexts.get(verse_0); } } final int firstAri = ariRanges.get(0); versesView.setData(Ari.toBookChapter(firstAri), new Verses(), null, null, 0, sourceVersion, sourceVersionId); } } else { // read each version and display it. First version must be the sourceVersion. final List<MVersion> mversions = S.getAvailableVersions(); // sort such that sourceVersion is first Collections.sort(mversions, (lhs, rhs) -> { int a = U.equals(lhs.getVersionId(), sourceVersionId)? -1: 0; int b = U.equals(rhs.getVersionId(), sourceVersionId)? -1: 0; return a - b; }); final Version[] displayedVersion = new Version[mversions.size()]; customCallbackData = new Object[mversions.size()]; for (int i = 0; i < customCallbackData.length; i++) { customCallbackData[i] = mversions.get(i); } class Verses extends SingleChapterVerses implements SingleChapterVerses.WithTextSizeMult { @Override public String getVerse(int verse_0) { // load version or take from existing if already loaded final MVersion mversion = mversions.get(verse_0); final Version loaded = displayedVersion[verse_0]; final Version version; if (loaded == null) { version = mversion.getVersion(); displayedVersion[verse_0] = version; } else { version = loaded; } if (version == null) { return getString(R.string.version_error_opening, mversion.getVersionId()); } final String res = version.loadVerseText(ari); if (res == null) { return getString(R.string.generic_verse_not_available_in_this_version); } return res; } @Override public int getVerseCount() { return mversions.size(); } @Override public String getVerseNumberText(int verse_0) { // load version or take from existing if already loaded final MVersion mversion = mversions.get(verse_0); final Version loaded = displayedVersion[verse_0]; final Version version; if (loaded == null) { version = mversion.getVersion(); displayedVersion[verse_0] = version; } else { version = loaded; } if (version == null) { return "ERROR"; // could not load version } String res = version.getShortName(); if (res == null) { res = mversion.shortName; } if (res == null) { // still null??? res = version.getLongName(); // this one may not be null. } return res; } @Override public float getTextSizeMult(final int verse_0) { final MVersion mversion = mversions.get(verse_0); return S.getDb().getPerVersionSettings(mversion.getVersionId()).fontSizeMultiplier; } } versesView.setData(Ari.toBookChapter(ari), new Verses(), null, null, 0, null, null); } return res; } VersesView.SelectedVersesListener versesView_selectedVerses = new VersesView.DefaultSelectedVersesListener() { @Override public void onVerseSingleClick(VersesView v, int verse_1 /* this is actually position+1, not necessaryly verse_1 */) { if (listener != null) { if (!compareMode) { listener.onVerseSelected(VersesDialog.this, (Integer) customCallbackData[verse_1 - 1]); } else { // only if the verse is available in this version. final MVersion mversion = (MVersion) customCallbackData[verse_1 - 1]; final Version version = mversion.getVersion(); if (version != null && version.loadVerseText(ari) != null) { listener.onComparedVerseSelected(VersesDialog.this, ari, mversion); } } } } }; public void setListener(final VersesDialogListener listener) { this.listener = listener; } public void setOnDismissListener(final DialogInterface.OnDismissListener onDismissListener) { this.onDismissListener = onDismissListener; } }