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

v2.0.beta16

修复
1. 返回主页闪退
2. 下载为空
优化
1. 增加全局底部 padding
2. 优化工具栏显示
3. 删除了冗余代码
4. 主页响应更流畅
This commit is contained in:
源文雨
2022-12-17 23:45:34 +08:00
parent 3213822786
commit 4269d9ab6b
32 changed files with 231 additions and 431 deletions

12
.idea/misc.xml generated
View File

@@ -11,23 +11,32 @@
<entry key="app/src/main/res/layout/activity_login.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/activity_login.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/activity_main.xml" value="0.5095108695652174" /> <entry key="app/src/main/res/layout/activity_main.xml" value="0.5095108695652174" />
<entry key="app/src/main/res/layout/activity_viewmanga.xml" value="0.5395833333333333" /> <entry key="app/src/main/res/layout/activity_viewmanga.xml" value="0.5395833333333333" />
<entry key="app/src/main/res/layout/anchor_popular.xml" value="0.3807291666666667" />
<entry key="app/src/main/res/layout/app_bar_main.xml" value="0.5095108695652174" /> <entry key="app/src/main/res/layout/app_bar_main.xml" value="0.5095108695652174" />
<entry key="app/src/main/res/layout/card_book.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/card_book.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/card_book_plain.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/card_book_plain.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/content_main.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/content_main.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/fragment_book.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/fragment_book.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/fragment_chapters.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/fragment_chapters.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/fragment_dlcomic.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/fragment_download.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/fragment_download.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/fragment_history.xml" value="0.5395833333333333" /> <entry key="app/src/main/res/layout/fragment_history.xml" value="0.5395833333333333" />
<entry key="app/src/main/res/layout/fragment_home.xml" value="0.4376278118609407" /> <entry key="app/src/main/res/layout/fragment_home.xml" value="0.4376278118609407" />
<entry key="app/src/main/res/layout/fragment_newest.xml" value="0.5395833333333333" /> <entry key="app/src/main/res/layout/fragment_newest.xml" value="0.5395833333333333" />
<entry key="app/src/main/res/layout/fragment_rank.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/fragment_reader.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/fragment_recommend.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/fragment_settings.xml" value="0.5255208333333333" /> <entry key="app/src/main/res/layout/fragment_settings.xml" value="0.5255208333333333" />
<entry key="app/src/main/res/layout/fragment_sort.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/fragment_statuscardflow.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/fragment_sub.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/line_1bookline.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/line_1bookline.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/line_bookinfo.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/line_bookinfo.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/line_bookinfo_text.xml" value="0.5395833333333333" /> <entry key="app/src/main/res/layout/line_bookinfo_text.xml" value="0.5395833333333333" />
<entry key="app/src/main/res/layout/line_booktandb.xml" value="0.48596014492753625" /> <entry key="app/src/main/res/layout/line_booktandb.xml" value="0.48596014492753625" />
<entry key="app/src/main/res/layout/line_chapter.xml" value="0.48596014492753625" /> <entry key="app/src/main/res/layout/line_chapter.xml" value="0.48596014492753625" />
<entry key="app/src/main/res/layout/line_choice_list.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/line_choice_list.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/line_lazybooklines.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/line_rank.xml" value="0.5395833333333333" /> <entry key="app/src/main/res/layout/line_rank.xml" value="0.5395833333333333" />
<entry key="app/src/main/res/layout/line_sort.xml" value="0.5395833333333333" /> <entry key="app/src/main/res/layout/line_sort.xml" value="0.5395833333333333" />
<entry key="app/src/main/res/layout/line_text_info.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/line_text_info.xml" value="0.49592391304347827" />
@@ -35,7 +44,10 @@
<entry key="app/src/main/res/layout/nav_header_main.xml" value="0.48596014492753625" /> <entry key="app/src/main/res/layout/nav_header_main.xml" value="0.48596014492753625" />
<entry key="app/src/main/res/layout/viewpage_banner.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/viewpage_banner.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/viewpage_horizonal.xml" value="0.49592391304347827" /> <entry key="app/src/main/res/layout/viewpage_horizonal.xml" value="0.49592391304347827" />
<entry key="app/src/main/res/layout/widget_finalmark.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/widget_infodrawer.xml" value="0.5395833333333333" /> <entry key="app/src/main/res/layout/widget_infodrawer.xml" value="0.5395833333333333" />
<entry key="app/src/main/res/layout/widget_titlebar.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/layout/widget_viewmangainfo.xml" value="0.5172101449275363" />
<entry key="app/src/main/res/menu/activity_main_drawer.xml" value="0.5395833333333333" /> <entry key="app/src/main/res/menu/activity_main_drawer.xml" value="0.5395833333333333" />
<entry key="app/src/main/res/menu/main.xml" value="0.5395833333333333" /> <entry key="app/src/main/res/menu/main.xml" value="0.5395833333333333" />
<entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.5572916666666666" /> <entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.5572916666666666" />

View File

