更新界面
增加搜索进度 增加初次使用引导界面
This commit is contained in:
1 parent
50abb9b552
commit
3327f181bd
5 files changed
+57
-11
No files matched your search
@@ -74,6 +74,8 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
|
|||||||
private fun startSearch() {
|
private fun startSearch() {
|
||||||
val precision = appCtx.getPrefBoolean(PreferKey.precisionSearch)
|
val precision = appCtx.getPrefBoolean(PreferKey.precisionSearch)
|
||||||
var hasMore = false
|
var hasMore = false
|
||||||
|
val totalParts = bookSourceParts.size
|
||||||
|
var processedParts = 0
|
||||||
searchJob = scope.launch(searchPool!!) {
|
searchJob = scope.launch(searchPool!!) {
|
||||||
flow {
|
flow {
|
||||||
for (bs in bookSourceParts) {
|
for (bs in bookSourceParts) {
|
||||||
@@ -100,7 +102,8 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
|
|||||||
appDb.searchBookDao.insert(*items.toTypedArray())
|
appDb.searchBookDao.insert(*items.toTypedArray())
|
||||||
mergeItems(items, precision)
|
mergeItems(items, precision)
|
||||||
currentCoroutineContext().ensureActive()
|
currentCoroutineContext().ensureActive()
|
||||||
callBack.onSearchSuccess(searchBooks)
|
processedParts++
|
||||||
|
callBack.onSearchSuccess(searchBooks, processedParts, totalParts)
|
||||||
}.onCompletion {
|
}.onCompletion {
|
||||||
if (it == null) callBack.onSearchFinish(searchBooks.isEmpty(), hasMore)
|
if (it == null) callBack.onSearchFinish(searchBooks.isEmpty(), hasMore)
|
||||||
}.catch {
|
}.catch {
|
||||||
@@ -191,7 +194,7 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB
|
|||||||
interface CallBack {
|
interface CallBack {
|
||||||
fun getSearchScope(): SearchScope
|
fun getSearchScope(): SearchScope
|
||||||
fun onSearchStart()
|
fun onSearchStart()
|
||||||
fun onSearchSuccess(searchBooks: List<SearchBook>)
|
fun onSearchSuccess(searchBooks: List<SearchBook>, processedSources: Int, totalSources: Int)
|
||||||
fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean)
|
fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean)
|
||||||
fun onSearchCancel(exception: Throwable? = null)
|
fun onSearchCancel(exception: Throwable? = null)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package io.legato.kazusa.ui.book.search
|
package io.legato.kazusa.ui.book.search
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
@@ -199,7 +200,6 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
searchBar.setOnMenuItemClickListener { item ->
|
searchBar.setOnMenuItemClickListener { item ->
|
||||||
onCompatOptionsItemSelected(item)
|
onCompatOptionsItemSelected(item)
|
||||||
}
|
}
|
||||||
@@ -429,6 +429,7 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
|||||||
*/
|
*/
|
||||||
private fun startSearch() {
|
private fun startSearch() {
|
||||||
binding.refreshProgressBar.visible()
|
binding.refreshProgressBar.visible()
|
||||||
|
binding.cdProgress.gone()
|
||||||
//binding.refreshProgressBar.isAutoLoading = true
|
//binding.refreshProgressBar.isAutoLoading = true
|
||||||
binding.fbStartStop.setImageResource(R.drawable.ic_stop_black_24dp)
|
binding.fbStartStop.setImageResource(R.drawable.ic_stop_black_24dp)
|
||||||
binding.fbStartStop.visible()
|
binding.fbStartStop.visible()
|
||||||
@@ -438,7 +439,8 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
|||||||
* 搜索结束
|
* 搜索结束
|
||||||
*/
|
*/
|
||||||
private fun searchFinally() {
|
private fun searchFinally() {
|
||||||
binding.refreshProgressBar.gone()
|
binding.refreshProgressBar.invisible()
|
||||||
|
binding.cdProgress.gone()
|
||||||
if (!isManualStopSearch && viewModel.hasMore) {
|
if (!isManualStopSearch && viewModel.hasMore) {
|
||||||
binding.fbStartStop.setImageResource(R.drawable.ic_play_24dp)
|
binding.fbStartStop.setImageResource(R.drawable.ic_play_24dp)
|
||||||
} else {
|
} else {
|
||||||
@@ -446,10 +448,16 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
override fun observeLiveBus() {
|
override fun observeLiveBus() {
|
||||||
viewModel.upAdapterLiveData.observe(this) {
|
viewModel.upAdapterLiveData.observe(this) {
|
||||||
adapter.notifyItemRangeChanged(0, adapter.itemCount, bundleOf(it to null))
|
adapter.notifyItemRangeChanged(0, adapter.itemCount, bundleOf(it to null))
|
||||||
}
|
}
|
||||||
|
viewModel.searchProgressLiveData.observe(this) { (processed, total) ->
|
||||||
|
val progress = (processed * 100 / total).coerceAtMost(100)
|
||||||
|
binding.refreshProgressBar.setProgress(progress, true)
|
||||||
|
binding.tvProgress.text = "$processed / $total"
|
||||||
|
}
|
||||||
viewModel.searchFinishLiveData.observe(this) { isEmpty ->
|
viewModel.searchFinishLiveData.observe(this) { isEmpty ->
|
||||||
if (!isEmpty || viewModel.searchScope.isAll()) return@observe
|
if (!isEmpty || viewModel.searchScope.isAll()) return@observe
|
||||||
alert("搜索结果为空") {
|
alert("搜索结果为空") {
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
val searchScope: SearchScope = SearchScope(AppConfig.searchScope)
|
val searchScope: SearchScope = SearchScope(AppConfig.searchScope)
|
||||||
var searchFinishLiveData = MutableLiveData<Boolean>()
|
var searchFinishLiveData = MutableLiveData<Boolean>()
|
||||||
var isSearchLiveData = MutableLiveData<Boolean>()
|
var isSearchLiveData = MutableLiveData<Boolean>()
|
||||||
|
|
||||||
|
val searchProgressLiveData = MutableLiveData<Pair<Int, Int>>()
|
||||||
|
|
||||||
var searchKey: String = ""
|
var searchKey: String = ""
|
||||||
var hasMore = true
|
var hasMore = true
|
||||||
private var searchID = 0L
|
private var searchID = 0L
|
||||||
@@ -42,8 +45,11 @@ class SearchViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
isSearchLiveData.postValue(true)
|
isSearchLiveData.postValue(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSearchSuccess(searchBooks: List<SearchBook>) {
|
override fun onSearchSuccess(
|
||||||
|
searchBooks: List<SearchBook>, processedSources: Int, totalSources: Int
|
||||||
|
) {
|
||||||
searchBookLiveData.postValue(searchBooks)
|
searchBookLiveData.postValue(searchBooks)
|
||||||
|
searchProgressLiveData.postValue(Pair(processedSources, totalSources))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean) {
|
override fun onSearchFinish(isEmpty: Boolean, hasMore: Boolean) {
|
||||||
|
|||||||
@@ -86,7 +86,11 @@ class BookSearchWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) :
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSearchSuccess(searchBooks: List<SearchBook>) {
|
override fun onSearchSuccess(
|
||||||
|
searchBooks: List<SearchBook>,
|
||||||
|
processedSources: Int,
|
||||||
|
totalSources: Int
|
||||||
|
) {
|
||||||
send(GSON.toJson(searchBooks))
|
send(GSON.toJson(searchBooks))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,13 +33,38 @@
|
|||||||
android:id="@+id/refresh_progress_bar"
|
android:id="@+id/refresh_progress_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:waveAmplitude="8dp"
|
android:visibility="gone"
|
||||||
app:wavelength="80dp"
|
app:waveAmplitude="2dp"
|
||||||
android:indeterminate="true"
|
app:waveSpeed="50dp"
|
||||||
android:visibility="gone">
|
app:wavelength="40dp" />
|
||||||
|
|
||||||
</com.google.android.material.progressindicator.LinearProgressIndicator>
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:id="@+id/cd_progress"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:layout_marginVertical="4dp"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:cardBackgroundColor="?attr/colorTertiaryContainer"
|
||||||
|
app:cardCornerRadius="4dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_progress"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingHorizontal="4dp"
|
||||||
|
android:paddingVertical="2dp"
|
||||||
|
android:text="进度"
|
||||||
|
android:textColor="?attr/colorTertiary"
|
||||||
|
android:textSize="10sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
|||||||
Reference in new issue
Block a user