|
|
@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.ui.library
|
|
|
|
|
|
|
|
|
|
|
|
import android.app.Activity
|
|
|
|
import android.app.Activity
|
|
|
|
import android.content.Context
|
|
|
|
import android.content.Context
|
|
|
|
import android.content.Intent
|
|
|
|
|
|
|
|
import android.content.res.Configuration
|
|
|
|
import android.content.res.Configuration
|
|
|
|
import android.graphics.Color
|
|
|
|
import android.graphics.Color
|
|
|
|
import android.os.Bundle
|
|
|
|
import android.os.Bundle
|
|
|
@ -14,10 +13,18 @@ import android.view.View
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import android.view.WindowInsets
|
|
|
|
import android.view.WindowInsets
|
|
|
|
import android.view.inputmethod.InputMethodManager
|
|
|
|
import android.view.inputmethod.InputMethodManager
|
|
|
|
|
|
|
|
import android.widget.ArrayAdapter
|
|
|
|
|
|
|
|
import android.widget.Spinner
|
|
|
|
|
|
|
|
import android.widget.TextView
|
|
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
|
|
import androidx.appcompat.view.ActionMode
|
|
|
|
import androidx.appcompat.view.ActionMode
|
|
|
|
|
|
|
|
import androidx.appcompat.widget.AppCompatSpinner
|
|
|
|
import androidx.appcompat.widget.SearchView
|
|
|
|
import androidx.appcompat.widget.SearchView
|
|
|
|
|
|
|
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
|
|
|
import androidx.core.graphics.drawable.DrawableCompat
|
|
|
|
import androidx.core.graphics.drawable.DrawableCompat
|
|
|
|
|
|
|
|
import androidx.recyclerview.widget.GridLayoutManager
|
|
|
|
|
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
|
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import androidx.viewpager.widget.ViewPager
|
|
|
|
import androidx.viewpager.widget.ViewPager
|
|
|
|
import com.afollestad.materialdialogs.MaterialDialog
|
|
|
|
import com.afollestad.materialdialogs.MaterialDialog
|
|
|
|
import com.bluelinelabs.conductor.ControllerChangeHandler
|
|
|
|
import com.bluelinelabs.conductor.ControllerChangeHandler
|
|
|
@ -26,9 +33,10 @@ import com.f2prateek.rx.preferences.Preference
|
|
|
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|
|
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|
|
|
import com.google.android.material.snackbar.BaseTransientBottomBar
|
|
|
|
import com.google.android.material.snackbar.BaseTransientBottomBar
|
|
|
|
import com.google.android.material.snackbar.Snackbar
|
|
|
|
import com.google.android.material.snackbar.Snackbar
|
|
|
|
import com.google.android.material.tabs.TabLayout
|
|
|
|
|
|
|
|
import com.jakewharton.rxrelay.BehaviorRelay
|
|
|
|
import com.jakewharton.rxrelay.BehaviorRelay
|
|
|
|
import com.jakewharton.rxrelay.PublishRelay
|
|
|
|
import com.jakewharton.rxrelay.PublishRelay
|
|
|
|
|
|
|
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
|
|
|
|
|
|
|
import eu.davidea.flexibleadapter.SelectableAdapter
|
|
|
|
import eu.kanade.tachiyomi.R
|
|
|
|
import eu.kanade.tachiyomi.R
|
|
|
|
import eu.kanade.tachiyomi.data.database.models.Category
|
|
|
|
import eu.kanade.tachiyomi.data.database.models.Category
|
|
|
|
import eu.kanade.tachiyomi.data.database.models.LibraryManga
|
|
|
|
import eu.kanade.tachiyomi.data.database.models.LibraryManga
|
|
|
@ -40,7 +48,6 @@ import eu.kanade.tachiyomi.data.library.LibraryUpdateService
|
|
|
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
|
|
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
|
|
|
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
|
|
|
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
|
|
|
import eu.kanade.tachiyomi.ui.base.controller.BaseController
|
|
|
|
import eu.kanade.tachiyomi.ui.base.controller.BaseController
|
|
|
|
import eu.kanade.tachiyomi.ui.base.controller.TabbedController
|
|
|
|
|
|
|
|
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
|
|
|
|
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
|
|
|
|
import eu.kanade.tachiyomi.ui.category.CategoryController
|
|
|
|
import eu.kanade.tachiyomi.ui.category.CategoryController
|
|
|
|
import eu.kanade.tachiyomi.ui.download.DownloadController
|
|
|
|
import eu.kanade.tachiyomi.ui.download.DownloadController
|
|
|
@ -53,14 +60,20 @@ import eu.kanade.tachiyomi.ui.migration.manga.design.PreMigrationController
|
|
|
|
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationListController
|
|
|
|
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationListController
|
|
|
|
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationProcedureConfig
|
|
|
|
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationProcedureConfig
|
|
|
|
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
|
|
|
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
|
|
|
|
|
|
|
import eu.kanade.tachiyomi.util.system.dpToPx
|
|
|
|
import eu.kanade.tachiyomi.util.system.getResourceColor
|
|
|
|
import eu.kanade.tachiyomi.util.system.getResourceColor
|
|
|
|
import eu.kanade.tachiyomi.util.system.launchUI
|
|
|
|
import eu.kanade.tachiyomi.util.system.launchUI
|
|
|
|
|
|
|
|
import eu.kanade.tachiyomi.util.view.gone
|
|
|
|
|
|
|
|
import eu.kanade.tachiyomi.util.view.inflate
|
|
|
|
import eu.kanade.tachiyomi.util.view.setOnQueryTextChangeListener
|
|
|
|
import eu.kanade.tachiyomi.util.view.setOnQueryTextChangeListener
|
|
|
|
import eu.kanade.tachiyomi.util.view.snack
|
|
|
|
import eu.kanade.tachiyomi.util.view.snack
|
|
|
|
|
|
|
|
import eu.kanade.tachiyomi.util.view.updateLayoutParams
|
|
|
|
|
|
|
|
import eu.kanade.tachiyomi.util.view.updatePaddingRelative
|
|
|
|
|
|
|
|
import eu.kanade.tachiyomi.util.view.visible
|
|
|
|
|
|
|
|
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
|
|
|
|
|
|
|
|
import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener
|
|
|
|
import kotlinx.android.synthetic.main.filter_bottom_sheet.*
|
|
|
|
import kotlinx.android.synthetic.main.filter_bottom_sheet.*
|
|
|
|
import kotlinx.android.synthetic.main.library_controller.*
|
|
|
|
import kotlinx.android.synthetic.main.library_controller.*
|
|
|
|
import kotlinx.android.synthetic.main.main_activity.*
|
|
|
|
|
|
|
|
import rx.Subscription
|
|
|
|
|
|
|
|
import uy.kohesive.injekt.Injekt
|
|
|
|
import uy.kohesive.injekt.Injekt
|
|
|
|
import uy.kohesive.injekt.api.get
|
|
|
|
import uy.kohesive.injekt.api.get
|
|
|
|
|
|
|
|
|
|
|
@ -68,12 +81,16 @@ class LibraryController(
|
|
|
|
bundle: Bundle? = null,
|
|
|
|
bundle: Bundle? = null,
|
|
|
|
private val preferences: PreferencesHelper = Injekt.get()
|
|
|
|
private val preferences: PreferencesHelper = Injekt.get()
|
|
|
|
) : BaseController(bundle),
|
|
|
|
) : BaseController(bundle),
|
|
|
|
TabbedController,
|
|
|
|
//TabbedController,
|
|
|
|
ActionMode.Callback,
|
|
|
|
ActionMode.Callback,
|
|
|
|
ChangeMangaCategoriesDialog.Listener,
|
|
|
|
ChangeMangaCategoriesDialog.Listener,
|
|
|
|
MigrationInterface,
|
|
|
|
MigrationInterface,
|
|
|
|
DownloadServiceListener,
|
|
|
|
DownloadServiceListener,
|
|
|
|
LibraryServiceListener {
|
|
|
|
LibraryServiceListener,
|
|
|
|
|
|
|
|
FlexibleAdapter.OnItemClickListener,
|
|
|
|
|
|
|
|
FlexibleAdapter.OnItemLongClickListener,
|
|
|
|
|
|
|
|
FlexibleAdapter.OnItemMoveListener,
|
|
|
|
|
|
|
|
LibraryCategoryAdapter.LibraryListener{
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Position of the active category.
|
|
|
|
* Position of the active category.
|
|
|
@ -135,14 +152,19 @@ class LibraryController(
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Adapter of the view pager.
|
|
|
|
* Adapter of the view pager.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
private var adapter: LibraryAdapter? = null
|
|
|
|
private var pagerAdapter: LibraryAdapter? = null
|
|
|
|
|
|
|
|
private lateinit var adapter: LibraryCategoryAdapter
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private lateinit var spinner: Spinner
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private var lastClickPosition = -1
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Drawer listener to allow swipe only for closing the drawer.
|
|
|
|
* Drawer listener to allow swipe only for closing the drawer.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
private var tabsVisibilityRelay: BehaviorRelay<Boolean> = BehaviorRelay.create(false)
|
|
|
|
// private var tabsVisibilityRelay: BehaviorRelay<Boolean> = BehaviorRelay.create(false)
|
|
|
|
|
|
|
|
|
|
|
|
private var tabsVisibilitySubscription: Subscription? = null
|
|
|
|
// private var tabsVisibilitySubscription: Subscription? = null
|
|
|
|
|
|
|
|
|
|
|
|
private var observeLater:Boolean = false
|
|
|
|
private var observeLater:Boolean = false
|
|
|
|
|
|
|
|
|
|
|
@ -153,47 +175,131 @@ class LibraryController(
|
|
|
|
|
|
|
|
|
|
|
|
private var justStarted = true
|
|
|
|
private var justStarted = true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private var updateScroll = true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private var spinnerAdapter: SpinnerAdapter? = null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var scrollLister = object : RecyclerView.OnScrollListener () {
|
|
|
|
|
|
|
|
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
|
|
|
|
|
|
|
super.onScrolled(recyclerView, dx, dy)
|
|
|
|
|
|
|
|
val position =
|
|
|
|
|
|
|
|
(recycler.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
|
|
|
|
|
|
|
|
val order = when (val item = adapter.getItem(position)) {
|
|
|
|
|
|
|
|
is LibraryHeaderItem -> item.category.order
|
|
|
|
|
|
|
|
is LibraryItem -> presenter.categories.find { it.id == item.manga.category }?.order
|
|
|
|
|
|
|
|
else -> null
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (order != null && order != activeCategory) {
|
|
|
|
|
|
|
|
preferences.lastUsedCategory().set(order)
|
|
|
|
|
|
|
|
activeCategory = order
|
|
|
|
|
|
|
|
val category = presenter.categories.find { it.order == order }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bottom_sheet.lastCategory = category
|
|
|
|
|
|
|
|
if (preferences.librarySortingMode().getOrDefault() == LibrarySort.DRAG_AND_DROP)
|
|
|
|
|
|
|
|
bottom_sheet.updateTitle()
|
|
|
|
|
|
|
|
// spinner.onItemSelectedListener = null
|
|
|
|
|
|
|
|
spinnerAdapter?.setCustomText(category?.name)
|
|
|
|
|
|
|
|
//spinner.view
|
|
|
|
|
|
|
|
//spinner.post { spinner.onItemSelectedListener = listener }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Recycler view of the list of manga.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private lateinit var recycler: RecyclerView
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var usePager = preferences.libraryUsingPager().getOrDefault()
|
|
|
|
|
|
|
|
|
|
|
|
init {
|
|
|
|
init {
|
|
|
|
setHasOptionsMenu(true)
|
|
|
|
setHasOptionsMenu(true)
|
|
|
|
retainViewMode = RetainViewMode.RETAIN_DETACH
|
|
|
|
retainViewMode = RetainViewMode.RETAIN_DETACH
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun getTitle(): String? {
|
|
|
|
override fun getTitle(): String? {
|
|
|
|
return resources?.getString(R.string.label_library)
|
|
|
|
return null//if (title != null) null else resources?.getString(R.string.label_library)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private var title: String? = null
|
|
|
|
|
|
|
|
set(value) {
|
|
|
|
|
|
|
|
field = value
|
|
|
|
|
|
|
|
setTitle()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View {
|
|
|
|
override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View {
|
|
|
|
return inflater.inflate(R.layout.library_controller, container, false)
|
|
|
|
return inflater.inflate(R.layout.library_controller, container, false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onViewCreated(view: View) {
|
|
|
|
override fun onViewCreated(view: View) {
|
|
|
|
super.onViewCreated(view)
|
|
|
|
super.onViewCreated(view)
|
|
|
|
|
|
|
|
mangaPerRow = getColumnsPreferenceForCurrentOrientation().getOrDefault()
|
|
|
|
|
|
|
|
|
|
|
|
adapter = LibraryAdapter(this)
|
|
|
|
if (usePager) {
|
|
|
|
library_pager.adapter = adapter
|
|
|
|
pager_layout.visible()
|
|
|
|
|
|
|
|
fast_scroller.gone()
|
|
|
|
|
|
|
|
pagerAdapter = LibraryAdapter(this)
|
|
|
|
|
|
|
|
library_pager.adapter = pagerAdapter
|
|
|
|
|
|
|
|
library_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
|
|
|
|
|
|
|
|
override fun onPageSelected(position: Int) {
|
|
|
|
|
|
|
|
preferences.lastUsedCategory().set(position)
|
|
|
|
|
|
|
|
activeCategory = position
|
|
|
|
|
|
|
|
bottom_sheet.lastCategory = pagerAdapter?.categories?.getOrNull(position)
|
|
|
|
|
|
|
|
if (preferences.librarySortingMode().getOrDefault() == LibrarySort.DRAG_AND_DROP) bottom_sheet.updateTitle()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
library_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
|
|
|
|
override fun onPageScrolled(
|
|
|
|
override fun onPageSelected(position: Int) {
|
|
|
|
position: Int, positionOffset: Float, positionOffsetPixels: Int
|
|
|
|
preferences.lastUsedCategory().set(position)
|
|
|
|
) {
|
|
|
|
activeCategory = position
|
|
|
|
}
|
|
|
|
bottom_sheet.lastCategory = adapter?.categories?.getOrNull(position)
|
|
|
|
|
|
|
|
if (preferences.librarySortingMode().getOrDefault() == LibrarySort.DRAG_AND_DROP) bottom_sheet.updateTitle()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onPageScrolled(
|
|
|
|
override fun onPageScrollStateChanged(state: Int) {}
|
|
|
|
position: Int, positionOffset: Float, positionOffsetPixels: Int
|
|
|
|
})
|
|
|
|
) {
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
adapter = LibraryCategoryAdapter(this)
|
|
|
|
|
|
|
|
recycler = if (preferences.libraryLayout().getOrDefault() == 0) {
|
|
|
|
|
|
|
|
(swipe_refresh.inflate(R.layout.library_list_recycler) as RecyclerView).apply {
|
|
|
|
|
|
|
|
layoutManager = LinearLayoutManager(context)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
(swipe_refresh.inflate(R.layout.library_grid_recycler) as AutofitRecyclerView).apply {
|
|
|
|
|
|
|
|
spanCount = mangaPerRow
|
|
|
|
|
|
|
|
manager.spanSizeLookup = (object : GridLayoutManager.SpanSizeLookup() {
|
|
|
|
|
|
|
|
override fun getSpanSize(position: Int): Int {
|
|
|
|
|
|
|
|
val item = this@LibraryController.adapter.getItem(position)
|
|
|
|
|
|
|
|
return if (item is LibraryHeaderItem)
|
|
|
|
|
|
|
|
manager.spanCount else 1
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onPageScrollStateChanged(state: Int) {}
|
|
|
|
recycler.setHasFixedSize(true)
|
|
|
|
})
|
|
|
|
recycler.adapter = adapter
|
|
|
|
|
|
|
|
//adapter.setStickyHeaders(true)
|
|
|
|
|
|
|
|
recycler_layout.addView(recycler)
|
|
|
|
|
|
|
|
adapter.fastScroller = fast_scroller
|
|
|
|
|
|
|
|
recycler.addOnScrollListener(scrollLister)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spinner = swipe_refresh.inflate(R.layout.library_spinner) as AppCompatSpinner
|
|
|
|
|
|
|
|
(activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(true)
|
|
|
|
|
|
|
|
(activity as MainActivity).supportActionBar?.customView = spinner
|
|
|
|
|
|
|
|
spinnerAdapter = SpinnerAdapter(view.context, R.layout.library_spinner_textview,
|
|
|
|
|
|
|
|
arrayOf(resources!!.getString(R.string.label_library)))
|
|
|
|
|
|
|
|
spinner.adapter = spinnerAdapter
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spinnerAdapter?.setCustomText(resources?.getString(R.string.label_library))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
mangaPerRow = getColumnsPreferenceForCurrentOrientation().getOrDefault()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (selectedMangas.isNotEmpty()) {
|
|
|
|
if (selectedMangas.isNotEmpty()) {
|
|
|
|
createActionModeIfNeeded()
|
|
|
|
createActionModeIfNeeded()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bottom_sheet.onCreate(pager_layout)
|
|
|
|
|
|
|
|
|
|
|
|
//bottom_sheet.onCreate(pager_layout)
|
|
|
|
|
|
|
|
bottom_sheet.onCreate(if (usePager) pager_layout else swipe_refresh)
|
|
|
|
|
|
|
|
|
|
|
|
bottom_sheet.onGroupClicked = {
|
|
|
|
bottom_sheet.onGroupClicked = {
|
|
|
|
when (it) {
|
|
|
|
when (it) {
|
|
|
@ -211,6 +317,28 @@ class LibraryController(
|
|
|
|
router.pushController(DownloadController().withFadeTransaction())
|
|
|
|
router.pushController(DownloadController().withFadeTransaction())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// spinner.onItemSelectedListener = listener
|
|
|
|
|
|
|
|
/*spinner.onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
|
|
|
|
|
|
|
|
if (!updateScroll) return@IgnoreFirstSpinnerListener
|
|
|
|
|
|
|
|
val headerPosition = adapter.indexOf(position) + 1
|
|
|
|
|
|
|
|
if (headerPosition > -1) (recycler.layoutManager as LinearLayoutManager)
|
|
|
|
|
|
|
|
.scrollToPositionWithOffset(position, 0)
|
|
|
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val config = resources?.configuration
|
|
|
|
|
|
|
|
val phoneLandscape = (config?.orientation == Configuration.ORIENTATION_LANDSCAPE &&
|
|
|
|
|
|
|
|
(config.screenLayout.and(Configuration.SCREENLAYOUT_SIZE_MASK)) <
|
|
|
|
|
|
|
|
Configuration.SCREENLAYOUT_SIZE_LARGE)
|
|
|
|
|
|
|
|
// pad the recycler if the filter bottom sheet is visible
|
|
|
|
|
|
|
|
if (!usePager && !phoneLandscape) {
|
|
|
|
|
|
|
|
val height = view.context.resources.getDimensionPixelSize(R.dimen.rounder_radius) + 5.dpToPx
|
|
|
|
|
|
|
|
recycler.updatePaddingRelative(bottom = height)
|
|
|
|
|
|
|
|
fast_scroller.updateLayoutParams<CoordinatorLayout.LayoutParams> {
|
|
|
|
|
|
|
|
bottomMargin = height
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (presenter.isDownloading()) {
|
|
|
|
if (presenter.isDownloading()) {
|
|
|
|
fab.scaleY = 1f
|
|
|
|
fab.scaleY = 1f
|
|
|
|
fab.scaleX = 1f
|
|
|
|
fab.scaleX = 1f
|
|
|
@ -219,9 +347,10 @@ class LibraryController(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
presenter.onRestore()
|
|
|
|
presenter.onRestore()
|
|
|
|
val library = presenter.getAllManga()
|
|
|
|
val library = presenter.getAllManga()
|
|
|
|
if (library != null) onNextLibraryUpdate(presenter.categories, library)
|
|
|
|
if (library != null) presenter.updateViewBlocking() //onNextLibraryUpdate(presenter.categories, library)
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
library_pager.alpha = 0f
|
|
|
|
library_pager.alpha = 0f
|
|
|
|
|
|
|
|
swipe_refresh.alpha = 0f
|
|
|
|
presenter.getLibraryBlocking()
|
|
|
|
presenter.getLibraryBlocking()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -229,12 +358,17 @@ class LibraryController(
|
|
|
|
override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
|
|
|
|
override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
|
|
|
|
super.onChangeStarted(handler, type)
|
|
|
|
super.onChangeStarted(handler, type)
|
|
|
|
if (type.isEnter) {
|
|
|
|
if (type.isEnter) {
|
|
|
|
activity?.tabs?.setupWithViewPager(library_pager)
|
|
|
|
if (usePager)
|
|
|
|
|
|
|
|
(activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(true)
|
|
|
|
|
|
|
|
//activity?.tabs?.setupWithViewPager(library_pager)
|
|
|
|
presenter.getLibrary()
|
|
|
|
presenter.getLibrary()
|
|
|
|
DownloadService.addListener(this)
|
|
|
|
DownloadService.addListener(this)
|
|
|
|
DownloadService.callListeners()
|
|
|
|
DownloadService.callListeners()
|
|
|
|
LibraryUpdateService.setListener(this)
|
|
|
|
LibraryUpdateService.setListener(this)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (type == ControllerChangeType.PUSH_EXIT) {
|
|
|
|
|
|
|
|
(activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(false)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onActivityResumed(activity: Activity) {
|
|
|
|
override fun onActivityResumed(activity: Activity) {
|
|
|
@ -251,18 +385,19 @@ class LibraryController(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onDestroy() {
|
|
|
|
override fun onDestroy() {
|
|
|
|
|
|
|
|
(activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(false)
|
|
|
|
presenter.onDestroy()
|
|
|
|
presenter.onDestroy()
|
|
|
|
super.onDestroy()
|
|
|
|
super.onDestroy()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onDestroyView(view: View) {
|
|
|
|
override fun onDestroyView(view: View) {
|
|
|
|
adapter?.onDestroy()
|
|
|
|
//adapter.onDestroy()
|
|
|
|
DownloadService.removeListener(this)
|
|
|
|
DownloadService.removeListener(this)
|
|
|
|
LibraryUpdateService.removeListener()
|
|
|
|
LibraryUpdateService.removeListener()
|
|
|
|
adapter = null
|
|
|
|
//adapter = null
|
|
|
|
actionMode = null
|
|
|
|
actionMode = null
|
|
|
|
tabsVisibilitySubscription?.unsubscribe()
|
|
|
|
//tabsVisibilitySubscription?.unsubscribe()
|
|
|
|
tabsVisibilitySubscription = null
|
|
|
|
//tabsVisibilitySubscription = null
|
|
|
|
super.onDestroyView(view)
|
|
|
|
super.onDestroyView(view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -288,7 +423,7 @@ class LibraryController(
|
|
|
|
super.onDetach(view)
|
|
|
|
super.onDetach(view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun configureTabs(tabs: TabLayout) {
|
|
|
|
/*override fun configureTabs(tabs: TabLayout) {
|
|
|
|
with(tabs) {
|
|
|
|
with(tabs) {
|
|
|
|
tabGravity = TabLayout.GRAVITY_CENTER
|
|
|
|
tabGravity = TabLayout.GRAVITY_CENTER
|
|
|
|
tabMode = TabLayout.MODE_SCROLLABLE
|
|
|
|
tabMode = TabLayout.MODE_SCROLLABLE
|
|
|
@ -307,12 +442,53 @@ class LibraryController(
|
|
|
|
override fun cleanupTabs(tabs: TabLayout) {
|
|
|
|
override fun cleanupTabs(tabs: TabLayout) {
|
|
|
|
tabsVisibilitySubscription?.unsubscribe()
|
|
|
|
tabsVisibilitySubscription?.unsubscribe()
|
|
|
|
tabsVisibilitySubscription = null
|
|
|
|
tabsVisibilitySubscription = null
|
|
|
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun onNextLibraryUpdate(mangaMap: List<LibraryItem>, freshStart: Boolean = false) {
|
|
|
|
|
|
|
|
if (mangaMap.isNotEmpty()) {
|
|
|
|
|
|
|
|
empty_view.hide()
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
empty_view.show(R.drawable.ic_book_black_128dp, R.string.information_empty_library)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
adapter.setItems(mangaMap)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val position = if (freshStart) adapter.indexOf(activeCategory) + 1 else null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spinner.onItemSelectedListener = null
|
|
|
|
|
|
|
|
spinnerAdapter = SpinnerAdapter(view!!.context, R.layout.library_spinner_textview,
|
|
|
|
|
|
|
|
presenter.categories.map { it.name }.toTypedArray())
|
|
|
|
|
|
|
|
spinner.adapter = spinnerAdapter
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spinnerAdapter?.setCustomText(presenter.categories.find { it.order == activeCategory
|
|
|
|
|
|
|
|
}?.name ?: resources?.getString(R.string.label_library))
|
|
|
|
|
|
|
|
if (!freshStart) {
|
|
|
|
|
|
|
|
spinnerAdapter?.setCustomText(presenter.categories.find { it.order == activeCategory
|
|
|
|
|
|
|
|
}?.name ?: resources?.getString(R.string.label_library))
|
|
|
|
|
|
|
|
justStarted = false
|
|
|
|
|
|
|
|
if (swipe_refresh.alpha == 0f)
|
|
|
|
|
|
|
|
swipe_refresh.animate().alpha(1f).setDuration(500).start()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}else {
|
|
|
|
|
|
|
|
if (position != null)
|
|
|
|
|
|
|
|
(recycler.layoutManager as LinearLayoutManager)
|
|
|
|
|
|
|
|
.scrollToPositionWithOffset(position, 0)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
spinner.onItemSelectedListener = IgnoreFirstSpinnerListener { pos ->
|
|
|
|
|
|
|
|
val headerPosition = adapter.indexOf(pos - 1) + 1
|
|
|
|
|
|
|
|
if (headerPosition > -1) {
|
|
|
|
|
|
|
|
(recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(
|
|
|
|
|
|
|
|
headerPosition, 0
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fun onNextLibraryUpdate(categories: List<Category>, mangaMap: Map<Int, List<LibraryItem>>,
|
|
|
|
fun onNextLibraryUpdate(categories: List<Category>, mangaMap: Map<Int, List<LibraryItem>>,
|
|
|
|
freshStart: Boolean = false) {
|
|
|
|
freshStart: Boolean = false) {
|
|
|
|
val view = view ?: return
|
|
|
|
val view = view ?: return
|
|
|
|
val adapter = adapter ?: return
|
|
|
|
val adapter = pagerAdapter ?: return
|
|
|
|
|
|
|
|
|
|
|
|
// Show empty view if needed
|
|
|
|
// Show empty view if needed
|
|
|
|
if (mangaMap.isNotEmpty()) {
|
|
|
|
if (mangaMap.isNotEmpty()) {
|
|
|
@ -342,13 +518,13 @@ class LibraryController(
|
|
|
|
bottom_sheet.lastCategory = adapter.categories.getOrNull(activeCat)
|
|
|
|
bottom_sheet.lastCategory = adapter.categories.getOrNull(activeCat)
|
|
|
|
bottom_sheet.updateTitle()
|
|
|
|
bottom_sheet.updateTitle()
|
|
|
|
|
|
|
|
|
|
|
|
tabsVisibilityRelay.call(categories.size > 1)
|
|
|
|
//tabsVisibilityRelay.call(categories.size > 1)
|
|
|
|
|
|
|
|
|
|
|
|
if (freshStart || !justStarted) {
|
|
|
|
if (freshStart || !justStarted) {
|
|
|
|
// Delay the scroll position to allow the view to be properly measured.
|
|
|
|
// Delay the scroll position to allow the view to be properly measured.
|
|
|
|
view.post {
|
|
|
|
view.post {
|
|
|
|
if (isAttached) {
|
|
|
|
if (isAttached) {
|
|
|
|
activity?.tabs?.setScrollPosition(library_pager.currentItem, 0f, true)
|
|
|
|
//activity?.tabs?.setScrollPosition(library_pager.currentItem, 0f, true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -398,22 +574,50 @@ class LibraryController(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fun onCatSortChanged(id: Int? = null) {
|
|
|
|
fun onCatSortChanged(id: Int? = null) {
|
|
|
|
val catId = id ?: adapter?.categories?.getOrNull(library_pager.currentItem)?.id ?: return
|
|
|
|
val catId = id ?: presenter.categories.find { it.order == activeCategory }?.id ?: return
|
|
|
|
presenter.requestCatSortUpdate(catId)
|
|
|
|
presenter.requestCatSortUpdate(catId)
|
|
|
|
|
|
|
|
//val catId = id ?: adapter?.categories?.getOrNull(library_pager.currentItem)?.id ?: return
|
|
|
|
|
|
|
|
// presenter.requestCatSortUpdate(catId)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Reattaches the adapter to the view pager to recreate fragments
|
|
|
|
* Reattaches the adapter to the view pager to recreate fragments
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
private fun reattachAdapter() {
|
|
|
|
private fun reattachAdapter() {
|
|
|
|
val adapter = adapter ?: return
|
|
|
|
val position = (recycler.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
|
|
|
|
|
|
|
|
if (recycler is AutofitRecyclerView && preferences.libraryLayout().getOrDefault() == 0 ||
|
|
|
|
|
|
|
|
recycler !is AutofitRecyclerView && preferences.libraryLayout().getOrDefault() > 0) {
|
|
|
|
|
|
|
|
recycler_layout.removeView(recycler)
|
|
|
|
|
|
|
|
recycler = if (preferences.libraryLayout().getOrDefault() == 0) {
|
|
|
|
|
|
|
|
(swipe_refresh.inflate(R.layout.library_list_recycler) as RecyclerView).apply {
|
|
|
|
|
|
|
|
layoutManager = LinearLayoutManager(context)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
(swipe_refresh.inflate(R.layout.library_grid_recycler) as AutofitRecyclerView).apply {
|
|
|
|
|
|
|
|
spanCount = mangaPerRow
|
|
|
|
|
|
|
|
manager.spanSizeLookup = (object : GridLayoutManager.SpanSizeLookup() {
|
|
|
|
|
|
|
|
override fun getSpanSize(position: Int): Int {
|
|
|
|
|
|
|
|
val item = this@LibraryController.adapter.getItem(position)
|
|
|
|
|
|
|
|
return if (item is LibraryHeaderItem)
|
|
|
|
|
|
|
|
manager.spanCount else 1
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
recycler.setHasFixedSize(true)
|
|
|
|
|
|
|
|
recycler.addOnScrollListener(scrollLister)
|
|
|
|
|
|
|
|
recycler_layout.addView(recycler)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
recycler.adapter = adapter
|
|
|
|
|
|
|
|
(recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(position, 0)
|
|
|
|
|
|
|
|
//val adapter = adapter ?: return
|
|
|
|
|
|
|
|
|
|
|
|
val position = library_pager.currentItem
|
|
|
|
/*val position = library_pager.currentItem
|
|
|
|
|
|
|
|
|
|
|
|
adapter.recycle = false
|
|
|
|
adapter.recycle = false
|
|
|
|
library_pager.adapter = adapter
|
|
|
|
library_pager.adapter = adapter
|
|
|
|
library_pager.currentItem = position
|
|
|
|
library_pager.currentItem = position
|
|
|
|
adapter.recycle = true
|
|
|
|
adapter.recycle = true*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -533,8 +737,8 @@ class LibraryController(
|
|
|
|
mode.title = resources?.getString(R.string.label_selected, count)
|
|
|
|
mode.title = resources?.getString(R.string.label_selected, count)
|
|
|
|
if (preferences.librarySortingMode().getOrDefault() == LibrarySort.DRAG_AND_DROP) {
|
|
|
|
if (preferences.librarySortingMode().getOrDefault() == LibrarySort.DRAG_AND_DROP) {
|
|
|
|
val catId = (selectedMangas.first() as? LibraryManga)?.category
|
|
|
|
val catId = (selectedMangas.first() as? LibraryManga)?.category
|
|
|
|
val sameCat = (adapter?.categories?.getOrNull(library_pager.currentItem)?.id
|
|
|
|
val sameCat = /*(adapter?.categories?.getOrNull(library_pager.currentItem)?.id
|
|
|
|
== catId) && selectedMangas.all { (it as? LibraryManga)?.category == catId }
|
|
|
|
== catId) &&*/ selectedMangas.all { (it as? LibraryManga)?.category == catId }
|
|
|
|
menu.findItem(R.id.action_move_manga).isVisible = sameCat
|
|
|
|
menu.findItem(R.id.action_move_manga).isVisible = sameCat
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else menu.findItem(R.id.action_move_manga).isVisible = false
|
|
|
|
else menu.findItem(R.id.action_move_manga).isVisible = false
|
|
|
@ -554,11 +758,11 @@ class LibraryController(
|
|
|
|
.negativeButton(android.R.string.no)
|
|
|
|
.negativeButton(android.R.string.no)
|
|
|
|
.show()
|
|
|
|
.show()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
R.id.action_select_all -> {
|
|
|
|
/*R.id.action_select_all -> {
|
|
|
|
adapter?.categories?.getOrNull(library_pager.currentItem)?.id?.let {
|
|
|
|
adapter?.categories?.getOrNull(library_pager.currentItem)?.id?.let {
|
|
|
|
selectAllRelay.call(it)
|
|
|
|
selectAllRelay.call(it)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
R.id.action_migrate -> {
|
|
|
|
R.id.action_migrate -> {
|
|
|
|
router.pushController(
|
|
|
|
router.pushController(
|
|
|
|
if (preferences.skipPreMigration().getOrDefault()) {
|
|
|
|
if (preferences.skipPreMigration().getOrDefault()) {
|
|
|
@ -573,12 +777,12 @@ class LibraryController(
|
|
|
|
.withFadeTransaction())
|
|
|
|
.withFadeTransaction())
|
|
|
|
destroyActionModeIfNeeded()
|
|
|
|
destroyActionModeIfNeeded()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
R.id.action_to_top, R.id.action_to_bottom -> {
|
|
|
|
/*R.id.action_to_top, R.id.action_to_bottom -> {
|
|
|
|
adapter?.categories?.getOrNull(library_pager.currentItem)?.id?.let {
|
|
|
|
adapter?.categories?.getOrNull(library_pager.currentItem)?.id?.let {
|
|
|
|
reorganizeRelay.call(it to if (item.itemId == R.id.action_to_top) -1 else -2)
|
|
|
|
reorganizeRelay.call(it to if (item.itemId == R.id.action_to_top) -1 else -2)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
destroyActionModeIfNeeded()
|
|
|
|
destroyActionModeIfNeeded()
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
else -> return false
|
|
|
|
else -> return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
return true
|
|
|
@ -669,6 +873,19 @@ class LibraryController(
|
|
|
|
destroyActionModeIfNeeded()
|
|
|
|
destroyActionModeIfNeeded()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun startReading(position: Int) {
|
|
|
|
|
|
|
|
val activity = activity ?: return
|
|
|
|
|
|
|
|
val manga = (adapter.getItem(position) as? LibraryItem)?.manga ?: return
|
|
|
|
|
|
|
|
val chapter = presenter.getFirstUnread(manga) ?: return
|
|
|
|
|
|
|
|
val intent = ReaderActivity.newIntent(activity, manga, chapter)
|
|
|
|
|
|
|
|
destroyActionModeIfNeeded()
|
|
|
|
|
|
|
|
startActivity(intent)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onItemReleased(position: Int) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fun startReading(manga: Manga) {
|
|
|
|
fun startReading(manga: Manga) {
|
|
|
|
val activity = activity ?: return
|
|
|
|
val activity = activity ?: return
|
|
|
|
val chapter = presenter.getFirstUnread(manga) ?: return
|
|
|
|
val chapter = presenter.getFirstUnread(manga) ?: return
|
|
|
@ -676,6 +893,94 @@ class LibraryController(
|
|
|
|
destroyActionModeIfNeeded()
|
|
|
|
destroyActionModeIfNeeded()
|
|
|
|
startActivity(intent)
|
|
|
|
startActivity(intent)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun canDrag(): Boolean {
|
|
|
|
|
|
|
|
val sortingMode = preferences.librarySortingMode().getOrDefault()
|
|
|
|
|
|
|
|
val filterOff = preferences.filterCompleted().getOrDefault() +
|
|
|
|
|
|
|
|
preferences.filterTracked().getOrDefault() +
|
|
|
|
|
|
|
|
preferences.filterUnread().getOrDefault() +
|
|
|
|
|
|
|
|
preferences.filterCompleted().getOrDefault() == 0 &&
|
|
|
|
|
|
|
|
!preferences.hideCategories().getOrDefault()
|
|
|
|
|
|
|
|
return sortingMode == LibrarySort.DRAG_AND_DROP && filterOff &&
|
|
|
|
|
|
|
|
adapter.mode != SelectableAdapter.Mode.MULTI
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Called when a manga is clicked.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param position the position of the element clicked.
|
|
|
|
|
|
|
|
* @return true if the item should be selected, false otherwise.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
override fun onItemClick(view: View?, position: Int): Boolean {
|
|
|
|
|
|
|
|
// If the action mode is created and the position is valid, toggle the selection.
|
|
|
|
|
|
|
|
val item = adapter.getItem(position) as? LibraryItem ?: return false
|
|
|
|
|
|
|
|
return if (adapter.mode == SelectableAdapter.Mode.MULTI) {
|
|
|
|
|
|
|
|
lastClickPosition = position
|
|
|
|
|
|
|
|
toggleSelection(position)
|
|
|
|
|
|
|
|
true
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
openManga(item.manga, 0f)
|
|
|
|
|
|
|
|
false
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Called when a manga is long clicked.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param position the position of the element clicked.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
override fun onItemLongClick(position: Int) {
|
|
|
|
|
|
|
|
createActionModeIfNeeded()
|
|
|
|
|
|
|
|
when {
|
|
|
|
|
|
|
|
lastClickPosition == -1 -> setSelection(position)
|
|
|
|
|
|
|
|
lastClickPosition > position -> for (i in position until lastClickPosition)
|
|
|
|
|
|
|
|
setSelection(i)
|
|
|
|
|
|
|
|
lastClickPosition < position -> for (i in lastClickPosition + 1..position)
|
|
|
|
|
|
|
|
setSelection(i)
|
|
|
|
|
|
|
|
else -> setSelection(position)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
lastClickPosition = position
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onActionStateChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
|
|
|
|
|
|
|
|
val position = viewHolder?.adapterPosition ?: return
|
|
|
|
|
|
|
|
if (actionState == 2) onItemLongClick(position)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Tells the presenter to toggle the selection for the given position.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param position the position to toggle.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private fun toggleSelection(position: Int) {
|
|
|
|
|
|
|
|
val item = adapter.getItem(position) ?: return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setSelection((item as LibraryItem).manga, !adapter.isSelected(position))
|
|
|
|
|
|
|
|
invalidateActionMode()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Tells the presenter to set the selection for the given position.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param position the position to toggle.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private fun setSelection(position: Int) {
|
|
|
|
|
|
|
|
val item = adapter.getItem(position) ?: return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setSelection((item as LibraryItem).manga, true)
|
|
|
|
|
|
|
|
invalidateActionMode()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onItemMove(fromPosition: Int, toPosition: Int) { }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun shouldMoveItem(fromPosition: Int, toPosition: Int): Boolean {
|
|
|
|
|
|
|
|
if (adapter.selectedItemCount > 1)
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
|
|
|
if (adapter.isSelected(fromPosition))
|
|
|
|
|
|
|
|
toggleSelection(fromPosition)
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
object HeightTopWindowInsetsListener : View.OnApplyWindowInsetsListener {
|
|
|
|
object HeightTopWindowInsetsListener : View.OnApplyWindowInsetsListener {
|
|
|
@ -689,3 +994,29 @@ object HeightTopWindowInsetsListener : View.OnApplyWindowInsetsListener {
|
|
|
|
return insets
|
|
|
|
return insets
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SpinnerAdapter(context: Context, layoutId: Int, val array: Array<String>) :
|
|
|
|
|
|
|
|
ArrayAdapter<String>
|
|
|
|
|
|
|
|
(context, layoutId, array) {
|
|
|
|
|
|
|
|
private var mCustomText = ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
|
|
|
|
|
|
|
|
val view = super.getView(position, convertView, parent)
|
|
|
|
|
|
|
|
val tv: TextView = view as TextView
|
|
|
|
|
|
|
|
tv.text = mCustomText
|
|
|
|
|
|
|
|
return view
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun setCustomText(customText: String?) {
|
|
|
|
|
|
|
|
// Call to set the text that must be shown in the spinner for the custom option.
|
|
|
|
|
|
|
|
val text = customText ?: return
|
|
|
|
|
|
|
|
mCustomText = text
|
|
|
|
|
|
|
|
notifyDataSetChanged()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
|
|
|
|
|
|
|
|
val view = parent.inflate(R.layout.library_spinner_entry_text) as TextView
|
|
|
|
|
|
|
|
view.text = array[position]
|
|
|
|
|
|
|
|
return view
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|