@@ -39,16 +39,19 @@ 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.api.UITools import top.fumiama.copymanga.tools.api.UITools
import top.fumiama.copymanga.ui.book.BookFragment.Companion.bookHandler
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
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
import java.io.FileInputStream import java.io.FileInputStream
import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
var isDrawerClosed = true var isDrawerClosed = true
var menuMain: Menu? = null private var menuMain: Menu? = null
var navController: NavController? = null private var navController: NavController? = null
private lateinit var appBarConfiguration: AppBarConfiguration private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var headPic: File private lateinit var headPic: File
@@ -102,6 +105,40 @@ class MainActivity : AppCompatActivity() {
checkUpdate(false) checkUpdate(false)
ime = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager ime = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
navController!!.addOnDestinationChangedListener { _, destination, _ ->
Thread {
sleep(1000)
runOnUiThread {
when (destination.id) {
R.id.nav_home -> {
Log.d("MyMA", "enter home")
menuMain?.findItem(R.id.action_info)?.isVisible = true
menuMain?.findItem(R.id.action_download)?.isVisible = false
menuMain?.findItem(R.id.action_sort)?.isVisible = false
}
R.id.nav_book -> {
Log.d("MyMA", "enter book")
menuMain?.findItem(R.id.action_info)?.isVisible = false
menuMain?.findItem(R.id.action_download)?.isVisible = true
menuMain?.findItem(R.id.action_sort)?.isVisible = false
}
R.id.nav_group -> {
Log.d("MyMA", "enter group")
menuMain?.findItem(R.id.action_info)?.isVisible = false
menuMain?.findItem(R.id.action_download)?.isVisible = false
menuMain?.findItem(R.id.action_sort)?.isVisible = true
}
else -> {
Log.d("MyMA", "enter others")
menuMain?.findItem(R.id.action_info)?.isVisible = false
menuMain?.findItem(R.id.action_download)?.isVisible = false
menuMain?.findItem(R.id.action_sort)?.isVisible = false
}
}
}
}.start()
}
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -111,6 +148,24 @@ class MainActivity : AppCompatActivity() {
return true return true
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_info -> {
showAbout()
true
}
R.id.action_download -> {
bookHandler?.sendEmptyMessage(6)
true
}
R.id.action_sort -> {
ComicDlFragment.handler?.sendEmptyMessage(13)
true
}
else -> super.onOptionsItemSelected(item)
}
}
override fun onSupportNavigateUp(): Boolean { override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.nav_host_fragment) val navController = findNavController(R.id.nav_host_fragment)
@@ -250,7 +305,7 @@ class MainActivity : AppCompatActivity() {
}.start() }.start()
} }
fun showAbout(item: MenuItem) { private fun showAbout() {
val dl = android.app.AlertDialog.Builder(this) val dl = android.app.AlertDialog.Builder(this)
dl.setMessage(R.string.app_description) dl.setMessage(R.string.app_description)
dl.setTitle(R.string.action_info) dl.setTitle(R.string.action_info)

View File

@@ -1,6 +1,7 @@
package top.fumiama.copymanga.template.general package top.fumiama.copymanga.template.general
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@@ -17,7 +18,11 @@ open class NoBackRefreshFragment(private val layoutToLoad: Int):Fragment() {
if(rootView == null){ if(rootView == null){
isFirstInflate = true isFirstInflate = true
rootView = inflater.inflate(layoutToLoad, container, false) rootView = inflater.inflate(layoutToLoad, container, false)
} else isFirstInflate = false Log.d("MyNBRF", "is first inflate")
} else {
isFirstInflate = false
Log.d("MyNBRF", "not first inflate")
}
return rootView return rootView
} }
override fun onDestroyView() { override fun onDestroyView() {

View File

@@ -41,8 +41,12 @@ open class AutoDownloadHandler(private val url: String, private val jsonClass: C
timeThread?.start() timeThread?.start()
} }
private fun dlThread() { private fun dlThread() {
DownloadTools.getHttpContent(url, null, mainWeakReference?.get()?.getString(R.string.pc_ua)!!)?.let { DownloadTools.getHttpContent(url, null, mainWeakReference?.get()?.getString(R.string.pc_ua)!!).let {
if(exit) return if(exit) return
if(it == null) {
dlThread()
return
}
val fi = it.inputStream() val fi = it.inputStream()
var pass = true var pass = true
try { try {

View File

@@ -62,11 +62,11 @@ class DownloadPool(folder: String) {
for(index in imgUrls.indices) { for(index in imgUrls.indices) {
while (wait && !exit) sleep(1000) while (wait && !exit) sleep(1000)
if(exit) break if(exit) break
zip.putNextEntry(ZipEntry("$index.jpg")) zip.putNextEntry(ZipEntry("$index.${if(imgUrls[index].contains(".webp")) "webp" else "jpg"}"))
var tryTimes = 3 var tryTimes = 3
var s = false var s = false
while (!s && tryTimes-- > 0){ while (!s && tryTimes-- > 0){
s = (DownloadTools.getHttpContent(imgUrls[index], -1, refer)) ?.let { zip.write(it); true }?:false s = (DownloadTools.getHttpContent(imgUrls[index], -1))?.let { zip.write(it); true }?:false
if (!s) sleep(2000) if (!s) sleep(2000)
} }
if(!s && tryTimes <= 0) { if(!s && tryTimes <= 0) {

View File

@@ -4,30 +4,13 @@ import android.content.Context
import android.util.Log import android.util.Log
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.tools.ssl.AllTrustManager
import top.fumiama.copymanga.tools.ssl.IgnoreHostNameVerifier
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.net.URL import java.net.URL
import java.net.URLEncoder
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.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 getConnection(url: String?, method: String = "GET", refer: String? = null, ua: String? = null) = fun getConnection(url: String?, method: String = "GET", refer: String? = null, ua: String? = null) =
url?.let { url?.let {
val connection = URL(url).openConnection() as HttpURLConnection val connection = URL(url).openConnection() as HttpURLConnection
@@ -35,6 +18,7 @@ object DownloadTools {
connection.connectTimeout = 20000 connection.connectTimeout = 20000
connection.readTimeout = 20000 connection.readTimeout = 20000
connection.apply { connection.apply {
setRequestProperty("host", url.substringAfter("://").substringBefore("/"))
ua?.let { setRequestProperty("user-agent", it) } ua?.let { setRequestProperty("user-agent", it) }
refer?.let { setRequestProperty("referer", it) } refer?.let { setRequestProperty("referer", it) }
setRequestProperty("source", "copyApp") setRequestProperty("source", "copyApp")
@@ -51,11 +35,22 @@ object DownloadTools {
} }
} }
} }
setRequestProperty("host", url.substringAfter("://").substringBefore("/"))
setRequestProperty("platform", "3") setRequestProperty("platform", "3")
} }
} }
private fun getNormalConnection(url: String?, method: String = "GET", ua: String? = null) =
url?.let {
val connection = URL(url).openConnection() as HttpURLConnection
connection.requestMethod = method
connection.connectTimeout = 20000
connection.readTimeout = 20000
connection.apply {
setRequestProperty("host", url.substringAfter("://").substringBefore("/"))
ua?.let { setRequestProperty("user-agent", it) }
}
}
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
@@ -79,16 +74,12 @@ object DownloadTools {
} }
} }
fun getHttpContent(Url: String, readSize: Int, refer: String? = "https://api.copymanga.com"): ByteArray? { fun getHttpContent(Url: String, readSize: Int): ByteArray? {
Log.d("Mydl", "getHttp: $Url") Log.d("Mydl", "getHttp: $Url")
var ret: ByteArray? = null var ret: ByteArray? = null
val task = FutureTask(Callable { val task = FutureTask(Callable {
try { try {
val connection = getConnection(Url, "GET", refer)?.apply { val connection = getNormalConnection(Url, "GET")
ret = inputStream.readBytes()
disconnect()
}
val ci = connection?.inputStream val ci = connection?.inputStream
if(readSize > 0) { if(readSize > 0) {
ret = ByteArray(readSize) ret = ByteArray(readSize)
@@ -110,16 +101,13 @@ object DownloadTools {
} }
} }
fun touch(url: String?, refer: String? = "https://api.copymanga.com"): FutureTask<ByteArray?>? = fun touch(url: String?): FutureTask<ByteArray?>? =
url?.let { url?.let {
Log.d("Mydl", "touchHttp: $it") Log.d("Mydl", "touchHttp: $it")
var ret: ByteArray? = null var ret: ByteArray? = null
val task = FutureTask(Callable { val task = FutureTask(Callable {
try { try {
val connection = getConnection(it, "GET", refer)?.apply { val connection = getNormalConnection(it, "GET")
ret = inputStream.readBytes()
disconnect()
}
val ci = connection?.inputStream val ci = connection?.inputStream
ret = ci?.readBytes() ret = ci?.readBytes()
@@ -134,10 +122,10 @@ object DownloadTools {
task task
} }
private fun replaceChineseCharacters(string: String?) : String? { /*private fun replaceChineseCharacters(string: String?) : String? {
if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.M) return string if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.M) return string
else return string?.replace(Regex("(?<=/)[\\w\\s\\d\\u4e00-\\u9fa5.-]+(?=/?)")) { match -> else return string?.replace(Regex("(?<=/)[\\w\\s\\d\\u4e00-\\u9fa5.-]+(?=/?)")) { match ->
return@replace URLEncoder.encode(match.value, "UTF-8") return@replace URLEncoder.encode(match.value, "UTF-8")
} }
} }*/
} }

View File

@@ -1,17 +0,0 @@
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

@@ -1,11 +0,0 @@
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

@@ -2,9 +2,9 @@ package top.fumiama.copymanga.ui.book
import android.content.Context.MODE_PRIVATE import android.content.Context.MODE_PRIVATE
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.view.LayoutInflater
import android.view.Menu
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.navigation.Navigation import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.line_booktandb.* import kotlinx.android.synthetic.main.line_booktandb.*
@@ -16,7 +16,9 @@ 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 var fbibinfo: View? = null
var fbtinfo: View? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -24,7 +26,7 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
bookHandler = BookHandler(WeakReference(this), arguments?.getString("path")?:"null") bookHandler = BookHandler(WeakReference(this), arguments?.getString("path")?:"null")
Thread{ Thread{
sleep(600) sleep(600)
bookHandler.startLoad() bookHandler?.startLoad()
}.start() }.start()
} }
} }
@@ -32,35 +34,29 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
mainWeakReference?.get()?.apply { mainWeakReference?.get()?.apply {
menuMain?.let { setMenuVisible(it) } toolbar.title = bookHandler?.book?.results?.comic?.name
toolbar.title = bookHandler.book?.results?.comic?.name
} }
setStartRead() setStartRead()
bookHandler.fbibinfo?.layoutParams?.height = ((bookHandler.fbibinfo?.width?:0) * 4.0 / 9.0 + 0.5).toInt() fbibinfo?.layoutParams?.height = ((fbibinfo?.width?:0) * 4.0 / 9.0 + 0.5).toInt()
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) } bookHandler?.destroy()
bookHandler.destroy() bookHandler?.ads?.forEach {
bookHandler.ads.forEach {
it.exit = true it.exit = true
} }
} bookHandler = null
override fun onPause() {
super.onPause()
mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) }
} }
fun setStartRead() { fun setStartRead() {
if(bookHandler.chapterNames.isNotEmpty()) mainWeakReference?.get()?.apply { if(bookHandler?.chapterNames?.isNotEmpty() == true) mainWeakReference?.get()?.apply {
bookHandler.book?.results?.comic?.name?.let { name -> bookHandler?.book?.results?.comic?.name?.let { name ->
getPreferences(MODE_PRIVATE).getInt(name, -1).let { p -> getPreferences(MODE_PRIVATE).getInt(name, -1).let { p ->
this@BookFragment.lbbstart.apply { this@BookFragment.lbbstart.apply {
var i = 0 var i = 0
if(p >= 0) { if(p >= 0) {
text = bookHandler.chapterNames[p] text = bookHandler!!.chapterNames[p]
i = p i = p
} }
setOnClickListener { setOnClickListener {
@@ -72,34 +68,20 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
} }
} }
private fun setMenuInvisible(menu: Menu){ fun navigate2dl(){
menu.findItem(R.id.action_download)?.isVisible = false
}
private fun setMenuVisible(menu: Menu) {
Log.d("MyBF", "显示下载按钮")
val dl = menu.findItem(R.id.action_download)
dl?.isVisible = true
dl?.setIcon(R.drawable.ic_menu_download)
dl?.setOnMenuItemClickListener {
if(bookHandler.complete && it.itemId == R.id.action_download){
navigate2dl()
true
}
else it.itemId == R.id.action_download
}
}
private fun navigate2dl(){
val bundle = Bundle() val bundle = Bundle()
bundle.putString("path", arguments?.getString("path")?:"null") bundle.putString("path", arguments?.getString("path")?:"null")
bundle.putString("name", bookHandler.book?.results?.comic?.name) bundle.putString("name", bookHandler!!.book?.results?.comic?.name)
if(bookHandler.vols != null) { if(bookHandler!!.vols != null) {
bundle.putBoolean("loadJson", true) bundle.putBoolean("loadJson", true)
} }
bundle.putStringArray("group", bookHandler.gpws) bundle.putStringArray("group", bookHandler!!.gpws)
bundle.putStringArray("groupNames", bookHandler.keys) bundle.putStringArray("groupNames", bookHandler!!.keys)
bundle.putIntArray("count", bookHandler.cnts) bundle.putIntArray("count", bookHandler!!.cnts)
rootView?.let { Navigation.findNavController(it).navigate(R.id.action_nav_book_to_nav_group, bundle) } rootView?.let { Navigation.findNavController(it).navigate(R.id.action_nav_book_to_nav_group, bundle) }
} }
companion object {
var bookHandler: BookHandler? = null
}
} }

View File

@@ -1,7 +1,5 @@
package top.fumiama.copymanga.ui.book package top.fumiama.copymanga.ui.book
import android.content.Context.MODE_PRIVATE
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.os.Message import android.os.Message
@@ -44,12 +42,12 @@ 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 BookHandler(that: WeakReference<BookFragment>, private val path: String) class BookHandler(private val th: WeakReference<BookFragment>, private val path: String)
: AutoDownloadHandler( : AutoDownloadHandler(
that.get()?.getString(R.string.bookInfoApiUrl)?.let { String.format(it, path) } ?: "", th.get()?.getString(R.string.bookInfoApiUrl)?.let { String.format(it, path) } ?: "",
BookInfoStructure::class.java, BookInfoStructure::class.java,
Looper.myLooper()!!){ Looper.myLooper()!!){
private val that = that.get() private val that get() = th.get()
private var hasToastedError = false private var hasToastedError = false
get(){ get(){
val re = field val re = field
@@ -57,7 +55,6 @@ class BookHandler(that: WeakReference<BookFragment>, private val path: String)
return re return re
} }
var book: BookInfoStructure? = null var book: BookInfoStructure? = null
var fbibinfo:View? = null
var complete = false var complete = false
var ads = emptyArray<AutoDownloadThread>() var ads = emptyArray<AutoDownloadThread>()
var gpws = arrayOf<String>() var gpws = arrayOf<String>()
@@ -65,8 +62,7 @@ class BookHandler(that: WeakReference<BookFragment>, private val path: String)
var cnts = intArrayOf() var cnts = intArrayOf()
var vols: Array<VolumeStructure>? = null var vols: Array<VolumeStructure>? = null
var chapterNames = arrayOf<String>() var chapterNames = arrayOf<String>()
private val divider get() = that?.layoutInflater?.inflate(R.layout.div_h, that.fbl, false) private val divider get() = that?.layoutInflater?.inflate(R.layout.div_h, that?.fbl, false)
private var fbtinfo: View? = null
override fun handleMessage(msg: Message) { override fun handleMessage(msg: Message) {
super.handleMessage(msg) super.handleMessage(msg)
@@ -74,9 +70,10 @@ class BookHandler(that: WeakReference<BookFragment>, private val path: String)
//0 -> setLayouts() //0 -> setLayouts()
1 -> setCover() 1 -> setCover()
2 -> setTexts() 2 -> setTexts()
3 -> fbibinfo?.let { setInfoHeight(it) } 3 -> that?.fbibinfo?.let { setInfoHeight(it) }
4 -> setThemes() 4 -> setThemes()
5 -> setOverScale() 5 -> setOverScale()
6 -> if(complete) that?.navigate2dl()
} }
} }
@@ -120,12 +117,12 @@ class BookHandler(that: WeakReference<BookFragment>, private val path: String)
} }
private fun inflateComponents(){ private fun inflateComponents(){
fbibinfo = that?.layoutInflater?.inflate(R.layout.line_bookinfo, that.fbl, false) that?.fbibinfo = that?.layoutInflater?.inflate(R.layout.line_bookinfo, that?.fbl, false)
fbtinfo = that?.layoutInflater?.inflate(R.layout.line_text_info, that.fbl, false) that?.fbtinfo = that?.layoutInflater?.inflate(R.layout.line_text_info, that?.fbl, false)
} }
private fun setOverScale(){ private fun setOverScale(){
that?.fbov?.setScaleView(that.lbibg) that?.fbov?.setScaleView(that!!.lbibg)
} }
private fun setCover(){ private fun setCover(){
@@ -164,8 +161,8 @@ class BookHandler(that: WeakReference<BookFragment>, private val path: String)
book?.results?.comic?.status?.display book?.results?.comic?.status?.display
) }?:"" ) }?:""
that?.bttime?.text = book?.results?.comic?.datetime_updated that?.bttime?.text = book?.results?.comic?.datetime_updated
(fbtinfo as TextView).text = book?.results?.comic?.brief (that?.fbtinfo as TextView).text = book?.results?.comic?.brief
that?.fbl?.addView(fbtinfo) that?.fbl?.addView(that?.fbtinfo)
that?.fbl?.addView(divider) that?.fbl?.addView(divider)
} }
@@ -190,7 +187,7 @@ class BookHandler(that: WeakReference<BookFragment>, private val path: String)
themeStructure.onEachIndexed { i, it -> themeStructure.onEachIndexed { i, it ->
if(line == null) { if(line == null) {
if(i == last) { if(i == last) {
line = that?.layoutInflater?.inflate(R.layout.line_chapter, that.fbl, false) line = that?.layoutInflater?.inflate(R.layout.line_chapter, that!!.fbl, false)
line?.lcc?.apply { line?.lcc?.apply {
lct.text = it.name lct.text = it.name
setOnClickListener { _ -> setOnClickListener { _ ->
@@ -199,7 +196,7 @@ class BookHandler(that: WeakReference<BookFragment>, private val path: String)
} }
that?.fbl?.addView(line) that?.fbl?.addView(line)
} else { } else {
line = that?.layoutInflater?.inflate(R.layout.line_2chapters, that.fbl, false) line = that?.layoutInflater?.inflate(R.layout.line_2chapters, that!!.fbl, false)
line?.l2cl?.apply { line?.l2cl?.apply {
lct.text = it.name lct.text = it.name
setOnClickListener { _ -> setOnClickListener { _ ->
@@ -250,14 +247,14 @@ class BookHandler(that: WeakReference<BookFragment>, private val path: String)
chapterNames += it.name chapterNames += it.name
if(line == null) { if(line == null) {
if(i == last) { if(i == last) {
line = layoutInflater.inflate(R.layout.line_chapter, that.fbl, false) line = layoutInflater.inflate(R.layout.line_chapter, that!!.fbl, false)
line?.lcc?.apply { line?.lcc?.apply {
lct.text = it.name lct.text = it.name
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) } setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) }
} }
fbl?.addView(line) fbl?.addView(line)
} else { } else {
line = layoutInflater.inflate(R.layout.line_2chapters, that.fbl, false) line = layoutInflater.inflate(R.layout.line_2chapters, that!!.fbl, false)
line?.l2cl?.apply { line?.l2cl?.apply {
lct.text = it.name lct.text = it.name
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) } setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) }
@@ -271,11 +268,6 @@ class BookHandler(that: WeakReference<BookFragment>, private val path: String)
} }
} }
} }
// padding
val line = layoutInflater.inflate(R.layout.line_chapter, that.fbl, false)
line.lci.visibility = View.INVISIBLE
line.isClickable = false
fbl?.addView(line)
endSetLayouts() endSetLayouts()
} }
} }

View File

@@ -1,27 +0,0 @@
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.general.NoBackRefreshFragment
import java.lang.Thread.sleep
import java.lang.ref.WeakReference
class ChapterFragment: NoBackRefreshFragment(R.layout.fragment_chapters) {
var handler: ChapterHandler? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if(isFirstInflate){
handler = arguments?.let { ChapterHandler(WeakReference(this), it.getString("path")?:"", it.getString("group")?:"") }
Thread{
sleep(600)
handler?.startLoad()
}.start()
}
}
override fun onDestroy() {
super.onDestroy()
handler?.destroy()
}
}

View File

@@ -1,84 +0,0 @@
package top.fumiama.copymanga.ui.chapter
import android.os.Looper
import android.os.Message
import android.view.View
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_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.http.AutoDownloadHandler
import java.lang.ref.WeakReference
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()
private var hasToastedError = false
get(){
val re = field
field = true
return re
}
private var chapters: VolumeStructure? = null
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
when(msg.what){
//0 -> setLayouts()
1 -> inflateChapters()
}
}
override fun getGsonItem() = chapters
override fun setGsonItem(gsonObj: Any) :Boolean {
val pass = super.setGsonItem(gsonObj)
chapters = gsonObj as VolumeStructure
return pass
}
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 ->
Navigation.findNavController(it1).navigateUp()
}
}
}
override fun doWhenFinishDownload() {
super.doWhenFinishDownload()
if(exit) return
Thread{ sendEmptyMessage(1) }.start()
}
private fun inflateChapters(){
that?.fcloading?.visibility = View.GONE
}
private fun addLine(size: Int, name:String, onClick:(()->Unit)? = null){
val line =
that?.let { it.layoutInflater.inflate(R.layout.line_chapter, it.fbl, false) }
line?.lct?.text = name
onClick?.let {action->
line?.lcc?.setOnClickListener {action()}
}
that?.fcl?.addView(line)
}
private fun loadChapter(chapter: ChapterStructure){
/*val bundle = Bundle()
bundle.putInt("id", id)
bundle.putInt("volume", volId)
bundle.putInt("chapter", cid)
that?.rootView?.let { Navigation.findNavController(it).navigate(R.id.action_nav_chapter_to_nav_reader, bundle) }
*/}
}

View File

@@ -18,7 +18,7 @@ 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 ltbtn: View? = null
var ads = emptyArray<AutoDownloadThread>() 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)
@@ -43,7 +43,6 @@ class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) {
) )
} }
} }
mainWeakReference?.get()?.menuMain?.let { setMenuVisible(it) }
} }
override fun onDestroy() { override fun onDestroy() {
@@ -81,19 +80,6 @@ class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) {
private fun loadFromJson() = Gson().fromJson(json, Array<VolumeStructure>::class.java) private fun loadFromJson() = Gson().fromJson(json, Array<VolumeStructure>::class.java)
private fun loadGroupsFromFile(file: File) = Gson().fromJson(file.reader(), Array<String>::class.java) private fun loadGroupsFromFile(file: File) = Gson().fromJson(file.reader(), Array<String>::class.java)
private fun setMenuVisible(menu: Menu) {
val dl = menu.findItem(R.id.action_download)
dl?.isVisible = true
dl?.setIcon(R.drawable.ic_menu_sort)
dl?.setOnMenuItemClickListener {
if(handler?.complete == true && it.itemId == R.id.action_download){
handler?.showMultiSelectInfo()
true
}
else it.itemId == R.id.action_download
}
}
/*private fun setMenuInvisible(menu: Menu){ /*private fun setMenuInvisible(menu: Menu){
menu.findItem(R.id.action_download)?.isVisible = false menu.findItem(R.id.action_download)?.isVisible = false
}*/ }*/
@@ -167,6 +153,7 @@ class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) {
} }
companion object { companion object {
var handler: ComicDlHandler? = null
var json: String? = null var json: String? = null
var exit = false var exit = false
} }

