1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-12 03:20:23 +08:00

v2.0.beta22

新增
1. 浏览漫画的加载提示
2. 设置->网络->总是使用流量观看
3. 加入书架(但是还不能删除)
修复
1. 进入排行时快速切换tab闪退
2. 详情页点击章节非第一组时错位到第一组(fix #33)
3. 快速多次点击某些按钮后闪退
This commit is contained in:
源文雨
2023-10-25 00:46:06 +09:00
parent 95e82ab97c
commit 5d9db7a657
22 changed files with 281 additions and 50 deletions

View File

@@ -8,8 +8,8 @@ android {
applicationId 'top.fumiama.copymanga'
minSdkVersion 23
targetSdkVersion 33
versionCode 33
versionName '2.0.beta21'
versionCode 34
versionName '2.0.beta22'
resConfigs 'zh', 'zh-rCN'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -40,6 +40,8 @@ import com.yalantis.ucrop.UCrop
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.copymanga.manga.Shelf
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.tools.api.UITools
import top.fumiama.copymanga.ui.book.BookFragment.Companion.bookHandler
@@ -361,5 +363,16 @@ class MainActivity : AppCompatActivity() {
var mainWeakReference: WeakReference<MainActivity>? = null
var ime: InputMethodManager? = null
const val MSG_CROP_IMAGE = 1
var shelf: Shelf? = null
get() {
if (field != null) return field
return mainWeakReference?.get()?.let {
field = Shelf(
it.getPreferences(Context.MODE_PRIVATE).getString("token", "")?:return@let null,
it.getString(R.string.shelfOperateApiUrl).format(CMApi.myHostApiUrl), it.getString(R.string.referer), it.getString(R.string.pc_ua)
)
field
}
}
}
}

View File

@@ -9,12 +9,13 @@ import top.fumiama.copymanga.ui.vm.ViewMangaActivity
object Reader {
fun viewMangaAt(name: String, pos: Int, from_first_page: Boolean = false) {
Log.d("MyR", "viewMangaAt name $name, pos $pos")
mainWeakReference?.get()?.apply {
getPreferences(Context.MODE_PRIVATE)?.edit {
putInt(name, pos)
apply()
Log.d("MyR", "记录 $name 阅读到第 ${pos+1}")
}?: Log.d("MyR", "无法获得main pref")
}?: Log.d("MyR", "无法获得 main pref")
ViewMangaActivity.dlhandler = null
ViewMangaActivity.position = pos
ViewMangaActivity.comicName = name

View File

@@ -0,0 +1,44 @@
package top.fumiama.copymanga.manga
import android.content.SharedPreferences
import com.google.gson.Gson
import top.fumiama.copymanga.json.ReturnBase
import top.fumiama.copymanga.tools.http.DownloadTools
class Shelf(private val token: String, private val apiUrl: String, private val referer: String, private val ua: String) {
fun add(comicId: String): String {
if (comicId.isEmpty()) {
return "空漫画ID"
}
val body = buildString {
append("comic_id=")
append(comicId)
append("&is_collect=1&authorization=Token+")
append("")
append(token)
}
val re = DownloadTools.requestWithBody(
"$apiUrl?platform=3", "POST", body.encodeToByteArray(), referer, ua
)?.decodeToString() ?: return "空回应"
return Gson().fromJson(re, ReturnBase::class.java).message
}
fun del(vararg bookIds: Int): String {
if (bookIds.isEmpty()) {
return "空ID列表"
}
val body = buildString {
bookIds.forEach {
append("ids=")
append(it)
append("&")
}
append("authorization=Token+")
append(token)
}
val re = DownloadTools.requestWithBody(
"${apiUrl}s?platform=3", "DELETE", body.encodeToByteArray(), referer, ua
)?.decodeToString() ?: return "空回应"
return Gson().fromJson(re, ReturnBase::class.java).message
}
}

View File

@@ -36,27 +36,31 @@ class CardList(
exitCardList = false
}
private fun manageRow(){
private fun manageRow() {
if(!exitCardList && count++ % cardPerRow == 0) inflateRow()
Log.d("MyCL", "index: $index, cardPR: $cardPerRow")
}
private fun inflateRow(){
that?.layoutInflater?.inflate(R.layout.line_horizonal_empty, that.mydll, false)?.let {
if(exitCardList) return
it.layoutParams.height = cardHeight + 16
mainWeakReference?.get()?.runOnUiThread {
if(!exitCardList) that.mydll.addView(it)
if(exitCardList) return@runOnUiThread
that.mydll.addView(it)
}
if(!exitCardList) recycleOneRow(it)
recycleOneRow(it)
index++
}
}
private fun recycleOneRow(v:View?){
val relativeIndex = index++ % 20
val relativeIndex = index % 20
if(rows[relativeIndex] == null) rows[relativeIndex] = v
else {
val victim = rows[relativeIndex]
mainWeakReference?.get()?.runOnUiThread {
if(!exitCardList) that?.apply {
if(exitCardList) return@runOnUiThread
that?.apply {
mydll?.removeView(victim)
mys?.scrollY = that.mys?.scrollY?.minus(cardHeight + 16)?:0
}
@@ -67,8 +71,9 @@ class CardList(
@ExperimentalStdlibApi
fun addCard(name: String, append: String? = null, head: String? = null, path: String? = null, chapterUUID: String? = null, pn: Int? = null, isFinish: Boolean = false){
if(!exitCardList) manageRow()
if(!exitCardList) that?.layoutInflater?.inflate(R.layout.card_book, that.mydll.ltbtn, false)?.let {
if(exitCardList) return
manageRow()
that?.layoutInflater?.inflate(R.layout.card_book, that.mydll.ltbtn, false)?.let {
val card = it.cic
card.name = name
card.append = append
@@ -79,7 +84,8 @@ class CardList(
card.pageNumber = pn
card.isFinish = isFinish
mainWeakReference?.get()?.runOnUiThread{
if(!exitCardList) addCard(it)
if(exitCardList) return@runOnUiThread
addCard(it)
}
}
}
@@ -87,21 +93,22 @@ class CardList(
@ExperimentalStdlibApi
fun addCard(cardFrame: View) {
val card = cardFrame.cic
if (card.index < 0) return
val name = card.name + (card.append?:"")
val head = card.headImageUrl
val file = File(that?.context?.getExternalFilesDir(""), card.name)
if(!exitCardList) cardFrame.let {
if(exitCardList) return
cardFrame.let {
it.tic.text = name
if(!file.exists()){
if(head != null) {
that?.context?.let { context ->
if(!exitCardList)
Glide.with(context).load(
GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders)
).into(it.imic)
Glide.with(context).load(
GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders)
).into(it.imic)
}
} else {
if(!exitCardList) it.imic.setImageResource(R.drawable.img_defmask)
it.imic.setImageResource(R.drawable.img_defmask)
}
} else {
val img = File(file, "head.jpg")
@@ -110,8 +117,8 @@ class CardList(
if(card.isFinish) it.sgnic.visibility = View.VISIBLE
initClickListeners?.prepareListeners(card, card.name, card.path, card.chapterUUID, card.pageNumber)
rows[card.index % 20]?.ltbtn?.addView(it)
it.layoutParams.height = cardHeight
it.layoutParams.width = cardWidth
it.layoutParams?.height = cardHeight
it.layoutParams?.width = cardWidth
}
}
interface InitClickListeners{

View File

@@ -14,6 +14,7 @@ import top.fumiama.copymanga.json.ShelfStructure
import top.fumiama.copymanga.json.TypeBookListStructure
import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.api.Navigate
import java.lang.ref.WeakReference
@ExperimentalStdlibApi
@@ -101,7 +102,7 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
v.setOnClickListener {
val bundle = Bundle()
bundle.putString("path", path)
findNavController().navigate(navId, bundle)
Navigate.safeNavigateTo(findNavController(), navId, bundle)
}
}
}

View File

@@ -0,0 +1,17 @@
package top.fumiama.copymanga.tools.api
import android.graphics.Typeface
import androidx.core.content.res.ResourcesCompat
import top.fumiama.copymanga.MainActivity
import top.fumiama.dmzj.copymanga.R
object Font {
var nisiTypeFace: Typeface? = null
get() {
if (field != null) return field
field = MainActivity.mainWeakReference?.get()?.let {
ResourcesCompat.getFont(it.applicationContext, R.font.nisi)
}
return field
}
}

View File

@@ -0,0 +1,12 @@
package top.fumiama.copymanga.tools.api
import android.os.Bundle
import androidx.navigation.NavController
object Navigate {
fun safeNavigateTo(navController: NavController, id: Int, bundle: Bundle? = null) {
navController.currentDestination?.getAction(id)?.let {
navController.navigate(id, bundle)
}
}
}

View File

@@ -3,6 +3,7 @@ package top.fumiama.copymanga.tools.http
import android.content.Context
import android.util.Log
import androidx.preference.PreferenceManager
import okhttp3.RequestBody
import top.fumiama.copymanga.MainActivity
import top.fumiama.dmzj.copymanga.R
import java.net.HttpURLConnection
@@ -129,4 +130,28 @@ object DownloadTools {
return@replace URLEncoder.encode(match.value, "UTF-8")
}
}*/
fun requestWithBody(url: String, method: String, body: ByteArray, refer: String? = null, ua: String? = null): ByteArray? {
Log.d("Mydl", "$method Http: $url")
var ret: ByteArray? = null
val task = FutureTask(Callable {
try {
getConnection(url, method, refer, ua)?.apply {
outputStream.write(body)
ret = inputStream.readBytes()
disconnect()
}
} catch (ex: Exception) {
ex.printStackTrace()
}
return@Callable ret
})
Thread(task).start()
return try {
task.get()
} catch (ex: Exception) {
ex.printStackTrace()
null
}
}
}

View File

@@ -3,11 +3,14 @@ package top.fumiama.copymanga.ui.book
import android.content.Context.MODE_PRIVATE
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.navigation.fragment.findNavController
import kotlinx.android.synthetic.main.line_booktandb.*
import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.manga.Reader
import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.dmzj.copymanga.R
import java.lang.Thread.sleep
@@ -68,6 +71,20 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
}
}
fun setAddToShelf() {
if(bookHandler?.chapterNames?.isNotEmpty() == true)
bookHandler?.book?.results?.comic?.let { comic ->
this@BookFragment.lbbsub.setOnClickListener {
Thread{
val re = MainActivity.shelf?.add(comic.uuid)
mainWeakReference?.get()?.runOnUiThread {
Toast.makeText(context, re, Toast.LENGTH_SHORT).show()
}
}.start()
}
}
}
fun navigate2dl(){
val bundle = Bundle()
bundle.putString("path", arguments?.getString("path")?:"null")
@@ -78,7 +95,9 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) {
bundle.putStringArray("group", bookHandler!!.gpws)
bundle.putStringArray("groupNames", bookHandler!!.keys)
bundle.putIntArray("count", bookHandler!!.cnts)
findNavController().navigate(R.id.action_nav_book_to_nav_group, bundle)
findNavController().let {
Navigate.safeNavigateTo(it, R.id.action_nav_book_to_nav_group, bundle)
}
}
companion object {

View File

@@ -34,6 +34,7 @@ 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.tools.api.Navigate
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment.Companion.json
import top.fumiama.copymanga.ui.vm.ViewMangaActivity
@@ -113,6 +114,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
that?.fbloading?.visibility = View.GONE
complete = true
that?.setStartRead()
that?.setAddToShelf()
Log.d("MyBH", "Set complete: true")
}
@@ -224,6 +226,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
}
private fun setThemes(){
if (exit) return
that?.apply {
book?.results?.comic?.apply {
author?.let { setTheme(getString(R.string.author), it, R.id.action_nav_book_to_nav_author) }
@@ -240,6 +243,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
if(exit) return@runOnUiThread
ViewMangaActivity.fileArray = arrayOf()
ViewMangaActivity.urlArray = arrayOf()
var i = 0
vols?.forEachIndexed { iv, v ->
if(exit) return@runOnUiThread
fbl.addView(layoutInflater.inflate(R.layout.div_h, fbl, false))
@@ -249,7 +253,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
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 ->
v.results.list.forEach {
ViewMangaActivity.urlArray += CMApi.getChapterInfoApiUrl(
comic.path_word,
it.uuid
@@ -261,22 +265,26 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
line = layoutInflater.inflate(R.layout.line_chapter, that!!.fbl, false)
line?.lcc?.apply {
lct.text = it.name
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) }
val index = i
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, index) }
}
fbl?.addView(line)
} else {
line = layoutInflater.inflate(R.layout.line_2chapters, that!!.fbl, false)
line?.l2cl?.apply {
lct.text = it.name
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) }
val index = i
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, index) }
}
}
} else line?.l2cr?.apply {
lct.text = it.name
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) }
val index = i
setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, index) }
fbl?.addView(line)
line = null
}
i++
}
}
endSetLayouts()
@@ -292,7 +300,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
val bundle = Bundle()
bundle.putString("name", name)
bundle.putString("path", path)
that?.apply { findNavController().navigate(nav, bundle) }
that?.apply { Navigate.safeNavigateTo(findNavController(), nav, bundle) }
}
}

