Skip to content

Commit

Permalink
made images better + fixed id + chapter split
Browse files Browse the repository at this point in the history
  • Loading branch information
LagradOst committed Jul 7, 2023
1 parent 5d55a43 commit 0b5cb57
Show file tree
Hide file tree
Showing 8 changed files with 186 additions and 67 deletions.
77 changes: 40 additions & 37 deletions app/src/main/java/com/lagradost/quicknovel/ReadActivity2.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.media.AudioManager
import android.content.res.Configuration
import android.os.BatteryManager
import android.os.Build
import android.os.Bundle
import android.os.PersistableBundle
import android.view.MotionEvent
import android.view.View
import android.view.WindowManager
import androidx.activity.viewModels
Expand All @@ -23,24 +21,15 @@ import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.fasterxml.jackson.module.kotlin.readValue
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
import com.lagradost.quicknovel.DataStore.setKey
import com.lagradost.quicknovel.TTSHelper.initMediaSession
import com.lagradost.quicknovel.databinding.ReadMainBinding
import com.lagradost.quicknovel.mvvm.Resource
import com.lagradost.quicknovel.mvvm.observe
import com.lagradost.quicknovel.receivers.BecomingNoisyReceiver
import com.lagradost.quicknovel.ui.ScrollVisibility
import com.lagradost.quicknovel.ui.TextAdapter
import com.lagradost.quicknovel.ui.mainpage.MainPageViewModel
import com.lagradost.quicknovel.util.UIHelper.fixPaddingStatusbar
import com.lagradost.quicknovel.util.toPx
import nl.siegmann.epublib.epub.EpubReader
import java.lang.ref.WeakReference

class ReadActivity2 : AppCompatActivity(), ColorPickerDialogListener {
Expand Down Expand Up @@ -176,6 +165,34 @@ class ReadActivity2 : AppCompatActivity(), ColorPickerDialogListener {
return viewModel.parseAction(input)
}

private lateinit var textAdapter: TextAdapter
private lateinit var textLayoutManager: LinearLayoutManager

fun onScroll() {
val visibility = ScrollVisibility(
firstVisible = textLayoutManager.findFirstVisibleItemPosition(),
firstFullyVisible = textLayoutManager.findFirstCompletelyVisibleItemPosition(),
lastVisible = textLayoutManager.findLastVisibleItemPosition(),
lastFullyVisible = textLayoutManager.findLastCompletelyVisibleItemPosition()
)
viewModel.onScroll(textAdapter.getIndex(visibility))
}

private var cachedChapter : List<SpanDisplay> = emptyList()
private fun scrollToDesired() {
val desired = viewModel.desiredIndex
val index =
cachedChapter.indexOfFirst { display -> display.index == desired.index && display.innerIndex == desired.innerIndex }
if (index > 0) {
textLayoutManager.scrollToPositionWithOffset(index, 0)
}
}

override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
scrollToDesired()
}

override fun onCreate(savedInstanceState: Bundle?) {
CommonActivity.loadThemes(this)
super.onCreate(savedInstanceState)
Expand All @@ -186,6 +203,13 @@ class ReadActivity2 : AppCompatActivity(), ColorPickerDialogListener {

viewModel.init(intent, this)

textAdapter = TextAdapter(viewModel).apply {
setHasStableIds(true)
}
textLayoutManager = LinearLayoutManager(binding.realText.context)



observe(viewModel.title) { title ->
binding.readToolbar.title = title
}
Expand Down Expand Up @@ -269,10 +293,6 @@ class ReadActivity2 : AppCompatActivity(), ColorPickerDialogListener {
}
}

val textAdapter = TextAdapter(viewModel).apply {
setHasStableIds(true)
}
val textLayoutManager = LinearLayoutManager(binding.realText.context)

binding.realText.apply {
layoutManager = textLayoutManager
Expand All @@ -283,39 +303,22 @@ class ReadActivity2 : AppCompatActivity(), ColorPickerDialogListener {
RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)

val visibility = ScrollVisibility(
firstVisible = textLayoutManager.findFirstVisibleItemPosition(),
firstFullyVisible = textLayoutManager.findFirstCompletelyVisibleItemPosition(),
lastVisible = textLayoutManager.findLastVisibleItemPosition(),
lastFullyVisible = textLayoutManager.findLastCompletelyVisibleItemPosition()
)
viewModel.onScroll(textAdapter.getIndex(visibility))
onScroll()
}
})
}

