diff --git a/app/build.gradle b/app/build.gradle index 834819b..ba214d9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId 'top.fumiama.copymanga' minSdkVersion 23 targetSdkVersion 34 - versionCode 55 - versionName '2.2.7' + versionCode 56 + versionName '2.2.8' resourceConfigurations += ['zh', 'zh-rCN'] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt index f8cbd9d..8ad4883 100644 --- a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt @@ -235,6 +235,7 @@ class MainActivity : AppCompatActivity() { if(avatar != "") Glide.with(this@MainActivity).load(avatar) .apply(RequestOptions.bitmapTransform(CircleCrop())) + .timeout(60000) .into(this@ic) else setImageResource(R.mipmap.ic_launcher) } } diff --git a/app/src/main/java/top/fumiama/copymanga/manga/Book.kt b/app/src/main/java/top/fumiama/copymanga/manga/Book.kt index 680ff54..0cb3924 100644 --- a/app/src/main/java/top/fumiama/copymanga/manga/Book.kt +++ b/app/src/main/java/top/fumiama/copymanga/manga/Book.kt @@ -18,7 +18,7 @@ class Book(val path: String, private val getString: (Int) -> String, private val private val mBookApiUrl = getString(R.string.bookInfoApiUrl).format(CMApi.myHostApiUrl, path).let { CMApi.apiProxy?.wrap(it)?:it } - private val mUserAgent = getString(R.string.pc_ua) + private val mUserAgent = getString(R.string.pc_ua).format(DownloadTools.app_ver) private var mBook: BookInfoStructure? = null private var mGroupPathWords = arrayOf() private var mKeys = arrayOf() diff --git a/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt b/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt index 0bea645..66c2bb0 100644 --- a/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt +++ b/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt @@ -13,8 +13,8 @@ class Shelf(private val token: String, getString: (Int) -> String) { private val hostUrl: String = getString(R.string.hostUrl) private val apiUrl: String = getString(R.string.shelfOperateApiUrl).format(hostUrl) private val queryApiUrlTemplate = getString(R.string.bookUserQueryApiUrl) - private val referer: String = getString(R.string.referer) - private val ua: String = getString(R.string.pc_ua) + private val referer: String = getString(R.string.referer).format(DownloadTools.app_ver) + private val ua: String = getString(R.string.pc_ua).format(DownloadTools.app_ver) private val addApiUrl get() = "$apiUrl?platform=3".let { CMApi.apiProxy?.wrap(it)?:it } private val delApiUrl get() = "${apiUrl}s?platform=3".let { CMApi.apiProxy?.wrap(it)?:it } suspend fun add(comicId: String): String = withContext(Dispatchers.IO) { diff --git a/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt b/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt index a407916..3721f33 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt @@ -80,7 +80,7 @@ open class AutoDownloadHandler( try { val data = DownloadTools.getHttpContent( CMApi.apiProxy?.wrap(url)?:url, null, - mainWeakReference?.get()?.getString(R.string.pc_ua)!! + DownloadTools.pc_ua ) if(exit) return@withContext val fi = data.inputStream() diff --git a/app/src/main/java/top/fumiama/copymanga/template/http/PausableDownloader.kt b/app/src/main/java/top/fumiama/copymanga/template/http/PausableDownloader.kt index 5a95a2b..3d500af 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/http/PausableDownloader.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/http/PausableDownloader.kt @@ -18,8 +18,8 @@ class PausableDownloader(private val url: String, private val waitMilliseconds: try { val data = (DownloadTools.getHttpContent( (if(isApi) CMApi.apiProxy?.wrap(url) else null)?:url, - mainWeakReference?.get()?.getString(R.string.referer)!!, - mainWeakReference?.get()?.getString(R.string.pc_ua)!! + DownloadTools.referer, + DownloadTools.pc_ua )) whenFinish?.let { it(data) } return@withContext true diff --git a/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt b/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt index b6ad3a7..3bf9dfc 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt @@ -133,7 +133,7 @@ class CardList( ).addListener(GlideHideLottieViewListener(WeakReference(it.laic)) { if (exitCardList) return@GlideHideLottieViewListener cardLoadingWaits.decrementAndGet() - }) + }).timeout(60000) if (waitMillis > 0) it.imic.postDelayed({ if (exitCardList) return@postDelayed g.into(it.imic) diff --git a/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt b/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt index 033501a..2f1ff4d 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt @@ -3,6 +3,7 @@ package top.fumiama.copymanga.tools.api import androidx.preference.PreferenceManager import com.bumptech.glide.load.model.LazyHeaders import top.fumiama.copymanga.MainActivity +import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.copymanga.tools.http.Proxy import top.fumiama.copymanga.tools.http.Resolution import top.fumiama.dmzj.copymanga.R @@ -36,20 +37,11 @@ object CMApi { PreferenceManager.getDefaultSharedPreferences(it).apply { if (field === null) field = LazyHeaders.Builder() - .addHeader( - "referer", - MainActivity.mainWeakReference?.get()?.getString(R.string.referer)!! - ) - .addHeader( - "User-Agent", - MainActivity.mainWeakReference?.get()?.getString(R.string.pc_ua)!! - ) + .addHeader("referer", DownloadTools.referer) + .addHeader("User-Agent", DownloadTools.pc_ua) .addHeader("source", "copyApp") .addHeader("webp", "1") - .addHeader( - "version", - MainActivity.mainWeakReference?.get()?.getString(R.string.app_ver)!! - ) + .addHeader("version", DownloadTools.app_ver) .addHeader( "region", if (!getBoolean("settings_cat_net", false)) "1" else "0" diff --git a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt index 4a78c4a..32f3ae9 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt @@ -13,6 +13,13 @@ import java.util.concurrent.Callable import java.util.concurrent.FutureTask object DownloadTools { + val app_ver = MainActivity.mainWeakReference?.get()?.let { main -> + PreferenceManager.getDefaultSharedPreferences(main) + ?.getString("settings_cat_general_et_app_version", main.getString(R.string.app_ver)) + ?:main.getString(R.string.app_ver) + }!! + val pc_ua = MainActivity.mainWeakReference?.get()!!.getString(R.string.pc_ua).format(app_ver) + val referer = MainActivity.mainWeakReference?.get()!!.getString(R.string.referer).format(app_ver) fun getApiConnection(url: String, method: String = "GET", refer: String? = null, ua: String? = null, timeout: Int = 20000) = url.let { val connection = URL(url).openConnection() as HttpURLConnection @@ -30,7 +37,7 @@ object DownloadTools { setRequestProperty("region", if(!getBoolean("settings_cat_net_sw_use_foreign", false)) "1" else "0") } it.getPreferences(Context.MODE_PRIVATE).apply { - setRequestProperty("version", it.getString(R.string.app_ver)) + setRequestProperty("version", app_ver) getString("token", "")?.let { tk -> setRequestProperty("authorization", "Token $tk") } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt index 28df526..67e5a89 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt @@ -1,5 +1,6 @@ package top.fumiama.copymanga.ui.book +import android.graphics.drawable.Drawable import android.os.Bundle import android.os.Handler import android.os.Looper @@ -14,8 +15,12 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.load.model.GlideUrl +import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target import com.google.android.material.tabs.TabLayoutMediator import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.card_book.* @@ -80,17 +85,36 @@ class BookHandler(private val th: WeakReference): Handler(Looper.m private fun setCover() { if (exit) return that?.apply { - val load = Glide.with(this).load( + Glide.with(this).load( if (book?.cover != null) GlideUrl(CMApi.imageProxy?.wrap(book?.cover!!)?:book?.cover!!, CMApi.myGlideHeaders) else book?.cachedCover - ).addListener(GlideHideLottieViewListener(WeakReference(laic))) - load.into(imic) - context?.let { it1 -> GlideBlurTransformation(it1) } - ?.let { it2 -> RequestOptions.bitmapTransform(it2) } - ?.let { it3 -> load.apply(it3).into(lbibg) } - //imf?.visibility = View.GONE - //fbl?.addView(divider) + ) + .timeout(60000) + .addListener(GlideHideLottieViewListener(WeakReference(laic))) + .addListener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target, + isFirstResource: Boolean + ): Boolean { + return false + } + + override fun onResourceReady( + resource: Drawable, + model: Any, + target: Target?, + dataSource: DataSource, + isFirstResource: Boolean + ): Boolean { + context?.let { it1 -> GlideBlurTransformation(it1) } + ?.let { it2 -> RequestOptions.bitmapTransform(it2) } + ?.let { it3 -> Glide.with(this@apply).load(resource).apply(it3).into(lbibg) } + return false + } + }).into(imic) } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt index c49501a..ba1ec8f 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt @@ -4,8 +4,6 @@ import android.os.Bundle import com.google.android.material.tabs.TabLayout import kotlinx.android.synthetic.main.fragment_rank.* import kotlinx.android.synthetic.main.line_rank.view.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext import top.fumiama.copymanga.template.ui.InfoCardLoader import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.ui.UITools @@ -27,12 +25,14 @@ class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank override fun onPause() { super.onPause() + wr = null ad?.exit = true } override fun onResume() { super.onResume() - ad?.exit = true + wr = WeakReference(this) + ad?.exit = false } override fun onDestroy() { @@ -72,7 +72,7 @@ class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank } fun showSexInfo(toolsBox: UITools) { - if (ad?.exit != false) return + if (ad?.exit == true) return toolsBox.buildInfo("切换类型", "选择一种想筛选的漫画类型", "男频", "全部", "女频", { if(!isLoading) { diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt index e294a45..53020c7 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt @@ -205,7 +205,9 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { //Log.d("MyHomeFVP", "Load img: $it") Glide.with(this@HomeFragment).load( GlideUrl(CMApi.imageProxy?.wrap(it)?:it, CMApi.myGlideHeaders) - ).addListener(GlideHideLottieViewListener(WeakReference(holder.itemView.lai))).into(holder.itemView.vpi) + ) + .addListener(GlideHideLottieViewListener(WeakReference(holder.itemView.lai))) + .timeout(60000).into(holder.itemView.vpi) } holder.itemView.vpt.text = thisBanner?.brief holder.itemView.vpc.setOnClickListener { @@ -244,6 +246,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { context?.let { Glide.with(it).load(R.drawable.img_defmask) .addListener(GlideHideLottieViewListener(WeakReference(laic))) + .timeout(60000) .into(imic) } cic.isClickable = false @@ -275,7 +278,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { Glide.with(it) .load(GlideUrl(CMApi.imageProxy?.wrap(cover)?:cover, CMApi.myGlideHeaders)) .addListener(GlideHideLottieViewListener(WeakReference(laic))) - .into(imic) + .timeout(60000).into(imic) } lwc.setOnClickListener { val bundle = Bundle() diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt index f9a7798..370648d 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt @@ -341,7 +341,7 @@ class HomeHandler(private val that: WeakReference) : AutoDownloadH val g = Glide.with(it).load(GlideUrl(CMApi.imageProxy?.wrap(img)?:img, CMApi.myGlideHeaders)) .addListener(GlideHideLottieViewListener(WeakReference(cv.laic)) { cardLoadingWaits.decrementAndGet() - }) + }).timeout(60000) if (waitMillis > 0) cv.imic.postDelayed({ g.into(cv.imic) }, waitMillis) else cv.imic.post { g.into(cv.imic) } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt index d15a227..05d79c2 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/vm/VMHandler.kt @@ -70,7 +70,7 @@ class VMHandler(activity: ViewMangaActivity, private val chapterUrl: String, pri } else { showInfCard(); true } - LOAD_IMG_ON -> { + /*LOAD_IMG_ON -> { val scaleImageView = msg.obj as ScaleImageView // msg.arg2: isLast wv.get()?.apply { @@ -80,10 +80,9 @@ class VMHandler(activity: ViewMangaActivity, private val chapterUrl: String, pri } //scaleImageView.setHeight2FitImgWidth() //if(msg.arg2 == 1) sendEmptyMessage(DELAYED_RESTORE_PAGE_NUMBER) - } + }*/ CLEAR_IMG_ON -> { - val img = msg.obj as ScaleImageView - img.visibility = View.GONE + (msg.obj as ScaleImageView).apply { post { visibility = View.GONE } } //sendEmptyMessage(DECREASE_IMAGE_COUNT_AND_RESTORE_PAGE_NUMBER_AT_ZERO) } PREPARE_LAST_PAGE -> wv.get()?.prepareLastPage(msg.arg1, msg.arg2) @@ -207,7 +206,7 @@ class VMHandler(activity: ViewMangaActivity, private val chapterUrl: String, pri vprog?.visibility = View.GONE } } - private suspend fun loadImagesIntoLine(item: Int = (wv.get()?.currentItem?:0), doAfter: Runnable? = null) = withContext(Dispatchers.IO) { + private suspend fun loadImagesIntoLine(item: Int = (wv.get()?.currentItem?:0), doAfter: Runnable? = null) { val maxCount: Int = (wv.get()?.verticalLoadMaxCount?:20) Log.d("MyVMH", "Fun: loadImagesIntoLine($item, $maxCount)") wv.get()?.realCount?.let { count -> @@ -216,8 +215,15 @@ class VMHandler(activity: ViewMangaActivity, private val chapterUrl: String, pri val loadCount = (if(notFull) count - item else maxCount) - 1 obtainMessage(INIT_IMAGE_COUNT, loadCount+1, 0).sendToTarget() Log.d("MyVMH", "count: $count, loadCount: $loadCount, notFull: $notFull") - if(loadCount >= 0) for(i in 0..loadCount) { - obtainMessage(LOAD_IMG_ON,item + i, if(i == loadCount - 1) 1 else 0, wv.get()?.scrollImages?.get(i)).sendToTarget() + if(loadCount >= 0) withContext(Dispatchers.IO) { + for(i in 0..loadCount) { + wv.get()?.apply { + val p = item + i + scrollPositions[i] = p + launch { loadImgOn(scrollImages[i], scrollButtons[i], p, false) } + } + //obtainMessage(LOAD_IMG_ON,item + i, if(i == loadCount - 1) 1 else 0, wv.get()?.scrollImages?.get(i)).sendToTarget() + } } //else sendEmptyMessageDelayed(RESTORE_PAGE_NUMBER, 233) if(notFull) obtainMessage(PREPARE_LAST_PAGE, loadCount + 1, maxCount).sendToTarget() @@ -267,7 +273,7 @@ class VMHandler(activity: ViewMangaActivity, private val chapterUrl: String, pri const val HIDE_INFO_CARD = 1 const val SHOW_INFO_CARD = 2 const val TRIGGER_INFO_CARD = 3 - const val LOAD_IMG_ON = 4 + //const val LOAD_IMG_ON = 4 const val CLEAR_IMG_ON = 5 const val PREPARE_LAST_PAGE = 6 const val DIALOG_SHOW = 7 diff --git a/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt b/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt index 9fdcbda..cfadde3 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt @@ -20,6 +20,7 @@ import android.view.View import android.view.ViewGroup import android.view.WindowInsets import android.view.WindowInsetsController +import android.widget.Button import android.widget.SeekBar import android.widget.Toast import androidx.appcompat.app.AppCompatDelegate @@ -31,8 +32,12 @@ import androidx.preference.PreferenceManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.load.model.GlideUrl +import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.transition.Transition import com.liaoinstan.springview.widget.SpringView import kotlinx.android.synthetic.main.activity_viewmanga.* @@ -45,6 +50,7 @@ import kotlinx.android.synthetic.main.widget_titlebar.* import kotlinx.android.synthetic.main.widget_titlebar.view.* import kotlinx.android.synthetic.main.widget_viewmangainfo.* import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import top.fumiama.copymanga.MainActivity @@ -68,13 +74,15 @@ import kotlin.math.abs class ViewMangaActivity : TitleActivityTemplate() { var count = 0 - private lateinit var handler: VMHandler + private lateinit var mHandler: VMHandler lateinit var tt: TimeThread var clicked = 0 private var isInSeek = false private var isInScroll = true //private var progressLog: PropertiesTools? = null var scrollImages = arrayOf() + var scrollButtons = arrayOf