1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-25 05:00:24 +08:00

2.0.beta5

0. 增加排行
1. 延长加载时间
2. 返回后停止下载/加载章节
3. 大幅提升章节加载速度
4. 修复加载中返回闪退
5. 修复专题加载异常
This commit is contained in:
fumiama
2021-05-11 16:39:51 +08:00
parent e6878c1711
commit 11f3577b65
47 changed files with 363 additions and 267 deletions

View File

@@ -28,8 +28,8 @@ android {
applicationId 'top.fumiama.copymanga' applicationId 'top.fumiama.copymanga'
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 30 targetSdkVersion 30
versionCode 15 versionCode 16
versionName '2.0.beta4' versionName '2.0.beta5'
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.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
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.findNavController import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp import androidx.navigation.ui.navigateUp
@@ -33,8 +34,8 @@ 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.PropertiesTools import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.tools.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
import java.io.File import java.io.File
@@ -45,6 +46,7 @@ import java.lang.ref.WeakReference
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
var isDrawerClosed = true var isDrawerClosed = true
var menuMain: Menu? = null var menuMain: Menu? = null
var navController: NavController? = null
private lateinit var appBarConfiguration: AppBarConfiguration private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var p: PropertiesTools private lateinit var p: PropertiesTools
@@ -57,7 +59,7 @@ class MainActivity : AppCompatActivity() {
//translucentStatusBar() //translucentStatusBar()
coordiv.layoutParams.height = getStatusBarHeight() coordiv.layoutParams.height = getStatusBarHeight()
val navController = findNavController(R.id.nav_host_fragment) navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration( appBarConfiguration = AppBarConfiguration(
setOf( setOf(
R.id.nav_home, R.id.nav_home,
@@ -69,8 +71,8 @@ class MainActivity : AppCompatActivity() {
R.id.nav_settings R.id.nav_settings
), drawer_layout ), drawer_layout
) )
setupActionBarWithNavController(navController, appBarConfiguration) setupActionBarWithNavController(navController!!, appBarConfiguration)
nav_view.setupWithNavController(navController) nav_view.setupWithNavController(navController!!)
p = PropertiesTools(File(filesDir, "database.prop")) p = PropertiesTools(File(filesDir, "database.prop"))
headPic = File(getExternalFilesDir(""), "headPic") headPic = File(getExternalFilesDir(""), "headPic")

View File

@@ -1,10 +1,10 @@
package top.fumiama.copymanga.template 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.PropertiesTools import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.tools.UITools import top.fumiama.copymanga.tools.api.UITools
import java.io.File import java.io.File
import java.lang.ref.WeakReference import java.lang.ref.WeakReference

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.template package top.fumiama.copymanga.template.general
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
@@ -8,8 +8,9 @@ import android.view.View
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.line_header.view.* import kotlinx.android.synthetic.main.line_header.view.*
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.template.ui.CardList
import top.fumiama.copymanga.template.handler.MPATHandler import top.fumiama.copymanga.template.handler.MPATHandler
import top.fumiama.copymanga.tools.UITools import top.fumiama.copymanga.tools.api.UITools
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.template package top.fumiama.copymanga.template.general
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater

View File

@@ -1,9 +1,9 @@
package top.fumiama.copymanga.template package top.fumiama.copymanga.template.general
import android.os.Bundle import android.os.Bundle
import kotlinx.android.synthetic.main.widget_titlebar.* import kotlinx.android.synthetic.main.widget_titlebar.*
open class TitleActivityTemplate:ActivityTemplate() { open class TitleActivityTemplate: ActivityTemplate() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
ilogo.setOnClickListener { ilogo.setOnClickListener {

View File

@@ -10,7 +10,7 @@ import android.widget.Toast
import com.liaoinstan.springview.widget.SpringView import com.liaoinstan.springview.widget.SpringView
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.template.MangaPagesFragmentTemplate import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
import java.lang.ref.WeakReference import java.lang.ref.WeakReference

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.template package top.fumiama.copymanga.template.http
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
@@ -8,10 +8,11 @@ import com.google.gson.Gson
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.ReturnBase import top.fumiama.copymanga.json.ReturnBase
import top.fumiama.copymanga.tools.DownloadTools import top.fumiama.copymanga.tools.http.DownloadTools
import top.fumiama.copymanga.tools.TimeThread import top.fumiama.copymanga.tools.thread.TimeThread
open class AutoDownloadHandler(private val url: String, private val jsonClass: Class<*>, looper: Looper, private val callCheckMsg: Int = -1): Handler(looper) { open class AutoDownloadHandler(private val url: String, private val jsonClass: Class<*>, looper: Looper, private val callCheckMsg: Int = -1): Handler(looper) {
var exit = false
private var timeThread: TimeThread? = null private var timeThread: TimeThread? = null
private var checkTimes = 0 private var checkTimes = 0
override fun handleMessage(msg: Message) { override fun handleMessage(msg: Message) {
@@ -28,12 +29,16 @@ open class AutoDownloadHandler(private val url: String, private val jsonClass: C
fun startLoad() { fun startLoad() {
sendEmptyMessage(0) sendEmptyMessage(0)
} }
fun destroy() {
exit = true
}
private fun download(){ private fun download(){
Thread{ Thread{
DownloadTools.getHttpContent(url, DownloadTools.getHttpContent(url,
mainWeakReference?.get()?.getString(R.string.referUrl)!!, mainWeakReference?.get()?.getString(R.string.referUrl)!!,
mainWeakReference?.get()?.getString(R.string.pc_ua)!! mainWeakReference?.get()?.getString(R.string.pc_ua)!!
)?.let { )?.let {
if(exit) return@Thread
val fi = it.inputStream() val fi = it.inputStream()
setGsonItem(Gson().fromJson(fi.reader(), jsonClass)) setGsonItem(Gson().fromJson(fi.reader(), jsonClass))
fi.close() fi.close()

View File

@@ -1,20 +1,21 @@
package top.fumiama.copymanga.template package top.fumiama.copymanga.template.http
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.tools.DownloadTools import top.fumiama.copymanga.tools.http.DownloadTools
class AutoDownloadThread(private val url: String, private val whenFinish: (result: ByteArray?)->Unit): Thread() { class AutoDownloadThread(private val url: String, private val whenFinish: (result: ByteArray?)->Unit): Thread() {
var exit = false
override fun run() { override fun run() {
super.run() super.run()
var re: ByteArray? = null var re: ByteArray? = null
var c = 0 var c = 0
while (re == null && c++ < 3){ while (!exit && re == null && c++ < 3){
re = DownloadTools.getHttpContent(url, re = DownloadTools.getHttpContent(url,
mainWeakReference?.get()?.getString(R.string.referUrl)!!, mainWeakReference?.get()?.getString(R.string.referUrl)!!,
mainWeakReference?.get()?.getString(R.string.pc_ua)!! mainWeakReference?.get()?.getString(R.string.pc_ua)!!
) )
} }
whenFinish(re) if(!exit) whenFinish(re)
} }
} }

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.template package top.fumiama.copymanga.template.ui
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.net.Uri import android.net.Uri
@@ -11,7 +11,7 @@ import kotlinx.android.synthetic.main.card_book.view.*
import kotlinx.android.synthetic.main.line_horizonal_empty.view.* import kotlinx.android.synthetic.main.line_horizonal_empty.view.*
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.tools.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.io.File import java.io.File
import java.lang.ref.WeakReference import java.lang.ref.WeakReference

View File

@@ -1,26 +1,26 @@
package top.fumiama.copymanga.template package top.fumiama.copymanga.template.ui
import android.os.Bundle import android.os.Bundle
import android.util.JsonReader import android.util.Log
import android.view.View import android.view.View
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.Navigation import androidx.navigation.Navigation
import com.google.gson.Gson import com.google.gson.Gson
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.json.BookListStructure import top.fumiama.copymanga.json.BookListStructure
import top.fumiama.copymanga.json.TypeBookListStructure import top.fumiama.copymanga.json.TypeBookListStructure
import top.fumiama.copymanga.tools.DownloadTools import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
import java.io.File import top.fumiama.copymanga.template.http.AutoDownloadThread
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@ExperimentalStdlibApi @ExperimentalStdlibApi
open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isTypeBook: Boolean = false): MangaPagesFragmentTemplate(inflateRes) { open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isTypeBook: Boolean = false): MangaPagesFragmentTemplate(inflateRes) {
var offset = 0
private val subUrl get() = getApiUrl() private val subUrl get() = getApiUrl()
private var ad: AutoDownloadThread? = null
init { init {
pageHandler = object : PageHandler { pageHandler = object : PageHandler {
override fun addPage(){ override fun addPage(){
AutoDownloadThread(subUrl){ ad = AutoDownloadThread(subUrl){
if(isRefresh){ if(isRefresh){
page = 0 page = 0
isRefresh = false isRefresh = false
@@ -28,9 +28,13 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
if(isTypeBook) { if(isTypeBook) {
val bookList = Gson().fromJson(it?.decodeToString(), TypeBookListStructure::class.java) val bookList = Gson().fromJson(it?.decodeToString(), TypeBookListStructure::class.java)
bookList?.apply { bookList?.apply {
Log.d("MyICL", "offset:${results.offset}, total:${results.total}")
if(results.offset < results.total) { if(results.offset < results.total) {
if(code == 200) results.list.forEach { book -> if(code == 200) {
cardList.addCard(book.comic.name, null, book.comic.cover, book.comic.path_word, null, null, false) results.list.forEach { book ->
cardList.addCard(book.comic.name, null, book.comic.cover, book.comic.path_word, null, null, false)
}
offset += results.list.size
} }
} }
page++ page++
@@ -38,16 +42,21 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
} else { } else {
val bookList = Gson().fromJson(it?.decodeToString(), BookListStructure::class.java) val bookList = Gson().fromJson(it?.decodeToString(), BookListStructure::class.java)
bookList?.apply { bookList?.apply {
Log.d("MyICL", "offset:${results.offset}, total:${results.total}")
if(results.offset < results.total) { if(results.offset < results.total) {
if(code == 200) results.list.forEach{ book -> if(code == 200) {
cardList.addCard(book.name, null, book.cover, book.path_word, null, null, false) results.list.forEach{ book ->
cardList.addCard(book.name, null, book.cover, book.path_word, null, null, false)
}
offset += results.list.size
} }
} }
page++ page++
} }
} }
onLoadFinish() onLoadFinish()
}.start() }
ad?.start()
} }
override fun initCardList(weakReference: WeakReference<Fragment>) { override fun initCardList(weakReference: WeakReference<Fragment>) {
cardList = CardList(weakReference, cardWidth, cardHeight, cardPerRow) cardList = CardList(weakReference, cardWidth, cardHeight, cardPerRow)
@@ -72,4 +81,9 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
open fun setListeners(){} open fun setListeners(){}
open fun onLoadFinish(){} open fun onLoadFinish(){}
override fun onDestroy() {
super.onDestroy()
ad?.exit = true
}
} }

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.tools package top.fumiama.copymanga.tools.api
import com.bumptech.glide.load.model.LazyHeaders import com.bumptech.glide.load.model.LazyHeaders
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@@ -9,7 +9,15 @@ import java.io.File
object CMApi { object CMApi {
var myGlideHeaders: LazyHeaders? = null var myGlideHeaders: LazyHeaders? = null
get() { get() {
if(field === null) field = LazyHeaders.Builder().addHeader("referer", MainActivity.mainWeakReference?.get()?.getString(R.string.referUrl)!!).addHeader("User-Agent", MainActivity.mainWeakReference?.get()?.getString(R.string.pc_ua)!!).build() if(field === null)
field = LazyHeaders.Builder()
.addHeader("referer", MainActivity.mainWeakReference?.get()?.getString(R.string.referUrl)!!)
.addHeader("User-Agent", MainActivity.mainWeakReference?.get()?.getString(R.string.pc_ua)!!)
.addHeader("source", "copyApp")
.addHeader("webp", "1")
.addHeader("region", "1")
.addHeader("platform", "3")
.build()
return field return field
} }
fun getImgZipFileFromVM(exDir: File?, chapter2Return: Chapter2Return?) = File(exDir, "${chapter2Return?.results?.comic?.name}/${chapter2Return?.results?.chapter?.group_path_word}/${chapter2Return?.results?.chapter?.name}.zip") fun getImgZipFileFromVM(exDir: File?, chapter2Return: Chapter2Return?) = File(exDir, "${chapter2Return?.results?.comic?.name}/${chapter2Return?.results?.chapter?.group_path_word}/${chapter2Return?.results?.chapter?.name}.zip")

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.tools package top.fumiama.copymanga.tools.api
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.tools package top.fumiama.copymanga.tools.api
import android.app.Activity import android.app.Activity
import android.app.AlertDialog import android.app.AlertDialog

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.tools package top.fumiama.copymanga.tools.file
//PropertiesTools.kt //PropertiesTools.kt
//created by fumiama 20200724 //created by fumiama 20200724
import android.util.Log import android.util.Log

View File

@@ -1,13 +1,30 @@
package top.fumiama.copymanga.tools package top.fumiama.copymanga.tools.http
import android.util.Log import android.util.Log
import top.fumiama.copymanga.tools.ssl.AllTrustManager
import top.fumiama.copymanga.tools.ssl.IgnoreHostNameVerifier
import java.io.File import java.io.File
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.net.URL import java.net.URL
import java.security.SecureRandom
import java.util.concurrent.Callable import java.util.concurrent.Callable
import java.util.concurrent.FutureTask import java.util.concurrent.FutureTask
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
object DownloadTools { object DownloadTools {
private val trustManager = AllTrustManager()
private val sslContext: SSLContext = SSLContext.getInstance("SSL").let {
it.init(null, arrayOf(trustManager), SecureRandom())
it
}
private val ignoreHostNameVerifier = IgnoreHostNameVerifier()
init {
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostNameVerifier)
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.socketFactory)
}
fun getHttpContent(Url: String, refer: String? = null, ua: String? = null): ByteArray? { fun getHttpContent(Url: String, refer: String? = null, ua: String? = null): ByteArray? {
Log.d("Mydl", "getHttp: $Url") Log.d("Mydl", "getHttp: $Url")
var ret: ByteArray? = null var ret: ByteArray? = null
@@ -15,9 +32,13 @@ object DownloadTools {
try { try {
val connection = URL(Url).openConnection() as HttpURLConnection val connection = URL(Url).openConnection() as HttpURLConnection
connection.requestMethod = "GET" connection.requestMethod = "GET"
connection.connectTimeout = 10000 connection.connectTimeout = 20000
connection.readTimeout = 10000 connection.readTimeout = 20000
refer?.let { connection.setRequestProperty("referer", it) } refer?.let { connection.setRequestProperty("referer", it) }
connection.setRequestProperty("source", "copyApp")
connection.setRequestProperty("webp", "1")
connection.setRequestProperty("region", "1")
connection.setRequestProperty("platform", "3")
ua?.let { connection.setRequestProperty("User-agent", it) } ua?.let { connection.setRequestProperty("User-agent", it) }
ret = connection.inputStream.readBytes() ret = connection.inputStream.readBytes()
@@ -41,8 +62,12 @@ object DownloadTools {
try { try {
val connection = URL(Url).openConnection() as HttpURLConnection val connection = URL(Url).openConnection() as HttpURLConnection
connection.requestMethod = "GET" connection.requestMethod = "GET"
connection.connectTimeout = 10000 connection.connectTimeout = 20000
connection.readTimeout = 10000 connection.readTimeout = 20000
connection.setRequestProperty("source", "copyApp")
connection.setRequestProperty("webp", "1")
connection.setRequestProperty("region", "1")
connection.setRequestProperty("platform", "3")
if (f.exists()) f.delete() if (f.exists()) f.delete()
else f.parentFile?.mkdirs() else f.parentFile?.mkdirs()
@@ -72,8 +97,8 @@ object DownloadTools {
try { try {
val connection = URL(Url).openConnection() as HttpURLConnection val connection = URL(Url).openConnection() as HttpURLConnection
connection.requestMethod = "GET" connection.requestMethod = "GET"
connection.connectTimeout = 10000 connection.connectTimeout = 20000
connection.readTimeout = 10000 connection.readTimeout = 20000
refer?.let { connection.setRequestProperty("referer", it) } refer?.let { connection.setRequestProperty("referer", it) }
if (f.exists()) f.delete() if (f.exists()) f.delete()
@@ -97,8 +122,8 @@ object DownloadTools {
try { try {
val connection = URL(Url).openConnection() as HttpURLConnection val connection = URL(Url).openConnection() as HttpURLConnection
connection.requestMethod = "GET" connection.requestMethod = "GET"
connection.connectTimeout = 10000 connection.connectTimeout = 20000
connection.readTimeout = 10000 connection.readTimeout = 20000
refer?.let { connection.setRequestProperty("referer", it) } refer?.let { connection.setRequestProperty("referer", it) }
ret = connection.inputStream.readBytes() ret = connection.inputStream.readBytes()

View File

@@ -1,12 +1,12 @@
package top.fumiama.copymanga.tools package top.fumiama.copymanga.tools.http
import android.util.Log import android.util.Log
import com.google.gson.Gson import com.google.gson.Gson
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.Chapter2Return import top.fumiama.copymanga.json.Chapter2Return
import top.fumiama.copymanga.template.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.DownloadTools.getHttpContent import top.fumiama.copymanga.tools.http.DownloadTools.getHttpContent
import java.io.File import java.io.File
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.util.zip.CRC32 import java.util.zip.CRC32

View File

@@ -0,0 +1,17 @@
package top.fumiama.copymanga.tools.ssl;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class AllTrustManager implements X509TrustManager{
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) { }
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) { }
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}

View File

@@ -0,0 +1,11 @@
package top.fumiama.copymanga.tools.ssl;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
public class IgnoreHostNameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.tools package top.fumiama.copymanga.tools.thread
import android.os.Handler import android.os.Handler

View File

@@ -7,11 +7,11 @@ import android.view.View
import androidx.navigation.Navigation import androidx.navigation.Navigation
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.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class BookFragment:NoBackRefreshFragment(R.layout.fragment_book) { class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
private lateinit var bookHandler: BookHandler private lateinit var bookHandler: BookHandler
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -34,6 +34,7 @@ class BookFragment:NoBackRefreshFragment(R.layout.fragment_book) {
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) } mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) }
bookHandler.destroy()
} }
private fun setMenuInvisible(menu: Menu){ private fun setMenuInvisible(menu: Menu){

View File

@@ -4,15 +4,12 @@ import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.os.Message import android.os.Message
import android.util.Log import android.util.Log
import android.view.Menu
import android.view.View import android.view.View
import android.view.ViewTreeObserver
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
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.load.model.LazyHeaders
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.card_book.* import kotlinx.android.synthetic.main.card_book.*
@@ -24,15 +21,14 @@ import kotlinx.android.synthetic.main.line_chapter.view.*
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.ReturnBase
import top.fumiama.copymanga.json.ThemeStructure import top.fumiama.copymanga.json.ThemeStructure
import top.fumiama.copymanga.template.AutoDownloadHandler import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.tools.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.GlideBlurTransformation import top.fumiama.copymanga.tools.api.GlideBlurTransformation
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class BookHandler(that: WeakReference<BookFragment>, path: String) class BookHandler(that: WeakReference<BookFragment>, 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,
Looper.myLooper()!!){ Looper.myLooper()!!){
@@ -64,6 +60,7 @@ class BookHandler(that: WeakReference<BookFragment>, path: String)
override fun onError() { override fun onError() {
super.onError() super.onError()
if(exit) return
if(!hasToastedError) { if(!hasToastedError) {
Toast.makeText(that?.context, R.string.null_book, Toast.LENGTH_SHORT).show() Toast.makeText(that?.context, R.string.null_book, Toast.LENGTH_SHORT).show()
that?.rootView?.let { it1 -> that?.rootView?.let { it1 ->
@@ -80,6 +77,7 @@ class BookHandler(that: WeakReference<BookFragment>, path: String)
override fun getGsonItem() = book override fun getGsonItem() = book
override fun doWhenFinishDownload() { override fun doWhenFinishDownload() {
super.doWhenFinishDownload() super.doWhenFinishDownload()
if(exit) return
inflateComponents() inflateComponents()
Thread{ for (i in 1..6) sendEmptyMessage(i) }.start() Thread{ for (i in 1..6) sendEmptyMessage(i) }.start()
} }

View File

@@ -6,7 +6,7 @@ import kotlinx.android.synthetic.main.anchor_popular.view.*
import kotlinx.android.synthetic.main.line_finish.* import kotlinx.android.synthetic.main.line_finish.*
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.lang.Thread.sleep import java.lang.Thread.sleep

View File

@@ -3,7 +3,7 @@ package top.fumiama.copymanga.ui.cardflow.newest
import android.view.View import android.view.View
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi @ExperimentalStdlibApi

View File

@@ -0,0 +1,54 @@
package top.fumiama.copymanga.ui.cardflow.rank
import android.view.View
import com.google.android.material.tabs.TabLayout
import kotlinx.android.synthetic.main.fragment_rank.*
import kotlinx.android.synthetic.main.line_lazybooklines.*
import kotlinx.android.synthetic.main.line_rank.view.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.dmzj.copymanga.R
import java.lang.Thread.sleep
@ExperimentalStdlibApi
class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank_to_nav_book, true) {
private val sortWay = listOf("day", "week", "month", "total")
private var sortValue = 0
override fun getApiUrl() =
getString(R.string.rankApiUrl).let {
String.format(
it,
page * 21,
sortWay[sortValue]
)
}
override fun setListeners() {
super.setListeners()
frlai.lrt.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {
override fun onTabReselected(tab: TabLayout.Tab?) {}
override fun onTabSelected(tab: TabLayout.Tab?) {
setSortValue(tab?.position?:0)
}
override fun onTabUnselected(tab: TabLayout.Tab?) {}
})
}
override fun onLoadFinish() {
super.onLoadFinish()
mainWeakReference?.get()?.runOnUiThread {
mypl.visibility = View.GONE
}
}
private fun setSortValue(value: Int) {
sortValue = value
Thread{
sleep(400)
mh?.sendEmptyMessage(4)
}.start()
}
}

View File

@@ -3,7 +3,7 @@ package top.fumiama.copymanga.ui.cardflow.recommend
import android.view.View import android.view.View
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi @ExperimentalStdlibApi

View File

@@ -10,8 +10,8 @@ import kotlinx.android.synthetic.main.line_sort.*
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.FilterStructure import top.fumiama.copymanga.json.FilterStructure
import top.fumiama.copymanga.template.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import java.lang.Thread.sleep import java.lang.Thread.sleep
@ExperimentalStdlibApi @ExperimentalStdlibApi

View File

@@ -8,8 +8,8 @@ import kotlinx.android.synthetic.main.line_lazybooklines.*
import kotlinx.android.synthetic.main.fragment_topic.* import kotlinx.android.synthetic.main.fragment_topic.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.TopicStructure import top.fumiama.copymanga.json.TopicStructure
import top.fumiama.copymanga.template.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi @ExperimentalStdlibApi
@@ -17,7 +17,7 @@ class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_to
private var type = 1 private var type = 1
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.topicContentApiUrl).let { getString(R.string.topicContentApiUrl).let {
String.format(it, arguments?.getString("path"), type, page * 21) String.format(it, arguments?.getString("path"), type, offset)
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -3,11 +3,11 @@ package top.fumiama.copymanga.ui.chapter
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.template.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class ChapterFragment:NoBackRefreshFragment(R.layout.fragment_chapters) { class ChapterFragment: NoBackRefreshFragment(R.layout.fragment_chapters) {
var handler: ChapterHandler? = null var handler: ChapterHandler? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -19,4 +19,9 @@ class ChapterFragment:NoBackRefreshFragment(R.layout.fragment_chapters) {
}.start() }.start()
} }
} }
override fun onDestroy() {
super.onDestroy()
handler?.destroy()
}
} }

View File

@@ -7,21 +7,21 @@ import android.widget.Toast
import androidx.navigation.Navigation import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_book.* import kotlinx.android.synthetic.main.fragment_book.*
import kotlinx.android.synthetic.main.fragment_chapters.* import kotlinx.android.synthetic.main.fragment_chapters.*
import kotlinx.android.synthetic.main.line_2chapters.view.*
import kotlinx.android.synthetic.main.line_chapter.view.* import kotlinx.android.synthetic.main.line_chapter.view.*
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.json.ChapterStructure import top.fumiama.copymanga.json.ChapterStructure
import top.fumiama.copymanga.json.VolumeStructure import top.fumiama.copymanga.json.VolumeStructure
import top.fumiama.copymanga.template.AutoDownloadHandler import top.fumiama.copymanga.template.http.AutoDownloadHandler
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class ChapterHandler(that: WeakReference<ChapterFragment>, pw: String, gpw: String):AutoDownloadHandler( class ChapterHandler(that: WeakReference<ChapterFragment>, pw: String, gpw: String):
AutoDownloadHandler(
that.get()?.getString(R.string.groupInfoApiUrl)?.let { String.format(it, pw, gpw) } ?: "", that.get()?.getString(R.string.groupInfoApiUrl)?.let { String.format(it, pw, gpw) } ?: "",
VolumeStructure::class.java, VolumeStructure::class.java,
Looper.myLooper()!! Looper.myLooper()!!
) { ) {
private val that = that.get() private val that = that.get()
var hasToastedError = false private var hasToastedError = false
get(){ get(){
val re = field val re = field
field = true field = true
@@ -46,6 +46,7 @@ class ChapterHandler(that: WeakReference<ChapterFragment>, pw: String, gpw: Stri
override fun onError() { override fun onError() {
super.onError() super.onError()
if(exit) return
if(!hasToastedError) { if(!hasToastedError) {
Toast.makeText(that?.context, R.string.null_book, Toast.LENGTH_SHORT).show() Toast.makeText(that?.context, R.string.null_book, Toast.LENGTH_SHORT).show()
that?.rootView?.let { it1 -> that?.rootView?.let { it1 ->
@@ -55,6 +56,7 @@ class ChapterHandler(that: WeakReference<ChapterFragment>, pw: String, gpw: Stri
} }
override fun doWhenFinishDownload() { override fun doWhenFinishDownload() {
super.doWhenFinishDownload() super.doWhenFinishDownload()
if(exit) return
Thread{ sendEmptyMessage(1) }.start() Thread{ sendEmptyMessage(1) }.start()
} }
private fun inflateChapters(){ private fun inflateChapters(){

View File

@@ -1,28 +1,28 @@
package top.fumiama.copymanga.ui.comicdl package top.fumiama.copymanga.ui.comicdl
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.os.Looper import android.os.Looper
import android.os.Message
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 com.google.gson.Gson import com.google.gson.Gson
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.ChapterStructure import top.fumiama.copymanga.json.ChapterStructure
import top.fumiama.copymanga.json.VolumeStructure import top.fumiama.copymanga.json.VolumeStructure
import top.fumiama.copymanga.template.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.tools.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R
import java.io.File import java.io.File
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class ComicDlFragment:NoBackRefreshFragment(R.layout.fragment_dlcomic) { class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) {
var handler: ComicDlHandler? = null var handler: ComicDlHandler? = null
var ads = emptyArray<AutoDownloadThread>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
exit = false
if(isFirstInflate){ if(isFirstInflate){
when { when {
arguments?.getBoolean("callFromOldDL", false) == true -> initOldComicData() arguments?.getBoolean("callFromOldDL", false) == true -> initOldComicData()
@@ -41,10 +41,15 @@ class ComicDlFragment:NoBackRefreshFragment(R.layout.fragment_dlcomic) {
mainWeakReference?.get()?.menuMain?.let { setMenuVisible(it) } mainWeakReference?.get()?.menuMain?.let { setMenuVisible(it) }
} }
/*override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) } //mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) }
}*/ handler?.mangaDlTools?.exit = true
ads.forEach {
it.exit = true
}
exit = true
}
private fun start2load(volumes: Array<VolumeStructure>, isFromFile: Boolean = false, groupArray: Array<String>? =null){ private fun start2load(volumes: Array<VolumeStructure>, isFromFile: Boolean = false, groupArray: Array<String>? =null){
handler = ComicDlHandler(Looper.myLooper()!!, handler = ComicDlHandler(Looper.myLooper()!!,
@@ -93,22 +98,29 @@ class ComicDlFragment:NoBackRefreshFragment(R.layout.fragment_dlcomic) {
gpws.forEachIndexed { i, gpw -> gpws.forEachIndexed { i, gpw ->
Log.d("MyCDF", "下载:$gpw") Log.d("MyCDF", "下载:$gpw")
var offset = 0 var offset = 0
val re = arrayOfNulls<VolumeStructure>(counts?.get(i)?:1) val times = (counts?.get(i)?:1) / 100
val remain = (counts?.get(i)?:1) % 100
val re = arrayOfNulls<VolumeStructure>(if(remain != 0) (times+1) else (times))
Log.d("MyCDF", "${i}卷共${if(times == 0) 1 else times}次加载")
do { do {
counts?.set(i, counts[i] - 100) counts?.set(i, counts[i] - 100)
CMApi.getApiUrl(R.string.groupInfoApiUrl, pw, gpw, offset)?.let { CMApi.getApiUrl(R.string.groupInfoApiUrl, pw, gpw, offset)?.let {
AutoDownloadThread(it) { result -> if(exit) return
//Log.d("MyCDF", "返回:${result?.decodeToString()}") val ad = AutoDownloadThread(it) { result ->
Log.d("MyCDF", "${i}卷返回")
val r = Gson().fromJson(result?.decodeToString(), VolumeStructure::class.java) val r = Gson().fromJson(result?.decodeToString(), VolumeStructure::class.java)
re[r.results.offset / 100] = r re[r.results.offset / 100] = r
}.start() }
ads += ad
ad.start()
offset += 100 offset += 100
} }
} while ((counts?.get(i) ?: 0) > 0) } while ((counts?.get(i) ?: 0) > 0)
Thread { Thread {
var c = 0 var c = 0
while (c++ < 80) { while (c++ < 80) {
sleep(100) sleep(1000)
if(exit) return@Thread
if(re.all { it != null }) break if(re.all { it != null }) break
} }
if(re.size > 1) { if(re.size > 1) {
@@ -127,7 +139,8 @@ class ComicDlFragment:NoBackRefreshFragment(R.layout.fragment_dlcomic) {
Thread { Thread {
var c = 0 var c = 0
while (c < 80 && volumes.size != gpws.size) { while (c < 80 && volumes.size != gpws.size) {
sleep(100) sleep(1000)
if(exit) return@Thread
Log.d("MyCDF", "已有:${volumes.size} 共:${gpws.size}") Log.d("MyCDF", "已有:${volumes.size} 共:${gpws.size}")
c++ c++
} }
@@ -149,5 +162,6 @@ class ComicDlFragment:NoBackRefreshFragment(R.layout.fragment_dlcomic) {
companion object { companion object {
var json: String? = null var json: String? = null
var exit = false
} }
} }

View File

@@ -26,10 +26,10 @@ 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.ComicStructureOld import top.fumiama.copymanga.json.ComicStructureOld
import top.fumiama.copymanga.json.VolumeStructure import top.fumiama.copymanga.json.VolumeStructure
import top.fumiama.copymanga.tools.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.MangaDlTools import top.fumiama.copymanga.tools.http.MangaDlTools
import top.fumiama.copymanga.tools.PropertiesTools import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.tools.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
import top.fumiama.copymanga.views.ChapterToggleButton import top.fumiama.copymanga.views.ChapterToggleButton
@@ -64,7 +64,7 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
private var tbtnlist: Array<ChapterToggleButton> = arrayOf() private var tbtnlist: Array<ChapterToggleButton> = arrayOf()
private var tbtncnt = 0 private var tbtncnt = 0
private var isNewTitle = false private var isNewTitle = false
private val mangaDlTools = MangaDlTools() val mangaDlTools = MangaDlTools()
private var multiSelect = false private var multiSelect = false
private var size = 0 private var size = 0
private var refreshSize = true private var refreshSize = true

View File

@@ -5,9 +5,7 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import android.widget.Toast import android.widget.Toast
import androidx.navigation.Navigation import androidx.navigation.Navigation
@@ -15,7 +13,7 @@ import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.fragment_download.* import kotlinx.android.synthetic.main.fragment_download.*
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.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.copymanga.ui.vm.ViewMangaActivity import top.fumiama.copymanga.ui.vm.ViewMangaActivity
import java.io.File import java.io.File

View File

@@ -7,13 +7,12 @@ import androidx.navigation.Navigation
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
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.load.model.LazyHeaders
import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.fragment_home.*
import kotlinx.android.synthetic.main.viewpage_horizonal.view.* import kotlinx.android.synthetic.main.viewpage_horizonal.view.*
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.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.tools.CMApi import top.fumiama.copymanga.tools.api.CMApi
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@@ -45,6 +44,11 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
homeHandler = HomeHandler(WeakReference(this)) homeHandler = HomeHandler(WeakReference(this))
} }
override fun onDestroy() {
super.onDestroy()
homeHandler.destroy()
}
inner class ViewData(itemView: View) : RecyclerView.ViewHolder(itemView) { inner class ViewData(itemView: View) : RecyclerView.ViewHolder(itemView) {
inner class RecyclerViewAdapter : inner class RecyclerViewAdapter :
RecyclerView.Adapter<ViewData>() { RecyclerView.Adapter<ViewData>() {

View File

@@ -20,16 +20,17 @@ import com.to.aboomy.pager2banner.ScaleInTransformer
import kotlinx.android.synthetic.main.card_book.view.* import kotlinx.android.synthetic.main.card_book.view.*
import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.fragment_home.*
import kotlinx.android.synthetic.main.line_1bookline.view.* import kotlinx.android.synthetic.main.line_1bookline.view.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.json.ComicStructure import top.fumiama.copymanga.json.ComicStructure
import top.fumiama.copymanga.json.IndexStructure import top.fumiama.copymanga.json.IndexStructure
import top.fumiama.copymanga.template.AutoDownloadHandler import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.tools.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.UITools import top.fumiama.copymanga.tools.api.UITools
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class HomeHandler(that: WeakReference<HomeFragment>) :AutoDownloadHandler( class HomeHandler(that: WeakReference<HomeFragment>) : AutoDownloadHandler(
that.get()?.getString(R.string.mainPageApiUrl) ?: "", that.get()?.getString(R.string.mainPageApiUrl) ?: "",
IndexStructure::class.java, IndexStructure::class.java,
Looper.myLooper()!!, Looper.myLooper()!!,
@@ -83,10 +84,12 @@ class HomeHandler(that: WeakReference<HomeFragment>) :AutoDownloadHandler(
} }
override fun onError() { override fun onError() {
super.onError() super.onError()
if(exit) return
Toast.makeText(homeF?.context, R.string.web_error, Toast.LENGTH_SHORT).show() Toast.makeText(homeF?.context, R.string.web_error, Toast.LENGTH_SHORT).show()
} }
override fun doWhenFinishDownload() { override fun doWhenFinishDownload() {
super.doWhenFinishDownload() super.doWhenFinishDownload()
if(exit) return
try { try {
Thread { Thread {
sendEmptyMessage(7) //inflateBanner sendEmptyMessage(7) //inflateBanner
@@ -147,7 +150,9 @@ class HomeHandler(that: WeakReference<HomeFragment>) :AutoDownloadHandler(
comics += book.comic comics += book.comic
} }
} }
if(comics.size == 9) allocateLine(homeF?.getString(R.string.rank_list)?:"", R.drawable.img_novel_bill, comics) if(comics.size == 9) allocateLine(homeF?.getString(R.string.rank_list)?:"", R.drawable.img_novel_bill, comics) {
mainWeakReference?.get()?.navController?.navigate(R.id.nav_rank)
}
} }
private fun inflateHot(){ private fun inflateHot(){
@@ -305,7 +310,7 @@ class HomeHandler(that: WeakReference<HomeFragment>) :AutoDownloadHandler(
private fun setCards(cv: CardView, pw: String, name: String, img: String, isFinal: Boolean, isTopic: Boolean) { private fun setCards(cv: CardView, pw: String, name: String, img: String, isFinal: Boolean, isTopic: Boolean) {
cv.tic.text = name cv.tic.text = name
homeF?.let { homeF?.let {
Glide.with(it).load(GlideUrl(img, CMApi.myGlideHeaders)).timeout(10000).into(cv.imic) Glide.with(it).load(GlideUrl(img, CMApi.myGlideHeaders)).timeout(20000).into(cv.imic)
} }
if (isFinal) cv.sgnic.visibility = View.VISIBLE if (isFinal) cv.sgnic.visibility = View.VISIBLE
cv.setOnClickListener { cv.setOnClickListener {

View File

@@ -1,10 +0,0 @@
package top.fumiama.copymanga.ui.latest
import androidx.fragment.app.Fragment
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.template.InfoCardLoader
@ExperimentalStdlibApi
class LatestFragment: Fragment()/*InfoCardLoader(R.layout.line_lazybooklines, R.id.action_nav_latest_to_nav_book, "name", "cover", "id") {
override fun getApiUrl() = getString(R.string.recentUpdateApiUrl).let { String.format(it, page) }
}*/

View File

@@ -1,93 +0,0 @@
package top.fumiama.copymanga.ui.rank
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.github.zawadz88.materialpopupmenu.popupMenu
import com.google.gson.Gson
import kotlinx.android.synthetic.main.anchor_popular.view.*
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.json.FilterStructure
import top.fumiama.copymanga.template.InfoCardLoader
import java.lang.Thread.sleep
@ExperimentalStdlibApi
class RankFragment: Fragment()/*: InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank_to_nav_book, "name", "cover", "id") {
private var type = 0
private var pop_sub = 0
private var filter: Array<FilterStructure>? = null
get() {
if (field == null) {
context?.assets?.open(getString(R.string.assets_filter))?.let {
field = Gson().fromJson(it.reader(), Array<FilterStructure>::class.java)
it.close()
}
}
return field
}
override fun getApiUrl() =
getString(R.string.rankApiUrl).let { String.format(it, pop_sub, type, page) }
override fun setListeners() {
super.setListeners()
setPop()
setClasses()
}
private fun setPop(){
line_rank_pop.apt.setText(if(pop_sub == 1) R.string.menu_pop_sub else R.string.menu_pop_pop)
line_rank_pop.setOnClickListener {
val popupMenu = popupMenu {
style = R.style.Widget_MPM_Menu_Dark_CustomBackground
section {
item {
labelRes = if(pop_sub == 0) R.string.menu_pop_sub else R.string.menu_pop_pop
labelColor = it.apt.currentTextColor
iconDrawable =
this@RankFragment.context?.let { it1 -> ContextCompat.getDrawable(it1, R.drawable.ic_refresh) } //optional
iconColor = it.apt.currentTextColor
callback = { //optional
if(pop_sub == 0){
pop_sub = 1
it.apt.setText(R.string.menu_pop_sub)
}else{
pop_sub = 0
it.apt.setText(R.string.menu_pop_pop)
}
Thread{
sleep(400)
mh?.sendEmptyMessage(4)
}.start()
}
}
}
}
this.context?.let { it1 -> popupMenu.show(it1, it) }
}
}
private fun setClasses(){
val items = filter?.get(0)?.items
line_rank_class.apt.text = items?.get(0)?.tag_name?:getString(R.string.text_null)
line_rank_class.setOnClickListener {
val popupMenu = popupMenu {
style = R.style.Widget_MPM_Menu_Dark_CustomBackground
if(items != null) section {
for(i in items.indices) item {
label = items[i]?.tag_name
labelColor = it.apt.currentTextColor
callback = { //optional
it.apt.text = label
type = items[i]?.tag_id?:0
Thread{
sleep(400)
mh?.sendEmptyMessage(4)
}.start()
}
}
}
}
this.context?.let { it1 -> popupMenu.show(it1, it) }
}
}
}*/

View File

@@ -1,12 +1,7 @@
package top.fumiama.copymanga.ui.settings package top.fumiama.copymanga.ui.settings
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.template.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
class SettingsFragment:NoBackRefreshFragment(R.layout.fragment_settings) { class SettingsFragment: NoBackRefreshFragment(R.layout.fragment_settings) {
} }

View File

@@ -5,7 +5,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.fragment_sub.*
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
class SubFragment : Fragment() { class SubFragment : Fragment() {

View File

@@ -15,8 +15,8 @@ import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.json.Chapter2Return 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.AutoDownloadHandler import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.tools.PropertiesTools 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
@@ -113,12 +113,14 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
} }
override fun onError() { override fun onError() {
super.onError() super.onError()
if(exit) return
wv.get()?.toolsBox?.toastError("下载章节信息失败") wv.get()?.toolsBox?.toastError("下载章节信息失败")
} }
@ExperimentalStdlibApi @ExperimentalStdlibApi
override fun doWhenFinishDownload() { override fun doWhenFinishDownload() {
super.doWhenFinishDownload() super.doWhenFinishDownload()
if(exit) return
prepareManga() prepareManga()
} }

View File

@@ -27,10 +27,10 @@ import kotlinx.android.synthetic.main.widget_titlebar.*
import kotlinx.android.synthetic.main.widget_titlebar.view.* import kotlinx.android.synthetic.main.widget_titlebar.view.*
import kotlinx.android.synthetic.main.widget_viewmangainfo.* import kotlinx.android.synthetic.main.widget_viewmangainfo.*
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.template.TitleActivityTemplate import top.fumiama.copymanga.template.general.TitleActivityTemplate
import top.fumiama.copymanga.tools.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.DownloadTools import top.fumiama.copymanga.tools.http.DownloadTools
import top.fumiama.copymanga.tools.TimeThread import top.fumiama.copymanga.tools.thread.TimeThread
import top.fumiama.copymanga.views.ScaleImageView import top.fumiama.copymanga.views.ScaleImageView
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
@@ -399,6 +399,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
dlhandler?.sendEmptyMessage(0) dlhandler?.sendEmptyMessage(0)
tt.canDo = false tt.canDo = false
dlhandler = null dlhandler = null
handler.destroy()
super.onDestroy() super.onDestroy()
} }

View File

@@ -16,6 +16,7 @@ class SimpleKanban(private val client: Client, private val pwd: String) { //mu
try { try {
firstRecv = client.receiveRawMessage(4) //le firstRecv = client.receiveRawMessage(4) //le
val length = convert2Int(firstRecv) val length = convert2Int(firstRecv)
Log.d("MySK", "Msg len: $length")
if(firstRecv.size > 4) re += firstRecv.copyOfRange(4, firstRecv.size) if(firstRecv.size > 4) re += firstRecv.copyOfRange(4, firstRecv.size)
re += client.receiveRawMessage(length - re.size, setProgress = true) re += client.receiveRawMessage(length - re.size, setProgress = true)
break break
@@ -53,6 +54,7 @@ class SimpleKanban(private val client: Client, private val pwd: String) { //mu
if(firstRecv.decodeToString() == "null") "null" if(firstRecv.decodeToString() == "null") "null"
else { else {
val length = convert2Int(firstRecv) val length = convert2Int(firstRecv)
Log.d("MySK", "Msg len: $length")
var re = byteArrayOf() var re = byteArrayOf()
if(firstRecv.size > 4) re += firstRecv.copyOfRange(4, firstRecv.size) if(firstRecv.size > 4) re += firstRecv.copyOfRange(4, firstRecv.size)
re += client.receiveRawMessage(length - re.size) re += client.receiveRawMessage(length - re.size)

View File

@@ -8,8 +8,8 @@ import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import kotlinx.android.synthetic.main.dialog_progress.view.* import kotlinx.android.synthetic.main.dialog_progress.view.*
import top.fumiama.copymanga.tools.PropertiesTools import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.tools.UITools import top.fumiama.copymanga.tools.api.UITools
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.io.File import java.io.File
import java.security.MessageDigest import java.security.MessageDigest

View File

@@ -4,11 +4,11 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="top.fumiama.copymanga.ui.rank.RankFragment"> tools:context="top.fumiama.copymanga.ui.cardflow.rank.RankFragment">
<include <include
android:id="@+id/frlai" android:id="@+id/frlai"
layout="@layout/line_finish" layout="@layout/line_rank"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
layout="@layout/div_h"
android:layout_width="wrap_content"
android:layout_height="1dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lrt" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/lrt"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.tabs.TabItem
android:id="@+id/lrtifast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/rank_fast" />
<com.google.android.material.tabs.TabItem
android:id="@+id/lrtiweek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/rank_week" />
<com.google.android.material.tabs.TabItem
android:id="@+id/lrtimonth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/rank_month" />
<com.google.android.material.tabs.TabItem
android:id="@+id/lrtiall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/rank_all" />
</com.google.android.material.tabs.TabLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -10,13 +10,6 @@
android:name="top.fumiama.copymanga.ui.home.HomeFragment" android:name="top.fumiama.copymanga.ui.home.HomeFragment"
android:label="@string/menu_home" android:label="@string/menu_home"
tools:layout="@layout/fragment_home" > tools:layout="@layout/fragment_home" >
<action
android:id="@+id/action_nav_home_to_nav_latest"
app:destination="@id/nav_latest"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_out_left_exit"
app:popExitAnim="@anim/slide_in_right_exit" />
<action <action
android:id="@+id/action_nav_home_to_nav_book" android:id="@+id/action_nav_home_to_nav_book"
app:destination="@id/nav_book" app:destination="@id/nav_book"
@@ -70,7 +63,7 @@
<fragment <fragment
android:id="@+id/nav_rank" android:id="@+id/nav_rank"
android:name="top.fumiama.copymanga.ui.rank.RankFragment" android:name="top.fumiama.copymanga.ui.cardflow.rank.RankFragment"
android:label="@string/menu_rank" android:label="@string/menu_rank"
tools:layout="@layout/fragment_rank" > tools:layout="@layout/fragment_rank" >
<action <action
@@ -115,20 +108,6 @@
app:popExitAnim="@anim/slide_in_right_exit"/> app:popExitAnim="@anim/slide_in_right_exit"/>
</fragment> </fragment>
<fragment
android:id="@+id/nav_latest"
android:name="top.fumiama.copymanga.ui.latest.LatestFragment"
android:label="@string/page_latest"
tools:layout="@layout/line_lazybooklines" >
<action
android:id="@+id/action_nav_latest_to_nav_book"
app:destination="@id/nav_book"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_out_left_exit"
app:popExitAnim="@anim/slide_in_right_exit"/>
</fragment>
<fragment <fragment
android:id="@+id/nav_settings" android:id="@+id/nav_settings"
android:name="top.fumiama.copymanga.ui.settings.SettingsFragment" android:name="top.fumiama.copymanga.ui.settings.SettingsFragment"

View File

@@ -29,21 +29,21 @@
<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</string> <string name="mainPageApiUrl">https://api.copymanga.com/api/v3/h5/homeIndex?platform=3</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="recentUpdateApiUrl">https://nnv3api.dmzj1.com/novel/recentUpdate/%1$d.json</string>
<string name="rankApiUrl">https://nnv3api.dmzj1.com/novel/rank/%1$d/%2$d/%3$d.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="filterApiUrl">https://api.copymanga.com/api/v3/h5/filterIndex/comic/tags</string> <string name="filterApiUrl">https://api.copymanga.com/api/v3/h5/filterIndex/comic/tags?platform=3</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</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://api.copymanga.com/api/v3/comic2/%1$s</string> <string name="bookInfoApiUrl">https://api.copymanga.com/api/v3/comic2/%1$s?platform=3</string>
<string name="groupInfoApiUrl">https://api.copymanga.com/api/v3/comic/%1$s/group/%2$s/chapters?limit=100&amp;offset=%3$d</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://api.copymanga.com/api/v3/comic/%1$s/chapter2/%2$s</string> <string name="chapterInfoApiUrl">https://api.copymanga.com/api/v3/comic/%1$s/chapter2/%2$s?platform=3</string>
<string name="chapterTxtUrl">https://nnv3api.dmzj1.com/novel/download/%1$d_%2$d_%3$d.txt</string> <string name="chapterTxtUrl">https://nnv3api.dmzj1.com/novel/download/%1$d_%2$d_%3$d.txt</string>
<string name="topicApiUrl">https://api.copymanga.com/api/v3/topic/%1$s</string> <string name="topicApiUrl">https://api.copymanga.com/api/v3/topic/%1$s?platform=3</string>
<string name="topicContentApiUrl">https://api.copymanga.com/api/v3/topic/%1$s/contents?type=%2$d&amp;limit=21&amp;offset=%3$d</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="recommendApiUrl">https://api.copymanga.com/api/v3/recs?pos=3200102&amp;limit=21&amp;offset=%1$d</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="newestApiUrl">https://api.copymanga.com/api/v3/update/newest?limit=21&amp;offset=%1$d</string> <string name="newestApiUrl">https://api.copymanga.com/api/v3/update/newest?limit=21&amp;offset=%1$d&amp;platform=3</string>
<string name="finishApiUrl">https://api.copymanga.com/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;top=finish</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="complete">已完结</string> <string name="complete">已完结</string>
@@ -70,4 +70,9 @@
<string name="rank_list">排行榜 ☟日周月 ☛冠亚季</string> <string name="rank_list">排行榜 ☟日周月 ☛冠亚季</string>
<string name="hot_list">热门更新</string> <string name="hot_list">热门更新</string>
<string name="new_list">全新上架</string> <string name="new_list">全新上架</string>
<string name="rank_fast">上升最快</string>
<string name="rank_week">近七天</string>
<string name="rank_month">近三十天</string>
<string name="rank_all">总榜单</string>
</resources> </resources>