Skip to content

Commit

Permalink
made inf scroll reader
Browse files Browse the repository at this point in the history
  • Loading branch information
LagradOst committed Jul 6, 2023
1 parent 02c3930 commit 5d55a43
Show file tree
Hide file tree
Showing 12 changed files with 745 additions and 123 deletions.
11 changes: 11 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,18 @@
<data android:mimeType="application/epub+zip" />
</intent-filter>
</activity>
<activity
android:name=".ReadActivity2"
android:exported="true"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden|navigation">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />

<data android:scheme="content" />
<data android:mimeType="application/epub+zip" />
</intent-filter>
</activity>
<service
android:name=".services.DownloadService"
android:enabled="true"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ object BookDownloader2Helper {

fun openQuickStream(activity: Activity?, uri: Uri?) {
if (uri == null || activity == null) return
val myIntent = Intent(activity, ReadActivity::class.java)
val myIntent = Intent(activity, ReadActivity2::class.java)
myIntent.setDataAndType(uri, "quickstream")
activity.startActivity(myIntent)
}
Expand Down Expand Up @@ -1265,6 +1265,10 @@ object BookDownloader2 {
EPUB_CURRENT_POSITION_SCROLL, newName,
getKey<Int>(EPUB_CURRENT_POSITION_SCROLL, oldName)
)
setKey(
EPUB_CURRENT_POSITION_SCROLL_CHAR, newName,
getKey<Int>(EPUB_CURRENT_POSITION_SCROLL_CHAR, oldName)
)
}

private val migrationNovelMutex = Mutex()
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/com/lagradost/quicknovel/DataStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const val EPUB_LANG: String = "reader_epub_lang"
const val EPUB_VOICE: String = "reader_epub_voice"
const val EPUB_CURRENT_POSITION: String = "reader_epub_position"
const val EPUB_CURRENT_POSITION_SCROLL: String = "reader_epub_position_scroll"
const val EPUB_CURRENT_POSITION_SCROLL_CHAR: String = "reader_epub_position_scroll_char"
const val RESULT_BOOKMARK : String = "result_bookmarked"
const val RESULT_BOOKMARK_STATE : String = "result_bookmarked_state"
const val HISTORY_FOLDER : String = "result_history"
Expand Down
228 changes: 225 additions & 3 deletions app/src/main/java/com/lagradost/quicknovel/ReadActivity2.kt
Original file line number Diff line number Diff line change
@@ -1,29 +1,49 @@
package com.lagradost.quicknovel

