This commit is contained in:
lunaticbum 2024-09-07 17:55:28 +09:00
parent f5003d9378
commit ac6523b2dd
9 changed files with 334 additions and 118 deletions

View File

@ -64,7 +64,7 @@ dependencies {
implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.code.gson:gson:2.10.1'
// implementation files('libs/DualScreen.jar') // implementation files('libs/DualScreen.jar')
implementation ("org.jsoup:jsoup:1.18.1")
implementation 'io.realm.kotlin:library-base:2.0.0' implementation 'io.realm.kotlin:library-base:2.0.0'

View File

@ -21,6 +21,7 @@ import android.view.KeyEvent
import android.view.View import android.view.View
import android.view.View.GONE import android.view.View.GONE
import android.view.View.VISIBLE import android.view.View.VISIBLE
import android.webkit.JavascriptInterface
import android.webkit.WebSettings import android.webkit.WebSettings
import android.webkit.WebView import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
@ -57,12 +58,19 @@ import com.mime.dualscreenview.webcontents.BaseWebContentsViewer
import com.mime.dualscreenview.webcontents.MainControllInterface import com.mime.dualscreenview.webcontents.MainControllInterface
import com.mime.dualscreenview.webcontents.contentsinfo.Booktoki import com.mime.dualscreenview.webcontents.contentsinfo.Booktoki
import com.mime.dualscreenview.webcontents.contentsinfo.GotoSomeWhere import com.mime.dualscreenview.webcontents.contentsinfo.GotoSomeWhere
import com.mime.dualscreenview.webcontents.contentsinfo.NewtokiOne
import com.mime.dualscreenview.webcontents.getT
import io.realm.kotlin.UpdatePolicy import io.realm.kotlin.UpdatePolicy
import io.realm.kotlin.ext.copyFromRealm import io.realm.kotlin.ext.copyFromRealm
import io.realm.kotlin.ext.isManaged
import io.realm.kotlin.ext.query import io.realm.kotlin.ext.query
import io.realm.kotlin.ext.realmListOf
import org.jsoup.Jsoup
import java.lang.System.currentTimeMillis import java.lang.System.currentTimeMillis
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
import kotlin.random.Random import kotlin.random.Random
@ -88,7 +96,7 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
fun getCurrentUrl() : String { fun getCurrentUrl() : String {
var currentPath = currentBooinfo?.pathUrl ?: mBaseWebContentsViewer.webview.url?.toUri()?.path ?: "" var currentPath = currentBooinfo?.pathUrl ?: mBaseWebContentsViewer.webview.url?.toUri()?.path ?: ""
var domain = PrefManager.getLastDomain() var domain = PrefManager.getLastDomain()
return domain.plus("/").plus(if (currentPath.length > 4) currentPath else "") return domain.plus(if (currentPath.length > 4) currentPath else "")
} }
override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) {
@ -130,6 +138,10 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
binding.hiddenWeb?.let { v-> binding.hiddenWeb?.let { v->
contentsSaver = v contentsSaver = v
contentsSaver?.webViewClient = saveClient contentsSaver?.webViewClient = saveClient
try {
contentsSaver?.removeJavascriptInterface("MyJavaScriptInterface")
} catch (e:Exception) {e.printStackTrace()}
contentsSaver?.addJavascriptInterface(SaveHelper(),"MyJavaScriptInterface")
contentsSaver?.settings?.textZoom = 100 contentsSaver?.settings?.textZoom = 100
contentsSaver?.settings?.javaScriptEnabled = true contentsSaver?.settings?.javaScriptEnabled = true
contentsSaver?.settings?.javaScriptCanOpenWindowsAutomatically = false contentsSaver?.settings?.javaScriptCanOpenWindowsAutomatically = false
@ -158,7 +170,7 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
binding.btnHome.setOnClickListener { v-> binding.btnHome.setOnClickListener { v->
paged_layer.visibility = GONE paged_layer.visibility = GONE
mBaseWebContentsViewer.loadContents(Booktoki) mBaseWebContentsViewer.loadContents(NewtokiOne)
} }
loadLastInfo() loadLastInfo()
@ -181,8 +193,8 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
Blog.LOGE("HistoryManager.getNextPage(${lastInfo?.pageUrl})") Blog.LOGE("HistoryManager.getNextPage(${lastInfo?.pageUrl})")
mBaseWebContentsViewer.webview.loadUrl(lastInfo!!.pageUrl!!.replace(Uri.parse(lastInfo!!.pageUrl)!!.path!!,it?.pathUrl!!)) mBaseWebContentsViewer.webview.loadUrl(lastInfo!!.pageUrl!!.replace(Uri.parse(lastInfo!!.pageUrl)!!.path!!,it?.pathUrl!!))
} else { } else {
Blog.LOGE("HistoryManager.getNextPage(${Booktoki.getLastedDoamin()})") Blog.LOGE("HistoryManager.getNextPage(${NewtokiOne.getLastedDoamin()})")
mBaseWebContentsViewer.webview.loadUrl(Booktoki.getLastedDoamin() + it?.pathUrl!!) mBaseWebContentsViewer.webview.loadUrl(NewtokiOne.getLastedDoamin() + it?.pathUrl!!)
} }
it?.pathUrl?.let { it?.pathUrl?.let {
HistoryManager.getBookInfos(it) { HistoryManager.getBookInfos(it) {
@ -230,8 +242,15 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
} }
} }
override fun onBookInfos(aInfos: BookPageInfos) {
Blog.LOGE("onBookInfos(aInfos: ${aInfos})")
runOnUiThread {
showList(aInfos)
}
}
override fun onBookInfos(jsonString: String) { override fun onBookInfos(jsonString: String) {
Blog.LOGE("onBookInfos" , "onBookInfos >> ${jsonString}") Blog.LOGE("onBookInfos" , "jsonString >> ${jsonString}")
val realm = openRealm() val realm = openRealm()
var infos : BookPageInfos? = null var infos : BookPageInfos? = null
realm.writeBlocking { realm.writeBlocking {
@ -270,7 +289,7 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
infos?.bookPageUrl?.let { infos?.bookPageUrl?.let {
HistoryManager.getBookInfos(it){ HistoryManager.getBookInfos(it){
it?.let { it?.let {
Blog.LOGE("onBookInfos" , "onBookInfos it >> ${it}") Blog.LOGE(s(), "onBookInfos it >> ${it}")
runOnUiThread { runOnUiThread {
showList(it) showList(it)
} }
@ -281,12 +300,14 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
} }
} }
private fun s() = "onBookInfos"
fun reloadTo(lastInfo: LastInfo?) { fun reloadTo(lastInfo: LastInfo?) {
findViewById<WebView>(R.id.menu_web)?.postDelayed({ findViewById<WebView>(R.id.menu_web)?.postDelayed({
if (lastInfo != null) { if (lastInfo != null) {
mBaseWebContentsViewer.loadLastInfo(lastInfo!!) mBaseWebContentsViewer.loadLastInfo(lastInfo!!)
} else { } else {
mBaseWebContentsViewer.loadContents(Booktoki) mBaseWebContentsViewer.loadContents(NewtokiOne)
} }
},200L) },200L)
} }
@ -380,7 +401,7 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
} }
fun showList(infos: BookPageInfos) { fun showList(infos: BookPageInfos) {
Blog.LOGE("showList infos >>>>${infos}")
if (infos != null && infos.pages.size ?: 0 > 0) { if (infos != null && infos.pages.size ?: 0 > 0) {
var items : ArrayList<BookPageInfo> = arrayListOf() var items : ArrayList<BookPageInfo> = arrayListOf()
for (item in infos.pages) { for (item in infos.pages) {
@ -391,7 +412,7 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
DefaultList.showDefaultList( DefaultList.showDefaultList(
this@Intro, this@Intro,
"현제는 ${currentTitle} - ${(infos.pages.size ?: 0) - currentChapter} -> 다른화를 골라", "현제는 ${currentTitle} - ${currentChapter} -> 다른화를 골라",
items, items,
currentChapter, currentChapter,
{ position -> { position ->
@ -420,17 +441,29 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
return text.trim() return text.trim()
} }
var isLoading = false
var saveClient = object : WebViewClient() { var saveClient = object : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon) super.onPageStarted(view, url, favicon)
isLoading = true
Blog.LOGE("saveClient >>> ${isLoading} ${url}")
} }
override fun onPageFinished(webView: WebView?, url: String?) { override fun onPageFinished(webView: WebView?, url: String?) {
super.onPageFinished(webView, url) super.onPageFinished(webView, url)
isLoading = false finishedUrl = url ?: ""
webView?.postDelayed({ autoScrollDown(webView, url) },(1300L + Random(System.currentTimeMillis()).nextLong().rem(1286L))) webView?.postDelayed({
webView?.evaluateJavascript(
"function getAll() {\n" +
" MyJavaScriptInterface.sendValueFromHtml(document.getElementsByTagName('html')[0].innerHTML)" +
" };getAll()"
) { result ->
(result as? String)?.let {
}
}
}, 11000L)
}
} }
fun showToast(origin: String) { fun showToast(origin: String) {
runOnUiThread { runOnUiThread {
@ -443,48 +476,32 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
).show() ).show()
} }
} }
var finishedUrl : String? = null
fun autoScrollDown(webView: WebView?, url: String?) { inner class SaveHelper {
webView?.let { webView -> @JavascriptInterface
val ramdomTimeSec = fun sendValueFromHtml(string: String) {
800L.plus(Random(System.currentTimeMillis()).nextLong().rem(789L)) Jsoup.parse(string)?.let { html ->
Blog.LOGE("ramdomTime >>> ${ramdomTimeSec}") val view_padding = html.getElementsByClass("view-padding")
if (((webView?.scrollY ?: 0) + (webView?.height if (view_padding.size > 0){
?: 0)) < webView?.contentHeight ?: 0 // Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: ${html.title()}")
) { val contents = view_padding.get(0).children().html().replace("<p>"," ").replace("</p>","\n\n")
webView?.postDelayed({ // Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: view_padding.get(0)\n${contents}")
webView?.pageDown(false) if (contents.length > 20) {
autoScrollDown(webView, url) Uri.parse(finishedUrl).path?.let {
}, ramdomTimeSec) HistoryManager.getBooPageInfoContentsSave(it, contents).apply {
HistoryManager.getBookPageInfo(it) { book ->
showToast("saved ${book?.getTitleItem()} :: lenght = ${contents.length}")
}
}.apply {
HistoryManager.getBookInfos(it) { saveItem(it)}
}
}
}
} else { } else {
webView?.postDelayed({
var findContents = Booktoki.getFindContentsJs()
webView?.evaluateJavascript(findContents) { result: String? ->
result?.let { string: String ->
if (string.length > 10) {
val contents = string.replace("\\\"", "\"")
.replace("\\n", System.getProperty("line.separator"))
.replace("\\n", System.getProperty("line.separator"))
Uri.parse(url)?.let {
it.path?.let {
HistoryManager.getBooPageInfoContentsSave(it, contents.replace(Char(0x20).toString(), " "))
HistoryManager.getBookPageInfo(it) { info ->
info?.let { showToast(info.getTitleItem()) }
} }
} }
} }
} }
var ramdomTime = 2000L.plus(Random(System.currentTimeMillis()).nextLong().rem(1785L))
Blog.LOGE("afterNextPageTime >>> ${ramdomTime}")
contentsSaver?.postDelayed({ saveItem(null) }, ramdomTime)
}
}
}, ramdomTimeSec)
}
}
}
}
var saveTarget : ArrayList<BookPageInfo> = arrayListOf() var saveTarget : ArrayList<BookPageInfo> = arrayListOf()
private fun saveItem(infos: BookPageInfos?) { private fun saveItem(infos: BookPageInfos?) {
Blog.LOGE("saveItem >>> infos?.pages ${infos?.pages?.size ?: 0}") Blog.LOGE("saveItem >>> infos?.pages ${infos?.pages?.size ?: 0}")
@ -513,7 +530,6 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
Blog.LOGE("saveItem >>> saveTarget ${saveTarget.count()}") Blog.LOGE("saveItem >>> saveTarget ${saveTarget.count()}")
if (isLoading == false) {
try { try {
saveTarget.removeFirst().let { saveTarget.removeFirst().let {
Blog.LOGE("saveItem >>> ${it.pathUrl}") Blog.LOGE("saveItem >>> ${it.pathUrl}")
@ -532,8 +548,6 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
} }
} }
}
private fun moveTo(item: BookPageInfo?) { private fun moveTo(item: BookPageInfo?) {
item?.pathUrl?.let { newPath -> item?.pathUrl?.let { newPath ->
if (item.contents?.length ?: 0 > 10) { if (item.contents?.length ?: 0 > 10) {
@ -597,8 +611,13 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
fun contentsLoad(pathUrl : String) { fun contentsLoad(pathUrl : String) {
HistoryManager.getBookPageInfo(pathUrl) { HistoryManager.getBookPageInfo(pathUrl) {
Blog.LOGE("contentsLoad :::: pathUrl >> ${pathUrl}")
it?.pathUrl?.let { it?.pathUrl?.let {
HistoryManager.getBookInfos(it) { saveItem(it) } Blog.LOGE("contentsLoad :::: pathUrl >> ${it}")
HistoryManager.getBookInfos(it) {
Blog.LOGE("contentsLoad :::: getBookInfos >> ${it}")
saveItem(it)
}
} }
if (it != null) currentBooinfo = it if (it != null) currentBooinfo = it
if (it != null && (it?.contents?.length ?: 0) > 10) { if (it != null && (it?.contents?.length ?: 0) > 10) {
@ -608,7 +627,7 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
if (lastInfo?.pageUrl?.length ?: 0 > 0 && lastInfo?.pageUrl!!.startsWith("http")) { if (lastInfo?.pageUrl?.length ?: 0 > 0 && lastInfo?.pageUrl!!.startsWith("http")) {
mBaseWebContentsViewer.webview.loadUrl(lastInfo!!.pageUrl!!.replace(Uri.parse(lastInfo!!.pageUrl)!!.path!!,it?.pathUrl!!)) mBaseWebContentsViewer.webview.loadUrl(lastInfo!!.pageUrl!!.replace(Uri.parse(lastInfo!!.pageUrl)!!.path!!,it?.pathUrl!!))
} else { } else {
mBaseWebContentsViewer.webview.loadUrl(Booktoki.getLastedDoamin() + it?.pathUrl!!) mBaseWebContentsViewer.webview.loadUrl(NewtokiOne.getLastedDoamin() + it?.pathUrl!!)
} }
HistoryManager.save(historyItem = HistoryItem().putHistory(it,mBaseWebContentsViewer.webview.url!!)) HistoryManager.save(historyItem = HistoryItem().putHistory(it,mBaseWebContentsViewer.webview.url!!))
} }
@ -620,7 +639,7 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
mBaseWebContentsViewer.webview.loadUrl(lastInfo!!.pageUrl!!.replace(Uri.parse(lastInfo!!.pageUrl)!!.path!!,it?.pathUrl!!)) mBaseWebContentsViewer.webview.loadUrl(lastInfo!!.pageUrl!!.replace(Uri.parse(lastInfo!!.pageUrl)!!.path!!,it?.pathUrl!!))
} else { } else {
paged_layer.visibility = GONE paged_layer.visibility = GONE
mBaseWebContentsViewer.webview.loadUrl(Booktoki.getLastedDoamin() + it?.pathUrl!!) mBaseWebContentsViewer.webview.loadUrl(NewtokiOne.getLastedDoamin() + it?.pathUrl!!)
} }
HistoryManager.save(historyItem = HistoryItem().putHistory(it,mBaseWebContentsViewer.webview.url!!)) HistoryManager.save(historyItem = HistoryItem().putHistory(it,mBaseWebContentsViewer.webview.url!!))
} }
@ -726,16 +745,17 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
@RequiresApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O)
override fun onLoadedContents(aContents: String) { override fun onLoadedContents(aContents: String) {
paged_layer.apply { paged_layer.apply {
paged_layer.post {
if (aContents != null && aContents.length > 10) { if (aContents != null && aContents.length > 10) {
var contents = aContents.replace("\\\"","\"") var contents = aContents.replace("\\\"", "\"")
contents = (contents.replace("\\n", System.getProperty("line.separator"))) contents = (contents.replace("\\n", System.getProperty("line.separator")))
contents = (contents.replace("\\n", System.getProperty("line.separator"))) contents = (contents.replace("\\n", System.getProperty("line.separator")))
mPagedTextViewInterface = this@Intro mPagedTextViewInterface = this@Intro
if(lastInfo != null && mBaseWebContentsViewer.webview.url?.endsWith(lastInfo!!.pageUrl) ?: false) { if (lastInfo != null && mBaseWebContentsViewer.webview.url?.endsWith(lastInfo!!.pageUrl) ?: false) {
binding.progress.visibility = VISIBLE binding.progress.visibility = VISIBLE
paged_layer.postDelayed({ paged_layer.postDelayed({
binding.progress.visibility = GONE binding.progress.visibility = GONE
},1000) }, 1000)
} }
applyReaderConfig() applyReaderConfig()
runOnUiThread { runOnUiThread {
@ -746,14 +766,20 @@ class Intro : Base() , MainControllInterface, PagedTextViewInterface {
mBaseWebContentsViewer.webview.url?.let { mBaseWebContentsViewer.webview.url?.let {
Uri.parse(it)?.let { Uri.parse(it)?.let {
it.path?.let { it.path?.let {
HistoryManager.getBookPageInfo(it){ HistoryManager.getBookPageInfo(it) {
currentBooinfo = it currentBooinfo = it
currentChapter = it?.chapterNum ?: 0 currentChapter = it?.chapterNum ?: 0
currentPage = it?.chapterNum ?: 0 currentPage = it?.chapterNum ?: 0
HistoryManager.save(historyItem = HistoryItem().putHistory(it,mBaseWebContentsViewer.webview.url!!)) HistoryManager.save(
historyItem = HistoryItem().putHistory(
it,
mBaseWebContentsViewer.webview.url!!
)
)
} }
} }
HistoryManager.getBooPageInfoContentsSave(it!!.path!!,contents) HistoryManager.getBooPageInfoContentsSave(it!!.path!!, contents)
}
} }
} }
} }

View File

@ -3,6 +3,7 @@ package com.mime.dualscreenview.common
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import com.mime.dualscreenview.webcontents.contentsinfo.Booktoki import com.mime.dualscreenview.webcontents.contentsinfo.Booktoki
import com.mime.dualscreenview.webcontents.contentsinfo.NewtokiOne
object PrefManager { object PrefManager {
private val mainName = "Main_Pref_" private val mainName = "Main_Pref_"
@ -20,7 +21,7 @@ object PrefManager {
} }
fun getLastDomain() : String { fun getLastDomain() : String {
return main.getString(domainKey, Booktoki.getLastedDoamin()) ?: Booktoki.getLastedDoamin() return main.getString(domainKey, NewtokiOne.getLastedDoamin()) ?: NewtokiOne.getLastedDoamin()
} }
fun putLastDomain(domain : String) { fun putLastDomain(domain : String) {
Blog.LOGE("domain >>> ${domain}") Blog.LOGE("domain >>> ${domain}")

View File

@ -61,13 +61,18 @@ object HistoryManager {
url = url.replace("//","/").trim() url = url.replace("//","/").trim()
} }
} }
var bookPageInfo = this.query(BookPageInfo::class).query("pathUrl == $0 || bookPageUrl == $1","${url}","${url}").find() Blog.LOGE("aUrl >>> ${aUrl}")
Blog.LOGE("aUrl >>> ${aUrl}")
var bookPageInfo = this.query(BookPageInfo::class).query("pathUrl == $0 || bookPageUrl == $0","${url}").find()
if (bookPageInfo != null && bookPageInfo.count() > 0) { if (bookPageInfo != null && bookPageInfo.count() > 0) {
Blog.LOGE("get ${bookPageInfo}" ) Blog.LOGE("get ${bookPageInfo}" )
this.query(BookPageInfos::class,"bookPageUrl == $0",bookPageInfo.first().bookPageUrl).find().first().let { var pgs = this.query(BookPageInfos::class,"bookPageUrl == $0", bookPageInfo.first().bookPageUrl).find()
Blog.LOGE("get ${it} , ${it?.pages}" ) if (pgs.size > 0) {
pgs.first().let {
Blog.LOGE("get ${it} , ${it?.pages}")
callback.invoke(this.copyFromRealm(it)) callback.invoke(this.copyFromRealm(it))
} }
}
} else { } else {
callback.invoke(null) callback.invoke(null)
} }

View File

@ -1,5 +1,6 @@
package com.mime.dualscreenview.webcontents package com.mime.dualscreenview.webcontents
import android.annotation.SuppressLint
import android.app.AlertDialog import android.app.AlertDialog
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
@ -7,15 +8,22 @@ import android.net.http.SslError
import android.util.Log import android.util.Log
import android.webkit.* import android.webkit.*
import androidx.core.net.toUri import androidx.core.net.toUri
import com.google.gson.Gson
import com.mime.dualscreenview.common.Blog import com.mime.dualscreenview.common.Blog
import com.mime.dualscreenview.common.PrefManager import com.mime.dualscreenview.common.PrefManager
import com.mime.dualscreenview.data.HistoryManager import com.mime.dualscreenview.data.HistoryManager
import com.mime.dualscreenview.data.model.BookPageInfo
import com.mime.dualscreenview.data.model.BookPageInfos
import com.mime.dualscreenview.data.model.LastInfo import com.mime.dualscreenview.data.model.LastInfo
import com.mime.dualscreenview.webcontents.contentsinfo.Booktoki import com.mime.dualscreenview.webcontents.contentsinfo.Booktoki
import com.mime.dualscreenview.webcontents.contentsinfo.DidFindContents import com.mime.dualscreenview.webcontents.contentsinfo.DidFindContents
import io.realm.kotlin.UpdatePolicy
import io.realm.kotlin.ext.realmListOf
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.json.JSONObject import org.json.JSONObject
import org.jsoup.Jsoup
import org.jsoup.select.Elements
open class BaseWebContentsViewer { open class BaseWebContentsViewer {
@ -38,6 +46,7 @@ open class BaseWebContentsViewer {
} }
} }
@SuppressLint("JavascriptInterface")
constructor(webview : WebView, mainControllInterface : MainControllInterface ) { constructor(webview : WebView, mainControllInterface : MainControllInterface ) {
this.webview = webview this.webview = webview
this.mainControllInterface = mainControllInterface this.mainControllInterface = mainControllInterface
@ -51,6 +60,10 @@ open class BaseWebContentsViewer {
webview.settings.setPluginState(WebSettings.PluginState.ON) webview.settings.setPluginState(WebSettings.PluginState.ON)
webview.settings.domStorageEnabled = true webview.settings.domStorageEnabled = true
webview.clearCache(true); webview.clearCache(true);
try {
webview.removeJavascriptInterface("MyJavaScriptInterface")
}catch (e :Exception){e.printStackTrace()}
webview.addJavascriptInterface( BookHelper(),"MyJavaScriptInterface")
webview.clearHistory(); webview.clearHistory();
webview.clearSslPreferences(); webview.clearSslPreferences();
WebView.setWebContentsDebuggingEnabled(true) WebView.setWebContentsDebuggingEnabled(true)
@ -83,7 +96,7 @@ open class BaseWebContentsViewer {
webview.loadUrl(last.pageUrl) webview.loadUrl(last.pageUrl)
} else { } else {
try { try {
webview.loadUrl(PrefManager.getLastDomain().plus("/").plus(last.pageUrl)) webview.loadUrl(PrefManager.getLastDomain().plus(last.pageUrl))
} catch (e : Exception) { } catch (e : Exception) {
webview.loadUrl(PrefManager.getLastDomain()) webview.loadUrl(PrefManager.getLastDomain())
} }
@ -92,7 +105,6 @@ open class BaseWebContentsViewer {
} }
val rootWebViewClient = object : WebViewClient() { val rootWebViewClient = object : WebViewClient() {
override fun shouldInterceptRequest( override fun shouldInterceptRequest(
view: WebView?, view: WebView?,
request: WebResourceRequest? request: WebResourceRequest?
@ -131,8 +143,10 @@ open class BaseWebContentsViewer {
// super.onReceivedHttpError(view, request, errorResponse) // super.onReceivedHttpError(view, request, errorResponse)
} }
override fun onPageFinished(view: WebView?, url: String?) { override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url) super.onPageFinished(view, url)
finishedUrl = url ?: ""
view?.let { view?.let {
url?.toUri()?.let { url?.toUri()?.let {
PrefManager.putLastDomain(it.scheme.plus("::/").plus(it.host)) PrefManager.putLastDomain(it.scheme.plus("::/").plus(it.host))
@ -143,10 +157,21 @@ open class BaseWebContentsViewer {
Blog.LOGE("onPageFinished", url ?: "") Blog.LOGE("onPageFinished", url ?: "")
} }
} else if (url?.contains("booktoki") ?: false){ } else if (url?.contains("booktoki") ?: false){
findListItem { // findListItem {
Blog.LOGE("onPageFinished", url ?: "") // Blog.LOGE("onPageFinished", url ?: "")
// }
}
view?.postDelayed({
view?.evaluateJavascript(
"function getAll() {\n" +
" MyJavaScriptInterface.sendValueFromHtml(document.getElementsByTagName('html')[0].innerHTML)" +
" };getAll()"
) { result ->
(result as? String)?.let {
} }
} }
}, 500L)
currentContentsProvider?.doOnloaded(it , { result -> currentContentsProvider?.doOnloaded(it , { result ->
result?.let { mainControllInterface.onLoadedContents(it) } result?.let { mainControllInterface.onLoadedContents(it) }
@ -162,4 +187,65 @@ open class BaseWebContentsViewer {
} }
} }
} }
var finishedUrl : String = ""
inner class BookHelper {
@JavascriptInterface
fun sendValueFromHtml(string: String) {
Jsoup.parse(string)?.let { html ->
val toon_intro = html.getElementById("toon_intro")
val view_padding = html.getElementsByClass("view-padding")
if (toon_intro != null) {
// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: ${html.title()}")
val bookPageInfos = BookPageInfos()
bookPageInfos.bookPageUrl = Uri.parse(finishedUrl).path
bookPageInfos.bookTitle = if (toon_intro.getElementsByTag("h3").size > 0) toon_intro.getElementsByTag("h3").get(0).text() else ""
bookPageInfos.pages = realmListOf<BookPageInfo>()
// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: bookPageInfos >>>> ${Gson().toJson(bookPageInfos)}")
val listParent = html.getElementById("list_type")
if (listParent != null) {
listParent.getElementsByClass("row").forEach { bookitem ->
// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: bookItemInfo ${bookitem}")
try {
val bookPageInfo = BookPageInfo()
bookPageInfo.bookTitle = bookPageInfos.bookTitle
bookPageInfo.chapterNum = bookitem.getElementsByClass("cell_num").getT().toInt()
bookPageInfo.chapterID = bookitem.getElementsByClass("cell_num").getT().toInt()
bookPageInfo.chapterTitle = bookitem.getElementsByTag("a").getT()
bookPageInfo.bookPageUrl = bookPageInfos.bookPageUrl
val href = bookitem.getElementsByTag("a").get(0).attr("href")
bookPageInfo.pathUrl = Uri.parse(href).path
bookPageInfos.pages.add(bookPageInfo)
}catch (nfe : NumberFormatException) {
nfe.printStackTrace()
}
}.apply {
HistoryManager.openRealm.writeBlocking {
copyToRealm(bookPageInfos, UpdatePolicy.ALL)
// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: bookPageInfos saved >>>> ${bookPageInfos.bookPageUrl}")
}
mainControllInterface.onBookInfos(bookPageInfos)
}
}
}else if (view_padding.size > 0){
// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: ${html.title()}")
val contents = view_padding.get(0).children().html().replace("<p>"," ").replace("</p>","\n\n")
// Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: view_padding.get(0)\n${contents}")
if (contents.length > 20) {
Uri.parse(finishedUrl).path?.let {
HistoryManager.getBooPageInfoContentsSave(it, contents)
mainControllInterface.onLoadedContents(contents)
}
}
} else {
Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: ${html.title()}")
Blog.LOGE("finishedUrl >>> ${finishedUrl} :::: whole body ${html}")
}
}
}
}
} }
fun Elements.getT() = if (size > 0) get(0).text() else ""

View File

@ -1,5 +1,6 @@
package com.mime.dualscreenview.webcontents package com.mime.dualscreenview.webcontents
import com.mime.dualscreenview.data.model.BookPageInfos
import com.mime.dualscreenview.data.model.LastInfo import com.mime.dualscreenview.data.model.LastInfo
import com.mime.dualscreenview.webcontents.contentsinfo.GotoSomeWhere import com.mime.dualscreenview.webcontents.contentsinfo.GotoSomeWhere
@ -16,5 +17,6 @@ interface MainControllInterface {
fun onFindTitle(contents :String) fun onFindTitle(contents :String)
fun onBookInfos(jsonString : String) fun onBookInfos(jsonString : String)
fun onBookInfos(infos : BookPageInfos)
} }

View File

@ -2,9 +2,10 @@ package com.mime.dualscreenview.webcontents
import com.mime.dualscreenview.webcontents.contentsinfo.Agit import com.mime.dualscreenview.webcontents.contentsinfo.Agit
import com.mime.dualscreenview.webcontents.contentsinfo.Booktoki import com.mime.dualscreenview.webcontents.contentsinfo.Booktoki
import com.mime.dualscreenview.webcontents.contentsinfo.NewtokiOne
object WebContentsManger { object WebContentsManger {
val allContentsList : ArrayList<BaseWebContents> = arrayListOf(Booktoki) val allContentsList : ArrayList<BaseWebContents> = arrayListOf(NewtokiOne)
fun getBaseWebContentsBy(name : String) : BaseWebContents { fun getBaseWebContentsBy(name : String) : BaseWebContents {
var correctContents : BaseWebContents = Booktoki var correctContents : BaseWebContents = Booktoki

View File

@ -4,7 +4,7 @@ import com.mime.dualscreenview.webcontents.BaseWebContents
object Booktoki : BaseWebContents() { object Booktoki : BaseWebContents() {
override var lastNumber : Int = 350 override var lastNumber : Int = 351
override fun getWebcontentsName(): String { override fun getWebcontentsName(): String {
return "Booktoki" return "Booktoki"

View File

@ -0,0 +1,95 @@
package com.mime.dualscreenview.webcontents.contentsinfo
import com.mime.dualscreenview.webcontents.BaseWebContents
object NewtokiOne : BaseWebContents() {
override var lastNumber : Int = 351
override fun getWebcontentsName(): String {
return "newtokione"
}
override fun getLastedDoamin(): String {
return "https://newtoki.one"
}
override fun getContentsList(): String {
return "function getList() {\n" +
" const contentsArray = [];\n" +
" var children = document.getElementsByClassName('list-body')[0].children;\n" +
" var maxCount = children.length;\n" +
" for (i= 0; i < maxCount; i++) {\n" +
" var chapterNum = children[i].getElementsByClassName('wr-num')[0].textContent;\n" +
" var pageUrl = children[i].getElementsByClassName('wr-subject')[0].getElementsByTagName('a')[0].href;\n" +
" if (pageUrl != null && pageUrl.length > 0 && pageUrl.startsWith(\"http\")) {\n" +
" pageUrl = new URL(pageUrl).pathname;\n" +
" }\n" +
" var chapterTitle = children[i].getElementsByClassName('wr-subject')[0].getElementsByTagName('a')[0].innerText;\n" +
" if(chapterTitle.split('\\n').length > 1) {\n" +
" chapterTitle = chapterTitle.split('\\n')[1];\n" +
" }\n" +
"\n" +
" var bookPageUrl = location.pathname;\n" +
" var bookTitle = document.getElementsByClassName('view-title')[0].getElementsByTagName('span')[0].innerText;\n" +
" var data = {\n" +
" 'chapterID': Number(chapterNum),\n" +
" 'chapterNum': Number(chapterNum),\n" +
" 'pathUrl': pageUrl,\n" +
" 'bookPageUrl': bookPageUrl,\n" +
" 'chapterTitle': chapterTitle,\n" +
" 'bookTitle': bookTitle,\n" +
" };\n" +
" contentsArray.push(\n" +
" data\n" +
" );\n" +
" }\n" +
" \n" +
" if(contentsArray.length > 0) {\n" +
" PAgit.onBookInfo(JSON.stringify({\n" +
" 'bookTitle': bookTitle,\n" +
" 'bookPageUrl': new URL(location.href).pathname,\n" +
" 'pages': contentsArray ,\n" +
" }));\n" +
" }\n" +
"}\n" +
"getList()\n" +
""
}
override fun acccceptResourceKeyword(): String {
return "toki"
}
override fun getNextButtonJs(): String {
return "goNextBtn"
}
override fun getPrevButtonJs(): String {
return "goPrevBtn"
}
override fun getTitleJs(): String {
return "document.getElementsByClassName(\"toon-title\").length > 0 ? document.getElementsByClassName(\"toon-title\")[0].title : null"
}
override fun getFindContentsJs(): String {
return "document.getElementById(\"novel_content\") != null ? document.getElementById(\"novel_content\").innerText : null"
}
override fun checkCorrectContents(contents: String): String {
return if (contents != null && !contents.isNullOrEmpty()) {
contents
} else {
"fail load"
}
}
// "if(document.getElementsByClassName(\"hd_pops\") != null && document.getElementsByClassName(\"hd_pops\").length > 0) document.getElementsByClassName(\"hd_pops\")[0].remove();" +
// "if(document.getElementsByClassName(\"hd_pops\") != null && document.getElementsByClassName(\"hd_pops\").length > 0) document.getElementsByClassName(\"hd_pops\")[0].remove();" +
// "if(document.getElementById(\"main-banner-view\") != null) document.getElementById(\"main-banner-view\").remove();" +
// "if(document.getElementsByClassName(\"board-tail-banner\") != null && document.getElementsByClassName(\"board-tail-banner\").length > 0)document.getElementsByClassName(\"board-tail-banner\")[0].remove();" +
// "if(document.getElementById(\"id_mbv\") != null)document.getElementById(\"id_mbv\").remove();"
override fun onLoadedJs(): String {
return ""
}
}