1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-21 09:50:23 +08:00

2.0.beta9

1. api改为云函数反代
2. 记录漫画与章节的阅读进度
3. 详情页显示章节
4. 修复流量警告不再提醒无效
This commit is contained in:
fumiama
2022-01-19 21:24:46 +08:00
parent 5811a4da13
commit 683c4eda8c
14 changed files with 301 additions and 81 deletions

3
.idea/misc.xml generated
View File

@@ -17,9 +17,12 @@
<entry key="app/src/main/res/layout/fragment_home.xml" value="0.5095108695652174" /> <entry key="app/src/main/res/layout/fragment_home.xml" value="0.5095108695652174" />
<entry key="app/src/main/res/layout/line_1bookline.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/line_1bookline.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/line_bookinfo.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/line_bookinfo.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/line_booktandb.xml" value="0.48596014492753625" />
<entry key="app/src/main/res/layout/line_chapter.xml" value="0.48596014492753625" />
<entry key="app/src/main/res/layout/line_choice_list.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/line_choice_list.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/line_text_info.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/line_text_info.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/line_word.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/line_word.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/nav_header_main.xml" value="0.48596014492753625" />
<entry key="app/src/main/res/layout/viewpage_banner.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/viewpage_banner.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/viewpage_horizonal.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/viewpage_horizonal.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.5572916666666666" /> <entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.5572916666666666" />

View File

@@ -30,7 +30,7 @@
### 功能 ### 功能
1. 浏览主页、分类、排行、我的下载、标签、作者。 1. 浏览主页、分类、排行、我的下载、标签、作者。
2. 查看、搜索漫画并直接阅读。 2. 查看、搜索漫画并直接阅读;记录漫画与章节的阅读进度
3. 下载漫画。但是由于不可抗力,下载速度较慢且容易出错,这绝对不是优化的原因,绝对不是。 3. 下载漫画。但是由于不可抗力,下载速度较慢且容易出错,这绝对不是优化的原因,绝对不是。
4. 阅读下载的漫画。 4. 阅读下载的漫画。
5. 检查更新。 5. 检查更新。

View File

