1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-07 08:10:23 +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'
minSdkVersion 23
targetSdkVersion 30
versionCode 15
versionName '2.0.beta4'
versionCode 16
versionName '2.0.beta5'
resConfigs "zh", "zh-rCN"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -21,6 +21,7 @@ import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import androidx.drawerlayout.widget.DrawerLayout
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
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.nav_header_main.*
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.tools.PropertiesTools
import top.fumiama.copymanga.tools.UITools
import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.tools.api.UITools
import top.fumiama.copymanga.ui.download.DownloadFragment
import top.fumiama.copymanga.update.Update
import java.io.File
@@ -45,6 +46,7 @@ import java.lang.ref.WeakReference
class MainActivity : AppCompatActivity() {
var isDrawerClosed = true
var menuMain: Menu? = null
var navController: NavController? = null
private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var p: PropertiesTools
@@ -57,7 +59,7 @@ class MainActivity : AppCompatActivity() {
//translucentStatusBar()
coordiv.layoutParams.height = getStatusBarHeight()
val navController = findNavController(R.id.nav_host_fragment)
navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.nav_home,
@@ -69,8 +71,8 @@ class MainActivity : AppCompatActivity() {
R.id.nav_settings
), drawer_layout
)
setupActionBarWithNavController(navController, appBarConfiguration)
nav_view.setupWithNavController(navController)
setupActionBarWithNavController(navController!!, appBarConfiguration)
nav_view.setupWithNavController(navController!!)
p = PropertiesTools(File(filesDir, "database.prop"))
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.os.Bundle
import android.view.View
import top.fumiama.copymanga.tools.PropertiesTools
import top.fumiama.copymanga.tools.UITools
import top.fumiama.copymanga.tools.file.PropertiesTools
import top.fumiama.copymanga.tools.api.UITools
import java.io.File
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.os.Bundle
@@ -8,8 +8,9 @@ import android.view.View
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.line_header.view.*
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.tools.UITools
import top.fumiama.copymanga.tools.api.UITools
import java.lang.Thread.sleep
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.view.LayoutInflater

View File

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

View File

@@ -10,7 +10,7 @@ import android.widget.Toast
import com.liaoinstan.springview.widget.SpringView
import top.fumiama.dmzj.copymanga.R
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

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.template
package top.fumiama.copymanga.template.http
import android.os.Handler
import android.os.Looper
@@ -8,10 +8,11 @@ import com.google.gson.Gson
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.ReturnBase
import top.fumiama.copymanga.tools.DownloadTools
import top.fumiama.copymanga.tools.TimeThread
import top.fumiama.copymanga.tools.http.DownloadTools
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) {
var exit = false
private var timeThread: TimeThread? = null
private var checkTimes = 0
override fun handleMessage(msg: Message) {
@@ -28,12 +29,16 @@ open class AutoDownloadHandler(private val url: String, private val jsonClass: C
fun startLoad() {
sendEmptyMessage(0)
}
fun destroy() {
exit = true
}
private fun download(){
Thread{
DownloadTools.getHttpContent(url,
mainWeakReference?.get()?.getString(R.string.referUrl)!!,
mainWeakReference?.get()?.getString(R.string.pc_ua)!!
)?.let {
if(exit) return@Thread
val fi = it.inputStream()
setGsonItem(Gson().fromJson(fi.reader(), jsonClass))
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.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() {
var exit = false
override fun run() {
super.run()
var re: ByteArray? = null
var c = 0
while (re == null && c++ < 3){
while (!exit && re == null && c++ < 3){
re = DownloadTools.getHttpContent(url,
mainWeakReference?.get()?.getString(R.string.referUrl)!!,
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.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_lazybooklines.*
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 java.io.File
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.util.JsonReader
import android.util.Log
import android.view.View
import androidx.fragment.app.Fragment
import androidx.navigation.Navigation
import com.google.gson.Gson
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.json.BookListStructure
import top.fumiama.copymanga.json.TypeBookListStructure
import top.fumiama.copymanga.tools.DownloadTools
import java.io.File
import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
import top.fumiama.copymanga.template.http.AutoDownloadThread
import java.lang.ref.WeakReference
@ExperimentalStdlibApi
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 var ad: AutoDownloadThread? = null
init {
pageHandler = object : PageHandler {
override fun addPage(){
AutoDownloadThread(subUrl){
ad = AutoDownloadThread(subUrl){
if(isRefresh){
page = 0
isRefresh = false
@@ -28,9 +28,13 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
if(isTypeBook) {
val bookList = Gson().fromJson(it?.decodeToString(), TypeBookListStructure::class.java)
bookList?.apply {
Log.d("MyICL", "offset:${results.offset}, total:${results.total}")
if(results.offset < results.total) {
if(code == 200) results.list.forEach { book ->
cardList.addCard(book.comic.name, null, book.comic.cover, book.comic.path_word, null, null, false)
if(code == 200) {
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++
@@ -38,16 +42,21 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
} else {
val bookList = Gson().fromJson(it?.decodeToString(), BookListStructure::class.java)
bookList?.apply {
Log.d("MyICL", "offset:${results.offset}, total:${results.total}")
if(results.offset < results.total) {
if(code == 200) results.list.forEach{ book ->
cardList.addCard(book.name, null, book.cover, book.path_word, null, null, false)
if(code == 200) {
results.list.forEach{ book ->
cardList.addCard(book.name, null, book.cover, book.path_word, null, null, false)
}
offset += results.list.size
}
}
page++
}
}
onLoadFinish()
}.start()
}
ad?.start()
}
override fun initCardList(weakReference: WeakReference<Fragment>) {
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 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 top.fumiama.dmzj.copymanga.R
@@ -9,7 +9,15 @@ import java.io.File
object CMApi {
var myGlideHeaders: LazyHeaders? = null
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
}
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.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.AlertDialog

View File

@@ -1,4 +1,4 @@
package top.fumiama.copymanga.tools
package top.fumiama.copymanga.tools.file
//PropertiesTools.kt
//created by fumiama 20200724
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 top.fumiama.copymanga.tools.ssl.AllTrustManager
import top.fumiama.copymanga.tools.ssl.IgnoreHostNameVerifier
import java.io.File
import java.net.HttpURLConnection
import java.net.URL
import java.security.SecureRandom
import java.util.concurrent.Callable
import java.util.concurrent.FutureTask
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
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? {
Log.d("Mydl", "getHttp: $Url")
var ret: ByteArray? = null
@@ -15,9 +32,13 @@ object DownloadTools {
try {
val connection = URL(Url).openConnection() as HttpURLConnection
connection.requestMethod = "GET"
connection.connectTimeout = 10000
connection.readTimeout = 10000
connection.connectTimeout = 20000
connection.readTimeout = 20000
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) }
ret = connection.inputStream.readBytes()
@@ -41,8 +62,12 @@ object DownloadTools {
try {
val connection = URL(Url).openConnection() as HttpURLConnection
connection.requestMethod = "GET"
connection.connectTimeout = 10000
connection.readTimeout = 10000
connection.connectTimeout = 20000
connection.readTimeout = 20000
connection.setRequestProperty("source", "copyApp")
connection.setRequestProperty("webp", "1")
connection.setRequestProperty("region", "1")
connection.setRequestProperty("platform", "3")
if (f.exists()) f.delete()
else f.parentFile?.mkdirs()
@@ -72,8 +97,8 @@ object DownloadTools {
try {
val connection = URL(Url).openConnection() as HttpURLConnection
connection.requestMethod = "GET"
connection.connectTimeout = 10000
connection.readTimeout = 10000
connection.connectTimeout = 20000
connection.readTimeout = 20000
refer?.let { connection.setRequestProperty("referer", it) }
if (f.exists()) f.delete()
@@ -97,8 +122,8 @@ object DownloadTools {
try {
val connection = URL(Url).openConnection() as HttpURLConnection
connection.requestMethod = "GET"
connection.connectTimeout = 10000
connection.readTimeout = 10000
connection.connectTimeout = 20000
connection.readTimeout = 20000
refer?.let { connection.setRequestProperty("referer", it) }
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 com.google.gson.Gson
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.Chapter2Return
import top.fumiama.copymanga.template.AutoDownloadThread
import top.fumiama.copymanga.tools.DownloadTools.getHttpContent
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.http.DownloadTools.getHttpContent
import java.io.File
import java.lang.Thread.sleep
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

View File

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

View File

@@ -4,15 +4,12 @@ import android.os.Bundle
import android.os.Looper
import android.os.Message
import android.util.Log
import android.view.Menu
import android.view.View
import android.view.ViewTreeObserver
import android.widget.TextView
import android.widget.Toast
import androidx.navigation.Navigation
import com.bumptech.glide.Glide
import com.bumptech.glide.load.model.GlideUrl
import com.bumptech.glide.load.model.LazyHeaders
import com.bumptech.glide.request.RequestOptions
import kotlinx.android.synthetic.main.app_bar_main.*
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.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.BookInfoStructure
import top.fumiama.copymanga.json.ReturnBase
import top.fumiama.copymanga.json.ThemeStructure
import top.fumiama.copymanga.template.AutoDownloadHandler
import top.fumiama.copymanga.tools.CMApi
import top.fumiama.copymanga.tools.GlideBlurTransformation
import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.GlideBlurTransformation
import java.lang.ref.WeakReference
class BookHandler(that: WeakReference<BookFragment>, path: String)
:AutoDownloadHandler(
: AutoDownloadHandler(
that.get()?.getString(R.string.bookInfoApiUrl)?.let { String.format(it, path) } ?: "",
BookInfoStructure::class.java,
Looper.myLooper()!!){
@@ -64,6 +60,7 @@ class BookHandler(that: WeakReference<BookFragment>, path: String)
override fun onError() {
super.onError()
if(exit) return
if(!hasToastedError) {
Toast.makeText(that?.context, R.string.null_book, Toast.LENGTH_SHORT).show()
that?.rootView?.let { it1 ->
@@ -80,6 +77,7 @@ class BookHandler(that: WeakReference<BookFragment>, path: String)
override fun getGsonItem() = book
override fun doWhenFinishDownload() {
super.doWhenFinishDownload()
if(exit) return
inflateComponents()
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_lazybooklines.*
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 java.lang.Thread.sleep

View File

@@ -3,7 +3,7 @@ package top.fumiama.copymanga.ui.cardflow.newest
import android.view.View
import kotlinx.android.synthetic.main.line_lazybooklines.*
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
@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 kotlinx.android.synthetic.main.line_lazybooklines.*
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
@ExperimentalStdlibApi

View File

@@ -10,8 +10,8 @@ import kotlinx.android.synthetic.main.line_sort.*
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.FilterStructure
import top.fumiama.copymanga.template.AutoDownloadThread
import top.fumiama.copymanga.template.InfoCardLoader
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.ui.InfoCardLoader
import java.lang.Thread.sleep
@ExperimentalStdlibApi

View File

@@ -8,8 +8,8 @@ import kotlinx.android.synthetic.main.line_lazybooklines.*
import kotlinx.android.synthetic.main.fragment_topic.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.TopicStructure
import top.fumiama.copymanga.template.AutoDownloadThread
import top.fumiama.copymanga.template.InfoCardLoader
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi
@@ -17,7 +17,7 @@ class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_to
private var type = 1
override fun getApiUrl() =
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?) {

View File

@@ -3,11 +3,11 @@ package top.fumiama.copymanga.ui.chapter
import android.os.Bundle
import android.view.View
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.ref.WeakReference
class ChapterFragment:NoBackRefreshFragment(R.layout.fragment_chapters) {
class ChapterFragment: NoBackRefreshFragment(R.layout.fragment_chapters) {
var handler: ChapterHandler? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -19,4 +19,9 @@ class ChapterFragment:NoBackRefreshFragment(R.layout.fragment_chapters) {
}.start()
}
}
override fun onDestroy() {
super.onDestroy()
handler?.destroy()
}
}

View File

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

View File

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

View File

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

View File

@@ -7,13 +7,12 @@ import androidx.navigation.Navigation
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
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.viewpage_horizonal.view.*
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.NoBackRefreshFragment
import top.fumiama.copymanga.tools.CMApi
import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.tools.api.CMApi
import java.lang.Thread.sleep
import java.lang.ref.WeakReference
@@ -45,6 +44,11 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
homeHandler = HomeHandler(WeakReference(this))
}
override fun onDestroy() {
super.onDestroy()
homeHandler.destroy()
}
inner class ViewData(itemView: View) : RecyclerView.ViewHolder(itemView) {
inner class RecyclerViewAdapter :
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.fragment_home.*
import kotlinx.android.synthetic.main.line_1bookline.view.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.json.ComicStructure
import top.fumiama.copymanga.json.IndexStructure
import top.fumiama.copymanga.template.AutoDownloadHandler
import top.fumiama.copymanga.tools.CMApi
import top.fumiama.copymanga.tools.UITools
import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.UITools
import java.lang.Thread.sleep
import java.lang.ref.WeakReference
class HomeHandler(that: WeakReference<HomeFragment>) :AutoDownloadHandler(
class HomeHandler(that: WeakReference<HomeFragment>) : AutoDownloadHandler(
that.get()?.getString(R.string.mainPageApiUrl) ?: "",
IndexStructure::class.java,
Looper.myLooper()!!,
@@ -83,10 +84,12 @@ class HomeHandler(that: WeakReference<HomeFragment>) :AutoDownloadHandler(
}
override fun onError() {
super.onError()
if(exit) return
Toast.makeText(homeF?.context, R.string.web_error, Toast.LENGTH_SHORT).show()
}
override fun doWhenFinishDownload() {
super.doWhenFinishDownload()
if(exit) return
try {
Thread {
sendEmptyMessage(7) //inflateBanner
@@ -147,7 +150,9 @@ class HomeHandler(that: WeakReference<HomeFragment>) :AutoDownloadHandler(
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(){
@@ -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) {
cv.tic.text = name
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
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
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.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.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.fragment_sub.*
import top.fumiama.dmzj.copymanga.R
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.ChapterWithContent
import top.fumiama.copymanga.json.ComicStructure
import top.fumiama.copymanga.template.AutoDownloadHandler
import top.fumiama.copymanga.tools.PropertiesTools
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.pn
import top.fumiama.copymanga.views.ScaleImageView
@@ -113,12 +113,14 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
}
override fun onError() {
super.onError()
if(exit) return
wv.get()?.toolsBox?.toastError("下载章节信息失败")
}
@ExperimentalStdlibApi
override fun doWhenFinishDownload() {
super.doWhenFinishDownload()
if(exit) return
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_viewmangainfo.*
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.template.TitleActivityTemplate
import top.fumiama.copymanga.tools.CMApi
import top.fumiama.copymanga.tools.DownloadTools
import top.fumiama.copymanga.tools.TimeThread
import top.fumiama.copymanga.template.general.TitleActivityTemplate
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.http.DownloadTools
import top.fumiama.copymanga.tools.thread.TimeThread
import top.fumiama.copymanga.views.ScaleImageView
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
@@ -399,6 +399,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
dlhandler?.sendEmptyMessage(0)
tt.canDo = false
dlhandler = null
handler.destroy()
super.onDestroy()
}

View File

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

View File

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

View File

@@ -4,11 +4,11 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="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
android:id="@+id/frlai"
layout="@layout/line_finish"
layout="@layout/line_rank"
android:layout_width="0dp"
android:layout_height="wrap_content"
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:label="@string/menu_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
android:id="@+id/action_nav_home_to_nav_book"
app:destination="@id/nav_book"
@@ -70,7 +63,7 @@
<fragment
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"
tools:layout="@layout/fragment_rank" >
<action
@@ -115,20 +108,6 @@
app:popExitAnim="@anim/slide_in_right_exit"/>
</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
android:id="@+id/nav_settings"
android:name="top.fumiama.copymanga.ui.settings.SettingsFragment"

View File

@@ -29,21 +29,21 @@
<string name="null_book">获取图书信息失败</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="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="filterApiUrl">https://api.copymanga.com/api/v3/h5/filterIndex/comic/tags</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="bookInfoApiUrl">https://api.copymanga.com/api/v3/comic2/%1$s</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="chapterInfoApiUrl">https://api.copymanga.com/api/v3/comic/%1$s/chapter2/%2$s</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?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&amp;platform=3</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&amp;platform=3</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="topicApiUrl">https://api.copymanga.com/api/v3/topic/%1$s</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="recommendApiUrl">https://api.copymanga.com/api/v3/recs?pos=3200102&amp;limit=21&amp;offset=%1$d</string>
<string name="newestApiUrl">https://api.copymanga.com/api/v3/update/newest?limit=21&amp;offset=%1$d</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="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&amp;platform=3</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&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&amp;platform=3</string>
<string name="complete">已完结</string>
@@ -70,4 +70,9 @@
<string name="rank_list">排行榜 ☟日周月 ☛冠亚季</string>
<string name="hot_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>