Implemented Source Selector

This commit is contained in:
tom5079
2020-11-29 13:37:31 +09:00
parent 24aedfc400
commit 3feae80359
17 changed files with 319 additions and 83 deletions

View File

@@ -25,23 +25,27 @@ import android.os.Bundle
import android.text.InputType
import android.text.util.Linkify
import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.cardview.widget.CardView
import androidx.core.view.GravityCompat
import androidx.core.view.ViewCompat
import androidx.core.view.children
import androidx.core.widget.ImageViewCompat
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.CircularProgressDrawable
import com.daimajia.swipe.adapters.RecyclerSwipeAdapter
import com.google.android.material.navigation.NavigationView
import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import xyz.quaver.floatingsearchview.FloatingSearchView
import xyz.quaver.floatingsearchview.suggestions.model.SearchSuggestion
import xyz.quaver.floatingsearchview.util.view.MenuView
import xyz.quaver.floatingsearchview.util.view.SearchInputView
import xyz.quaver.hitomi.getSuggestionsForQuery
import xyz.quaver.pupil.*
@@ -50,18 +54,16 @@ import xyz.quaver.pupil.databinding.MainActivityBinding
import xyz.quaver.pupil.services.DownloadService
import xyz.quaver.pupil.sources.SearchResult
import xyz.quaver.pupil.sources.Source
import xyz.quaver.pupil.sources.hitomi.Hitomi
import xyz.quaver.pupil.sources.hitomi.Hiyobi
import xyz.quaver.pupil.sources.sourceIcons
import xyz.quaver.pupil.sources.sources
import xyz.quaver.pupil.types.*
import xyz.quaver.pupil.ui.dialog.DownloadLocationDialogFragment
import xyz.quaver.pupil.ui.dialog.GalleryDialog
import xyz.quaver.pupil.ui.dialog.SourceSelectDialog
import xyz.quaver.pupil.ui.view.ProgressCardView
import xyz.quaver.pupil.ui.view.SwipePageTurnView
import xyz.quaver.pupil.util.ItemClickSupport
import xyz.quaver.pupil.util.Preferences
import xyz.quaver.pupil.util.checkUpdate
import xyz.quaver.pupil.util.*
import xyz.quaver.pupil.util.downloader.DownloadManager
import xyz.quaver.pupil.util.restore
import java.util.regex.Pattern
import kotlin.math.*
import kotlin.random.Random
@@ -82,9 +84,8 @@ class MainActivity :
}
private var queryStack = mutableListOf<String>()
@Suppress("UNCHECKED_CAST")
private var source: Source<Enum<*>> = Hiyobi() as Source<Enum<*>>
private var sortMode = Hitomi.SortMode.NEWEST
private lateinit var source: Source<*>
private lateinit var sortMode: Enum<*>
private var searchJob: Deferred<Pair<Channel<SearchResult>, Int>>? = null
private var totalItems = 0
@@ -97,6 +98,8 @@ class MainActivity :
binding = MainActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
setSource(sources.values.first())
if (intent.action == Intent.ACTION_VIEW) {
intent.dataString?.let { url ->
restore(url,
@@ -167,6 +170,34 @@ class MainActivity :
}
}
private fun setSource(source: Source<*>) {
this.source = source
sortMode = source.availableSortMode.first()
query = ""
currentPage = 1
with (binding.contents.searchview.binding.querySection.menuView) {
post {
menuItems.findMenu(R.id.sort).subMenu.apply {
clear()
source.availableSortMode.forEach {
add(R.id.sort_mode_group_id, it.ordinal, Menu.NONE, it.name)
}
setGroupCheckable(R.id.sort_mode_group_id, true, true)
children.first().isChecked = true
}
with (getChildAt(1) as ImageView) {
ImageViewCompat.setImageTintList(this, null)
setImageDrawable(sourceIcons[source.name])
}
}
}
}
private fun initView() {
binding.contents.recyclerview.addOnScrollListener(object: RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
@@ -175,7 +206,7 @@ class MainActivity :
min(
max(
binding.contents.searchview.translationY - dy,
-binding.contents.searchview.findViewById<CardView>(R.id.search_query_section).height.toFloat()
-binding.contents.searchview.binding.querySection.root.height.toFloat()
), 0F)
if (dy > 0)
@@ -224,6 +255,7 @@ class MainActivity :
with(binding.contents.randomFab) {
setImageResource(R.drawable.shuffle_variant)
setOnClickListener {
setImageDrawable(CircularProgressDrawable(context))
if (totalItems > 0)
CoroutineScope(Dispatchers.IO).launch {
val random = Random.Default.nextInt(totalItems)
@@ -236,6 +268,7 @@ class MainActivity :
).first.receive()
launch(Dispatchers.Main) {
setImageResource(R.drawable.shuffle_variant)
GalleryDialog(this@MainActivity, randomResult.id).apply {
onChipClickedHandler.add {
query = it.toQuery()
@@ -394,7 +427,7 @@ class MainActivity :
with(binding.contents.searchview) {
onMenuStatusChangeListener = object: FloatingSearchView.OnMenuStatusChangeListener {
override fun onMenuOpened() {
(binding.contents.recyclerview.adapter as SearchResultsAdapter).closeAllItems()
(this@MainActivity.binding.contents.recyclerview.adapter as SearchResultsAdapter).closeAllItems()
}
override fun onMenuClosed() {
@@ -402,14 +435,6 @@ class MainActivity :
}
}
post {
findViewById<MenuView>(R.id.menu_view).menuItems.firstOrNull {
(it as MenuItem).itemId == R.id.main_menu_thin
}?.let {
(it as MenuItem).isChecked = Preferences["thin"]
}
}
onHistoryDeleteClickedListener = {
searchHistory.remove(it)
swapSuggestions(defaultSuggestions)
@@ -473,37 +498,32 @@ class MainActivity :
}
}
attachNavigationDrawerToMenuButton(binding.drawer)
attachNavigationDrawerToMenuButton(this@MainActivity.binding.drawer)
}
}
fun onActionMenuItemSelected(item: MenuItem?) {
when(item?.itemId) {
R.id.main_menu_settings -> startActivity(Intent(this@MainActivity, SettingsActivity::class.java))
R.id.main_menu_thin -> {
// TODO
private fun onActionMenuItemSelected(item: MenuItem?) {
if (item?.groupId == R.id.sort_mode_group_id) {
currentPage = 1
sortMode = source.availableSortMode.let { availableSortMode ->
availableSortMode.getOrElse(item.itemId) { availableSortMode.first() }
}
R.id.main_menu_sort_newest -> {
sortMode = Hitomi.SortMode.NEWEST
item.isChecked = true
runOnUiThread {
currentPage = 1
query()
}
}
R.id.main_menu_sort_popular -> {
sortMode = Hitomi.SortMode.POPULAR
item.isChecked = true
runOnUiThread {
currentPage = 1
query()
}
}
query()
}
else
when(item?.itemId) {
R.id.main_menu_settings -> startActivity(Intent(this@MainActivity, SettingsActivity::class.java))
R.id.source -> SourceSelectDialog().apply {
onSourceSelectedListener = {
setSource(it)
query()
dismiss()
}
}.show(supportFragmentManager, null)
}
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
@@ -539,6 +559,7 @@ class MainActivity :
private fun clearGalleries() = CoroutineScope(Dispatchers.Main).launch {
searchResults.clear()
(binding.contents.recyclerview.adapter as RecyclerSwipeAdapter).mItemManger.closeAllItems()
binding.contents.recyclerview.adapter?.notifyDataSetChanged()
binding.contents.noresult.visibility = View.INVISIBLE