@@ -9,8 +9,8 @@ android {
applicationId 'top.fumiama.copymanga' applicationId 'top.fumiama.copymanga'
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 31 targetSdkVersion 31
versionCode 19 versionCode 21
versionName '2.0.beta8' versionName '2.0.beta9'
resConfigs "zh", "zh-rCN" resConfigs "zh", "zh-rCN"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -21,6 +21,7 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.edit
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.drawerlayout.widget.DrawerLayout import androidx.drawerlayout.widget.DrawerLayout
import androidx.navigation.NavController import androidx.navigation.NavController
@@ -36,7 +37,6 @@ import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.nav_header_main.* import kotlinx.android.synthetic.main.nav_header_main.*
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.tools.api.UITools import top.fumiama.copymanga.tools.api.UITools
import top.fumiama.copymanga.ui.download.DownloadFragment import top.fumiama.copymanga.ui.download.DownloadFragment
import top.fumiama.copymanga.update.Update import top.fumiama.copymanga.update.Update
@@ -50,7 +50,6 @@ class MainActivity : AppCompatActivity() {
var navController: NavController? = null var navController: NavController? = null
private lateinit var appBarConfiguration: AppBarConfiguration private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var p: PropertiesTools
private lateinit var headPic: File private lateinit var headPic: File
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -75,7 +74,6 @@ class MainActivity : AppCompatActivity() {
setupActionBarWithNavController(navController!!, appBarConfiguration) setupActionBarWithNavController(navController!!, appBarConfiguration)
nav_view.setupWithNavController(navController!!) nav_view.setupWithNavController(navController!!)
p = PropertiesTools(File(filesDir, "database.prop"))
headPic = File(getExternalFilesDir(""), "headPic") headPic = File(getExternalFilesDir(""), "headPic")
mainWeakReference = WeakReference(this) mainWeakReference = WeakReference(this)
drawer_layout.addDrawerListener(object : DrawerLayout.DrawerListener { drawer_layout.addDrawerListener(object : DrawerLayout.DrawerListener {
@@ -121,7 +119,7 @@ class MainActivity : AppCompatActivity() {
} }
true true
} }
p["navTextInfo"].let { if (it != "null") navtinfo.text = it } navtinfo.text = getPreferences(MODE_PRIVATE).getString("navTextInfo", getString(R.string.navTextInfo))
return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
} }
@@ -239,7 +237,7 @@ class MainActivity : AppCompatActivity() {
private fun checkUpdate(ignoreSkip: Boolean) { private fun checkUpdate(ignoreSkip: Boolean) {
Thread{ Thread{
Update.checkUpdate(this, p, UITools(this), ignoreSkip) Update.checkUpdate(this, UITools(this), ignoreSkip)
}.start() }.start()
} }
@@ -259,7 +257,10 @@ class MainActivity : AppCompatActivity() {
MaterialDialog(this).show { MaterialDialog(this).show {
input(prefill = (it as TextView).text) { _, charSequence -> input(prefill = (it as TextView).text) { _, charSequence ->
it.text = charSequence it.text = charSequence
p["navTextInfo"] = charSequence.toString() getPreferences(MODE_PRIVATE).edit {
putString("navTextInfo", charSequence.toString())
apply()
}
} }
positiveButton(android.R.string.ok) positiveButton(android.R.string.ok)
title(R.string.navTextInfoInputHint) title(R.string.navTextInfoInputHint)

View File

@@ -3,20 +3,18 @@ package top.fumiama.copymanga.template.general
import android.app.Activity import android.app.Activity
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import top.fumiama.copymanga.tools.file.PropertiesTools import androidx.core.content.edit
import top.fumiama.copymanga.tools.api.UITools import top.fumiama.copymanga.tools.api.UITools
import java.io.File
import java.lang.ref.WeakReference
open class ActivityTemplate:Activity() { open class ActivityTemplate:Activity() {
lateinit var p: PropertiesTools
lateinit var toolsBox: UITools lateinit var toolsBox: UITools
val p = IntPref()
val pb = BoolPref()
private val allFullScreen private val allFullScreen
get() = p["allFullScreen"] == "true" get() = getPreferences(MODE_PRIVATE).getBoolean("allFullScreen", false)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
p = PropertiesTools(File("$filesDir/settings.properties"))
toolsBox = UITools(this) toolsBox = UITools(this)
} }
@@ -25,4 +23,20 @@ open class ActivityTemplate:Activity() {
if(allFullScreen) window.decorView.systemUiVisibility = if(allFullScreen) window.decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
} }
inner class IntPref {
operator fun get(key: String) = getPreferences(MODE_PRIVATE).getInt(key, -5)
operator fun set(key: String, value: Int) = getPreferences(MODE_PRIVATE).edit {
putInt(key, value)
apply()
}
}
inner class BoolPref {
operator fun get(key: String) = getPreferences(MODE_PRIVATE).getBoolean(key, false)
operator fun set(key: String, value: Boolean) = getPreferences(MODE_PRIVATE).edit {
putBoolean(key, value)
apply()
}
}
} }

View File

@@ -1,11 +1,13 @@
package top.fumiama.copymanga.ui.book package top.fumiama.copymanga.ui.book
import android.content.Context.MODE_PRIVATE
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.Menu import android.view.Menu
import android.view.View import android.view.View
import androidx.navigation.Navigation import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.line_booktandb.*
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.general.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
@@ -33,12 +35,16 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
menuMain?.let { setMenuVisible(it) } menuMain?.let { setMenuVisible(it) }
toolbar.title = bookHandler.book?.results?.comic?.name toolbar.title = bookHandler.book?.results?.comic?.name
} }
setStartRead()
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) } mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) }
bookHandler.destroy() bookHandler.destroy()
bookHandler.ads.forEach {
it.exit = true
}
} }
override fun onPause() { override fun onPause() {
@@ -46,6 +52,25 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) } mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) }
} }
fun setStartRead() {
mainWeakReference?.get()?.apply {
bookHandler.book?.results?.comic?.name?.let {
getPreferences(MODE_PRIVATE).getInt(it, -1).let { p ->
this@BookFragment.lbbstart.apply {
var i = 0
if(p >= 0) {
text = bookHandler.chapterNames[p]
i = p
}
setOnClickListener {
bookHandler.callViewManga(i)
}
}
}
}
}
}
private fun setMenuInvisible(menu: Menu){ private fun setMenuInvisible(menu: Menu){
menu.findItem(R.id.action_download)?.isVisible = false menu.findItem(R.id.action_download)?.isVisible = false
} }
@@ -68,19 +93,12 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
val bundle = Bundle() val bundle = Bundle()
bundle.putString("path", arguments?.getString("path")?:"null") bundle.putString("path", arguments?.getString("path")?:"null")
bundle.putString("name", bookHandler.book?.results?.comic?.name) bundle.putString("name", bookHandler.book?.results?.comic?.name)
val groups = bookHandler.book?.results?.groups if(bookHandler.vols != null) {
var keys = arrayOf<String>() bundle.putBoolean("loadJson", true)
var gpws = arrayOf<String>()
var cnts = intArrayOf()
groups?.values?.forEach {
keys += it.name
gpws += it.path_word
cnts += it.count
Log.d("MyBF", "Add caption: ${it.name} @ ${it.path_word} of ${it.count}")
} }
bundle.putStringArray("group", gpws) bundle.putStringArray("group", bookHandler.gpws)
bundle.putStringArray("groupNames", keys) bundle.putStringArray("groupNames", bookHandler.keys)
bundle.putIntArray("count", cnts) bundle.putIntArray("count", bookHandler.cnts)
rootView?.let { Navigation.findNavController(it).navigate(R.id.action_nav_book_to_nav_group, bundle) } rootView?.let { Navigation.findNavController(it).navigate(R.id.action_nav_book_to_nav_group, bundle) }
} }
} }

