Skip to content

Commit

Permalink
Improved error handling for search
Browse files Browse the repository at this point in the history
  • Loading branch information
xizzhu committed Mar 4, 2019
1 parent 23a79b4 commit e80c34c
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,22 +44,24 @@ class SearchViewController(private val searchActivity: SearchActivity,
suspend fun search(query: String) {
searchState.send(true)

val currentTranslation = bibleReadingManager.observeCurrentTranslation().firstOrNull()
?: throw IllegalStateException("No translation selected")
searchResult.send(withContext(Dispatchers.Default) {
val bookNamesAsync = async { bibleReadingManager.readBookNames(currentTranslation) }
val versesAsync = async { bibleReadingManager.search(currentTranslation, query) }
val bookNames = bookNamesAsync.await()
val verses = versesAsync.await()
val searchedVerses = ArrayList<SearchResult.Verse>()
for (verse in verses) {
searchedVerses.add(SearchResult.Verse(
verse.verseIndex, bookNames[verse.verseIndex.bookIndex], verse.text))
}
SearchResult(query, searchedVerses)
})

searchState.send(false)
try {
val currentTranslation = bibleReadingManager.observeCurrentTranslation().firstOrNull()
?: throw IllegalStateException("No translation selected")
searchResult.send(withContext(Dispatchers.Default) {
val bookNamesAsync = async { bibleReadingManager.readBookNames(currentTranslation) }
val versesAsync = async { bibleReadingManager.search(currentTranslation, query) }
val bookNames = bookNamesAsync.await()
val verses = versesAsync.await()
val searchedVerses = ArrayList<SearchResult.Verse>()
for (verse in verses) {
searchedVerses.add(SearchResult.Verse(
verse.verseIndex, bookNames[verse.verseIndex.bookIndex], verse.text))
}
SearchResult(query, searchedVerses)
})
} finally {
searchState.send(false)
}
}

fun openReading() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,18 @@
package me.xizzhu.android.joshua.search.toolbar

import android.content.Context
import android.content.DialogInterface
import android.util.AttributeSet
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.Toolbar
import me.xizzhu.android.joshua.R
import me.xizzhu.android.joshua.ui.DialogHelper
import me.xizzhu.android.joshua.utils.MVPView

interface ToolbarView : MVPView
interface ToolbarView : MVPView {
fun onError(e: Exception)
}

class SearchToolbar : Toolbar, SearchView.OnQueryTextListener, ToolbarView {
constructor(context: Context) : super(context)
Expand All @@ -33,14 +37,16 @@ class SearchToolbar : Toolbar, SearchView.OnQueryTextListener, ToolbarView {

constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

private val searchView: SearchView

init {
setLogo(R.drawable.ic_toolbar)

inflateMenu(R.menu.menu_search)
val searchMenuItem = menu.findItem(R.id.action_search)
searchMenuItem.expandActionView()

val searchView = searchMenuItem.actionView as SearchView
searchView = searchMenuItem.actionView as SearchView
searchView.setOnQueryTextListener(this)
searchView.isQueryRefinementEnabled = true
searchView.isIconified = false
Expand All @@ -64,4 +70,11 @@ class SearchToolbar : Toolbar, SearchView.OnQueryTextListener, ToolbarView {
}

override fun onQueryTextChange(newText: String): Boolean = false

override fun onError(e: Exception) {
DialogHelper.showDialog(context, true, R.string.error_search,
DialogInterface.OnClickListener { _, _ ->
presenter.search(searchView.query.toString())
}, null)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,19 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import me.xizzhu.android.joshua.search.SearchViewController
import me.xizzhu.android.joshua.utils.MVPPresenter
import java.lang.Exception

class ToolbarPresenter(private val searchViewController: SearchViewController) : MVPPresenter<ToolbarView>() {
fun search(query: String): Boolean {
if (query.isEmpty()) {
return false
}
launch(Dispatchers.Main) {
searchViewController.search(query)
try {
searchViewController.search(query)
} catch (e: Exception) {
view?.onError(e)
}
}
return true
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import androidx.appcompat.app.AlertDialog
class DialogHelper {
companion object {
fun showDialog(context: Context, cancelable: Boolean, @StringRes message: Int,
onPositive: DialogInterface.OnClickListener, onNegative: DialogInterface.OnClickListener) {
onPositive: DialogInterface.OnClickListener, onNegative: DialogInterface.OnClickListener?) {
AlertDialog.Builder(context)
.setCancelable(cancelable)
.setMessage(message)
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@

<string name="no_translation_downloaded">No translation, download now?</string>
<string name="more_translation">More</string>

<string name="error_search">Error occurred during search, retry?</string>
</resources>

0 comments on commit e80c34c

Please sign in to comment.