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