From dadcb1e729f623ea94872e49c975dda68e9b903b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sun, 6 Jul 2025 23:05:19 +0900 Subject: [PATCH] =?UTF-8?q?v1.5.3=20=E4=BC=98=E5=8C=96=201.=20=E4=B8=BB?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=8A=A0=E8=BD=BD=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/dictionaries/fumiama.xml | 2 + .idea/kotlinc.xml | 6 -- app/build.gradle | 6 +- .../copymangaweb/activity/DlActivity.kt | 6 +- .../copymangaweb/activity/DlListActivity.kt | 2 +- .../copymangaweb/activity/MainActivity.kt | 65 +++++++++++++- .../activity/viewmodel/MainViewModel.kt | 30 +++++++ .../copymangaweb/handler/MainHandler.kt | 61 +------------- .../fumiama/copymangaweb/tool/MangaDlTools.kt | 2 +- .../copymangaweb/view/BindingAdapters.kt | 30 +++++++ .../java/top/fumiama/copymangaweb/web/JS.kt | 8 +- .../top/fumiama/copymangaweb/web/JSHidden.kt | 5 +- .../copymangaweb/web/WebChromeClient.kt | 9 +- .../fumiama/copymangaweb/web/WebViewClient.kt | 25 +++--- app/src/main/res/layout/activity_main.xml | 84 +++++++++++-------- 15 files changed, 205 insertions(+), 136 deletions(-) delete mode 100644 .idea/kotlinc.xml create mode 100644 app/src/main/java/top/fumiama/copymangaweb/activity/viewmodel/MainViewModel.kt create mode 100644 app/src/main/java/top/fumiama/copymangaweb/view/BindingAdapters.kt diff --git a/.idea/dictionaries/fumiama.xml b/.idea/dictionaries/fumiama.xml index 7c9f9f0..266058c 100644 --- a/.idea/dictionaries/fumiama.xml +++ b/.idea/dictionaries/fumiama.xml @@ -2,7 +2,9 @@ copymanga + copymangaweb dere + fileprovider lowpan pdwn reilia diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml deleted file mode 100644 index bb44937..0000000 --- a/.idea/kotlinc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 54b05ba..5398dde 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "top.fumiama.copymangaweb" minSdkVersion 23 targetSdkVersion 36 - versionCode 15 - versionName '1.5.2' + versionCode 16 + versionName '1.5.3' resConfigs "zh", "zh-rCN" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -97,7 +97,7 @@ if (propFile.canRead()){ dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3" + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2' implementation 'androidx.core:core-ktx:1.16.0' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.9.1' implementation 'androidx.constraintlayout:constraintlayout:2.2.1' diff --git a/app/src/main/java/top/fumiama/copymangaweb/activity/DlActivity.kt b/app/src/main/java/top/fumiama/copymangaweb/activity/DlActivity.kt index d005e2a..19cfce3 100644 --- a/app/src/main/java/top/fumiama/copymangaweb/activity/DlActivity.kt +++ b/app/src/main/java/top/fumiama/copymangaweb/activity/DlActivity.kt @@ -14,7 +14,7 @@ import android.widget.Toast import android.widget.ToggleButton import com.google.gson.Gson import top.fumiama.copymangaweb.R -import top.fumiama.copymangaweb.activity.MainActivity.Companion.mh +import top.fumiama.copymangaweb.activity.MainActivity.Companion.wm import top.fumiama.copymangaweb.activity.template.ToolsBoxActivity import top.fumiama.copymangaweb.data.ComicStructure import top.fumiama.copymangaweb.databinding.ActivityDlBinding @@ -51,7 +51,7 @@ class DlActivity : ToolsBoxActivity() { super.onCreate(savedInstanceState) mBinding = ActivityDlBinding.inflate(layoutInflater) setContentView(mBinding.root) - mh?.saveUrlsOnly = true + wm?.get()?.saveUrlsOnly = true mangaDlTools = MangaDlTools(this) mBinding.dwh.apply { post { settings.userAgentString = getString(R.string.pc_ua) @@ -63,7 +63,7 @@ class DlActivity : ToolsBoxActivity() { } override fun onDestroy() { - mh?.saveUrlsOnly = false + wm?.get()?.saveUrlsOnly = false wmdlt?.get()?.exit = true handler.removeCallbacksAndMessages(null) super.onDestroy() diff --git a/app/src/main/java/top/fumiama/copymangaweb/activity/DlListActivity.kt b/app/src/main/java/top/fumiama/copymangaweb/activity/DlListActivity.kt index 90e4221..08afbf4 100644 --- a/app/src/main/java/top/fumiama/copymangaweb/activity/DlListActivity.kt +++ b/app/src/main/java/top/fumiama/copymangaweb/activity/DlListActivity.kt @@ -62,7 +62,7 @@ class DlListActivity: Activity() { ViewMangaActivity.zipFile = chosenFile ViewMangaActivity.titleText = it[position] ViewMangaActivity.zipPosition = position - ViewMangaActivity.zipList = it as Array + ViewMangaActivity.zipList = it.toList().toTypedArray() ViewMangaActivity.cd = cd startActivity(Intent(this, ViewMangaActivity::class.java)) } diff --git a/app/src/main/java/top/fumiama/copymangaweb/activity/MainActivity.kt b/app/src/main/java/top/fumiama/copymangaweb/activity/MainActivity.kt index 4783c28..eeef245 100644 --- a/app/src/main/java/top/fumiama/copymangaweb/activity/MainActivity.kt +++ b/app/src/main/java/top/fumiama/copymangaweb/activity/MainActivity.kt @@ -6,6 +6,7 @@ import android.net.Uri import android.os.Bundle import android.os.Looper import android.view.View +import android.view.WindowManager import android.webkit.ValueCallback import android.webkit.WebView import androidx.lifecycle.lifecycleScope @@ -14,9 +15,12 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import top.fumiama.copymangaweb.BuildConfig import top.fumiama.copymangaweb.R +import top.fumiama.copymangaweb.activity.DlActivity.Companion.json import top.fumiama.copymangaweb.activity.template.ToolsBoxActivity +import top.fumiama.copymangaweb.activity.viewmodel.MainViewModel import top.fumiama.copymangaweb.databinding.ActivityMainBinding import top.fumiama.copymangaweb.handler.MainHandler +import top.fumiama.copymangaweb.tool.MangaDlTools.Companion.wmdlt import top.fumiama.copymangaweb.tool.SetDraggable import top.fumiama.copymangaweb.tool.Updater import top.fumiama.copymangaweb.web.JS @@ -26,19 +30,23 @@ import java.lang.ref.WeakReference class MainActivity: ToolsBoxActivity() { var uploadMessageAboveL: ValueCallback>? = null + var saveUrlsOnly = false lateinit var mBinding: ActivityMainBinding + private val mViewModel = MainViewModel() @SuppressLint("JavascriptInterface") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mBinding = ActivityMainBinding.inflate(layoutInflater) + mBinding.mainViewModel = mViewModel + mBinding.lifecycleOwner = this setContentView(mBinding.root) wm = WeakReference(this) mh = MainHandler(Looper.myLooper()!!) toolsBox.netInfo.let { if(it == "无网络" || it == "错误") { - mh?.sendEmptyMessage(MainHandler.SET_FAB_TO_DOWNLOAD_LIST) + setFab2DlList() return@let } @@ -109,10 +117,41 @@ class MainActivity: ToolsBoxActivity() { ).check(BuildConfig.VERSION_CODE) } - fun onFabClicked(v: View){ + fun loadHiddenUrl(u: String) { + mBinding.wh.apply { post { loadUrl(u) } } + } + + fun updateLoadProgress(p: Int) { + lifecycleScope.launch { mViewModel.updateLoadProgress(p) } + } + + fun setFab(content: String) { + json = content + lifecycleScope.launch { + withContext(Dispatchers.Main) { + mViewModel.showDlList.value = false + mViewModel.setFabVisibility(true) + } + } + } + + fun setFab2DlList() { + lifecycleScope.launch { + withContext(Dispatchers.Main) { + mViewModel.showDlList.value = true + mViewModel.setFabVisibility(true) + } + } + } + + fun hideFab() { + lifecycleScope.launch { mViewModel.setFabVisibility(false) } + } + + fun onFabClicked(v: View) { DlListActivity.currentDir = getExternalFilesDir("") startActivity( - Intent(this, (if(mh?.showDlList == true) DlListActivity::class else DlActivity::class).java) + Intent(this, (if(mViewModel.showDlList.value == true) DlListActivity::class else DlActivity::class).java) .putExtra("title", "我的下载") ) } @@ -128,6 +167,26 @@ class MainActivity: ToolsBoxActivity() { ) } + fun callViewManga(content: String) { + lifecycleScope.launch { withContext(Dispatchers.IO) { + val listChapter = content.split('\n') + if(!saveUrlsOnly) { + ViewMangaActivity.titleText = listChapter[0].substringBeforeLast(' ') + ViewMangaActivity.nextChapterUrl = listChapter[1].let { if(it == "null") null else it } + ViewMangaActivity.previousChapterUrl = listChapter[2].let { if(it == "null") null else it } + ViewMangaActivity.imgUrls = arrayOf() + for(i in 3 until listChapter.size) ViewMangaActivity.imgUrls += listChapter[i] + withContext(Dispatchers.Main) { + startActivity(Intent(this@MainActivity, ViewMangaActivity::class.java)) + } + } else { + var imgs = arrayOf() + for(i in 3 until listChapter.size) imgs += listChapter[i] + wmdlt?.get()?.setChapterImages(listChapter[0].substringAfterLast(' '), imgs) + } + } } + } + companion object { const val FILE_CHOOSER_RESULT_CODE = 1 var wm: WeakReference? = null diff --git a/app/src/main/java/top/fumiama/copymangaweb/activity/viewmodel/MainViewModel.kt b/app/src/main/java/top/fumiama/copymangaweb/activity/viewmodel/MainViewModel.kt new file mode 100644 index 0000000..2ee6675 --- /dev/null +++ b/app/src/main/java/top/fumiama/copymangaweb/activity/viewmodel/MainViewModel.kt @@ -0,0 +1,30 @@ +package top.fumiama.copymangaweb.activity.viewmodel + +import android.view.View +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class MainViewModel: ViewModel() { + val progress = MutableLiveData(0) + val progressDuration = MutableLiveData(233L) + val progressVisibility = MutableLiveData(View.VISIBLE) + val fabVisibility = MutableLiveData(View.GONE) + val showDlList = MutableLiveData(false) + + suspend fun updateLoadProgress(p: Int) = withContext(Dispatchers.Main) { + if(progress.value == 100 && p < 100) { + progress.value = 0 + progressVisibility.value = View.VISIBLE + return@withContext + } + progress.value = p + } + + suspend fun setFabVisibility(visible: Boolean) { + withContext(Dispatchers.Main) { + fabVisibility.value = if (visible) View.VISIBLE else View.GONE + } + } +} diff --git a/app/src/main/java/top/fumiama/copymangaweb/handler/MainHandler.kt b/app/src/main/java/top/fumiama/copymangaweb/handler/MainHandler.kt index fac91c3..b0590b1 100644 --- a/app/src/main/java/top/fumiama/copymangaweb/handler/MainHandler.kt +++ b/app/src/main/java/top/fumiama/copymangaweb/handler/MainHandler.kt @@ -1,33 +1,19 @@ package top.fumiama.copymangaweb.handler -import android.animation.ObjectAnimator import android.app.Dialog -import android.content.Intent import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import android.widget.TextView import top.fumiama.copymangaweb.R -import top.fumiama.copymangaweb.activity.DlActivity.Companion.json import top.fumiama.copymangaweb.activity.MainActivity.Companion.wm -import top.fumiama.copymangaweb.activity.ViewMangaActivity -import top.fumiama.copymangaweb.tool.MangaDlTools.Companion.wmdlt -class MainHandler(looper: Looper):Handler(looper) { - var saveUrlsOnly = false - var showDlList = false +class MainHandler(looper: Looper): Handler(looper) { private var dialog: Dialog? = null override fun handleMessage(msg: Message) { super.handleMessage(msg) when(msg.what) { - LOAD_URL_IN_HIDDEN_WEB_VIEW -> loadUrlInHiddenWebView(msg.obj as String) - CALL_VIEW_MANGA -> callViewManga(msg.obj as String) - UPDATE_LOAD_PROGRESS -> updateLoadProgress(msg.arg1) - SET_FAB -> setFab(msg.obj as String) - HIDE_FAB -> hideFab() - SET_FAB_TO_DOWNLOAD_LIST -> setFab2DlList() SHOW_LOADING_DIALOG -> { wm?.get()?.apply { (dialog?:Dialog(this).also { @@ -48,52 +34,7 @@ class MainHandler(looper: Looper):Handler(looper) { } } } - private fun loadUrlInHiddenWebView(url: String) { wm?.get()?.mBinding?.wh?.apply { post { loadUrl(url) } } } - private fun callViewManga(content: String) = Thread{ - val listChapter = content.split('\n') - if(!saveUrlsOnly) { - ViewMangaActivity.titleText = listChapter[0].substringBeforeLast(' ') - ViewMangaActivity.nextChapterUrl = listChapter[1].let { if(it == "null") null else it } - ViewMangaActivity.previousChapterUrl = listChapter[2].let { if(it == "null") null else it } - ViewMangaActivity.imgUrls = arrayOf() - for(i in 3 until listChapter.size) ViewMangaActivity.imgUrls += listChapter[i] - wm?.get()?.apply { runOnUiThread { startActivity(Intent(this, ViewMangaActivity::class.java)) } } - } else { - var imgs = arrayOf() - for(i in 3 until listChapter.size) imgs += listChapter[i] - wmdlt?.get()?.setChapterImgs(listChapter[0].substringAfterLast(' '), imgs) - } - }.start() - private fun updateLoadProgress(p: Int) { - wm?.get()?.mBinding?.pw?.apply { post { - if(progress == 100 && p < 100) { - progress = 0 - visibility = View.VISIBLE - } - ObjectAnimator.ofInt(this, "progress", progress, p).setDuration(233).start() - if(p == 100) postDelayed({ visibility = View.GONE }, 500) - } } - } - private fun showFab() { wm?.get()?.mBinding?.fab?.apply { post { visibility = View.VISIBLE } } } - private fun hideFab() { wm?.get()?.mBinding?.fab?.apply { post { visibility = View.GONE } } } - private fun setFab(content: String) { - //Log.d("MyMH", "Get chapter json: $content") - showDlList = false - json = content - showFab() - } - private fun setFab2DlList(){ - showDlList = true - showFab() - } - companion object { - const val LOAD_URL_IN_HIDDEN_WEB_VIEW = 1 - const val CALL_VIEW_MANGA = 2 - const val UPDATE_LOAD_PROGRESS = 3 - const val SET_FAB = 4 - const val HIDE_FAB = 5 - const val SET_FAB_TO_DOWNLOAD_LIST = 6 const val SHOW_LOADING_DIALOG = 7 const val HIDE_LOADING_DIALOG = 8 const val SET_LOADING_DIALOG_TEXT = 9 diff --git a/app/src/main/java/top/fumiama/copymangaweb/tool/MangaDlTools.kt b/app/src/main/java/top/fumiama/copymangaweb/tool/MangaDlTools.kt index a16112f..48c8398 100644 --- a/app/src/main/java/top/fumiama/copymangaweb/tool/MangaDlTools.kt +++ b/app/src/main/java/top/fumiama/copymangaweb/tool/MangaDlTools.kt @@ -41,7 +41,7 @@ class MangaDlTools(activity: DlActivity) { } } - fun setChapterImgs(hash: String, imgUrls: Array){ + fun setChapterImages(hash: String, imgUrls: Array){ imgUrlsList?.set(p[hash].toInt(), imgUrls) sem.release() } diff --git a/app/src/main/java/top/fumiama/copymangaweb/view/BindingAdapters.kt b/app/src/main/java/top/fumiama/copymangaweb/view/BindingAdapters.kt new file mode 100644 index 0000000..a27b121 --- /dev/null +++ b/app/src/main/java/top/fumiama/copymangaweb/view/BindingAdapters.kt @@ -0,0 +1,30 @@ +package top.fumiama.copymangaweb.view + +import android.animation.ObjectAnimator +import android.view.View +import android.widget.ProgressBar +import androidx.core.animation.doOnEnd +import androidx.databinding.BindingAdapter + +object BindingAdapters { + @JvmStatic + @BindingAdapter( + value = ["animateProgress", "animationDuration"], + requireAll = false + ) + fun bindAnimateProgress( + view: ProgressBar, + progress: Int?, + duration: Long? + ) { + if (progress == null) return + val dur = duration ?: 1000L + ObjectAnimator.ofInt(view, "progress", view.progress, progress).apply { + setDuration(dur) + start() + }.doOnEnd { + if (progress < 100) return@doOnEnd + view.apply { post { visibility = View.GONE } } + } + } +} diff --git a/app/src/main/java/top/fumiama/copymangaweb/web/JS.kt b/app/src/main/java/top/fumiama/copymangaweb/web/JS.kt index 2da024f..2ae5933 100644 --- a/app/src/main/java/top/fumiama/copymangaweb/web/JS.kt +++ b/app/src/main/java/top/fumiama/copymangaweb/web/JS.kt @@ -3,9 +3,7 @@ package top.fumiama.copymangaweb.web import android.util.Log import android.webkit.JavascriptInterface import top.fumiama.copymangaweb.R -import top.fumiama.copymangaweb.activity.MainActivity.Companion.mh import top.fumiama.copymangaweb.activity.MainActivity.Companion.wm -import top.fumiama.copymangaweb.handler.MainHandler class JS { @JavascriptInterface @@ -16,14 +14,14 @@ class JS { else -> "" } Log.d("MyJS", "Load comic: $u") - mh?.obtainMessage(MainHandler.LOAD_URL_IN_HIDDEN_WEB_VIEW, u)?.sendToTarget() + wm?.get()?.loadHiddenUrl(u) } @JavascriptInterface fun hideFab() { - mh?.sendEmptyMessage(MainHandler.HIDE_FAB) + wm?.get()?.hideFab() } @JavascriptInterface fun enterProfile(){ - mh?.sendEmptyMessage(MainHandler.SET_FAB_TO_DOWNLOAD_LIST) + wm?.get()?.setFab2DlList() } } \ No newline at end of file diff --git a/app/src/main/java/top/fumiama/copymangaweb/web/JSHidden.kt b/app/src/main/java/top/fumiama/copymangaweb/web/JSHidden.kt index 0e11cf3..7fa60f3 100644 --- a/app/src/main/java/top/fumiama/copymangaweb/web/JSHidden.kt +++ b/app/src/main/java/top/fumiama/copymangaweb/web/JSHidden.kt @@ -4,12 +4,13 @@ import android.util.Log import android.webkit.JavascriptInterface import top.fumiama.copymangaweb.activity.DlActivity import top.fumiama.copymangaweb.activity.MainActivity.Companion.mh +import top.fumiama.copymangaweb.activity.MainActivity.Companion.wm import top.fumiama.copymangaweb.handler.MainHandler class JSHidden { @JavascriptInterface fun loadChapter(listString: String){ - mh?.obtainMessage(MainHandler.CALL_VIEW_MANGA, listString)?.sendToTarget() + wm?.get()?.callViewManga(listString) } @JavascriptInterface fun setTitle(title:String){ @@ -18,7 +19,7 @@ class JSHidden { } @JavascriptInterface fun setFab(content: String){ - mh?.obtainMessage(MainHandler.SET_FAB, content)?.sendToTarget() + wm?.get()?.setFab(content) } @JavascriptInterface fun setLoadingDialog(display: Boolean) { diff --git a/app/src/main/java/top/fumiama/copymangaweb/web/WebChromeClient.kt b/app/src/main/java/top/fumiama/copymangaweb/web/WebChromeClient.kt index 191188e..4d6be83 100644 --- a/app/src/main/java/top/fumiama/copymangaweb/web/WebChromeClient.kt +++ b/app/src/main/java/top/fumiama/copymangaweb/web/WebChromeClient.kt @@ -1,17 +1,18 @@ package top.fumiama.copymangaweb.web import android.net.Uri -import android.webkit.* +import android.webkit.JsPromptResult +import android.webkit.JsResult +import android.webkit.ValueCallback import android.webkit.WebChromeClient -import top.fumiama.copymangaweb.activity.MainActivity.Companion.mh +import android.webkit.WebView import top.fumiama.copymangaweb.activity.MainActivity.Companion.wm -import top.fumiama.copymangaweb.handler.MainHandler class WebChromeClient:WebChromeClient() { override fun onProgressChanged(view: WebView?, newProgress: Int) { super.onProgressChanged(view, newProgress) //Log.d("MyWCC", "W progress: $newProgress") - mh?.obtainMessage(MainHandler.UPDATE_LOAD_PROGRESS, newProgress, 0)?.sendToTarget() + wm?.get()?.updateLoadProgress(newProgress) } override fun onJsAlert( diff --git a/app/src/main/java/top/fumiama/copymangaweb/web/WebViewClient.kt b/app/src/main/java/top/fumiama/copymangaweb/web/WebViewClient.kt index 5f958c9..04a5f12 100644 --- a/app/src/main/java/top/fumiama/copymangaweb/web/WebViewClient.kt +++ b/app/src/main/java/top/fumiama/copymangaweb/web/WebViewClient.kt @@ -8,6 +8,11 @@ import android.webkit.WebResourceResponse import android.webkit.WebView import android.webkit.WebViewClient import android.widget.Toast +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import top.fumiama.copymangaweb.R import top.fumiama.copymangaweb.activity.MainActivity.Companion.wm @@ -25,20 +30,18 @@ class WebViewClient(private val context: Context, jsFileName: String):WebViewCli } override fun onPageFinished(view: WebView?, url: String?) { - Thread { - Thread.sleep(500) - wm?.get()?.runOnUiThread { - view?.loadUrl(js) - Log.d("MyWC", "Inject JS into: $url") - super.onPageFinished(view, url) + wm?.get()?.lifecycleScope?.launch { + withContext(Dispatchers.IO) { + delay(500) + withContext(Dispatchers.Main) { + view?.loadUrl(js) + Log.d("MyWC", "Inject JS into: $url") + super.onPageFinished(view, url) + } } - }.start() + } } - /*override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) { - handler?.proceed() // ignore ssl errors - }*/ - override fun shouldInterceptRequest( view: WebView?, request: WebResourceRequest? diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 79250f9..1fa7c81 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,44 +1,54 @@ - - - + + + + + android:layout_height="match_parent"> - + - + -