package yuku.alkitabintegration.provider; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import java.util.ArrayList; import java.util.List; import yuku.alkitabintegration.AlkitabIntegrationUtil; public class VerseProvider { public static final String TAG = VerseProvider.class.getSimpleName(); public static class Verse { public long _id; public int ari; public String bookName; public String text; public int getBookId() { return (0xff0000 & ari) >> 16; } public int getChapter() { return (0x00ff00 & ari) >> 8; } public int getVerse() { return (0x0000ff & ari); } @Override public String toString() { return bookName + " " + getChapter() + ":" + getVerse() + " " + text; } } public static class VerseRanges { private int[] ranges = new int[16]; private int size = 0; public void addRange(int bookId_start, int chapter_1_start, int verse_1_start, int bookId_end, int chapter_1_end, int verse_1_end) { int start = (bookId_start << 16) | (chapter_1_start << 8) | verse_1_start; int end = (bookId_end << 16) | (chapter_1_end << 8) | verse_1_end; addRange(start, end); } public void addRange(int ari_start, int ari_end) { if (ranges.length < size + 2) { int[] ranges_new = new int[ranges.length * 2]; System.arraycopy(ranges, 0, ranges_new, 0, size); ranges = ranges_new; } ranges[size++] = ari_start; ranges[size++] = ari_end; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < size; i += 2) { if (sb.length() != 0) { sb.append(','); } sb.append(ranges[i]).append('-').append(ranges[i+1]); } return sb.toString(); } } public static final String PATH_bible_verses_single_by_lid = "bible/verses/single/by-lid/"; public static final String PATH_bible_verses_single_by_ari = "bible/verses/single/by-ari/"; public static final String PATH_bible_verses_range_by_lid = "bible/verses/range/by-lid/"; public static final String PATH_bible_verses_range_by_ari = "bible/verses/range/by-ari/"; public static final String COLUMN_ari = "ari"; public static final String COLUMN_bookName = "bookName"; public static final String COLUMN_text = "text"; private ContentResolver cr; public VerseProvider(ContentResolver cr) { this.cr = cr; } /** * Reads a single verse from the default version. * @param bookId 0 for Genesis, up to 65 for Revelation * @param chapter_1 Chapter number starting from 1 * @param verse_1 Verse number starting from 1 * @return null when failed or the requested verse */ public Verse getVerse(int bookId, int chapter_1, int verse_1) { int ari = (bookId << 16) | (chapter_1 << 8) | (verse_1); return getVerse(ari); } /** * Reads a single verse from the default version. * @param ari a combination of bookId (byte 2), chapter_1 (byte 1) and verse_1 (byte 0) in an int (with byte number 3 for MSB and 0 for LSB). * @return null when failed or the requested verse */ public Verse getVerse(int ari) { Cursor c = cr.query(Uri.parse("content://" + AlkitabIntegrationUtil.getProviderAuthority() + "/" + PATH_bible_verses_single_by_ari + ari + "?formatting=0"), null, null, null, null); if (c == null) { return null; } try { int col__id = c.getColumnIndexOrThrow("_id"); int col_ari = c.getColumnIndexOrThrow(COLUMN_ari); int col_bookName = c.getColumnIndexOrThrow(COLUMN_bookName); int col_text = c.getColumnIndexOrThrow(COLUMN_text); if (c.moveToNext()) { Verse res = new Verse(); res._id = c.getLong(col__id); res.ari = c.getInt(col_ari); res.bookName = c.getString(col_bookName); res.text = c.getString(col_text); return res; } else { return null; } } finally { c.close(); } } /** * Reads verses from the default version using verse ranges. * @return null when failed, empty when no verses satisfy the requested ranges, or verses from the requested ranges. */ public List<Verse> getVerses(VerseRanges ranges) { Cursor c = cr.query(Uri.parse("content://" + AlkitabIntegrationUtil.getProviderAuthority() + "/" + PATH_bible_verses_range_by_ari + ranges.toString() + "?formatting=0"), null, null, null, null); if (c == null) { return null; } try { List<Verse> res = new ArrayList<Verse>(); int col__id = c.getColumnIndexOrThrow("_id"); int col_ari = c.getColumnIndexOrThrow(COLUMN_ari); int col_bookName = c.getColumnIndexOrThrow(COLUMN_bookName); int col_text = c.getColumnIndexOrThrow(COLUMN_text); while (c.moveToNext()) { Verse v = new Verse(); v._id = c.getLong(col__id); v.ari = c.getInt(col_ari); v.bookName = c.getString(col_bookName); v.text = c.getString(col_text); res.add(v); } return res; } finally { c.close(); } } }