import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.media.AudioManager
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
import androidx.appcompat.app.AppCompatActivity
import androidx.core.animation.doOnEnd
import androidx.core.app.NotificationManagerCompat
import androidx.core.view.WindowCompat
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 {
class ReadActivity2 : AppCompatActivity(), ColorPickerDialogListener {
companion object {
private var _readActivity: WeakReference<ReadActivity2>? = null
var readActivity
Expand All @@ -33,6 +53,74 @@ class ReadActivity2 : AppCompatActivity(), ColorPickerDialogListener {
}
}

private fun hideSystemUI() {

WindowCompat.setDecorFitsSystemWindows(window, false)
WindowInsetsControllerCompat(window, binding.readerContainer).let { controller ->
controller.hide(WindowInsetsCompat.Type.systemBars())
controller.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
window.attributes.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}

fun lowerBottomNav(v: View) {
v.translationY = 0f
ObjectAnimator.ofFloat(v, "translationY", v.height.toFloat()).apply {
duration = 200
start()
}.doOnEnd {
v.visibility = View.GONE
}
}

lowerBottomNav(binding.readerBottomView)
lowerBottomNav(binding.readerBottomViewTts)

binding.readToolbarHolder.translationY = 0f
ObjectAnimator.ofFloat(
binding.readToolbarHolder,
"translationY",
-binding.readToolbarHolder.height.toFloat()
).apply {
duration = 200
start()
}.doOnEnd {
binding.readToolbarHolder.visibility = View.GONE
}
}

private fun showSystemUI() {
WindowCompat.setDecorFitsSystemWindows(window, true)
WindowInsetsControllerCompat(
window,
binding.readerContainer
).show(WindowInsetsCompat.Type.systemBars())

binding.readToolbarHolder.visibility = View.VISIBLE


fun higherBottomNavView(v: View) {
v.translationY = v.height.toFloat()
ObjectAnimator.ofFloat(v, "translationY", 0f).apply {
duration = 200
start()
}
}

higherBottomNavView(binding.readerBottomView)
higherBottomNavView(binding.readerBottomViewTts)

binding.readToolbarHolder.translationY = -binding.readToolbarHolder.height.toFloat()

ObjectAnimator.ofFloat(binding.readToolbarHolder, "translationY", 0f).apply {
duration = 200
start()
}
}


lateinit var binding: ReadMainBinding
private val viewModel: ReadActivityViewModel by viewModels()
Expand Down Expand Up @@ -84,17 +172,151 @@ class ReadActivity2 : AppCompatActivity(), ColorPickerDialogListener {
}
}

fun parseAction(input : TTSHelper.TTSActionType) : Boolean {
fun parseAction(input: TTSHelper.TTSActionType): Boolean {
return viewModel.parseAction(input)
}

override fun onCreate(savedInstanceState: Bundle?) {
CommonActivity.loadThemes(this)
super.onCreate(savedInstanceState)
binding = ReadMainBinding.inflate(layoutInflater)
setContentView(binding.root)

registerBattery()

viewModel.init(intent,this)
viewModel.init(intent, this)

observe(viewModel.title) { title ->
binding.readToolbar.title = title
}

observe(viewModel.chapterTile) { title ->
binding.readToolbar.subtitle = title
}

observe(viewModel.chaptersTitles) { titles ->

}

observe(viewModel.ttsStatus) { status ->
val isTTSRunning = status != TTSHelper.TTSStatus.IsStopped

binding.readerBottomView.isGone = isTTSRunning
binding.readerBottomViewTts.isVisible = isTTSRunning
}

/*val touchListener = View.OnTouchListener { _, event ->
if(event.action == MotionEvent.ACTION_DOWN) {
viewModel.switchVisibility()
return@OnTouchListener true
}
false
}*/

fixPaddingStatusbar(binding.readToolbarHolder)
fixPaddingStatusbar(binding.realText)

binding.apply {
realText.setOnClickListener {
viewModel.switchVisibility()
}
readToolbar.setOnClickListener {
viewModel.switchVisibility()
}
readerLinContainer.setOnClickListener {
viewModel.switchVisibility()
}
}

observe(viewModel.bottomVisibility) { visibility ->
if(visibility)
showSystemUI()
else
hideSystemUI()
}

observe(viewModel.loadingStatus) { loading ->
when (loading) {
is Resource.Success -> {
binding.readLoading.isVisible = false
binding.readFail.isVisible = false

binding.readNormalLayout.isVisible = true
binding.readNormalLayout.alpha = 0.01f

ObjectAnimator.ofFloat(binding.readNormalLayout, "alpha", 1f).apply {
duration = 300
start()
}
}

is Resource.Loading -> {
binding.readNormalLayout.isVisible = false
binding.readFail.isVisible = false
binding.readLoading.isVisible = true
binding.loadingText.apply {
isGone = loading.url.isNullOrBlank()
text = loading.url ?: ""
}
}

is Resource.Failure -> {
binding.readLoading.isVisible = false
binding.readFail.isVisible = true
binding.failText.text = loading.errorString
binding.readNormalLayout.isVisible = false
}
}
}

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

binding.realText.apply {
layoutManager = textLayoutManager
adapter = textAdapter
itemAnimator = null

addOnScrollListener(object :
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))
}
})
}

var firstAppend = true
observe(viewModel.chapter) { 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) //
}
}

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

0 comments on commit 5d55a43

Please sign in to comment.