View File

@@ -12,6 +12,7 @@ import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.fragment_download.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.copymanga.ui.vm.ViewMangaActivity
import top.fumiama.dmzj.copymanga.R
@@ -96,7 +97,7 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) {
ComicDlFragment.json = jsonFile.readText()
Log.d("MyDF", "root view: $rootView")
Log.d("MyDF", "action_nav_download_to_nav_group")
findNavController().navigate(R.id.action_nav_download_to_nav_group, bundle)
Navigate.safeNavigateTo(findNavController(), R.id.action_nav_download_to_nav_group, bundle)
}
private fun callSelf(title: String){
@@ -105,7 +106,7 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) {
Log.d("MyDF", "Call self to $title")
Log.d("MyDF", "root view: $rootView")
Log.d("MyDF", "action_nav_download_self")
findNavController().navigate(R.id.action_nav_download_self, bundle)
Navigate.safeNavigateTo(findNavController(), R.id.action_nav_download_self, bundle)
}
private fun getFloat(oldString: String): Float {

View File

@@ -9,6 +9,7 @@ import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
import top.fumiama.copymanga.template.ui.CardList
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.dmzj.copymanga.R
import java.io.File
@@ -58,7 +59,7 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
override fun prepareListeners(v: View, name: String, path: String?, chapterUUID: String?, pn: Int?) {
v.setOnClickListener {
if(name==oldDlCardName && path == oldDlCardName) {
findNavController().navigate(R.id.action_nav_new_download_to_nav_download)
Navigate.safeNavigateTo(findNavController(), R.id.action_nav_new_download_to_nav_download)
return@setOnClickListener
}
callDownloadFragment(name)
@@ -79,12 +80,13 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
ComicDlFragment.json = File(File(extDir, name), "info.json").readText()
Log.d("MyNDF", "root view: $rootView")
Log.d("MyNDF", "action_nav_new_download_to_nav_group")
findNavController().navigate(R.id.action_nav_new_download_to_nav_group, bundle)
Navigate.safeNavigateTo(findNavController(), R.id.action_nav_new_download_to_nav_group, bundle)
}
private fun onLoadFinish() {
MainActivity.mainWeakReference?.get()?.runOnUiThread {
if(cardList?.exitCardList == false) mypl.visibility = View.GONE
if(cardList?.exitCardList != false) return@runOnUiThread
mypl.visibility = View.GONE
}
}

View File

@@ -28,6 +28,7 @@ import top.fumiama.copymanga.json.BookListStructure
import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.dmzj.copymanga.R
import java.lang.Thread.sleep
import java.lang.ref.WeakReference
@@ -159,7 +160,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
holder.itemView.vpc.setOnClickListener {
val bundle = Bundle()
homeHandler.index?.results?.banners?.get(position)?.comic?.path_word?.let { it1 -> bundle.putString("path", it1) }
findNavController().navigate(R.id.action_nav_home_to_nav_book, bundle)
Navigate.safeNavigateTo(findNavController(), R.id.action_nav_home_to_nav_book, bundle)
}
}
@@ -198,7 +199,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
holder.itemView.lwc.setOnClickListener {
val bundle = Bundle()
bundle.putString("path", path_word)
findNavController().navigate(R.id.action_nav_home_to_nav_book, bundle)
Navigate.safeNavigateTo(findNavController(), R.id.action_nav_home_to_nav_book, bundle)
}
holder.itemView.lwc.layoutParams.height = fhs.width / 4
}

