@Override public void onClick(View v) { gridview.setVisibility(View.GONE); if (bible.getCount(Bible.TYPE.VERSION) == 0 && bible.getDatabase() == null && v.getId() != R.id.version) { return; } switch (v.getId()) { case R.id.version: getVerse(); case R.id.book: case R.id.chapter: case R.id.items: showSpinner(v); break; case R.id.search: onSearchRequested(); break; case R.id.share: if (!copytext.equals("")) { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, copytext); sendIntent.setType("text/plain"); startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.share))); } } }
protected String formatOsisItem(OsisItem item) { String book = bible.get(Bible.TYPE.HUMAN, bible.getPosition(Bible.TYPE.OSIS, item.book)); return book + " " + item.chapter + (item.verse.equals("") ? "" : ":" + item.verse) + (item.end.equals("") ? "" : "-" + item.end); }
private int getMatt() { int matt = bible.getPosition(Bible.TYPE.OSIS, "Matt"); if (matt > 0 && matt * 2 > bible.getCount(Bible.TYPE.OSIS)) { return matt; } else { return -1; } }
public void setItemText(int index) { if (items != null && index >= 0 && index < items.size()) { OsisItem item = items.get(index); String book = bible.get(Bible.TYPE.BOOK, bible.getPosition(Bible.TYPE.OSIS, item.book)) + item.chapter; if (!item.verse.equals("") && !item.end.equals("")) { book += ":" + item.verse + "-" + item.end; } else if (!item.verse.equals("") || !item.end.equals("")) { book += ":" + item.verse + item.end; } ((TextView) findViewById(R.id.items)).setText(book); } }
private void _showData() { version = bible.getVersion(); SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); fontsize = sp.getInt("fontsize-" + version, 0); if (fontsize == 0) { fontsize = sp.getInt("fontsize", 16); } if (fontsize > 32) { fontsize = 32; } if (!osis.equals("")) { uri = Provider.CONTENT_URI_CHAPTER.buildUpon().appendEncodedPath(osis).build(); } showView(R.id.search, true); if (items == null || items.size() == 0) { showView(R.id.items, false); showView(R.id.book, true); showView(R.id.chapter, true); showUri(); } else { showView(R.id.items, true); showView(R.id.book, false); showView(R.id.chapter, false); if (this.index > -1 && this.index < items.size()) { showItem(this.index); } else { showItem(0); } } }
private void setBookChapter() { book = osis.split("\\.")[0]; if (osis.split("\\.").length > 1) { chapter = osis.split("\\.")[1]; } else { chapter = "0"; } Log.d(TAG, "set book chapter, osis: " + osis); setItemText(this.index); ((TextView) findViewById(R.id.version)).setText(bible.getVersionName(bible.getVersion())); ((TextView) findViewById(R.id.book)) .setText(bible.get(Bible.TYPE.BOOK, bible.getPosition(Bible.TYPE.OSIS, book))); if (!"".equals(verse) && !"".equals(end)) { ((TextView) findViewById(R.id.chapter)).setText(chapter + ":" + verse + "-" + end); } else if (!"".equals(verse) || !"".equals(end)) { ((TextView) findViewById(R.id.chapter)).setText(chapter + ":" + verse + end); } else { ((TextView) findViewById(R.id.chapter)).setText(chapter); } }
private void _showUri() { version = bible.getVersion(); Log.d(TAG, "showuri: " + uri); if (uri == null) { Log.d(TAG, "show null uri, use default"); uri = Provider.CONTENT_URI_CHAPTER .buildUpon() .appendEncodedPath(null) .fragment(version) .build(); } Cursor cursor = null; try { cursor = getContentResolver().query(uri, null, null, null, null); } catch (SQLiteException e) { showContent("", getString(R.string.queryerror)); return; } catch (Exception e) { } if (cursor != null) { cursor.moveToFirst(); osis = cursor.getString(cursor.getColumnIndexOrThrow(Provider.COLUMN_OSIS)); osis_next = cursor.getString(cursor.getColumnIndexOrThrow(Provider.COLUMN_NEXT)); osis_prev = cursor.getString(cursor.getColumnIndexOrThrow(Provider.COLUMN_PREVIOUS)); final String human = cursor.getString(cursor.getColumnIndexOrThrow(Provider.COLUMN_HUMAN)); final String content = cursor.getString(cursor.getColumnIndexOrThrow(Provider.COLUMN_CONTENT)); cursor.close(); showContent(human + " | " + version, content); } else { Log.d(TAG, "no such chapter, try first chapter"); Uri nulluri = Provider.CONTENT_URI_CHAPTER .buildUpon() .appendEncodedPath(null) .fragment(version) .build(); if (!nulluri.equals(uri)) { uri = nulluri; showUri(); } else { showContent("", getString(R.string.queryerror)); } } }
private boolean setButtonsControllerAPI11(WebView webview) { Object mZoomManager = null; // android 4.1, webview.mProvider.mZoomManager.getCurrentZoomControl().getControls() Object mProvider = Bible.getField(webview, WebView.class, "mProvider"); if (mProvider != null) { mZoomManager = Bible.getField(mProvider, mProvider.getClass(), "mZoomManager"); } else { // android 4.0, webview.mZoomManager.getCurrentZoomControl().getControls() mZoomManager = Bible.getField(webview, WebView.class, "mZoomManager"); } if (mZoomManager == null) { return false; } try { // let canZoomOut always be true, part1 Field MINIMUM_SCALE_INCREMENT = mZoomManager.getClass().getDeclaredField("MINIMUM_SCALE_INCREMENT"); MINIMUM_SCALE_INCREMENT.setAccessible(true); MINIMUM_SCALE_INCREMENT.set(mZoomManager, -128.0f); } catch (Exception e) { Log.e( TAG, "cannot set " + mZoomManager.getClass().getName() + ".MINIMUM_SCALE_INCREMENT to -128.0f", e); return false; } try { // let canZoomOut always be true, part2 Field mInZoomOverview = mZoomManager.getClass().getDeclaredField("mInZoomOverview"); mInZoomOverview.setAccessible(true); mInZoomOverview.set(mZoomManager, false); } catch (Exception e) { Log.e( TAG, "cannot set " + mZoomManager.getClass().getName() + ".mInZoomOverview to false", e); return false; } if (mZoomButtonsController != null) { return true; } try { Method getCurrentZoomControl = mZoomManager.getClass().getDeclaredMethod("getCurrentZoomControl"); getCurrentZoomControl.setAccessible(true); Object mEmbeddedZoomControl = getCurrentZoomControl.invoke(mZoomManager); Method getControls = mEmbeddedZoomControl.getClass().getDeclaredMethod("getControls"); getControls.setAccessible(true); mZoomButtonsController = (ZoomButtonsController) getControls.invoke(mEmbeddedZoomControl); } catch (Exception e) { Log.e( TAG, "cannot call " + mZoomManager.getClass().getName() + ".getCurrentZoomControl().getControls()", e); return false; } return true; }
@Override public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { gridview.setVisibility(View.GONE); switch (gridviewid) { case R.id.book: int matt = getMatt(); String newbook; if (matt > 0) { if (pos % 2 == 0) { newbook = bible.get(Bible.TYPE.OSIS, pos / 2); } else { newbook = bible.get(Bible.TYPE.OSIS, matt + pos / 2); } } else { newbook = bible.get(Bible.TYPE.OSIS, pos); } if (!newbook.equals("") && !newbook.equals(book)) { storeOsisVersion(); chapter = PreferenceManager.getDefaultSharedPreferences(this).getString(newbook, "1"); openOsis(newbook + "." + chapter); } break; case R.id.chapter: openOsis(String.format("%s.%d", book, pos + 1)); break; case R.id.version: storeOsisVersion(); if (pos >= bible.getCount(Bible.TYPE.VERSION)) { String link_market = "<a href=\"market://search?q=" + getString(R.string.bibledatalink) + "&c=apps\">market://search?q=" + getString(R.string.bibledatahuman) + "&c=apps</a>"; String body = "<div id=\"pb-demo\">" + getString( R.string.moreversion, new Object[] { link_market, link_github, "<a href=\"mailto:[email protected]\">Liu DongMiao</a>" }) + "</div>\n"; showContent("", body); return; } version = bible.get(Bible.TYPE.VERSION, pos); Log.d(TAG, "version: " + version); bible.setVersion(version); fontsize = PreferenceManager.getDefaultSharedPreferences(this) .getInt("fontsize-" + version, fontsize); uri = Provider.CONTENT_URI_CHAPTER .buildUpon() .appendEncodedPath(osis) .fragment(version) .build(); showUri(); break; case R.id.items: if (items != null && pos < items.size()) { showItem(pos); } else { showView(R.id.book, true); showView(R.id.chapter, true); showView(R.id.items, false); items.clear(); findViewById(R.id.book).performClick(); } break; } }
private void showSpinner(View v) { adapter.clear(); gridviewid = v.getId(); switch (v.getId()) { case R.id.book: int matt = getMatt(); gridview.setNumColumns(2); Log.d(TAG, "book=" + book); selected = bible.get(Bible.TYPE.HUMAN, bible.getPosition(Bible.TYPE.OSIS, book)); if (matt > 0) { for (int id = 0; id < matt; id++) { int right = matt + id; adapter.add(bible.get(Bible.TYPE.HUMAN, id)); if (right < bible.getCount(Bible.TYPE.OSIS)) { adapter.add(bible.get(Bible.TYPE.HUMAN, right)); } else { adapter.add(""); } } } else { for (String string : bible.get(Bible.TYPE.HUMAN)) { adapter.add(string); } } break; case R.id.chapter: gridview.setNumColumns(5); selected = chapter; String chapters = bible.get(Bible.TYPE.CHAPTER, bible.getPosition(Bible.TYPE.OSIS, book)); int maxchapter = 1; try { maxchapter = Integer.parseInt(chapters); } catch (Exception e) { } for (int i = 1; i <= maxchapter; i++) { adapter.add(String.valueOf(i)); } break; case R.id.version: gridview.setNumColumns(1); Log.d(TAG, "version=" + version); selected = bible.getVersionFullname(version); for (String string : bible.get(Bible.TYPE.VERSION)) { Log.d(TAG, "add version " + string); adapter.add(bible.getVersionFullname(string)); } adapter.add(getString(R.string.more)); break; case R.id.items: gridview.setNumColumns(1); Log.d(TAG, "version=" + version); for (OsisItem item : items) { adapter.add(formatOsisItem(item)); } adapter.add(getString(R.string.otherbook)); selected = formatOsisItem(items.get(index)); break; } if (adapter.getCount() > 0) { gridview.setVisibility(View.VISIBLE); gridview.setSelection(adapter.getPosition(selected)); } else { gridview.setVisibility(View.GONE); showUri(); } }
private void _showContent(String title, String content) { if (!title.equals("")) { versename = "pb-" + version + "-" + book.toLowerCase(Locale.US) + "-" + chapter; } else { versename = "versename"; } copytext = ""; showView(R.id.share, !copytext.equals("")); String context = content; // for biblegateway.com context = context.replaceAll( "<span class=\"chapternum\">.*?</span>", "<sup class=\"versenum\">1 </sup>"); context = context.replaceAll("<span class=\"chapternum mid-paragraph\">.*?</span>", ""); context = context.replaceAll( "(<strong>\\D*?(\\d+).*?</strong>)", "<span class=\"pb-verse\" title=\"$2\"><a id=\"" + versename + "-$2\"></a><sup>$1</sup></span>"); context = context.replaceAll( "<sup(.*?>\\D*?(\\d+).*?)</sup>", "<span class=\"pb-verse\" title=\"$2\"><a id=\"" + versename + "-$2\"></a><sup><strong$1</strong></sup></span>"); if (Locale.getDefault().equals(Locale.SIMPLIFIED_CHINESE)) { context = context.replaceAll("「", "“").replaceAll("」", "”"); context = context.replaceAll("『", "‘").replaceAll("』", "’"); } fontsize = (int) (fontsize * scale); if (fontsize > 32) { fontsize = 24; } String body = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n"; body += "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">\n"; body += "<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"; body += "<meta name=\"viewport\" content=\"target-densitydpi=device-dpi, width=device-width, initial-scale=1.0, minimum-scale=0.1, maximum-scale=2\" />\n"; body += "<style type=\"text/css\">\n"; if (font.exists()) { body += "@font-face { font-family: 'custom'; src: url('" + font.getAbsolutePath() + "'); }\n"; body += "body {font-family: 'custom', serif; line-height: 1.4em; font-weight: 100; font-size: " + fontsize + "pt;}\n"; } else { body += "body {font-family: serif; line-height: 1.4em; font-weight: 100; font-size: " + fontsize + "pt;}\n"; } body += ".trans {display: none;}\n"; body += ".wordsofchrist {color: red;}\n"; body += "h1 {font-size: 2em;}\n"; body += "h2 {font-size: 1.5em;}\n"; body += ".selected {" + background + "}\n"; body += ".highlight {" + background + "}\n"; body += "</style>\n"; body += "<title>" + title + "</title>\n"; body += "<link rel=\"stylesheet\" type=\"text/css\" href=\"reader.css\"/>\n"; body += "<script type=\"text/javascript\">\n"; body += String.format( "var verse_start=%s, verse_end=%s, versename=\"%s\", search=\"%s\";", verse.equals("") ? "-1" : verse, end.equals("") ? "-1" : verse, versename, items != null ? search : ""); verse = ""; search = ""; body += "\n</script>\n"; body += "<script type=\"text/javascript\" src=\"reader.js\"></script>\n"; body += "</head>\n<body>\n"; if (!"".equals(title) && bible.getVersion().endsWith("demo")) { String link_market = "<a href=\"market://search?q=" + getString(R.string.bibledatalink) + "&c=apps\">market://search?q=" + getString(R.string.bibledatahuman) + "&c=apps</a>"; body += "<div id=\"pb-demo\">" + getString(R.string.noversion, new Object[] {link_market, link_github}) + "</div>\n"; } body += "<div id=\"content\">\n"; body += context; body += "</div>\n</body>\n</html>\n"; webview.clearCache(true); webview.setInitialScale(100); scale = 1.0f; webview.loadDataWithBaseURL("file:///android_asset/", body, "text/html", "utf-8", null); dismiss(); /* { String path = "/sdcard/" + versename + ".html"; try { Log.d("write", path); java.io.OutputStream os = new java.io.BufferedOutputStream(new java.io.FileOutputStream(new java.io.File(path))); os.write(body.getBytes()); os.close(); } catch (Exception e) { Log.e("write", path, e); } } */ }
@Override @SuppressLint("SetJavaScriptEnabled") protected void onCreate(Bundle savedInstanceState) { // on MB612, the search and share icon is so dark ... if (Build.MODEL.equals("MB612")) { setTheme(android.R.style.Theme_Light_NoTitleBar); } super.onCreate(savedInstanceState); setContentView(R.layout.chapter); findViewById(R.id.book).setOnClickListener(this); findViewById(R.id.chapter).setOnClickListener(this); findViewById(R.id.search).setOnClickListener(this); findViewById(R.id.version).setOnClickListener(this); findViewById(R.id.share).setOnClickListener(this); findViewById(R.id.items).setOnClickListener(this); adapter = new ArrayAdapter<String>(this, R.layout.grid) { private LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; ToggleButton grid = null; if (view == null) { view = inflater.inflate(R.layout.grid, null); } grid = (ToggleButton) view.findViewById(R.id.text1); grid.setTextOn(getItem(position)); grid.setTextOff(getItem(position)); grid.setChecked(getItem(position).equals(selected)); grid.setVisibility(getItem(position).equals("") ? View.INVISIBLE : View.VISIBLE); return view; } }; gridview = (GridView) findViewById(R.id.gridview); gridview.setAdapter(adapter); gridview.setVisibility(View.GONE); gridview.setOnItemClickListener(this); setGestureDetector(); webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setSupportZoom(true); webview.getSettings().setBuiltInZoomControls(true); webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); webview.addJavascriptInterface( new Object() { @SuppressWarnings("unused") public void setVerse(String string) { synchronized (verseLock) { verse = string; Log.d(TAG, "verse from javascript: " + verse); verseLock.notifyAll(); } } @SuppressWarnings({"unused", "deprecation"}) public void setCopyText(String text) { if (!text.equals("")) { copytext = bible .getVersionFullname(version) .replace("(" + getString(R.string.demo) + ")", "") + " "; copytext += bible.get(Bible.TYPE.HUMAN, bible.getPosition(Bible.TYPE.OSIS, book)) + " " + chapter + ":" + text; ((android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE)) .setText(copytext); Log.d(TAG, "copy from javascript: " + copytext); } else { copytext = ""; } handler.sendEmptyMessage(COPYTEXT); } }, "android"); setZoomButtonsController(webview); osis = PreferenceManager.getDefaultSharedPreferences(this).getString("osis", "null"); uri = Provider.CONTENT_URI_CHAPTER.buildUpon().appendEncodedPath(osis).fragment(version).build(); setIntentData(); int color = 0x6633B5E5; Integer mHighlightColor = (Integer) Bible.getField(findViewById(R.id.version), TextView.class, "mHighlightColor"); if (mHighlightColor != null) { color = mHighlightColor.intValue(); } background = String.format( "background: rgba(%d, %d, %d, %.2f);", (color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, (color >>> 24) / 255.0); Log.d(TAG, "onCreate"); hasIntentData = true; font = new File( new File( new File( new File( new File(Environment.getExternalStorageDirectory(), "Android"), "data"), getPackageName()), "files"), "custom.ttf"); }