@ -3,12 +3,10 @@ package org.koitharu.kotatsu.ui.reader
import android.Manifest
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.net.Uri
import android.os.Bundle
import android.view.Gravity
import android.view.Menu
import android.view.MenuItem
import android.view.MotionEvent
import android.view.*
import android.widget.Toast
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
@ -17,11 +15,13 @@ import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.activity_reader.*
import moxy.MvpDelegate
import moxy.ktx.moxyPresenter
import org.koin.core.inject
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.core.model.MangaChapter
import org.koitharu.kotatsu.core.model.MangaHistory
import org.koitharu.kotatsu.core.model.MangaPage
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.prefs.ReaderMode
import org.koitharu.kotatsu.ui.common.BaseFullscreenActivity
import org.koitharu.kotatsu.ui.reader.standard.StandardReaderFragment
@ -35,14 +35,17 @@ import org.koitharu.kotatsu.utils.ext.*
class ReaderActivity : BaseFullscreenActivity ( ) , ReaderView , ChaptersDialog . OnChapterChangeListener ,
GridTouchHelper . OnGridTouchListener , OnPageSelectListener , ReaderConfigDialog . Callback ,
ReaderListener {
ReaderListener , SharedPreferences . OnSharedPreferenceChangeListener {
private val presenter by moxyPresenter ( factory = ReaderPresenter . Companion :: getInstance )
private val settings by inject < AppSettings > ( )
lateinit var state : ReaderState
private set
private lateinit var touchHelper : GridTouchHelper
private var isTapSwitchEnabled = true
private var isVolumeKeysSwitchEnabled = false
private val reader
get ( ) = supportFragmentManager . findFragmentById ( R . id . container ) as ? BaseReaderFragment
@ -74,6 +77,9 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
insets
}
settings . subscribe ( this )
loadSettings ( )
if ( savedInstanceState ?. containsKey ( MvpDelegate . MOXY _DELEGATE _TAGS _KEY ) != true ) {
presenter . loadChapter ( state . manga , state . chapterId , ReaderAction . REPLACE )
}
@ -95,6 +101,11 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
super . onPause ( )
}
override fun onDestroy ( ) {
settings . unsubscribe ( this )
super . onDestroy ( )
}
override fun onCreateOptionsMenu ( menu : Menu ? ) : Boolean {
menuInflater . inflate ( R . menu . opt _reader _top , menu )
return super . onCreateOptionsMenu ( menu )
@ -106,7 +117,7 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
}
override fun onOptionsItemSelected ( item : MenuItem ) = when ( item . itemId ) {
R . id . action _ settings -> {
R . id . action _ reader_mode -> {
ReaderConfigDialog . show (
supportFragmentManager , when ( reader ) {
is StandardReaderFragment -> ReaderMode . STANDARD
@ -116,6 +127,10 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
)
true
}
R . id . action _settings -> {
startActivity ( SimpleSettingsActivity . newReaderSettingsIntent ( this ) )
true
}
R . id . action _chapters -> {
ChaptersDialog . show (
supportFragmentManager ,
@ -183,11 +198,11 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
setUiIsVisible ( ! appbar _top . isVisible )
}
GridTouchHelper . AREA _TOP ,
GridTouchHelper . AREA _LEFT -> {
GridTouchHelper . AREA _LEFT -> if ( isTapSwitchEnabled ) {
reader ?. switchPageBy ( - 1 )
}
GridTouchHelper . AREA _BOTTOM ,
GridTouchHelper . AREA _RIGHT -> {
GridTouchHelper . AREA _RIGHT -> if ( isTapSwitchEnabled ) {
reader ?. switchPageBy ( 1 )
}
}
@ -209,6 +224,45 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
return super . dispatchTouchEvent ( ev )
}
override fun onKeyDown ( keyCode : Int , event : KeyEvent ? ) : Boolean = when ( keyCode ) {
KeyEvent . KEYCODE _VOLUME _UP -> if ( isVolumeKeysSwitchEnabled ) {
reader ?. switchPageBy ( - 1 )
true
} else {
super . onKeyDown ( keyCode , event )
}
KeyEvent . KEYCODE _VOLUME _DOWN -> if ( isVolumeKeysSwitchEnabled ) {
reader ?. switchPageBy ( 1 )
true
} else {
super . onKeyDown ( keyCode , event )
}
KeyEvent . KEYCODE _SPACE ,
KeyEvent . KEYCODE _PAGE _DOWN ,
KeyEvent . KEYCODE _DPAD _DOWN ,
KeyEvent . KEYCODE _DPAD _RIGHT -> {
reader ?. switchPageBy ( 1 )
true
}
KeyEvent . KEYCODE _PAGE _UP ,
KeyEvent . KEYCODE _DPAD _UP ,
KeyEvent . KEYCODE _DPAD _LEFT -> {
reader ?. switchPageBy ( - 1 )
true
}
KeyEvent . KEYCODE _DPAD _CENTER -> {
setUiIsVisible ( ! appbar _top . isVisible )
true
}
else -> super . onKeyDown ( keyCode , event )
}
override fun onKeyUp ( keyCode : Int , event : KeyEvent ? ) : Boolean {
return ( isVolumeKeysSwitchEnabled &&
( keyCode == KeyEvent . KEYCODE _VOLUME _DOWN || keyCode == KeyEvent . KEYCODE _VOLUME _UP ) )
|| super . onKeyUp ( keyCode , event )
}
override fun onChapterChanged ( chapter : MangaChapter ) {
state = state . copy (
chapterId = chapter . id ,
@ -262,6 +316,10 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
}
}
override fun onSharedPreferenceChanged ( sharedPreferences : SharedPreferences ? , key : String ? ) {
loadSettings ( )
}
private fun showWaitWhileLoading ( ) {
Toast . makeText ( this , R . string . wait _for _loading _finish , Toast . LENGTH _SHORT ) . apply {
setGravity ( Gravity . CENTER , 0 , 0 )
@ -296,6 +354,17 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh
}
}
}
toolbar _bottom . menu . findItem ( R . id . action _reader _mode ) . setIcon ( when ( mode ) {
ReaderMode . WEBTOON -> R . drawable . ic _script
else -> R . drawable . ic _book _page
} )
}
private fun loadSettings ( ) {
settings . readerPageSwitch . let {
isTapSwitchEnabled = it . contains ( AppSettings . PAGE _SWITCH _TAPS )
isVolumeKeysSwitchEnabled = it . contains ( AppSettings . PAGE _SWITCH _VOLUME _KEYS )
}
}
companion object {