View File

@@ -14,7 +14,6 @@ import android.view.ViewTreeObserver
import android.widget.Toast import android.widget.Toast
import com.google.gson.Gson import com.google.gson.Gson
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.line_chapter.view.* import kotlinx.android.synthetic.main.line_chapter.view.*
import kotlinx.android.synthetic.main.widget_downloadbar.* import kotlinx.android.synthetic.main.widget_downloadbar.*
import kotlinx.android.synthetic.main.fragment_dlcomic.* import kotlinx.android.synthetic.main.fragment_dlcomic.*
@@ -36,14 +35,14 @@ import top.fumiama.copymanga.views.LazyScrollView
import java.io.File import java.io.File
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, private val vols: Array<VolumeStructure>, private val comicName: String, private val groupNames: Array<String>?):Handler(looper) { class ComicDlHandler(looper: Looper, private val th: WeakReference<ComicDlFragment>, private val vols: Array<VolumeStructure>, private val comicName: String, private val groupNames: Array<String>?):Handler(looper) {
constructor(looper: Looper, that: WeakReference<ComicDlFragment>, comicName: String) : this(looper, that, arrayOf(), comicName, null) { constructor(looper: Looper, th: WeakReference<ComicDlFragment>, comicName: String) : this(looper, th, arrayOf(), comicName, null) {
isOld = true isOld = true
} }
private var isOld = false private var isOld = false
var complete = false var complete = false
private val that = that.get() private val that get() = th.get()
private val toolsBox = UITools(that.get()?.context) private val toolsBox = UITools(th.get()?.context)
private var btnNumPerRow = 4 private var btnNumPerRow = 4
private var btnw = 0 private var btnw = 0
private var cdwnWidth = 0 private var cdwnWidth = 0
@@ -56,7 +55,6 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
private var isNewTitle = false private var isNewTitle = false
val mangaDlTools = MangaDlTools() val mangaDlTools = MangaDlTools()
private var multiSelect = false private var multiSelect = false
private var ltbtn: View? = null
private var finishMap = arrayOf<Boolean?>() private var finishMap = arrayOf<Boolean?>()
var downloading = false var downloading = false
@@ -95,10 +93,11 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
} }
6 -> that?.tdwn?.text = "${dldChapter}/${checkedChapter}" 6 -> that?.tdwn?.text = "${dldChapter}/${checkedChapter}"
7 -> deleteChapters(msg.obj as File, msg.arg1) 7 -> deleteChapters(msg.obj as File, msg.arg1)
9 -> that?.cdwn?.setCardBackgroundColor(that.resources.getColor(R.color.colorGreen)) 9 -> that?.cdwn?.setCardBackgroundColor(that!!.resources.getColor(R.color.colorGreen))
10 -> addTbtn(msg.obj as Array<String>) 10 -> addTbtn(msg.obj as Array<String>)
11 -> addCaption(msg.obj as String) 11 -> addCaption(msg.obj as String)
12 -> addDiv() 12 -> addDiv()
13 -> if(complete) showMultiSelectInfo()
} }
} }
@@ -128,7 +127,7 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
} }
private fun addDiv(){ private fun addDiv(){
that?.ldwn?.addView( that?.ldwn?.addView(
that.layoutInflater.inflate(R.layout.div_h, that.ldwn, false), that!!.layoutInflater.inflate(R.layout.div_h, that!!.ldwn, false),
ViewGroup.LayoutParams( ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT ViewGroup.LayoutParams.WRAP_CONTENT
@@ -136,7 +135,7 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
) )
} }
private fun addCaption(title: String){ private fun addCaption(title: String){
val tc = that?.layoutInflater?.inflate(R.layout.line_caption, that.ldwn, false) val tc = that?.layoutInflater?.inflate(R.layout.line_caption, that!!.ldwn, false)
tc?.tcptn?.text = title tc?.tcptn?.text = title
that?.ldwn?.addView( that?.ldwn?.addView(
tc, tc,
@@ -191,9 +190,9 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
dl?.setContentView(R.layout.dialog_unzipping) dl?.setContentView(R.layout.dialog_unzipping)
that?.dlsdwn?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{ that?.dlsdwn?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{
override fun onGlobalLayout() { override fun onGlobalLayout() {
cdwnWidth = that.dlsdwn.width cdwnWidth = that!!.dlsdwn.width
Log.d("MyDl", "Get dlsdwn height: $cdwnWidth") Log.d("MyDl", "Get dlsdwn height: $cdwnWidth")
that.dlsdwn.viewTreeObserver.removeOnGlobalLayoutListener(this) that!!.dlsdwn.viewTreeObserver.removeOnGlobalLayoutListener(this)
} }
}) })
that?.dllazys?.onScrollListener = object : LazyScrollView.OnScrollListener{ that?.dllazys?.onScrollListener = object : LazyScrollView.OnScrollListener{
@@ -204,10 +203,10 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
} }
} }
that?.cdwn?.setOnClickListener { that?.cdwn?.setOnClickListener {
if(that.dlsdwn.translationX != 0f) showDlCard() if(that!!.dlsdwn.translationX != 0f) showDlCard()
else if(checkedChapter == 0) hideDlCard() else if(checkedChapter == 0) hideDlCard()
else{ else{
that.pdwn.progress = 0 that!!.pdwn.progress = 0
if (downloading || checkedChapter == 0) { if (downloading || checkedChapter == 0) {
mangaDlTools.wait = !mangaDlTools.wait!! mangaDlTools.wait = !mangaDlTools.wait!!
} else { } else {
@@ -251,7 +250,8 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
} }
} }
} }
fun showMultiSelectInfo() {
private fun showMultiSelectInfo() {
toolsBox.buildInfo("进入多选模式?", "之后可以对已下载漫画进行批量删除/重新下载", toolsBox.buildInfo("进入多选模式?", "之后可以对已下载漫画进行批量删除/重新下载",
"确定", null, "取消", { multiSelect = true }) "确定", null, "取消", { multiSelect = true })
} }
@@ -314,12 +314,12 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun addTbtn(title: String, uuid: String, caption: String, url: String) { private fun addTbtn(title: String, uuid: String, caption: String, url: String) {
if ((tbtncnt % btnNumPerRow == 0) || isNewTitle) { if ((tbtncnt % btnNumPerRow == 0) || isNewTitle) {
ltbtn = that?.layoutInflater?.inflate(R.layout.line_horizonal_empty, that.ldwn, false) that?.ltbtn = that?.layoutInflater?.inflate(R.layout.line_horizonal_empty, that!!.ldwn, false)
that?.ldwn?.addView(ltbtn) that?.ldwn?.addView(that!!.ltbtn)
tbtncnt = 0 tbtncnt = 0
isNewTitle = false isNewTitle = false
} }
that?.layoutInflater?.inflate(R.layout.button_tbutton, ltbtn?.ltbtn, false)?.let { tbv -> that?.layoutInflater?.inflate(R.layout.button_tbutton, that!!.ltbtn?.ltbtn, false)?.let { tbv ->
tbv.tbtn.index = tbtnlist.size tbv.tbtn.index = tbtnlist.size
tbtnlist += tbv.tbtn tbtnlist += tbv.tbtn
tbtncnt++ tbtncnt++
@@ -330,15 +330,15 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
//tbv.tbtn.hint = caption //tbv.tbtn.hint = caption
tbv.tbtn.caption = caption tbv.tbtn.caption = caption
tbv.tbtn.layoutParams.width = btnw tbv.tbtn.layoutParams.width = btnw
val zipf = CMApi.getZipFile(that.context?.getExternalFilesDir(""), comicName, caption, title) val zipf = CMApi.getZipFile(that!!.context?.getExternalFilesDir(""), comicName, caption, title)
Log.d("MyCD", "Get zipf: $zipf") Log.d("MyCD", "Get zipf: $zipf")
ViewMangaActivity.fileArray += zipf ViewMangaActivity.fileArray += zipf
if (zipf.exists()) { if (zipf.exists()) {
tbv.tbtn.setBackgroundResource(R.drawable.rndbg_checked) tbv.tbtn.setBackgroundResource(R.drawable.rndbg_checked)
tbv.tbtn.isChecked = false tbv.tbtn.isChecked = false
} }
ltbtn?.ltbtn?.addView(tbv) that?.ltbtn?.ltbtn?.addView(tbv)
ltbtn?.invalidate() that?.ltbtn?.invalidate()
tbv.tbtn.setOnClickListener { tbv.tbtn.setOnClickListener {
if (zipf.exists() && !multiSelect) { if (zipf.exists() && !multiSelect) {
it.tbtn.setBackgroundResource(R.drawable.rndbg_checked) it.tbtn.setBackgroundResource(R.drawable.rndbg_checked)
@@ -348,13 +348,13 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
ViewMangaActivity.position = it.tbtn.index ViewMangaActivity.position = it.tbtn.index
dl?.show() dl?.show()
that.startActivity(Intent(that.context, ViewMangaActivity::class.java) that?.startActivity(Intent(that!!.context, ViewMangaActivity::class.java)
.putExtra("callFrom", "zipFirst") .putExtra("callFrom", "zipFirst")
) )
} else { } else {
it.tbtn.setBackgroundResource(R.drawable.toggle_button) it.tbtn.setBackgroundResource(R.drawable.toggle_button)
if (it.tbtn.isChecked) that.tdwn?.text = "$dldChapter/${++checkedChapter}" if (it.tbtn.isChecked) that?.tdwn?.text = "$dldChapter/${++checkedChapter}"
else that.tdwn.text = "$dldChapter/${--checkedChapter}" else that?.tdwn?.text = "$dldChapter/${--checkedChapter}"
} }
} }
tbv.tbtn.setOnLongClickListener { tbv.tbtn.setOnLongClickListener {
@@ -377,7 +377,7 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
ViewMangaActivity.position = it.tbtn.index ViewMangaActivity.position = it.tbtn.index
dl?.show() dl?.show()
that.startActivity(Intent(that.context, ViewMangaActivity::class.java)) that?.startActivity(Intent(that?.context, ViewMangaActivity::class.java))
}, null, null }, null, null
) )
} }
@@ -389,17 +389,17 @@ class ComicDlHandler(looper: Looper, that: WeakReference<ComicDlFragment>, priva
private fun analyzeOldStructure() = Thread{ private fun analyzeOldStructure() = Thread{
Gson().fromJson(json?.reader(), Array<ComicStructureOld>::class.java)?.let { Gson().fromJson(json?.reader(), Array<ComicStructureOld>::class.java)?.let {
for (group in it) { for (group in it) {
that?.layoutInflater?.inflate(R.layout.line_caption, that.ldwn, false)?.let { tc -> that?.layoutInflater?.inflate(R.layout.line_caption, that!!.ldwn, false)?.let { tc ->
tc.tcptn.text = group.name tc.tcptn.text = group.name
that.ldwn.addView( that!!.ldwn.addView(
tc, tc,
ViewGroup.LayoutParams( ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT ViewGroup.LayoutParams.WRAP_CONTENT
) )
) )
that.ldwn.addView( that!!.ldwn.addView(
that.layoutInflater.inflate(R.layout.div_h, that.ldwn, false), that!!.layoutInflater.inflate(R.layout.div_h, that!!.ldwn, false),
ViewGroup.LayoutParams( ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT ViewGroup.LayoutParams.WRAP_CONTENT

View File

@@ -32,7 +32,7 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) {
} }
} }
fun scanFile(cd: File?){ private fun scanFile(cd: File?){
val isRoot = cd == context?.getExternalFilesDir("") val isRoot = cd == context?.getExternalFilesDir("")
val jsonFile = File(cd, "info.bin") val jsonFile = File(cd, "info.bin")
if(isRoot || !jsonFile.exists()) cd?.list()?.sortedArrayWith { o1, o2 -> if(isRoot || !jsonFile.exists()) cd?.list()?.sortedArrayWith { o1, o2 ->

View File

@@ -38,7 +38,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
if(isFirstInflate){ if(isFirstInflate) {
val theme = resources.newTheme() val theme = resources.newTheme()
swiperefresh.setColorSchemeColors( swiperefresh.setColorSchemeColors(
resources.getColor(R.color.colorAccent, theme), resources.getColor(R.color.colorAccent, theme),

View File

@@ -8,10 +8,12 @@ import android.os.Message
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.view.ViewTreeObserver import android.view.ViewTreeObserver
import android.widget.LinearLayout
import android.widget.Toast import android.widget.Toast
import androidx.cardview.widget.CardView import androidx.cardview.widget.CardView
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.navigation.Navigation import androidx.navigation.Navigation
import androidx.navigation.fragment.findNavController
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.to.aboomy.pager2banner.Banner import com.to.aboomy.pager2banner.Banner
@@ -30,19 +32,19 @@ 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(private val 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()!!,
9 9
) { ) {
private val homeF = that.get() private val homeF get() = that.get()
var index: IndexStructure? = null var index: IndexStructure? = null
var fhib: View? = null var fhib: View? = null
get() { get() {
Log.d("MyHH", "Get fhib.") Log.d("MyHH", "Get fhib.")
if(field == null){ if(field == null){
field = homeF?.layoutInflater?.inflate(R.layout.viewpage_banner, homeF.fhl, false) field = homeF?.layoutInflater?.inflate(R.layout.viewpage_banner, homeF?.fhl, false)
Thread{homeF?.homeHandler?.sendEmptyMessage(3)}.start() Thread{homeF?.homeHandler?.sendEmptyMessage(3)}.start()
} }
return field return field
@@ -72,7 +74,15 @@ class HomeHandler(that: WeakReference<HomeFragment>) : AutoDownloadHandler(
} }
} }
7 -> inflateBanner() 7 -> inflateBanner()
8 -> homeF?.fhl?.addView(indexLines[msg.arg1]) 8 -> {
try {
homeF?.fhl?.addView(indexLines[msg.arg1])
} catch (e: Exception) {
e.printStackTrace()
(indexLines[msg.arg1].parent as LinearLayout).removeAllViews()
homeF?.fhl?.addView(indexLines[msg.arg1])
}
}
//9 -> checkIndex() //9 -> checkIndex()
} }
} }
@@ -159,7 +169,7 @@ class HomeHandler(that: WeakReference<HomeFragment>) : AutoDownloadHandler(
} }
} }
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) that.get()?.findNavController()?.navigate(R.id.nav_rank)
} }
} }
@@ -201,6 +211,7 @@ class HomeHandler(that: WeakReference<HomeFragment>) : AutoDownloadHandler(
} }
private fun inflateCardLines() { private fun inflateCardLines() {
if (indexLines.isNotEmpty()) indexLines = arrayOf()
inflateRec() inflateRec()
inflateTopics() inflateTopics()
inflateHot() inflateHot()
@@ -208,7 +219,10 @@ class HomeHandler(that: WeakReference<HomeFragment>) : AutoDownloadHandler(
inflateFinish() inflateFinish()
inflateRank() inflateRank()
Thread{ Thread{
for(i in indexLines.indices) obtainMessage(8, i, 0).sendToTarget() for(i in indexLines.indices) {
obtainMessage(8, i, 0).sendToTarget()
sleep(512)
}
obtainMessage(-1, false).sendToTarget() //closeLoad obtainMessage(-1, false).sendToTarget() //closeLoad
}.start() }.start()
} }
@@ -233,11 +247,11 @@ class HomeHandler(that: WeakReference<HomeFragment>) : AutoDownloadHandler(
.addPageTransformer(ScaleInTransformer()) .addPageTransformer(ScaleInTransformer())
.setPageMargin(it.dp2px(20) ?: 0, it.dp2px(10) ?: 0) .setPageMargin(it.dp2px(20) ?: 0, it.dp2px(10) ?: 0)
.setIndicator( .setIndicator(
IndicatorView(homeF.context) IndicatorView(homeF!!.context)
.setIndicatorColor(Color.DKGRAY) .setIndicatorColor(Color.DKGRAY)
.setIndicatorSelectorColor(Color.WHITE) .setIndicatorSelectorColor(Color.WHITE)
.setIndicatorStyle(IndicatorView.IndicatorStyle.INDICATOR_BEZIER) .setIndicatorStyle(IndicatorView.IndicatorStyle.INDICATOR_BEZIER)
).adapter = homeF.ViewData(v).RecyclerViewAdapter() ).adapter = homeF?.ViewData(v)?.RecyclerViewAdapter()
} }
v.invalidate() v.invalidate()
homeF?.fhov?.swipeRefreshLayout = homeF?.swiperefresh homeF?.fhov?.swipeRefreshLayout = homeF?.swiperefresh
@@ -265,7 +279,7 @@ class HomeHandler(that: WeakReference<HomeFragment>) : AutoDownloadHandler(
2 -> R.layout.line_2bookline 2 -> R.layout.line_2bookline
3 -> R.layout.line_3bookline 3 -> R.layout.line_3bookline
else -> return -1 else -> return -1
}, homeF.fhl, false)?.apply { }, homeF!!.fhl, false)?.apply {
scanCards(this, comics, finish, isTopic) scanCards(this, comics, finish, isTopic)
rttitle.text = title rttitle.text = title
ir.setImageResource(iconResId) ir.setImageResource(iconResId)

View File

@@ -1,18 +0,0 @@
package top.fumiama.copymanga.ui.sub
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
class SubFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_sub, container, false)
}
}

