diff --git a/.idea/misc.xml b/.idea/misc.xml index f340c7e..d9bdeae 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -17,9 +17,12 @@ + + + diff --git a/README.md b/README.md index 07a6015..fe2265a 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ ### 功能 1. 浏览主页、分类、排行、我的下载、标签、作者。 -2. 查看、搜索漫画并直接阅读。 +2. 查看、搜索漫画并直接阅读;记录漫画与章节的阅读进度。 3. 下载漫画。但是由于不可抗力,下载速度较慢且容易出错,这绝对不是优化的原因,绝对不是。 4. 阅读下载的漫画。 5. 检查更新。 diff --git a/app/build.gradle b/app/build.gradle index de145f8..1638bca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId 'top.fumiama.copymanga' minSdkVersion 23 targetSdkVersion 31 - versionCode 19 - versionName '2.0.beta8' + versionCode 21 + versionName '2.0.beta9' resConfigs "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 315b4cc..5414bd6 100644 --- a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt @@ -21,6 +21,7 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.core.content.edit import androidx.core.net.toUri import androidx.drawerlayout.widget.DrawerLayout import androidx.navigation.NavController @@ -36,7 +37,6 @@ import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.nav_header_main.* import top.fumiama.dmzj.copymanga.R -import top.fumiama.copymanga.tools.file.PropertiesTools import top.fumiama.copymanga.tools.api.UITools import top.fumiama.copymanga.ui.download.DownloadFragment import top.fumiama.copymanga.update.Update @@ -50,7 +50,6 @@ class MainActivity : AppCompatActivity() { var navController: NavController? = null private lateinit var appBarConfiguration: AppBarConfiguration - private lateinit var p: PropertiesTools private lateinit var headPic: File override fun onCreate(savedInstanceState: Bundle?) { @@ -75,7 +74,6 @@ class MainActivity : AppCompatActivity() { setupActionBarWithNavController(navController!!, appBarConfiguration) nav_view.setupWithNavController(navController!!) - p = PropertiesTools(File(filesDir, "database.prop")) headPic = File(getExternalFilesDir(""), "headPic") mainWeakReference = WeakReference(this) drawer_layout.addDrawerListener(object : DrawerLayout.DrawerListener { @@ -121,7 +119,7 @@ class MainActivity : AppCompatActivity() { } true } - p["navTextInfo"].let { if (it != "null") navtinfo.text = it } + navtinfo.text = getPreferences(MODE_PRIVATE).getString("navTextInfo", getString(R.string.navTextInfo)) return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() } @@ -239,7 +237,7 @@ class MainActivity : AppCompatActivity() { private fun checkUpdate(ignoreSkip: Boolean) { Thread{ - Update.checkUpdate(this, p, UITools(this), ignoreSkip) + Update.checkUpdate(this, UITools(this), ignoreSkip) }.start() } @@ -259,7 +257,10 @@ class MainActivity : AppCompatActivity() { MaterialDialog(this).show { input(prefill = (it as TextView).text) { _, charSequence -> it.text = charSequence - p["navTextInfo"] = charSequence.toString() + getPreferences(MODE_PRIVATE).edit { + putString("navTextInfo", charSequence.toString()) + apply() + } } positiveButton(android.R.string.ok) title(R.string.navTextInfoInputHint) diff --git a/app/src/main/java/top/fumiama/copymanga/template/general/ActivityTemplate.kt b/app/src/main/java/top/fumiama/copymanga/template/general/ActivityTemplate.kt index 86c56b7..e8278c6 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/general/ActivityTemplate.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/general/ActivityTemplate.kt @@ -3,20 +3,18 @@ package top.fumiama.copymanga.template.general import android.app.Activity import android.os.Bundle import android.view.View -import top.fumiama.copymanga.tools.file.PropertiesTools +import androidx.core.content.edit import top.fumiama.copymanga.tools.api.UITools -import java.io.File -import java.lang.ref.WeakReference open class ActivityTemplate:Activity() { - lateinit var p: PropertiesTools lateinit var toolsBox: UITools + val p = IntPref() + val pb = BoolPref() private val allFullScreen - get() = p["allFullScreen"] == "true" + get() = getPreferences(MODE_PRIVATE).getBoolean("allFullScreen", false) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - p = PropertiesTools(File("$filesDir/settings.properties")) toolsBox = UITools(this) } @@ -25,4 +23,20 @@ open class ActivityTemplate:Activity() { if(allFullScreen) window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY } + + inner class IntPref { + operator fun get(key: String) = getPreferences(MODE_PRIVATE).getInt(key, -5) + operator fun set(key: String, value: Int) = getPreferences(MODE_PRIVATE).edit { + putInt(key, value) + apply() + } + } + + inner class BoolPref { + operator fun get(key: String) = getPreferences(MODE_PRIVATE).getBoolean(key, false) + operator fun set(key: String, value: Boolean) = getPreferences(MODE_PRIVATE).edit { + putBoolean(key, value) + apply() + } + } } \ No newline at end of file diff --git a/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt index ce5dc3c..85c7ab1 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt @@ -1,11 +1,13 @@ package top.fumiama.copymanga.ui.book +import android.content.Context.MODE_PRIVATE import android.os.Bundle import android.util.Log import android.view.Menu import android.view.View import androidx.navigation.Navigation import kotlinx.android.synthetic.main.app_bar_main.* +import kotlinx.android.synthetic.main.line_booktandb.* import top.fumiama.dmzj.copymanga.R import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.template.general.NoBackRefreshFragment @@ -33,12 +35,16 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) { menuMain?.let { setMenuVisible(it) } toolbar.title = bookHandler.book?.results?.comic?.name } + setStartRead() } override fun onDestroy() { super.onDestroy() mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) } bookHandler.destroy() + bookHandler.ads.forEach { + it.exit = true + } } override fun onPause() { @@ -46,6 +52,25 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) { mainWeakReference?.get()?.menuMain?.let { setMenuInvisible(it) } } + fun setStartRead() { + mainWeakReference?.get()?.apply { + bookHandler.book?.results?.comic?.name?.let { + getPreferences(MODE_PRIVATE).getInt(it, -1).let { p -> + this@BookFragment.lbbstart.apply { + var i = 0 + if(p >= 0) { + text = bookHandler.chapterNames[p] + i = p + } + setOnClickListener { + bookHandler.callViewManga(i) + } + } + } + } + } + } + private fun setMenuInvisible(menu: Menu){ menu.findItem(R.id.action_download)?.isVisible = false } @@ -68,19 +93,12 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) { val bundle = Bundle() bundle.putString("path", arguments?.getString("path")?:"null") bundle.putString("name", bookHandler.book?.results?.comic?.name) - val groups = bookHandler.book?.results?.groups - var keys = arrayOf() - var gpws = arrayOf() - var cnts = intArrayOf() - groups?.values?.forEach { - keys += it.name - gpws += it.path_word - cnts += it.count - Log.d("MyBF", "Add caption: ${it.name} @ ${it.path_word} of ${it.count}") + if(bookHandler.vols != null) { + bundle.putBoolean("loadJson", true) } - bundle.putStringArray("group", gpws) - bundle.putStringArray("groupNames", keys) - bundle.putIntArray("count", cnts) + bundle.putStringArray("group", bookHandler.gpws) + bundle.putStringArray("groupNames", bookHandler.keys) + bundle.putIntArray("count", bookHandler.cnts) rootView?.let { Navigation.findNavController(it).navigate(R.id.action_nav_book_to_nav_group, bundle) } } } \ No newline at end of file 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 21694aa..d1db9eb 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,7 @@ package top.fumiama.copymanga.ui.book +import android.content.Context.MODE_PRIVATE +import android.content.Intent import android.os.Bundle import android.os.Looper import android.os.Message @@ -7,28 +9,41 @@ import android.util.Log import android.view.View import android.widget.TextView import android.widget.Toast +import androidx.core.content.edit import androidx.navigation.Navigation import com.bumptech.glide.Glide import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.request.RequestOptions +import com.google.gson.Gson import kotlinx.android.synthetic.main.app_bar_main.* +import kotlinx.android.synthetic.main.button_tbutton.view.* import kotlinx.android.synthetic.main.card_book.* import kotlinx.android.synthetic.main.fragment_book.* import kotlinx.android.synthetic.main.line_2chapters.view.* import kotlinx.android.synthetic.main.line_bookinfo.* import kotlinx.android.synthetic.main.line_bookinfo_text.* +import kotlinx.android.synthetic.main.line_booktandb.* import kotlinx.android.synthetic.main.line_caption.view.* import kotlinx.android.synthetic.main.line_chapter.view.* +import kotlinx.android.synthetic.main.widget_downloadbar.* import top.fumiama.dmzj.copymanga.R import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.json.BookInfoStructure +import top.fumiama.copymanga.json.ChapterStructure import top.fumiama.copymanga.json.ThemeStructure +import top.fumiama.copymanga.json.VolumeStructure import top.fumiama.copymanga.template.http.AutoDownloadHandler +import top.fumiama.copymanga.template.http.AutoDownloadThread import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.api.GlideBlurTransformation +import top.fumiama.copymanga.ui.comicdl.ComicDlFragment +import top.fumiama.copymanga.ui.comicdl.ComicDlFragment.Companion.json +import top.fumiama.copymanga.ui.vm.ViewMangaActivity +import java.io.File +import java.lang.Thread.sleep import java.lang.ref.WeakReference -class BookHandler(that: WeakReference, path: String) +class BookHandler(that: WeakReference, private val path: String) : AutoDownloadHandler( that.get()?.getString(R.string.bookInfoApiUrl)?.let { String.format(it, path) } ?: "", BookInfoStructure::class.java, @@ -43,6 +58,12 @@ class BookHandler(that: WeakReference, path: String) var book: BookInfoStructure? = null var fbibinfo:View? = null var complete = false + var ads = emptyArray() + var gpws = arrayOf() + var keys = arrayOf() + var cnts = intArrayOf() + var vols: Array? = null + var chapterNames = arrayOf() private val divider get() = that?.layoutInflater?.inflate(R.layout.div_h, that.fbl, false) private var fbtinfo: View? = null @@ -55,7 +76,6 @@ class BookHandler(that: WeakReference, path: String) 3 -> fbibinfo?.let { setInfoHeight(it) } 4 -> setThemes() 5 -> setOverScale() - 6 -> endSetLayouts() } } @@ -80,12 +100,20 @@ class BookHandler(that: WeakReference, path: String) super.doWhenFinishDownload() if(exit) return inflateComponents() - Thread{ for (i in 1..6) sendEmptyMessage(i) }.start() + book?.results?.groups?.values?.forEach{ + keys += it.name + gpws += it.path_word + cnts += it.count + Log.d("MyBFH", "Add caption: ${it.name} @ ${it.path_word} of ${it.count}") + } + initComicData() + Thread{ for (i in 1..5) sendEmptyMessage(i) }.start() } private fun endSetLayouts(){ that?.fbloading?.visibility = View.GONE complete = true + that?.setStartRead() Log.d("MyBH", "Set complete: true") } @@ -192,9 +220,63 @@ class BookHandler(that: WeakReference, path: String) that?.apply { book?.results?.comic?.apply { author?.let { setTheme(getString(R.string.author), it, R.id.action_nav_book_to_nav_author) } + fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false)) theme?.let { setTheme(getString(R.string.caption), it, R.id.action_nav_book_to_nav_caption) } } } + Thread{ + while (vols == null && !exit) sleep(1000) + if(exit) return@Thread + that?.apply { + book?.results?.apply { + mainWeakReference?.get()?.runOnUiThread{ + ViewMangaActivity.fileArray = arrayOf() + ViewMangaActivity.urlArray = arrayOf() + vols?.forEachIndexed { iv, v -> + fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false)) + val t = layoutInflater.inflate(R.layout.line_caption, fbl, false) + t.tcptn.text = keys[iv] + fbl.addView(t) + fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false)) + var line: View? = null + val last = v.results.list.size - 1 + v.results.list.onEachIndexed { i, it -> + ViewMangaActivity.urlArray += CMApi.getApiUrl(R.string.chapterInfoApiUrl, comic.path_word, it.uuid)?:"" + ViewMangaActivity.fileArray += CMApi.getZipFile(context?.getExternalFilesDir(""), comic.name, keys[iv], it.name) + chapterNames += it.name + if(line == null) { + if(i == last) { + line = layoutInflater.inflate(R.layout.line_chapter, that.fbl, false) + line?.lcc?.apply { + lct.text = it.name + setOnClickListener { callViewManga(i) } + } + fbl?.addView(line) + } else { + line = layoutInflater.inflate(R.layout.line_2chapters, that.fbl, false) + line?.l2cl?.apply { + lct.text = it.name + setOnClickListener { callViewManga( i) } + } + } + } else line?.l2cr?.apply { + lct.text = it.name + setOnClickListener { callViewManga(i) } + fbl?.addView(line) + line = null + } + } + } + // padding + val line = layoutInflater.inflate(R.layout.line_chapter, that.fbl, false) + line.lci.visibility = View.INVISIBLE + line.isClickable = false + fbl?.addView(line) + endSetLayouts() + } + } + } + }.start() } private fun loadVolume(name: String, path: String, nav: Int){ @@ -204,4 +286,100 @@ class BookHandler(that: WeakReference, path: String) bundle.putString("path", path) that?.rootView?.let { Navigation.findNavController(it).navigate(nav, bundle) } } + + private fun initComicData() { + var volumes = emptyArray() + val counts = cnts.clone() + gpws.forEachIndexed { i, gpw -> + Log.d("MyBFH", "下载:$gpw") + var offset = 0 + val times = counts[i] / 100 + val remain = counts[i] % 100 + val re = arrayOfNulls(if(remain != 0) (times+1) else (times)) + Log.d("MyBFH", "${i}卷共${if(times == 0) 1 else times}次加载") + do { + counts[i] = counts[i] - 100 + CMApi.getApiUrl(R.string.groupInfoApiUrl, path, gpw, offset)?.let { + if(ComicDlFragment.exit) return + val ad = AutoDownloadThread(it) { result -> + Log.d("MyBFH", "第${i}卷返回") + val r = + Gson().fromJson(result?.decodeToString(), VolumeStructure::class.java) + re[r.results.offset / 100] = r + } + ads += ad + ad.start() + offset += 100 + } + } while (counts[i] > 0) + Thread { + var c = 0 + while (c++ < 80) { + sleep(1000) + if(ComicDlFragment.exit) return@Thread + if(re.all { it != null }) break + } + if(re.size > 1) { + val r = re[0] + var s = emptyArray() + re.forEach { + it?.results?.list?.forEach { + s += it + } + } + r?.results?.list = s + r?.apply { volumes += this } + } else re[0]?.apply { volumes += this } + }.start() + } + Thread { + var c = 0 + while (c < 80 && volumes.size != gpws.size) { + sleep(1000) + if(ComicDlFragment.exit) return@Thread + Log.d("MyBFH", "已有:${volumes.size} 共:${gpws.size}") + c++ + } + if (volumes.size == gpws.size) { + mainWeakReference?.get()?.runOnUiThread { + saveVolumes(volumes) + } + } + }.start() + } + + private fun saveVolumes(volumes: Array) { + that?.context?.getExternalFilesDir("")?.let { home -> + book?.results?.comic?.name?.let { name -> + val mangaFolder = File(home, name) + if(!mangaFolder.exists()) mangaFolder.mkdirs() + json = Gson().toJson(volumes) + File(mangaFolder, "info.json").writeText(json!!) + File(mangaFolder, "grps.json").writeText(Gson().toJson(keys)) + } + } + vols = volumes + } + + fun callViewManga(pos: Int) { + book?.results?.comic?.name?.let { + mainWeakReference?.get()?.getPreferences(MODE_PRIVATE)?.edit { + putInt(it, pos) + apply() + } + } + ViewMangaActivity.dlhandler = null + ViewMangaActivity.position = pos + val zipf = ViewMangaActivity.fileArray[pos] + if (zipf.exists()) { + ViewMangaActivity.zipFile = zipf + that?.startActivity( + Intent(that.context, ViewMangaActivity::class.java) + .putExtra("callFrom", "zipFirst").putExtra("function", "log") + ) + } else { + ViewMangaActivity.zipFile = null + that?.startActivity(Intent(that.context, ViewMangaActivity::class.java).putExtra("function", "log")) + } + } } \ No newline at end of file diff --git a/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlFragment.kt index a0a9c73..286bcba 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlFragment.kt @@ -28,7 +28,12 @@ class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) { arguments?.getBoolean("callFromOldDL", false) == true -> initOldComicData() arguments?.getBoolean("loadJson", false) == true -> context?.getExternalFilesDir("")?.let { home -> arguments?.getString("name")?.let { - start2load(loadFromJson(), true, loadGroupsFromFile(File(home, "$it/grps.json"))) + Thread{ + sleep(600) + mainWeakReference?.get()?.runOnUiThread { + start2load(loadFromJson(), true, loadGroupsFromFile(File(home, "$it/grps.json"))) + } + }.start() } } else -> initComicData( diff --git a/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlHandler.kt index 58b697f..a0c3dc1 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlHandler.kt @@ -28,7 +28,6 @@ import top.fumiama.copymanga.json.ComicStructureOld import top.fumiama.copymanga.json.VolumeStructure import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.http.MangaDlTools -import top.fumiama.copymanga.tools.file.PropertiesTools import top.fumiama.copymanga.tools.api.UITools import top.fumiama.copymanga.ui.comicdl.ComicDlFragment.Companion.json import top.fumiama.copymanga.ui.vm.ViewMangaActivity @@ -45,7 +44,6 @@ class ComicDlHandler(looper: Looper, that: WeakReference, priva var complete = false private val that = that.get() private val toolsBox = UITools(that.get()?.context) - private val p = PropertiesTools(File("${that.get()?.context?.filesDir}/settings.properties")) private var btnNumPerRow = 4 private var btnw = 0 private var cdwnWidth = 0 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 02a4ed0..4ea07ec 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 @@ -16,7 +16,6 @@ import top.fumiama.copymanga.json.Chapter2Return import top.fumiama.copymanga.json.ChapterWithContent import top.fumiama.copymanga.json.ComicStructure import top.fumiama.copymanga.template.http.AutoDownloadHandler -import top.fumiama.copymanga.tools.file.PropertiesTools import top.fumiama.copymanga.ui.vm.ViewMangaActivity.Companion.comicName import top.fumiama.copymanga.ui.vm.ViewMangaActivity.Companion.pn import top.fumiama.copymanga.views.ScaleImageView @@ -26,7 +25,6 @@ import java.lang.Thread.sleep import java.lang.ref.WeakReference import java.text.SimpleDateFormat import java.util.* -import java.util.zip.ZipInputStream class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler( url, Chapter2Return::class.java, Looper.myLooper()!! @@ -59,7 +57,6 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler( else -> "" } } - var progressLog: PropertiesTools? = null @SuppressLint("SimpleDateFormat", "SetTextI18n") override fun handleMessage(msg: Message) { @@ -159,7 +156,6 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler( @ExperimentalStdlibApi private fun prepareManga(){ comicName = manga?.results?.comic?.name - progressLog = PropertiesTools(File("${wv.get()?.filesDir}/progress/${manga?.results?.comic?.name}")) wv.get()?.count = manga?.results?.chapter?.size?:0 wv.get()?.initManga() wv.get()?.vprog?.visibility = View.GONE 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 f9ec8a5..bcf7fa6 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 @@ -12,6 +12,7 @@ import android.util.Log import android.view.* import android.widget.SeekBar import android.widget.Toast +import androidx.core.content.edit import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.bumptech.glide.Glide @@ -41,7 +42,6 @@ import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.File import java.io.InputStream -import java.lang.Thread.sleep import java.lang.ref.WeakReference import java.util.* import java.util.concurrent.FutureTask @@ -90,21 +90,20 @@ class ViewMangaActivity : TitleActivityTemplate() { setContentView(R.layout.activity_viewmanga) super.onCreate(savedInstanceState) va = WeakReference(this) - //progressLog = PropertiesTools(File("$filesDir/progress/${chapter2Return?.results?.chapter?.comic_id}")) //dlZip2View = intent.getStringExtra("callFrom") == "Dl" || p["dlZip2View"] == "true" //zipFirst = intent.getStringExtra("callFrom") == "zipFirst" - cut = p["useCut"] == "true" - r2l = p["r2l"] == "true" - verticalLoadMaxCount = if (p["verticalMax"] != "null") p["verticalMax"].toInt() else 20 - isVertical = p["vertical"] == "true" - notUseVP = p["noVP"] == "true" || isVertical + cut = pb["useCut"] + r2l = pb["r2l"] + verticalLoadMaxCount = p["verticalMax"].let { if(it > 0) it else 20 } + isVertical = pb["vertical"] + notUseVP = pb["noVP"] || isVertical //url = intent.getStringExtra("url") handler = VMHandler(this, if(urlArray.isNotEmpty()) urlArray[position] else "") - if (p["quality"] != "null") q = p["quality"].toInt() + p["quality"].let { q = if (it > 0) it else 100 } tt = TimeThread(handler, 22) tt.canDo = true tt.start() - volTurnPage = p["volturn"] == "true" + volTurnPage = pb["volturn"] am = getSystemService(Service.AUDIO_SERVICE) as AudioManager Log.d("MyVM", "Now ZipFile is $zipFile") @@ -155,7 +154,7 @@ class ViewMangaActivity : TitleActivityTemplate() { pageNum = pn pn = -1 } - sendProgress() + setProgress() } private fun preDownloadChapterPages() { @@ -220,6 +219,9 @@ class ViewMangaActivity : TitleActivityTemplate() { @ExperimentalStdlibApi fun initManga(){ + handler.manga?.results?.chapter?.uuid?.let { + pn = getPreferences(MODE_PRIVATE).getInt(it, pn) + } if (zipFile?.exists() != true) doPrepareWebImg() else prepareItems() if (!isVertical) restorePN() @@ -227,7 +229,7 @@ class ViewMangaActivity : TitleActivityTemplate() { @ExperimentalStdlibApi private fun prepareImgFromWeb() { - if(toolsBox.netinfo == "移动数据") alertCellar() + if(!noCellarAlert && toolsBox.netinfo == "移动数据") alertCellar() else handler.startLoad() } @@ -431,18 +433,21 @@ class ViewMangaActivity : TitleActivityTemplate() { } } - private fun sendProgress() { - handler.progressLog?.let { - //it["chapterId"] = hm.chapterId.toString() - it["page"] = pageNum.toString() - //it["name"] = inftitle.ttitle.text + private fun setProgress() { + handler.manga?.results?.chapter?.uuid?.let { + getPreferences(MODE_PRIVATE).edit { + //it["chapterId"] = hm.chapterId.toString() + putInt(it, pageNum) + //it["name"] = inftitle.ttitle.text + apply() + } } } private fun prepareIdBtCut() { idtbcut.isChecked = cut idtbcut.setOnClickListener { - p["useCut"] = if (idtbcut.isChecked) "true" else "false" + pb["useCut"] = idtbcut.isChecked Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show() } } @@ -450,8 +455,7 @@ class ViewMangaActivity : TitleActivityTemplate() { private fun prepareIdBtLR() { idtblr.isChecked = r2l idtblr.setOnClickListener { - if (idtblr.isChecked) p["r2l"] = "true" - else p["r2l"] = "false" + pb["r2l"] = idtblr.isChecked Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show() } } @@ -459,8 +463,7 @@ class ViewMangaActivity : TitleActivityTemplate() { private fun prepareIdBtVP() { idtbvp.isChecked = notUseVP idtbvp.setOnClickListener { - if (idtbvp.isChecked) p["noVP"] = "true" - else p["noVP"] = "false" + pb["noVP"] = idtbvp.isChecked Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show() } } @@ -487,7 +490,7 @@ class ViewMangaActivity : TitleActivityTemplate() { if (!isInSeek) hideObjs() updateSeekText() updateSeekProgress() - sendProgress() + setProgress() } @SuppressLint("SetTextI18n") @@ -555,7 +558,7 @@ class ViewMangaActivity : TitleActivityTemplate() { } } idtbvh.setOnClickListener { - p["vertical"] = if (idtbvh.isChecked) "true" else "false" + pb["vertical"] = idtbvh.isChecked Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show() } } diff --git a/app/src/main/java/top/fumiama/copymanga/update/Update.kt b/app/src/main/java/top/fumiama/copymanga/update/Update.kt index 4fa2c17..c1b2ef6 100644 --- a/app/src/main/java/top/fumiama/copymanga/update/Update.kt +++ b/app/src/main/java/top/fumiama/copymanga/update/Update.kt @@ -1,12 +1,14 @@ package top.fumiama.copymanga.update import android.app.Activity +import android.content.Context.MODE_PRIVATE import android.content.Intent import android.net.Uri import android.os.Build import android.util.Log import android.widget.Toast import androidx.core.content.FileProvider +import androidx.core.content.edit import kotlinx.android.synthetic.main.dialog_progress.view.* import top.fumiama.copymanga.tools.file.PropertiesTools import top.fumiama.copymanga.tools.api.UITools @@ -15,7 +17,7 @@ import java.io.File import java.security.MessageDigest object Update { - fun checkUpdate(activity: Activity, p: PropertiesTools, 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 progressBar = layoutInflater.inflate(R.layout.dialog_progress, null, false) val progressHandler = object : Client.Progress{ @@ -28,7 +30,7 @@ object Update { val msg = kanban[packageManager.getPackageInfo(packageName, 0).versionCode] if(msg != "null") { val verNum = msg.substringBefore('\n').toIntOrNull() - val skipNum = p["skipVersion"].let { if(it != "null") it.toInt() else 0 } + val skipNum = activity.getPreferences(MODE_PRIVATE).getInt("skipVersion", 0) Log.d("MyUP", "Ver:$verNum, skip: $skipNum") if(verNum != null) { @@ -63,7 +65,12 @@ object Update { client.progress = null } }.start() - }, { p["skipVersion"] = verNum.toString() }) + }, { + activity.getPreferences(MODE_PRIVATE).edit { + putInt("skipVersion", verNum) + apply() + } + }) } } else runOnUiThread { toolsBox.buildInfo("看板", msg.substringAfter('\n'), "知道了") diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml index e0cbe60..01c14c5 100644 --- a/app/src/main/res/layout/nav_header_main.xml +++ b/app/src/main/res/layout/nav_header_main.xml @@ -24,7 +24,6 @@ android:layout_height="wrap_content" android:layout_marginBottom="@dimen/nav_header_vertical_spacing" android:onClick="onNavTInfoClicked" - android:text="@string/navTextInfo" android:textAppearance="@style/TextAppearance.AppCompat.Body1" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4a13cc5..b36289f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,24 +30,22 @@ 获取图书信息失败 网络错误 - https://api.copymanga.com/api/v3/h5/homeIndex?platform=3 + https://copymanga.azurewebsites.net/api/api?/v3/h5/homeIndex?platform=3&format=json "https://api.copymanga.com" - https://nnv3api.dmzj1.com/novel/recentUpdate/%1$d.json - https://api.copymanga.com/api/v3/ranks?limit=21&offset=%1$d&date_type=%2$s&platform=3 - https://api.copymanga.com/api/v3/search/comic?limit=21&offset=%1$d&q=%2$s&q_type=%3$s&platform=3 - https://api.copymanga.com/api/v3/h5/filterIndex/comic/tags?platform=3 - https://api.copymanga.com/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&platform=3 - https://api.copymanga.com/api/v3/comic2/%1$s?platform=3 - https://api.copymanga.com/api/v3/comic/%1$s/group/%2$s/chapters?limit=100&offset=%3$d&platform=3 - https://api.copymanga.com/api/v3/comic/%1$s/chapter2/%2$s?platform=3 - https://nnv3api.dmzj1.com/novel/download/%1$d_%2$d_%3$d.txt - https://api.copymanga.com/api/v3/topic/%1$s?platform=3 - https://api.copymanga.com/api/v3/topic/%1$s/contents?type=%2$d&limit=21&offset=%3$d&platform=3 - https://api.copymanga.com/api/v3/recs?pos=3200102&limit=21&offset=%1$d&platform=3 - https://api.copymanga.com/api/v3/update/newest?limit=21&offset=%1$d&platform=3 - https://api.copymanga.com/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&top=finish&platform=3 - https://api.copymanga.com/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&author=%3$s&platform=3 - https://api.copymanga.com/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&platform=3 + https://copymanga.azurewebsites.net/api/api?/v3/ranks?limit=21&offset=%1$d&date_type=%2$s&platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/search/comic?limit=21&offset=%1$d&q=%2$s&q_type=%3$s&platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/h5/filterIndex/comic/tags?platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/comic2/%1$s?platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/comic/%1$s/group/%2$s/chapters?limit=100&offset=%3$d&platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/comic/%1$s/chapter2/%2$s?platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/topic/%1$s?platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/topic/%1$s/contents?type=%2$d&limit=21&offset=%3$d&platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/recs?pos=3200102&limit=21&offset=%1$d&platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/update/newest?limit=21&offset=%1$d&platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/comics?limit=21&offset=%1$d&ordering=%2$s&top=finish&platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/comics?limit=21&offset=%1$d&ordering=%2$s&author=%3$s&platform=3&format=json + https://copymanga.azurewebsites.net/api/api?/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&platform=3&format=json 已完结