View File

@@ -28,6 +28,7 @@ import top.fumiama.copymanga.json.ComicStructure
import top.fumiama.copymanga.json.IndexStructure
import top.fumiama.copymanga.template.http.AutoDownloadHandler
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.Navigate
import top.fumiama.copymanga.tools.api.UITools
import java.lang.Thread.sleep
import java.lang.ref.WeakReference
@@ -143,7 +144,9 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
comics += rec.comic
}
if(comics.size == 3) allocateLine(homeF?.getString(R.string.manga_rec)?:"", R.drawable.img_master_work, comics) {
homeF?.findNavController()?.navigate(R.id.action_nav_home_to_nav_recommend)
homeF?.findNavController()?.let { nav ->
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_recommend)
}
}
}
}
@@ -192,7 +195,9 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
comics += rec.comic
}
if(comics.size == 9) allocateLine(homeF?.getString(R.string.new_list)?:"", R.drawable.img_latest_pub, comics) {
homeF?.findNavController()?.navigate(R.id.action_nav_home_to_nav_newest)
homeF?.findNavController()?.let { nav ->
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_newest)
}
}
}
}
@@ -205,7 +210,9 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
comics += rec
}
if(comics.size == 6) allocateLine(homeF?.getString(R.string.complete)?:"", R.drawable.img_novel_eye, comics, true) {
homeF?.findNavController()?.navigate(R.id.action_nav_home_to_nav_finish)
homeF?.findNavController()?.let { nav ->
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_finish)
}
}
}
}
@@ -317,7 +324,9 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
cv.setOnClickListener {
val bundle = Bundle()
bundle.putString("path", pw)
homeF?.findNavController()?.navigate(if(isTopic) R.id.action_nav_home_to_nav_topic else R.id.action_nav_home_to_nav_book, bundle)
homeF?.findNavController()?.let { nav ->
Navigate.safeNavigateTo(nav, if(isTopic) R.id.action_nav_home_to_nav_topic else R.id.action_nav_home_to_nav_book, bundle)
}
}
}

