Skip to content

Commit

Permalink
Merge fabb646 into cbbcc25
Browse files Browse the repository at this point in the history
  • Loading branch information
xizzhu committed Mar 20, 2019
2 parents cbbcc25 + fabb646 commit 4799ad6
Show file tree
Hide file tree
Showing 24 changed files with 663 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,23 @@ class AndroidReadingStorageTest : BaseSqliteTest() {
}
}

@Test
fun testSaveThenReadByVerseIndex() {
runBlocking {
androidDatabase.bookNamesDao.save(MockContents.kjvShortName, MockContents.kjvBookNames)
androidDatabase.translationDao.createTable(MockContents.kjvShortName)
androidDatabase.translationDao.save(MockContents.kjvShortName, MockContents.kjvVerses.toMap())

androidDatabase.bookNamesDao.save(MockContents.cuvShortName, MockContents.cuvBookNames)
androidDatabase.translationDao.createTable(MockContents.cuvShortName)
androidDatabase.translationDao.save(MockContents.cuvShortName, MockContents.cuvVerses.toMap())

val expected = MockContents.kjvVersesWithCuvParallel[0]
val actual = androidReadingStorage.readVerse(MockContents.kjvShortName, VerseIndex(0, 0, 0))
assertEquals(expected, actual)
}
}