View File

@@ -360,7 +360,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
val re = tasks?.get(index2load) val re = tasks?.get(index2load)
if (re != null) Thread{ if (re != null) Thread{
val data = re.get() val data = re.get()
if(data != null) { if(data != null && data.isNotEmpty()) {
BitmapFactory.decodeByteArray(data, 0, data.size)?.let { BitmapFactory.decodeByteArray(data, 0, data.size)?.let {
loadImg(imgView, it, isLast, useCut, isLeft) loadImg(imgView, it, isLast, useCut, isLeft)
Log.d("MyVM", "Load from task") Log.d("MyVM", "Load from task")

View File

@@ -18,7 +18,7 @@ import java.security.MessageDigest
object Update { object Update {
fun checkUpdate(activity: Activity, toolsBox: UITools, ignoreSkip: Boolean = false) = activity.apply{ fun checkUpdate(activity: Activity, toolsBox: UITools, ignoreSkip: Boolean = false) = activity.apply{
val client = Client("copymanga.v6.army", 12315) val client = Client("copymanga.v6.army", 12316)
val progressBar = layoutInflater.inflate(R.layout.dialog_progress, null, false) val progressBar = layoutInflater.inflate(R.layout.dialog_progress, null, false)
val progressHandler = object : Client.Progress{ val progressHandler = object : Client.Progress{
override fun notify(progressPercentage: Int) { override fun notify(progressPercentage: Int) {

View File

@@ -13,7 +13,8 @@
android:id="@+id/fbl" android:id="@+id/fbl"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" /> android:orientation="vertical"
android:paddingBottom="@dimen/global_content_padding_bottom"/>
</top.fumiama.copymanga.views.OverScrollView> </top.fumiama.copymanga.views.OverScrollView>
<ProgressBar <ProgressBar

View File

@@ -1,28 +0,0 @@
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView2"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/fcl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</androidx.core.widget.NestedScrollView>
<ProgressBar
android:id="@+id/fcloading"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
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" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -14,7 +14,8 @@
android:id="@+id/ldwn" android:id="@+id/ldwn"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"/> android:orientation="vertical"
android:paddingBottom="@dimen/global_content_padding_bottom"/>
</top.fumiama.copymanga.views.LazyScrollView> </top.fumiama.copymanga.views.LazyScrollView>
<include <include

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android" <ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:fillViewport="true" android:id="@+id/mylv"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:id="@+id/mylv"> android:paddingBottom="@dimen/global_content_padding_bottom"/>
</ListView>

View File

@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
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.home.HomeFragment" tools:context="top.fumiama.copymanga.ui.home.HomeFragment"
android:focusableInTouchMode="true"> android:focusableInTouchMode="true">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swiperefresh" android:id="@+id/swiperefresh"
@@ -29,7 +28,8 @@
android:id="@+id/fhl" android:id="@+id/fhl"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical"
android:paddingBottom="@dimen/global_content_padding_bottom">
</LinearLayout> </LinearLayout>
</top.fumiama.copymanga.views.ScrollRefreshView> </top.fumiama.copymanga.views.ScrollRefreshView>

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/frt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="textStart"
android:textSize="18sp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,22 +0,0 @@
<?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"
tools:context="top.fumiama.copymanga.ui.sub.SubFragment">
<TextView
android:id="@+id/text_sub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -25,7 +25,8 @@
android:id="@+id/mydll" android:id="@+id/mydll"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" /> android:orientation="vertical"
android:paddingBottom="@dimen/global_content_padding_bottom"/>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
</com.liaoinstan.springview.widget.SpringView> </com.liaoinstan.springview.widget.SpringView>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu <menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
@@ -10,9 +10,15 @@
android:visible="false" android:visible="false"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_info" android:id="@+id/action_sort"
android:onClick="showAbout" android:icon="@drawable/ic_menu_sort"
android:orderInCategory="200" android:orderInCategory="200"
android:title="@string/action_sort"
android:visible="false"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_info"
android:orderInCategory="300"
android:title="@string/action_info" android:title="@string/action_info"
app:showAsAction="never" /> app:showAsAction="never" />
</menu> </menu>

View File

@@ -75,12 +75,6 @@
app:popExitAnim="@anim/slide_in_right_exit"/> app:popExitAnim="@anim/slide_in_right_exit"/>
</fragment> </fragment>
<fragment
android:id="@+id/nav_sub"
android:name="top.fumiama.copymanga.ui.sub.SubFragment"
android:label="@string/menu_sub"
tools:layout="@layout/fragment_sub" />
<fragment <fragment
android:id="@+id/nav_history" android:id="@+id/nav_history"
android:name="top.fumiama.copymanga.ui.cardflow.history.HistoryFragment" android:name="top.fumiama.copymanga.ui.cardflow.history.HistoryFragment"
@@ -128,13 +122,6 @@
android:name="top.fumiama.copymanga.ui.book.BookFragment" android:name="top.fumiama.copymanga.ui.book.BookFragment"
android:label="@string/page_book" android:label="@string/page_book"
tools:layout="@layout/fragment_book" > tools:layout="@layout/fragment_book" >
<action
android:id="@+id/action_nav_book_to_nav_chapter"
app:destination="@id/nav_chapter"
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_book_to_nav_group" android:id="@+id/action_nav_book_to_nav_group"
app:destination="@id/nav_group" app:destination="@id/nav_group"
@@ -158,13 +145,6 @@
app:popExitAnim="@anim/slide_in_right_exit"/> app:popExitAnim="@anim/slide_in_right_exit"/>
</fragment> </fragment>
<fragment
android:id="@+id/nav_chapter"
android:name="top.fumiama.copymanga.ui.chapter.ChapterFragment"
android:label="@string/page_chapter"
tools:layout="@layout/fragment_chapters" >
</fragment>
<fragment <fragment
android:id="@+id/nav_topic" android:id="@+id/nav_topic"
android:name="top.fumiama.copymanga.ui.cardflow.topic.TopicFragment" android:name="top.fumiama.copymanga.ui.cardflow.topic.TopicFragment"

View File

@@ -11,4 +11,6 @@
<dimen name="global_alpha">0.8</dimen> <dimen name="global_alpha">0.8</dimen>
<dimen name="global_radius">16dp</dimen> <dimen name="global_radius">16dp</dimen>
<dimen name="global_card_elevation">4dp</dimen> <dimen name="global_card_elevation">4dp</dimen>
<dimen name="global_content_padding_bottom">48dp</dimen>
</resources> </resources>

View File

@@ -3,11 +3,12 @@
<string name="action_settings">设定</string> <string name="action_settings">设定</string>
<string name="action_info">关于</string> <string name="action_info">关于</string>
<string name="action_download">下载</string> <string name="action_download">下载</string>
<string name="action_sort">整理</string>
<string name="menu_home">主页</string> <string name="menu_home">主页</string>
<string name="menu_sort">分类</string> <string name="menu_sort">分类</string>
<string name="menu_rank">排行</string> <string name="menu_rank">排行</string>
<string name="app_description">©2022源文雨@CoolApk\n本应用为拷贝漫画的第三方客户端数据均来源于网络作者不对其中所呈现的任何内容负责。</string> <string name="app_description">©2022源文雨\n本应用为拷贝漫画的第三方客户端数据均来源于网络作者不对其中所呈现的任何内容负责。</string>
<string name="menu_history">浏览历史</string> <string name="menu_history">浏览历史</string>
<string name="menu_sub">我的订阅</string> <string name="menu_sub">我的订阅</string>
<string name="menu_download">我的下载</string> <string name="menu_download">我的下载</string>