View File

@@ -1,5 +1,7 @@
package top.fumiama.copymanga.ui.book package top.fumiama.copymanga.ui.book
import android.content.Context.MODE_PRIVATE
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.os.Message import android.os.Message
@@ -7,28 +9,41 @@ import android.util.Log
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.core.content.edit
import androidx.navigation.Navigation import androidx.navigation.Navigation
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.GlideUrl
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.google.gson.Gson
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.button_tbutton.view.*
import kotlinx.android.synthetic.main.card_book.* import kotlinx.android.synthetic.main.card_book.*
import kotlinx.android.synthetic.main.fragment_book.* import kotlinx.android.synthetic.main.fragment_book.*
import kotlinx.android.synthetic.main.line_2chapters.view.* import kotlinx.android.synthetic.main.line_2chapters.view.*
import kotlinx.android.synthetic.main.line_bookinfo.* import kotlinx.android.synthetic.main.line_bookinfo.*
import kotlinx.android.synthetic.main.line_bookinfo_text.* import kotlinx.android.synthetic.main.line_bookinfo_text.*
import kotlinx.android.synthetic.main.line_booktandb.*
import kotlinx.android.synthetic.main.line_caption.view.* import kotlinx.android.synthetic.main.line_caption.view.*
import kotlinx.android.synthetic.main.line_chapter.view.* import kotlinx.android.synthetic.main.line_chapter.view.*
import kotlinx.android.synthetic.main.widget_downloadbar.*
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.BookInfoStructure import top.fumiama.copymanga.json.BookInfoStructure
import top.fumiama.copymanga.json.ChapterStructure
import top.fumiama.copymanga.json.ThemeStructure import top.fumiama.copymanga.json.ThemeStructure
import top.fumiama.copymanga.json.VolumeStructure
import top.fumiama.copymanga.template.http.AutoDownloadHandler import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.GlideBlurTransformation import top.fumiama.copymanga.tools.api.GlideBlurTransformation
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment.Companion.json
import top.fumiama.copymanga.ui.vm.ViewMangaActivity
import java.io.File
import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class BookHandler(that: WeakReference<BookFragment>, path: String) class BookHandler(that: WeakReference<BookFragment>, private val path: String)
: AutoDownloadHandler( : AutoDownloadHandler(
that.get()?.getString(R.string.bookInfoApiUrl)?.let { String.format(it, path) } ?: "", that.get()?.getString(R.string.bookInfoApiUrl)?.let { String.format(it, path) } ?: "",
BookInfoStructure::class.java, BookInfoStructure::class.java,
@@ -43,6 +58,12 @@ class BookHandler(that: WeakReference<BookFragment>, path: String)
var book: BookInfoStructure? = null var book: BookInfoStructure? = null
var fbibinfo:View? = null var fbibinfo:View? = null
var complete = false var complete = false
var ads = emptyArray<AutoDownloadThread>()
var gpws = arrayOf<String>()
var keys = arrayOf<String>()
var cnts = intArrayOf()
var vols: Array<VolumeStructure>? = null
var chapterNames = arrayOf<String>()
private val divider get() = that?.layoutInflater?.inflate(R.layout.div_h, that.fbl, false) private val divider get() = that?.layoutInflater?.inflate(R.layout.div_h, that.fbl, false)
private var fbtinfo: View? = null private var fbtinfo: View? = null
@@ -55,7 +76,6 @@ class BookHandler(that: WeakReference<BookFragment>, path: String)
3 -> fbibinfo?.let { setInfoHeight(it) } 3 -> fbibinfo?.let { setInfoHeight(it) }
4 -> setThemes() 4 -> setThemes()
5 -> setOverScale() 5 -> setOverScale()
6 -> endSetLayouts()
} }
} }
@@ -80,12 +100,20 @@ class BookHandler(that: WeakReference<BookFragment>, path: String)
super.doWhenFinishDownload() super.doWhenFinishDownload()
if(exit) return if(exit) return
inflateComponents() inflateComponents()
Thread{ for (i in 1..6) sendEmptyMessage(i) }.start() book?.results?.groups?.values?.forEach{
keys += it.name
gpws += it.path_word
cnts += it.count
Log.d("MyBFH", "Add caption: ${it.name} @ ${it.path_word} of ${it.count}")
}
initComicData()
Thread{ for (i in 1..5) sendEmptyMessage(i) }.start()
} }
private fun endSetLayouts(){ private fun endSetLayouts(){
that?.fbloading?.visibility = View.GONE that?.fbloading?.visibility = View.GONE
complete = true complete = true
that?.setStartRead()
Log.d("MyBH", "Set complete: true") Log.d("MyBH", "Set complete: true")
} }
@@ -192,9 +220,63 @@ class BookHandler(that: WeakReference<BookFragment>, path: String)
that?.apply { that?.apply {
book?.results?.comic?.apply { book?.results?.comic?.apply {
author?.let { setTheme(getString(R.string.author), it, R.id.action_nav_book_to_nav_author) } author?.let { setTheme(getString(R.string.author), it, R.id.action_nav_book_to_nav_author) }
fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false))
theme?.let { setTheme(getString(R.string.caption), it, R.id.action_nav_book_to_nav_caption) } theme?.let { setTheme(getString(R.string.caption), it, R.id.action_nav_book_to_nav_caption) }
} }
} }
Thread{
while (vols == null && !exit) sleep(1000)
if(exit) return@Thread
that?.apply {
book?.results?.apply {
mainWeakReference?.get()?.runOnUiThread{
ViewMangaActivity.fileArray = arrayOf()
ViewMangaActivity.urlArray = arrayOf()
vols?.forEachIndexed { iv, v ->
fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false))
val t = layoutInflater.inflate(R.layout.line_caption, fbl, false)
t.tcptn.text = keys[iv]
fbl.addView(t)
fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false))
var line: View? = null
val last = v.results.list.size - 1
v.results.list.onEachIndexed { i, it ->
ViewMangaActivity.urlArray += CMApi.getApiUrl(R.string.chapterInfoApiUrl, comic.path_word, it.uuid)?:""
ViewMangaActivity.fileArray += CMApi.getZipFile(context?.getExternalFilesDir(""), comic.name, keys[iv], it.name)
chapterNames += it.name
if(line == null) {
if(i == last) {
line = layoutInflater.inflate(R.layout.line_chapter, that.fbl, false)
line?.lcc?.apply {
lct.text = it.name
setOnClickListener { callViewManga(i) }
}
fbl?.addView(line)
} else {
line = layoutInflater.inflate(R.layout.line_2chapters, that.fbl, false)
line?.l2cl?.apply {
lct.text = it.name
setOnClickListener { callViewManga( i) }
}
}
} else line?.l2cr?.apply {
lct.text = it.name
setOnClickListener { callViewManga(i) }
fbl?.addView(line)
line = null
}
}
}
// padding
val line = layoutInflater.inflate(R.layout.line_chapter, that.fbl, false)
line.lci.visibility = View.INVISIBLE
line.isClickable = false
fbl?.addView(line)
endSetLayouts()
}
}
}
}.start()
} }
private fun loadVolume(name: String, path: String, nav: Int){ private fun loadVolume(name: String, path: String, nav: Int){
@@ -204,4 +286,100 @@ class BookHandler(that: WeakReference<BookFragment>, path: String)
bundle.putString("path", path) bundle.putString("path", path)
that?.rootView?.let { Navigation.findNavController(it).navigate(nav, bundle) } that?.rootView?.let { Navigation.findNavController(it).navigate(nav, bundle) }
} }
private fun initComicData() {
var volumes = emptyArray<VolumeStructure>()
val counts = cnts.clone()
gpws.forEachIndexed { i, gpw ->
Log.d("MyBFH", "下载:$gpw")
var offset = 0
val times = counts[i] / 100
val remain = counts[i] % 100
val re = arrayOfNulls<VolumeStructure>(if(remain != 0) (times+1) else (times))
Log.d("MyBFH", "${i}卷共${if(times == 0) 1 else times}次加载")
do {
counts[i] = counts[i] - 100
CMApi.getApiUrl(R.string.groupInfoApiUrl, path, gpw, offset)?.let {
if(ComicDlFragment.exit) return
val ad = AutoDownloadThread(it) { result ->
Log.d("MyBFH", "${i}卷返回")
val r =
Gson().fromJson(result?.decodeToString(), VolumeStructure::class.java)
re[r.results.offset / 100] = r
}
ads += ad
ad.start()
offset += 100
}
} while (counts[i] > 0)
Thread {
var c = 0
while (c++ < 80) {
sleep(1000)
if(ComicDlFragment.exit) return@Thread
if(re.all { it != null }) break
}
if(re.size > 1) {
val r = re[0]
var s = emptyArray<ChapterStructure>()
re.forEach {
it?.results?.list?.forEach {
s += it
}
}
r?.results?.list = s
r?.apply { volumes += this }
} else re[0]?.apply { volumes += this }
}.start()
}
Thread {
var c = 0
while (c < 80 && volumes.size != gpws.size) {
sleep(1000)
if(ComicDlFragment.exit) return@Thread
Log.d("MyBFH", "已有:${volumes.size} 共:${gpws.size}")
c++
}
if (volumes.size == gpws.size) {
mainWeakReference?.get()?.runOnUiThread {
saveVolumes(volumes)
}
}
}.start()
}
private fun saveVolumes(volumes: Array<VolumeStructure>) {
that?.context?.getExternalFilesDir("")?.let { home ->
book?.results?.comic?.name?.let { name ->
val mangaFolder = File(home, name)
if(!mangaFolder.exists()) mangaFolder.mkdirs()
json = Gson().toJson(volumes)
File(mangaFolder, "info.json").writeText(json!!)
File(mangaFolder, "grps.json").writeText(Gson().toJson(keys))
}
}
vols = volumes
}
fun callViewManga(pos: Int) {
book?.results?.comic?.name?.let {
mainWeakReference?.get()?.getPreferences(MODE_PRIVATE)?.edit {
putInt(it, pos)
apply()
}
}
ViewMangaActivity.dlhandler = null
ViewMangaActivity.position = pos
val zipf = ViewMangaActivity.fileArray[pos]
if (zipf.exists()) {
ViewMangaActivity.zipFile = zipf
that?.startActivity(
Intent(that.context, ViewMangaActivity::class.java)
.putExtra("callFrom", "zipFirst").putExtra("function", "log")
)
} else {
ViewMangaActivity.zipFile = null
that?.startActivity(Intent(that.context, ViewMangaActivity::class.java).putExtra("function", "log"))
}
}
} }