@Test
fun testSearchNonExistTranslation() {
runBlocking {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package me.xizzhu.android.joshua.core.repository.local.android.db

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import me.xizzhu.android.joshua.core.Bible
import me.xizzhu.android.joshua.core.repository.local.android.BaseSqliteTest
import me.xizzhu.android.joshua.tests.MockContents
import org.junit.Assert.assertEquals
Expand All @@ -31,6 +32,10 @@ class BookNamesDaoTest : BaseSqliteTest() {
@Test
fun testEmptyTable() {
assertTrue(androidDatabase.bookNamesDao.read("not_exist").isEmpty())

for (bookIndex in 0 until Bible.BOOK_COUNT) {
assertTrue(androidDatabase.bookNamesDao.read(bookIndex).isEmpty())
}
}

@Test
Expand Down Expand Up @@ -68,6 +73,30 @@ class BookNamesDaoTest : BaseSqliteTest() {
androidDatabase.bookNamesDao.read(listOf(MockContents.kjvShortName, MockContents.cuvShortName), 1))
}

@Test
fun testSaveThenReadByBookIndex() {
androidDatabase.bookNamesDao.save(MockContents.kjvShortName, MockContents.kjvBookNames)
androidDatabase.bookNamesDao.save(MockContents.cuvShortName, MockContents.cuvBookNames)

val expected = mapOf(Pair(MockContents.kjvShortName, MockContents.kjvBookNames[0]),
Pair(MockContents.cuvShortName, MockContents.cuvBookNames[0]))
val actual = androidDatabase.bookNamesDao.read(0)
assertEquals(expected, actual)
}

@Test
fun testSaveOverrideThenReadByBookIndex() {
androidDatabase.bookNamesDao.save(MockContents.kjvShortName, listOf("random_1", "whatever_2"))
androidDatabase.bookNamesDao.save(MockContents.cuvShortName, listOf("random_3", "whatever_4"))
androidDatabase.bookNamesDao.save(MockContents.kjvShortName, MockContents.kjvBookNames)
androidDatabase.bookNamesDao.save(MockContents.cuvShortName, MockContents.cuvBookNames)

val expected = mapOf(Pair(MockContents.kjvShortName, MockContents.kjvBookNames[0]),
Pair(MockContents.cuvShortName, MockContents.cuvBookNames[0]))
val actual = androidDatabase.bookNamesDao.read(0)
assertEquals(expected, actual)
}

@Test
fun testRemoveNonExist() {
val translationShortName = "not_exist"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package me.xizzhu.android.joshua.core.repository.local.android.db

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import me.xizzhu.android.joshua.core.VerseIndex
import me.xizzhu.android.joshua.core.repository.local.android.BaseSqliteTest
import me.xizzhu.android.joshua.tests.MockContents
import me.xizzhu.android.joshua.tests.toMap
Expand Down Expand Up @@ -84,6 +85,30 @@ class TranslationDaoTest : BaseSqliteTest() {
}
}

@Test
fun testSaveThenReadByVerseIndex() {
androidDatabase.translationDao.createTable(MockContents.kjvShortName)
androidDatabase.translationDao.save(MockContents.kjvShortName, MockContents.kjvVerses.toMap())

androidDatabase.translationDao.createTable(MockContents.cuvShortName)
androidDatabase.translationDao.save(MockContents.cuvShortName, MockContents.cuvVerses.toMap())

val actual = androidDatabase.translationDao.read(mutableMapOf(
Pair(MockContents.kjvShortName, "Genesis"), Pair(MockContents.cuvShortName, "创世记")),
VerseIndex(0, 0, 0))
for ((translation, text) in actual) {
when (translation) {
MockContents.kjvShortName -> {
assertEquals(MockContents.kjvVerses[0].text, text)
}
MockContents.cuvShortName -> {
assertEquals(MockContents.cuvVerses[0].text, text)
}
else -> fail()
}
}
}

@Test
fun testSearchNonExistTranslation() {
assertTrue(androidDatabase.translationDao.search("not_exist", emptyList(), "keyword").isEmpty())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ class BibleReadingManager(private val bibleReadingRepository: BibleReadingReposi
bookIndex: Int, chapterIndex: Int): List<Verse> =
bibleReadingRepository.readVerses(translationShortName, parallelTranslations, bookIndex, chapterIndex)

suspend fun readVerse(translationShortName: String, verseIndex: VerseIndex): Verse =
bibleReadingRepository.readVerse(translationShortName, verseIndex)

suspend fun search(translationShortName: String, query: String): List<Verse> =
bibleReadingRepository.search(translationShortName, query)
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ class BibleReadingRepository(private val localReadingStorage: LocalReadingStorag
bookIndex: Int, chapterIndex: Int): List<Verse> =
localReadingStorage.readVerses(translationShortName, parallelTranslations, bookIndex, chapterIndex)

suspend fun readVerse(translationShortName: String, verseIndex: VerseIndex): Verse =
localReadingStorage.readVerse(translationShortName, verseIndex)

suspend fun search(translationShortName: String, query: String): List<Verse> =
localReadingStorage.search(translationShortName, readBookNames(translationShortName), query)
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,7 @@ interface LocalReadingStorage {
suspend fun readVerses(translationShortName: String, parallelTranslations: List<String>,
bookIndex: Int, chapterIndex: Int): List<Verse>

suspend fun readVerse(translationShortName: String, verseIndex: VerseIndex): Verse

suspend fun search(translationShortName: String, bookNames: List<String>, query: String): List<Verse>
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,27 @@ class AndroidReadingStorage(private val androidDatabase: AndroidDatabase) : Loca
}
}

override suspend fun readVerse(translationShortName: String, verseIndex: VerseIndex): Verse {
return withContext(Dispatchers.IO) {
val db = androidDatabase.readableDatabase
try {
db.beginTransaction()

val translationToBookNames = androidDatabase.bookNamesDao.read(verseIndex.bookIndex)
val translationToText = androidDatabase.translationDao.read(translationToBookNames, verseIndex).toMutableMap()
val primaryText = translationToText.remove(translationShortName)!!
val verse = Verse(verseIndex, primaryText, translationToText.values.toList())

db.setTransactionSuccessful()
return@withContext verse
} finally {
if (db.inTransaction()) {
db.endTransaction()
}
}
}
}

override suspend fun search(translationShortName: String, bookNames: List<String>, query: String): List<Verse> {
return withContext(Dispatchers.IO) {
androidDatabase.translationDao.search(translationShortName, bookNames, query)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,32 @@ class BookNamesDao(private val sqliteHelper: SQLiteOpenHelper) {
}
}

@WorkerThread
fun read(bookIndex: Int): Map<String, String> {
if (bookIndex < 0 || bookIndex >= Bible.BOOK_COUNT) {
return emptyMap()
}

var cursor: Cursor? = null
try {
cursor = db.query(TABLE_BOOK_NAMES, arrayOf(COLUMN_TRANSLATION_SHORT_NAME, COLUMN_BOOK_NAME),
"$COLUMN_BOOK_INDEX = ?", arrayOf(bookIndex.toString()), null, null, null)
val count = cursor.count
if (count > 0) {
val bookNames = HashMap<String, String>(count)
val translationShortName = cursor.getColumnIndex(COLUMN_TRANSLATION_SHORT_NAME)
val bookName = cursor.getColumnIndex(COLUMN_BOOK_NAME)
while (cursor.moveToNext()) {
bookNames[cursor.getString(translationShortName)] = cursor.getString(bookName)
}
return bookNames
}
return emptyMap()
} finally {
cursor?.close()
}
}

@WorkerThread
fun save(translationShortName: String, bookNames: List<String>) {
val values = ContentValues(3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@ class TranslationDao(private val sqliteHelper: SQLiteOpenHelper) {
}
}

private fun SQLiteDatabase.hasTable(name: String): Boolean {
val cursor: Cursor = rawQuery("SELECT DISTINCT tbl_name FROM sqlite_master WHERE tbl_name = '$name'", null)
return cursor.use {
cursor.count > 0
}
}

@WorkerThread
fun read(translationToBookName: Map<String, String>, bookIndex: Int, chapterIndex: Int): Map<String, List<Verse.Text>> {
if (translationToBookName.isEmpty() || bookIndex < 0 || bookIndex >= Bible.BOOK_COUNT
Expand Down Expand Up @@ -112,10 +119,39 @@ class TranslationDao(private val sqliteHelper: SQLiteOpenHelper) {
}
}

private fun SQLiteDatabase.hasTable(name: String): Boolean {
val cursor: Cursor = rawQuery("SELECT DISTINCT tbl_name FROM sqlite_master WHERE tbl_name = '$name'", null)
return cursor.use {
cursor.count > 0
@WorkerThread
fun read(translationToBookName: Map<String, String>, verseIndex: VerseIndex): Map<String, Verse.Text> {
if (translationToBookName.isEmpty()
|| verseIndex.bookIndex < 0 || verseIndex.bookIndex >= Bible.BOOK_COUNT
|| verseIndex.chapterIndex < 0 || verseIndex.chapterIndex >= Bible.getChapterCount(verseIndex.bookIndex)
|| verseIndex.verseIndex < 0) {
return emptyMap()
}

db.beginTransaction()
try {
val results = mutableMapOf<String, Verse.Text>()
for ((translation, bookName) in translationToBookName) {
var cursor: Cursor? = null
try {
cursor = db.query(translation, arrayOf(COLUMN_TEXT),
"$COLUMN_BOOK_INDEX = ? AND $COLUMN_CHAPTER_INDEX = ? AND $COLUMN_VERSE_INDEX = ?",
arrayOf(verseIndex.bookIndex.toString(), verseIndex.chapterIndex.toString(), verseIndex.verseIndex.toString()),
null, null, null)
if (cursor.moveToNext()) {
results[translation] = Verse.Text(translation, bookName, cursor.getString(0))
}
} finally {
cursor?.close()
}
}

db.setTransactionSuccessful()
return results
} finally {
if (db.inTransaction()) {
db.endTransaction()
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import me.xizzhu.android.joshua.reading.toolbar.ToolbarPresenter
import me.xizzhu.android.joshua.reading.verse.VersePresenter
import me.xizzhu.android.joshua.ActivityScope
import me.xizzhu.android.joshua.Navigator
import me.xizzhu.android.joshua.reading.detail.VerseDetailPresenter

@Module
class ReadingModule {
Expand Down Expand Up @@ -54,6 +55,10 @@ class ReadingModule {
fun provideVersePresenter(readingInteractor: ReadingInteractor): VersePresenter =
VersePresenter(readingInteractor)

@Provides
fun provideVerseDetailPresenter(readingInteractor: ReadingInteractor): VerseDetailPresenter =
VerseDetailPresenter(readingInteractor)

@Provides
fun provideSearchButtonPresenter(readingInteractor: ReadingInteractor): SearchButtonPresenter =
SearchButtonPresenter(readingInteractor)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,17 @@ package me.xizzhu.android.joshua.reading

import android.content.res.Configuration
import android.os.Bundle
import android.view.ViewTreeObserver
import androidx.appcompat.app.ActionBarDrawerToggle
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import me.xizzhu.android.joshua.R
import me.xizzhu.android.joshua.reading.chapter.ChapterListPresenter
import me.xizzhu.android.joshua.reading.chapter.ChapterListView
import me.xizzhu.android.joshua.reading.detail.VerseDetailPresenter
import me.xizzhu.android.joshua.reading.detail.VerseDetailViewLayout
import me.xizzhu.android.joshua.reading.toolbar.ReadingToolbar
import me.xizzhu.android.joshua.reading.toolbar.ToolbarPresenter
import me.xizzhu.android.joshua.reading.verse.VersePresenter
Expand All @@ -30,6 +37,9 @@ import me.xizzhu.android.joshua.utils.BaseActivity
import javax.inject.Inject

class ReadingActivity : BaseActivity() {
@Inject
lateinit var readingInteractor: ReadingInteractor

@Inject
lateinit var readingDrawerPresenter: ReadingDrawerPresenter

Expand All @@ -42,6 +52,9 @@ class ReadingActivity : BaseActivity() {
@Inject
lateinit var versePresenter: VersePresenter

@Inject
lateinit var verseDetailPresenter: VerseDetailPresenter

@Inject
lateinit var searchButtonPresenter: SearchButtonPresenter

Expand All @@ -50,6 +63,7 @@ class ReadingActivity : BaseActivity() {
private lateinit var toolbar: ReadingToolbar
private lateinit var chapterListView: ChapterListView
private lateinit var verseViewPager: VerseViewPager
private lateinit var verseDetailView: VerseDetailViewLayout
private lateinit var search: SearchFloatingActionButton

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -67,6 +81,9 @@ class ReadingActivity : BaseActivity() {
verseViewPager = findViewById(R.id.verse_view_pager)
verseViewPager.setPresenter(versePresenter)

verseDetailView = findViewById(R.id.verse_detail_view)
verseDetailView.setPresenter(verseDetailPresenter)

drawerToggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, 0, 0)
drawerLayout.addDrawerListener(drawerToggle)

Expand All @@ -86,6 +103,7 @@ class ReadingActivity : BaseActivity() {
toolbarPresenter.attachView(toolbar)
chapterListPresenter.attachView(chapterListView)
versePresenter.attachView(verseViewPager)
verseDetailPresenter.attachView(verseDetailView)
searchButtonPresenter.attachView(search)
}

Expand All @@ -94,6 +112,7 @@ class ReadingActivity : BaseActivity() {
toolbarPresenter.detachView()
chapterListPresenter.detachView()
versePresenter.detachView()
verseDetailPresenter.detachView()
searchButtonPresenter.detachView()

super.onStop()
Expand All @@ -103,4 +122,12 @@ class ReadingActivity : BaseActivity() {
super.onConfigurationChanged(newConfig)
drawerToggle.onConfigurationChanged(newConfig)
}

override fun onBackPressed() {
GlobalScope.launch(Dispatchers.Main) {
if (!readingInteractor.closeVerseDetail()) {
super.onBackPressed()
}
}
}
}
Loading

0 comments on commit 4799ad6

Please sign in to comment.