var firstAppend = true
observe(viewModel.chapter) { text ->
cachedChapter = text
textAdapter.submitList(text)
if (firstAppend) {
firstAppend = false
val desired = viewModel.desiredIndex
val index =
text.indexOfFirst { display -> display.index == desired.index && display.innerIndex == desired.innerIndex }
if (index > 0) {
textLayoutManager.scrollToPositionWithOffset(index, binding.readToolbar.height - 5.toPx) //
}
scrollToDesired()
}

binding.realText.post {
val visibility = ScrollVisibility(
firstVisible = textLayoutManager.findFirstVisibleItemPosition(),
firstFullyVisible = textLayoutManager.findFirstCompletelyVisibleItemPosition(),
lastVisible = textLayoutManager.findLastVisibleItemPosition(),
lastFullyVisible = textLayoutManager.findLastCompletelyVisibleItemPosition()
)
viewModel.onScroll(textAdapter.getIndex(visibility))
onScroll()
}
}
}
Expand Down
39 changes: 26 additions & 13 deletions app/src/main/java/com/lagradost/quicknovel/ReadActivityViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import com.lagradost.quicknovel.ui.ScrollVisibilityIndex
import com.lagradost.quicknovel.util.Apis
import com.lagradost.quicknovel.util.Coroutines.ioSafe
import com.lagradost.quicknovel.util.Coroutines.runOnMainThread
import com.lagradost.quicknovel.util.amap
import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.Markwon
import io.noties.markwon.MarkwonConfiguration
Expand Down Expand Up @@ -264,23 +263,25 @@ class ReadActivityViewModel : ViewModel() {

private var currentIndex = Int.MIN_VALUE

/**
* Preloads this much in both directions
* */
private var chapterPadding: Int = 1
/** lower padding for preloading current-chapterPaddingBottom*/
private var chapterPaddingBottom: Int = 1

/** upper padding, for preloading current+chapterPaddingTop */
private var chapterPaddingTop: Int = 2

private suspend fun updateIndexAsync(
index: Int,
notify: Boolean = true
) {
for (idx in index - chapterPadding..index + chapterPadding) {
for (idx in index - chapterPaddingBottom..index + chapterPaddingTop) {
requested += index
loadIndividualChapter(idx, false, notify)
}
}

private fun updateIndex(index: Int) {
var alreadyRequested = false
for (idx in index - chapterPadding..index + chapterPadding) {
for (idx in index - chapterPaddingBottom..index + chapterPaddingTop) {
if (!requested.contains(index)) {
alreadyRequested = true
}
Expand All @@ -297,7 +298,7 @@ class ReadActivityViewModel : ViewModel() {
private fun updateReadArea() {
val cIndex = currentIndex
val chapters = ArrayList<SpanDisplay>()
for (idx in cIndex - chapterPadding..cIndex + chapterPadding) {
for (idx in cIndex - chapterPaddingBottom..cIndex + chapterPaddingTop) {
val append: List<SpanDisplay> = when (val data = chapterData[idx]) {
null -> emptyList()
is Resource.Loading -> {
Expand All @@ -315,14 +316,17 @@ class ReadActivityViewModel : ViewModel() {
)
)
}

if (idx < chaptersTitlesInternal.size && idx >= 0)
chapters.add(ChapterStartSpanned(idx, 0, chaptersTitlesInternal[idx]))
chapters.addAll(append)
_chapterData.postValue(chapters)
}
_chapterData.postValue(chapters)
}

private fun notifyChapterUpdate(index: Int) {
val cIndex = currentIndex
if (cIndex - chapterPadding <= index && index <= cIndex + chapterPadding) {
if (cIndex - chapterPaddingBottom <= index && index <= cIndex + chapterPaddingTop) {
updateReadArea()
}
}
Expand Down Expand Up @@ -662,7 +666,9 @@ class ReadActivityViewModel : ViewModel() {

private fun innerIndexToChar(index: Int, innerIndex: Int?): Int? {
return chapterData[index]?.letInner { live ->
innerIndex?.let { live.spans.getOrNull(innerIndex)?.start }
innerIndex?.let {
live.spans.getOrNull(innerIndex)?.start
}
}
}

Expand Down Expand Up @@ -693,12 +699,19 @@ class ReadActivityViewModel : ViewModel() {
if (visibility == null) return

// dynamically increase padding in case of very small chapters with a maximum of 10 chapters
chapterPadding = minOf(
//val bottom = visibility.firstVisible.index
val index = visibility.firstVisible.index
val top = visibility.lastVisible.index

chapterPaddingTop = minOf(10, maxOf(chapterPaddingTop, (top - index) + 1))


/*chapterPadding = minOf(
maxOf(
chapterPadding,
kotlin.math.abs(visibility.lastVisible.index - visibility.firstVisible.index)
), 5
)
)*/

changeIndex(visibility.firstVisible)
updateIndex(visibility.firstVisible.index)
Expand Down
36 changes: 31 additions & 5 deletions app/src/main/java/com/lagradost/quicknovel/TTSHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,20 @@ class TTSSession(val context: Context, event: (TTSHelper.TTSActionType) -> Boole
}
}

fun generateId(type: Long, index: Int, start: Int, end: Int): Long {
// 4b bits for type, max 16
// 16b for chapter, max 65536
// 22b for start, max 4 194 304
// 22b for end, max 4 194 304

val typeBits = type and ((1 shl 5) - 1)
val indexBits = index.toLong() and ((1 shl 17) - 1)
val startBits = start.toLong() and ((1 shl 23) - 1)
val endBits = end.toLong() and ((1 shl 23) - 1)

return typeBits or (indexBits shl 4) or (startBits shl 20) or (endBits shl 42)
}

data class TextSpan(
val text: Spanned,
val start: Int,
Expand All @@ -80,7 +94,7 @@ data class TextSpan(
override var innerIndex: Int,
) : SpanDisplay() {
override fun id(): Long {
return ((index.toLong() * 10000L) + start) xor end.toLong()
return generateId(0, index, start, end)
}
}

Expand All @@ -93,17 +107,28 @@ abstract class SpanDisplay {
protected abstract fun id(): Long
}

// uses the last text inner index
data class ChapterStartSpanned(
override val index: Int,
override val innerIndex: Int,
val name: String
) : SpanDisplay() {
override fun id(): Long {
return generateId(1, index, 0, 0)
}
}

data class LoadingSpanned(val url: String?, override val index: Int) : SpanDisplay() {
override val innerIndex: Int = 0
override fun id(): Long {
return Long.MAX_VALUE - index.toLong()
return generateId(2, index, 0, 0)
}
}

data class FailedSpanned(val reason: String, override val index: Int) : SpanDisplay() {
override val innerIndex: Int = 0
override fun id(): Long {
return Long.MIN_VALUE + index.toLong()
return generateId(3, index, 0, 0)
}
}

Expand Down Expand Up @@ -194,7 +219,7 @@ object TTSHelper {

while (nextIndex != -1) {
// don't include duplicate newlines
if (currentOffset != nextIndex)
if (currentOffset != nextIndex) {
spans.add(
TextSpan(
unsegmented.subSequence(currentOffset, nextIndex) as Spanned,
Expand All @@ -204,8 +229,9 @@ object TTSHelper {
innerIndex
)
)
innerIndex++
}

innerIndex++
currentOffset = nextIndex + 1

nextIndex = unsegmented.indexOf('\n', currentOffset)
Expand Down

0 comments on commit 0b5cb57

Please sign in to comment.