View File

@@ -28,7 +28,12 @@ class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) {
arguments?.getBoolean("callFromOldDL", false) == true -> initOldComicData() arguments?.getBoolean("callFromOldDL", false) == true -> initOldComicData()
arguments?.getBoolean("loadJson", false) == true -> context?.getExternalFilesDir("")?.let { home -> arguments?.getBoolean("loadJson", false) == true -> context?.getExternalFilesDir("")?.let { home ->
arguments?.getString("name")?.let { arguments?.getString("name")?.let {
start2load(loadFromJson(), true, loadGroupsFromFile(File(home, "$it/grps.json"))) Thread{
sleep(600)
mainWeakReference?.get()?.runOnUiThread {
start2load(loadFromJson(), true, loadGroupsFromFile(File(home, "$it/grps.json")))
}
}.start()
} }
} }
else -> initComicData( else -> initComicData(

View File

@@ -28,7 +28,6 @@ import top.fumiama.copymanga.json.ComicStructureOld
import top.fumiama.copymanga.json.VolumeStructure import top.fumiama.copymanga.json.VolumeStructure
import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.http.MangaDlTools import top.fumiama.copymanga.tools.http.MangaDlTools
import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.tools.api.UITools import top.fumiama.copymanga.tools.api.UITools
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment.Companion.json import top.fumiama.copymanga.ui.comicdl.ComicDlFragment.Companion.json
import top.fumiama.copymanga.ui.vm.ViewMangaActivity import top.fumiama.copymanga.ui.vm.ViewMangaActivity
@@ -45,7 +44,6 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
var complete = false var complete = false
private val that = that.get() private val that = that.get()
private val toolsBox = UITools(that.get()?.context) private val toolsBox = UITools(that.get()?.context)
private val p = PropertiesTools(File("${that.get()?.context?.filesDir}/settings.properties"))
private var btnNumPerRow = 4 private var btnNumPerRow = 4
private var btnw = 0 private var btnw = 0
private var cdwnWidth = 0 private var cdwnWidth = 0

View File

@@ -16,7 +16,6 @@ import top.fumiama.copymanga.json.Chapter2Return
import top.fumiama.copymanga.json.ChapterWithContent import top.fumiama.copymanga.json.ChapterWithContent
import top.fumiama.copymanga.json.ComicStructure import top.fumiama.copymanga.json.ComicStructure
import top.fumiama.copymanga.template.http.AutoDownloadHandler import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.ui.vm.ViewMangaActivity.Companion.comicName import top.fumiama.copymanga.ui.vm.ViewMangaActivity.Companion.comicName
import top.fumiama.copymanga.ui.vm.ViewMangaActivity.Companion.pn import top.fumiama.copymanga.ui.vm.ViewMangaActivity.Companion.pn
import top.fumiama.copymanga.views.ScaleImageView import top.fumiama.copymanga.views.ScaleImageView
@@ -26,7 +25,6 @@ import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
import java.util.zip.ZipInputStream
class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler( class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
url, Chapter2Return::class.java, Looper.myLooper()!! url, Chapter2Return::class.java, Looper.myLooper()!!
@@ -59,7 +57,6 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
else -> "" else -> ""
} }
} }
var progressLog: PropertiesTools? = null
@SuppressLint("SimpleDateFormat", "SetTextI18n") @SuppressLint("SimpleDateFormat", "SetTextI18n")
override fun handleMessage(msg: Message) { override fun handleMessage(msg: Message) {
@@ -159,7 +156,6 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
@ExperimentalStdlibApi @ExperimentalStdlibApi
private fun prepareManga(){ private fun prepareManga(){
comicName = manga?.results?.comic?.name comicName = manga?.results?.comic?.name
progressLog = PropertiesTools(File("${wv.get()?.filesDir}/progress/${manga?.results?.comic?.name}"))
wv.get()?.count = manga?.results?.chapter?.size?:0 wv.get()?.count = manga?.results?.chapter?.size?:0
wv.get()?.initManga() wv.get()?.initManga()
wv.get()?.vprog?.visibility = View.GONE wv.get()?.vprog?.visibility = View.GONE

View File

@@ -12,6 +12,7 @@ import android.util.Log
import android.view.* import android.view.*
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.Toast import android.widget.Toast
import androidx.core.content.edit
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
@@ -41,7 +42,6 @@ import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File import java.io.File
import java.io.InputStream import java.io.InputStream
import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.* import java.util.*
import java.util.concurrent.FutureTask import java.util.concurrent.FutureTask
@@ -90,21 +90,20 @@ class ViewMangaActivity : TitleActivityTemplate() {
setContentView(R.layout.activity_viewmanga) setContentView(R.layout.activity_viewmanga)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
va = WeakReference(this) va = WeakReference(this)
//progressLog = PropertiesTools(File("$filesDir/progress/${chapter2Return?.results?.chapter?.comic_id}"))
//dlZip2View = intent.getStringExtra("callFrom") == "Dl" || p["dlZip2View"] == "true" //dlZip2View = intent.getStringExtra("callFrom") == "Dl" || p["dlZip2View"] == "true"
//zipFirst = intent.getStringExtra("callFrom") == "zipFirst" //zipFirst = intent.getStringExtra("callFrom") == "zipFirst"
cut = p["useCut"] == "true" cut = pb["useCut"]
r2l = p["r2l"] == "true" r2l = pb["r2l"]
verticalLoadMaxCount = if (p["verticalMax"] != "null") p["verticalMax"].toInt() else 20 verticalLoadMaxCount = p["verticalMax"].let { if(it > 0) it else 20 }
isVertical = p["vertical"] == "true" isVertical = pb["vertical"]
notUseVP = p["noVP"] == "true" || isVertical notUseVP = pb["noVP"] || isVertical
//url = intent.getStringExtra("url") //url = intent.getStringExtra("url")
handler = VMHandler(this, if(urlArray.isNotEmpty()) urlArray[position] else "") handler = VMHandler(this, if(urlArray.isNotEmpty()) urlArray[position] else "")
if (p["quality"] != "null") q = p["quality"].toInt() p["quality"].let { q = if (it > 0) it else 100 }
tt = TimeThread(handler, 22) tt = TimeThread(handler, 22)
tt.canDo = true tt.canDo = true
tt.start() tt.start()
volTurnPage = p["volturn"] == "true" volTurnPage = pb["volturn"]
am = getSystemService(Service.AUDIO_SERVICE) as AudioManager am = getSystemService(Service.AUDIO_SERVICE) as AudioManager
Log.d("MyVM", "Now ZipFile is $zipFile") Log.d("MyVM", "Now ZipFile is $zipFile")
@@ -155,7 +154,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
pageNum = pn pageNum = pn
pn = -1 pn = -1
} }
sendProgress() setProgress()
} }
private fun preDownloadChapterPages() { private fun preDownloadChapterPages() {
@@ -220,6 +219,9 @@ class ViewMangaActivity : TitleActivityTemplate() {
@ExperimentalStdlibApi @ExperimentalStdlibApi
fun initManga(){ fun initManga(){
handler.manga?.results?.chapter?.uuid?.let {
pn = getPreferences(MODE_PRIVATE).getInt(it, pn)
}
if (zipFile?.exists() != true) doPrepareWebImg() if (zipFile?.exists() != true) doPrepareWebImg()
else prepareItems() else prepareItems()
if (!isVertical) restorePN() if (!isVertical) restorePN()
@@ -227,7 +229,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
@ExperimentalStdlibApi @ExperimentalStdlibApi
private fun prepareImgFromWeb() { private fun prepareImgFromWeb() {
if(toolsBox.netinfo == "移动数据") alertCellar() if(!noCellarAlert && toolsBox.netinfo == "移动数据") alertCellar()
else handler.startLoad() else handler.startLoad()
} }
@@ -431,18 +433,21 @@ class ViewMangaActivity : TitleActivityTemplate() {
} }
} }
private fun sendProgress() { private fun setProgress() {
handler.progressLog?.let { handler.manga?.results?.chapter?.uuid?.let {
//it["chapterId"] = hm.chapterId.toString() getPreferences(MODE_PRIVATE).edit {
it["page"] = pageNum.toString() //it["chapterId"] = hm.chapterId.toString()
//it["name"] = inftitle.ttitle.text putInt(it, pageNum)
//it["name"] = inftitle.ttitle.text
apply()
}
} }
} }
private fun prepareIdBtCut() { private fun prepareIdBtCut() {
idtbcut.isChecked = cut idtbcut.isChecked = cut
idtbcut.setOnClickListener { idtbcut.setOnClickListener {
p["useCut"] = if (idtbcut.isChecked) "true" else "false" pb["useCut"] = idtbcut.isChecked
Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show() Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show()
} }
} }
@@ -450,8 +455,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
private fun prepareIdBtLR() { private fun prepareIdBtLR() {
idtblr.isChecked = r2l idtblr.isChecked = r2l
idtblr.setOnClickListener { idtblr.setOnClickListener {
if (idtblr.isChecked) p["r2l"] = "true" pb["r2l"] = idtblr.isChecked
else p["r2l"] = "false"
Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show() Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show()
} }
} }
@@ -459,8 +463,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
private fun prepareIdBtVP() { private fun prepareIdBtVP() {
idtbvp.isChecked = notUseVP idtbvp.isChecked = notUseVP
idtbvp.setOnClickListener { idtbvp.setOnClickListener {
if (idtbvp.isChecked) p["noVP"] = "true" pb["noVP"] = idtbvp.isChecked
else p["noVP"] = "false"
Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show() Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show()
} }
} }
@@ -487,7 +490,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
if (!isInSeek) hideObjs() if (!isInSeek) hideObjs()
updateSeekText() updateSeekText()
updateSeekProgress() updateSeekProgress()
sendProgress() setProgress()
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
@@ -555,7 +558,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
} }
} }
idtbvh.setOnClickListener { idtbvh.setOnClickListener {
p["vertical"] = if (idtbvh.isChecked) "true" else "false" pb["vertical"] = idtbvh.isChecked
Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show() Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show()
} }
} }