View File

@@ -19,8 +19,8 @@ class PagesManager(w: WeakReference<ViewMangaActivity>) {
fun toNextPage(){
toPage(v?.r2l!=true)
}
private fun judgePrevious() = v?.pageNum?:0 > 1
private fun judgeNext() = v?.pageNum?:0 < v?.realCount?:0
private fun judgePrevious() = (v?.pageNum ?: 0) > 1
private fun judgeNext() = (v?.pageNum ?: 0) < (v?.realCount ?: 0)
@ExperimentalStdlibApi
fun toPage(goNext:Boolean){
if (v?.clicked == false) {

View File

@@ -88,8 +88,8 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
}.start()
9 -> loadScrollMode(msg.arg1)
10 -> loadScrollMode()
11 -> loadImgsIntoLine(msg.arg1)
12 -> loadImgsIntoLine()
11 -> loadImagesIntoLine(msg.arg1)
12 -> loadImagesIntoLine()
13 -> {
dl?.hide()
wv.get()?.restorePN()
@@ -100,7 +100,17 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
Log.d("MyVMH", "Load page from $item")
}
15 -> dl?.hide()
//16 -> wv.get()?.prepareItems()
16 -> if (infcShowed) {
hideInfCardFull(); infcShowed = false
}
17 -> if (!infcShowed) {
showInfCardFull(); infcShowed = true
}
18 -> infcShowed = if (infcShowed) {
hideInfCardFull(); false
} else {
showInfCardFull(); true
}
22 -> wv.get()?.idtime?.text = SimpleDateFormat("HH:mm").format(Date()) + week + wv.get()?.toolsBox?.netinfo
}
}
@@ -163,8 +173,8 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
wv.get()?.initManga()
wv.get()?.vprog?.visibility = View.GONE
}
private fun loadImgsIntoLine(item: Int = (wv.get()?.currentItem?:0), maxCount: Int = (wv.get()?.verticalLoadMaxCount?:20)) /*= Thread*/{
Log.d("MyVMH", "Fun: loadImgsIntoLine($item, $maxCount)")
private fun loadImagesIntoLine(item: Int = (wv.get()?.currentItem?:0), maxCount: Int = (wv.get()?.verticalLoadMaxCount?:20)) /*= Thread*/{
Log.d("MyVMH", "Fun: loadImagesIntoLine($item, $maxCount)")
wv.get()?.realCount?.let { count ->
if(count > 0){
val notFull = item + maxCount > count
@@ -197,8 +207,18 @@ class VMHandler(activity: ViewMangaActivity, url: String) : AutoDownloadHandler(
ObjectAnimator.ofFloat(infcard, "translationY", delta, 0F).setDuration(233).start()
}
private fun showInfCardFull() {
Log.d("MyVMH", "Read info drawer delta: $delta")
ObjectAnimator.ofFloat(infcard?.idc, "alpha", 0.0F, 0.8F).setDuration(233).start()
ObjectAnimator.ofFloat(infcard, "translationY", delta, 0F).setDuration(233).start()
}
private fun hideInfCard() {
ObjectAnimator.ofFloat(infcard?.idc, "alpha", 0.8F, 0.3F).setDuration(233).start()
ObjectAnimator.ofFloat(infcard, "translationY", 0F, delta).setDuration(233).start()
}
private fun hideInfCardFull() {
ObjectAnimator.ofFloat(infcard?.idc, "alpha", 0.8F, 0.0F).setDuration(233).start()
ObjectAnimator.ofFloat(infcard, "translationY", 0F, delta).setDuration(233).start()
}
}

View File

@@ -4,8 +4,13 @@ import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.app.Service
import android.content.Context
import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.media.AudioManager
import android.os.Bundle
import android.os.Handler
@@ -13,6 +18,7 @@ import android.util.Log
import android.view.*
import android.widget.SeekBar
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.RecyclerView
@@ -36,6 +42,7 @@ import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.template.general.TitleActivityTemplate
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.api.Font
import top.fumiama.copymanga.tools.http.DownloadTools
import top.fumiama.copymanga.tools.thread.TimeThread
import top.fumiama.copymanga.views.ScaleImageView
@@ -85,6 +92,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
private var volTurnPage = false
private var am: AudioManager? = null
private var pm: PagesManager? = null
private var fullyHideInfo = false
val realCount get() = if(cut) indexMap.size else count
@SuppressLint("SetTextI18n")
@@ -108,6 +116,8 @@ class ViewMangaActivity : TitleActivityTemplate() {
tt.start()
volTurnPage = settingsPref?.getBoolean("settings_cat_vm_sw_vol_turn", false)?:false
am = getSystemService(Service.AUDIO_SERVICE) as AudioManager
if (!noCellarAlert) noCellarAlert = settingsPref?.getBoolean("settings_cat_net_sw_use_cellar", false) == true
fullyHideInfo = settingsPref?.getBoolean("settings_cat_vm_sw_hide_info", false) == true
Log.d("MyVM", "Now ZipFile is $zipFile")
try {
@@ -148,7 +158,10 @@ class ViewMangaActivity : TitleActivityTemplate() {
}
private fun alertCellar() {
toolsBox.buildInfo("注意", "要使用使用流量观看吗?", "确定", "不再提醒", "取消", {handler.startLoad()}, { noCellarAlert = true; handler.startLoad()}, {finish()})
toolsBox.buildInfo(
"注意", "要使用使用流量观看吗?", "确定", "本次阅读不再提醒", "取消",
{ handler.startLoad() }, { noCellarAlert = true; handler.startLoad() }, { finish() }
)
}
fun restorePN(){
@@ -354,11 +367,26 @@ class ViewMangaActivity : TitleActivityTemplate() {
}.start()
}
private fun getLoadingBitmap(position: Int): Bitmap {
val loading = Bitmap.createBitmap(1024, 256, Bitmap.Config.ARGB_8888)
val canvas = Canvas(loading)
val paint = Paint()
paint.color = ContextCompat.getColor(applicationContext, R.color.design_default_color_surface)
paint.textSize = 100.0f
paint.typeface = Font.nisiTypeFace!!
val text = "${position+1}"
val x = (canvas.width - paint.measureText(text)) / 2
val y = (canvas.height + paint.descent() - paint.ascent()) / 2
canvas.drawText(text, x, y, paint)
return loading
}
fun loadImgOn(imgView: ScaleImageView, position: Int, isLast: Int = 0){
Log.d("MyVM", "Load img: $position")
val index2load = if(cut) Math.abs(indexMap[position]) -1 else position
val useCut = cut && isCut[index2load]
val isLeft = cut && indexMap[position] > 0
loadImg(imgView, getLoadingBitmap(position), isLast, useCut, isLeft)
if (zipFile?.exists() == true) getImgBitmap(index2load)?.let {
loadImg(imgView, it, isLast, useCut, isLeft)
}
@@ -428,6 +456,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
infoDrawerDelta = position.toFloat()
infcard.translationY = infoDrawerDelta
Log.d("MyVM", "Set info drawer delta to $infoDrawerDelta")
handler.sendEmptyMessage(if (fullyHideInfo) 16 else 1)
}
@ExperimentalStdlibApi
@@ -538,7 +567,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
})
isearch.setImageResource(R.drawable.ic_author)
isearch.setOnClickListener {
handler.sendEmptyMessage(3)
handler.sendEmptyMessage(if (fullyHideInfo) 18 else 3) // trigger info card
}
}
@@ -641,12 +670,16 @@ class ViewMangaActivity : TitleActivityTemplate() {
val thisOneI = holder.itemView.onei
Glide.with(this@ViewMangaActivity)
.asBitmap()
.load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)
).into(object : SimpleTarget<Bitmap>() {
.load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders))
.placeholder(BitmapDrawable(resources, getLoadingBitmap(pos)))
.into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
thisOneI.setImageBitmap(cutBitmap(resource, isLeft))
} })
} else Glide.with(this@ViewMangaActivity).load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)).into(holder.itemView.onei)
} else Glide.with(this@ViewMangaActivity)
.load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders))
.placeholder(BitmapDrawable(resources, getLoadingBitmap(pos)))
.into(holder.itemView.onei)
}
}
@@ -680,7 +713,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
infseek.visibility = View.GONE
isearch.visibility = View.GONE
}, 300)
handler.sendEmptyMessage(1)
handler.sendEmptyMessage(if (fullyHideInfo) 16 else 1)
}
companion object {

BIN
app/src/main/res/font/nisi.ttf Executable file

Binary file not shown.

View File

@@ -60,6 +60,7 @@
<string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=3</string>
<string name="historyApiUrl">https://%1$s/api/v3/member/browse/comics?limit=21&amp;offset=%2$d&amp;platform=3</string>
<string name="shelfApiUrl">https://%1$s/api/v3/member/collect/comics?limit=21&amp;offset=%2$d&amp;free_type=1&amp;ordering=%3$s&amp;platform=3</string>
<string name="shelfOperateApiUrl">https://%1$s/api/v3/member/collect/comic</string>
<string name="imgProxyApiUrl">https://copymanga.azurewebsites.net/api/img?code=%1$s&amp;url=%2$s</string>
<string name="imgProxyApiPrefix">https://hi77-overseas.mangafuna.xyz/</string>
@@ -108,6 +109,8 @@
<string name="caption">标签</string>
<string name="settings_cat_net">网络</string>
<string name="settings_cat_net_sw_use_cellar">总是使用流量观看</string>
<string name="settings_cat_net_sm_use_cellar">打开后不再在开始阅读时提示</string>
<string name="settings_cat_net_sw_use_foreign">使用海外线路</string>
<string name="settings_cat_net_sm_use_foreign">不管使用什么线路, API访问均是海外, 只有图片CDN可能会变化也可能不变, 请酌情选择使用</string>
<string name="settings_cat_net_et_title_api_url">请求API网址</string>
@@ -120,6 +123,8 @@
<string name="settings_cat_net_et_summary_img_proxy">为避免滥用代理密钥需加群559748702获得且随时可能会刷新</string>
<string name="settings_cat_vm">漫画浏览</string>
<string name="settings_cat_vm_sw_hide_info">隐藏底部时间栏</string>
<string name="settings_cat_vm_sm_hide_info">打开后不再在底部显示时间和网络状态</string>
<string name="settings_cat_vm_sw_vol_turn">音量键翻页</string>
<string name="settings_cat_vm_sm_vol_turn">使用音量上下键前后翻页</string>
<string name="settings_cat_vm_sb_vertical_max">竖向翻页一次加载页数</string>

View File

@@ -4,6 +4,12 @@
<PreferenceCategory
app:iconSpaceReserved="false"
app:title="@string/settings_cat_net">
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_net_sw_use_cellar"
app:selectable="true"
app:summary="@string/settings_cat_net_sm_use_cellar"
app:title="@string/settings_cat_net_sw_use_cellar" />
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_net_sw_use_foreign"
@@ -49,6 +55,12 @@
<PreferenceCategory
app:iconSpaceReserved="false"
app:title="@string/settings_cat_vm">
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_vm_sw_hide_info"
app:selectable="true"
app:summary="@string/settings_cat_vm_sm_hide_info"
app:title="@string/settings_cat_vm_sw_hide_info" />
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_vm_sw_vol_turn"