package yuku.alkitab.base.pdbconvert; import android.content.Context; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.Spinner; import android.widget.TextView; import com.afollestad.materialdialogs.MaterialDialog; import com.compactbyte.android.bible.PDBFileStream; import com.compactbyte.bibleplus.reader.BiblePlusPDB; import com.compactbyte.bibleplus.reader.BookInfo; import yuku.afw.V; import yuku.alkitab.base.widget.Localized; import yuku.alkitab.debug.R; import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; public class ConvertOptionsDialog { public static final String TAG = ConvertOptionsDialog.class.getSimpleName(); Context context; MaterialDialog alert; ConvertOptionsCallback callback; Spinner cbEncoding; TextView lSample; CheckBox cAddlTitle; BiblePlusPDB pdb; BookInfo bookInfo; ArrayAdapter<String> encodingAdapter; public interface ConvertOptionsCallback { void onOkYes2(ConvertPdbToYes2.ConvertParams params); void onPdbReadError(Throwable e); } public static class PdbKnownErrorException extends Exception { public PdbKnownErrorException(BiblePlusPDB pdb) { super(constructExceptionString(pdb)); } static String constructExceptionString(BiblePlusPDB pdb) { int reason = pdb.getFailReason(); if (reason == BiblePlusPDB.ERR_NOT_BIBLE_PLUS_FILE) { String type = pdb.getHeader().getType(); String creator = pdb.getHeader().getCreator(); return Localized.string(R.string.pdb_error_not_palmbible, type, creator); } else if (reason == BiblePlusPDB.ERR_FILE_CORRUPTED) { return Localized.string(R.string.pdb_error_corrupted); } else if (reason == BiblePlusPDB.ERR_NOT_PDB_FILE) { return Localized.string(R.string.pdb_error_not_pdb_file); } return null; } } public ConvertOptionsDialog(Context context, String filenamepdb, ConvertOptionsCallback callback) { this.context = context; this.callback = callback; try { pdb = new BiblePlusPDB(new PDBFileStream(filenamepdb), Tabs.hebrewTab, Tabs.greekTab); boolean versionInfoOk = pdb.loadVersionInfo(); if (!versionInfoOk) { throw new PdbKnownErrorException(pdb); } pdb.loadWordIndex(); pdb.getBookCount(); bookInfo = pdb.getBook(0); bookInfo.openBook(); bookInfo.getVerse(1, 1); } catch (Throwable e) { callback.onPdbReadError(e); if (pdb != null) { try { pdb.close(); } catch (IOException e1) { Log.e(TAG, "IO exception when closing", e1); } } return; } this.alert = new MaterialDialog.Builder(context) .customView(R.layout.dialog_pdbconvert_options, false) .title(R.string.pdb_file_options) .positiveText(R.string.ok) .negativeText(R.string.cancel) .onPositive((dialog, which) -> bOk_click()) .build(); final View dialogLayout = this.alert.getCustomView(); cbEncoding = V.get(dialogLayout, R.id.cbEncoding); lSample = V.get(dialogLayout, R.id.lSample); cAddlTitle = V.get(dialogLayout, R.id.cAddlTitle); String tabEncoding = null; if (pdb.isGreek()) { tabEncoding = context.getString(R.string.greek_charset); } else if (pdb.isHebrew()) { tabEncoding = context.getString(R.string.hebrew_charset); } List<String> charsets = new ArrayList<>(); if (tabEncoding == null) { for (Map.Entry<String, Charset> charset: Charset.availableCharsets().entrySet()) { String key = charset.getKey(); Log.d(TAG, "available charset: " + key); charsets.add(key); } Collections.sort(charsets, (a, b) -> { int va = 0; int vb = 0; if (a.equalsIgnoreCase("utf-8")) va = -2; if (a.equalsIgnoreCase("iso-8859-1")) va = -1; if (b.equalsIgnoreCase("utf-8")) vb = -2; if (b.equalsIgnoreCase("iso-8859-1")) vb = -1; if (va == 0 && vb == 0) { return a.compareToIgnoreCase(b); } else { return va - vb; } }); } else { charsets.add(tabEncoding); cbEncoding.setEnabled(false); } encodingAdapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item, charsets); encodingAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); cbEncoding.setAdapter(encodingAdapter); showSample("utf-8"); // default! if greek or hebrew, this won't be cared! cbEncoding.setOnItemSelectedListener(cbEncoding_itemSelected); } void showSample(String encoding) { pdb.setEncoding(encoding); String bookName = bookInfo.getFullName(); String verse = bookInfo.getVerse(1, 1); if (verse.length() > 90) { verse = verse.substring(0, 88) + "..."; } lSample.setText(bookName + " 1:1 " + verse); } private OnItemSelectedListener cbEncoding_itemSelected = new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String encoding = encodingAdapter.getItem(position); showSample(encoding); } @Override public void onNothingSelected(AdapterView<?> parent) { } }; public void show() { if (alert != null) alert.show(); } protected void bOk_click() { try { pdb.close(); } catch (IOException e1) { Log.e(TAG, "IO exception when closing", e1); } ConvertPdbToYes2.ConvertParams params = new ConvertPdbToYes2.ConvertParams(); params.inputEncoding = encodingAdapter.getItem(cbEncoding.getSelectedItemPosition()); params.includeAddlTitle = cAddlTitle.isChecked(); callback.onOkYes2(params); } }