View File

@@ -1,12 +1,14 @@
package top.fumiama.copymanga.update package top.fumiama.copymanga.update
import android.app.Activity import android.app.Activity
import android.content.Context.MODE_PRIVATE
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.core.content.edit
import kotlinx.android.synthetic.main.dialog_progress.view.* import kotlinx.android.synthetic.main.dialog_progress.view.*
import top.fumiama.copymanga.tools.file.PropertiesTools import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.tools.api.UITools import top.fumiama.copymanga.tools.api.UITools
@@ -15,7 +17,7 @@ import java.io.File
import java.security.MessageDigest import java.security.MessageDigest
object Update { object Update {
fun checkUpdate(activity: Activity, p: PropertiesTools, toolsBox: UITools, ignoreSkip: Boolean = false) = activity.apply{ fun checkUpdate(activity: Activity, toolsBox: UITools, ignoreSkip: Boolean = false) = activity.apply{
val client = Client("copymanga.v6.army", 12315) val client = Client("copymanga.v6.army", 12315)
val progressBar = layoutInflater.inflate(R.layout.dialog_progress, null, false) val progressBar = layoutInflater.inflate(R.layout.dialog_progress, null, false)
val progressHandler = object : Client.Progress{ val progressHandler = object : Client.Progress{
@@ -28,7 +30,7 @@ object Update {
val msg = kanban[packageManager.getPackageInfo(packageName, 0).versionCode] val msg = kanban[packageManager.getPackageInfo(packageName, 0).versionCode]
if(msg != "null") { if(msg != "null") {
val verNum = msg.substringBefore('\n').toIntOrNull() val verNum = msg.substringBefore('\n').toIntOrNull()
val skipNum = p["skipVersion"].let { if(it != "null") it.toInt() else 0 } val skipNum = activity.getPreferences(MODE_PRIVATE).getInt("skipVersion", 0)
Log.d("MyUP", "Ver:$verNum, skip: $skipNum") Log.d("MyUP", "Ver:$verNum, skip: $skipNum")
if(verNum != null) { if(verNum != null) {
@@ -63,7 +65,12 @@ object Update {
client.progress = null client.progress = null
} }
}.start() }.start()
}, { p["skipVersion"] = verNum.toString() }) }, {
activity.getPreferences(MODE_PRIVATE).edit {
putInt("skipVersion", verNum)
apply()
}
})
} }
} else runOnUiThread { } else runOnUiThread {
toolsBox.buildInfo("看板", msg.substringAfter('\n'), "知道了") toolsBox.buildInfo("看板", msg.substringAfter('\n'), "知道了")

View File

@@ -24,7 +24,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/nav_header_vertical_spacing" android:layout_marginBottom="@dimen/nav_header_vertical_spacing"
android:onClick="onNavTInfoClicked" android:onClick="onNavTInfoClicked"
android:text="@string/navTextInfo"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textAppearance="@style/TextAppearance.AppCompat.Body1"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View File

@@ -30,24 +30,22 @@
<string name="null_book">获取图书信息失败</string> <string name="null_book">获取图书信息失败</string>
<string name="web_error">网络错误</string> <string name="web_error">网络错误</string>
<string name="mainPageApiUrl">https://api.copymanga.com/api/v3/h5/homeIndex?platform=3</string> <string name="mainPageApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/h5/homeIndex?platform=3&amp;format=json</string>
<string name="referUrl">"https://api.copymanga.com"</string> <string name="referUrl">"https://api.copymanga.com"</string>
<string name="recentUpdateApiUrl">https://nnv3api.dmzj1.com/novel/recentUpdate/%1$d.json</string> <string name="rankApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/ranks?limit=21&amp;offset=%1$d&amp;date_type=%2$s&amp;platform=3&amp;format=json</string>
<string name="rankApiUrl">https://api.copymanga.com/api/v3/ranks?limit=21&amp;offset=%1$d&amp;date_type=%2$s&amp;platform=3</string> <string name="searchApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/search/comic?limit=21&amp;offset=%1$d&amp;q=%2$s&amp;q_type=%3$s&amp;platform=3&amp;format=json</string>
<string name="searchApiUrl">https://api.copymanga.com/api/v3/search/comic?limit=21&amp;offset=%1$d&amp;q=%2$s&amp;q_type=%3$s&amp;platform=3</string> <string name="filterApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/h5/filterIndex/comic/tags?platform=3&amp;format=json</string>
<string name="filterApiUrl">https://api.copymanga.com/api/v3/h5/filterIndex/comic/tags?platform=3</string> <string name="sortApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;theme=%3$s&amp;platform=3&amp;format=json</string>
<string name="sortApiUrl">https://api.copymanga.com/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;theme=%3$s&amp;platform=3</string> <string name="bookInfoApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/comic2/%1$s?platform=3&amp;format=json</string>
<string name="bookInfoApiUrl">https://api.copymanga.com/api/v3/comic2/%1$s?platform=3</string> <string name="groupInfoApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/comic/%1$s/group/%2$s/chapters?limit=100&amp;offset=%3$d&amp;platform=3&amp;format=json</string>
<string name="groupInfoApiUrl">https://api.copymanga.com/api/v3/comic/%1$s/group/%2$s/chapters?limit=100&amp;offset=%3$d&amp;platform=3</string> <string name="chapterInfoApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/comic/%1$s/chapter2/%2$s?platform=3&amp;format=json</string>
<string name="chapterInfoApiUrl">https://api.copymanga.com/api/v3/comic/%1$s/chapter2/%2$s?platform=3</string> <string name="topicApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/topic/%1$s?platform=3&amp;format=json</string>
<string name="chapterTxtUrl">https://nnv3api.dmzj1.com/novel/download/%1$d_%2$d_%3$d.txt</string> <string name="topicContentApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/topic/%1$s/contents?type=%2$d&amp;limit=21&amp;offset=%3$d&amp;platform=3&amp;format=json</string>
<string name="topicApiUrl">https://api.copymanga.com/api/v3/topic/%1$s?platform=3</string> <string name="recommendApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/recs?pos=3200102&amp;limit=21&amp;offset=%1$d&amp;platform=3&amp;format=json</string>
<string name="topicContentApiUrl">https://api.copymanga.com/api/v3/topic/%1$s/contents?type=%2$d&amp;limit=21&amp;offset=%3$d&amp;platform=3</string> <string name="newestApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/update/newest?limit=21&amp;offset=%1$d&amp;platform=3&amp;format=json</string>
<string name="recommendApiUrl">https://api.copymanga.com/api/v3/recs?pos=3200102&amp;limit=21&amp;offset=%1$d&amp;platform=3</string> <string name="finishApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;top=finish&amp;platform=3&amp;format=json</string>
<string name="newestApiUrl">https://api.copymanga.com/api/v3/update/newest?limit=21&amp;offset=%1$d&amp;platform=3</string> <string name="authorApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;author=%3$s&amp;platform=3&amp;format=json</string>
<string name="finishApiUrl">https://api.copymanga.com/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;top=finish&amp;platform=3</string> <string name="captionApiUrl">https://copymanga.azurewebsites.net/api/api?/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;theme=%3$s&amp;platform=3&amp;format=json</string>
<string name="authorApiUrl">https://api.copymanga.com/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;author=%3$s&amp;platform=3</string>
<string name="captionApiUrl">https://api.copymanga.com/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;theme=%3$s&amp;platform=3</string>
<string name="complete">已完结</string> <string name="complete">已完结</string>