1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-07-02 00:30:25 +08:00
新增
1. 看板娘加载背景
修复
1. 设置输入框无法缩回中部
优化
1. 限用MainActivity弱引用
This commit is contained in:
源文雨
2024-04-10 23:11:16 +09:00
parent 5ea5ad631e
commit 43de1640f1
23 changed files with 220 additions and 96 deletions

BIN
.github/komako.jpg vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

View File

@@ -5,6 +5,7 @@
<w>downloaders</w> <w>downloaders</w>
<w>grps</w> <w>grps</w>
<w>imgs</w> <w>imgs</w>
<w>kohima</w>
<w>lowpan</w> <w>lowpan</w>
<w>mangacopy</w> <w>mangacopy</w>
<w>mangafuna</w> <w>mangafuna</w>

View File

@@ -1,5 +1,5 @@
<div align="center"> <div align="center">
<img src=".github/komako.jpg" width = "300" height = "300" alt="Komako"><br> <img src="app/src/main/res/drawable-nodpi/kohima.webp" width = "256" height = "256" alt="Kohima"><br>
<h1>copymanga 拷贝漫画</h1> <h1>copymanga 拷贝漫画</h1>
拷贝漫画的第三方APP优化阅读/下载体验<br><br> 拷贝漫画的第三方APP优化阅读/下载体验<br><br>

View File

@@ -8,8 +8,8 @@ android {
applicationId 'top.fumiama.copymanga' applicationId 'top.fumiama.copymanga'
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 34 targetSdkVersion 34
versionCode 56 versionCode 57
versionName '2.2.8' versionName '2.2.9'
resourceConfigurations += ['zh', 'zh-rCN'] resourceConfigurations += ['zh', 'zh-rCN']
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -53,7 +53,6 @@ import top.fumiama.copymanga.tools.ui.UITools
import top.fumiama.copymanga.ui.book.BookFragment.Companion.bookHandler import top.fumiama.copymanga.ui.book.BookFragment.Companion.bookHandler
import top.fumiama.copymanga.ui.cardflow.rank.RankFragment import top.fumiama.copymanga.ui.cardflow.rank.RankFragment
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
import top.fumiama.copymanga.ui.download.DownloadFragment
import top.fumiama.copymanga.ui.download.NewDownloadFragment import top.fumiama.copymanga.ui.download.NewDownloadFragment
import top.fumiama.copymanga.update.Update import top.fumiama.copymanga.update.Update
import top.fumiama.copymanga.user.Member import top.fumiama.copymanga.user.Member
@@ -98,22 +97,6 @@ class MainActivity : AppCompatActivity() {
) )
setupActionBarWithNavController(navController!!, appBarConfiguration) setupActionBarWithNavController(navController!!, appBarConfiguration)
nav_view.setupWithNavController(navController!!) nav_view.setupWithNavController(navController!!)
PreferenceManager.getDefaultSharedPreferences(this)?.apply {
if (contains("settings_cat_general_sb_startup_menu")) getString("settings_cat_general_sb_startup_menu", "0")?.toInt()?.let {
if (it > 0) {
Log.d("MyMain", "nav 2 dest $it")
navController!!.navigate(listOf(
R.id.nav_home,
R.id.nav_sort,
R.id.nav_rank,
R.id.nav_sub,
R.id.nav_history,
R.id.nav_new_download,
R.id.nav_settings
)[it])
}
}
}
headPic = File(getExternalFilesDir(""), "headPic") headPic = File(getExternalFilesDir(""), "headPic")
drawer_layout.addDrawerListener(object : DrawerLayout.DrawerListener { drawer_layout.addDrawerListener(object : DrawerLayout.DrawerListener {
@@ -161,6 +144,26 @@ class MainActivity : AppCompatActivity() {
} }
} }
override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
PreferenceManager.getDefaultSharedPreferences(this)?.apply {
if (contains("settings_cat_general_sb_startup_menu")) getString("settings_cat_general_sb_startup_menu", "0")?.toInt()?.let {
if (it > 0) {
Log.d("MyMain", "nav 2 dest $it")
navController!!.navigate(listOf(
R.id.nav_home,
R.id.nav_sort,
R.id.nav_rank,
R.id.nav_sub,
R.id.nav_history,
R.id.nav_new_download,
R.id.nav_settings
)[it])
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present. // Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.main, menu) menuInflater.inflate(R.menu.main, menu)

View File

@@ -69,6 +69,7 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, private val isLazy: Boolea
return return
} }
lifecycleScope.launch { lifecycleScope.launch {
showKanban()
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
delay(600) delay(600)
setLayouts() setLayouts()
@@ -100,6 +101,7 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, private val isLazy: Boolea
initCardList(WeakReference(this@MangaPagesFragmentTemplate)) initCardList(WeakReference(this@MangaPagesFragmentTemplate))
managePage() managePage()
setListeners() setListeners()
hideKanban()
} }
private suspend fun managePage() { private suspend fun managePage() {
@@ -116,9 +118,11 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, private val isLazy: Boolea
override fun onRefresh() { override fun onRefresh() {
lifecycleScope.launch { lifecycleScope.launch {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
showKanban()
reset() reset()
delay(600) delay(600)
addPage() addPage()
hideKanban()
} }
} }
} }

View File

@@ -1,18 +1,30 @@
package top.fumiama.copymanga.template.general package top.fumiama.copymanga.template.general
import android.animation.ObjectAnimator
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.animation.doOnEnd
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
import kotlinx.android.synthetic.main.content_main.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.tools.ui.UITools import top.fumiama.copymanga.tools.ui.UITools
import java.util.concurrent.atomic.AtomicBoolean
open class NoBackRefreshFragment(private val layoutToLoad: Int): Fragment() { open class NoBackRefreshFragment(private val layoutToLoad: Int): Fragment() {
private var _rootView: View? = null private var _rootView: View? = null
val rootView: View get() = _rootView!! val rootView: View get() = _rootView!!
var isFirstInflate = true var isFirstInflate = true
var navBarHeight = 0 var navBarHeight = 0
private val disableAnimation = MainActivity.mainWeakReference?.get()?.let {
PreferenceManager.getDefaultSharedPreferences(it)
}?.getBoolean("settings_cat_general_sw_disable_kanban_animation", false)?:false
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@@ -31,7 +43,40 @@ open class NoBackRefreshFragment(private val layoutToLoad: Int): Fragment() {
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
Thread { runBlocking { hideKanban() } }.start()
_rootView = null _rootView = null
isFirstInflate = true isFirstInflate = true
Log.d("MyNBRF", "destroyed")
}
suspend fun showKanban() = withContext(Dispatchers.Main) {
if (disableAnimation) return@withContext
(activity?:(MainActivity.mainWeakReference?.get()))?.apply {cmaini?.post {
if(cmaini?.visibility == View.GONE) {
Log.d("MyNBRF", "show: start, set h: ${window?.decorView?.height}")
cmaini?.translationY = window?.decorView?.height?.toFloat()?:0f
cmaini?.visibility = View.VISIBLE
ObjectAnimator.ofFloat(cmaini, "translationY", cmaini?.translationY?:0f, 0f).setDuration(300).start()
}
}
}?:Log.d("MyNBRF", "show: null kanban ImgView")
Log.d("MyNBRF", "show: end")
}
private var isHideRunning = AtomicBoolean()
suspend fun hideKanban() = withContext(Dispatchers.Main) {
if (disableAnimation) return@withContext
(activity?:(MainActivity.mainWeakReference?.get()))?.apply { cmaini?.post {
if(!isHideRunning.get() && cmaini?.visibility == View.VISIBLE) {
isHideRunning.set(true)
Log.d("MyNBRF", "hide: start, set h: ${window?.decorView?.height}")
ObjectAnimator.ofFloat(cmaini, "translationY", 0f, window?.decorView?.height?.toFloat()?:0f).setDuration(300).also {
it.doOnEnd {
cmaini?.visibility = View.GONE
isHideRunning.set(false)
Log.d("MyNBRF", "hide: set gone")
}
}.start()
}
} }?:Log.d("MyNBRF", "hide: null kanban ImgView")
Log.d("MyNBRF", "hide: end")
} }
} }

View File

@@ -180,8 +180,10 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
lifecycleScope.launch { lifecycleScope.launch {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
delay(timeMillis) delay(timeMillis)
showKanban()
reset() reset()
addPage() addPage()
hideKanban()
} }
} }
} }

View File

@@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.View import android.view.View
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.line_finish.* import kotlinx.android.synthetic.main.line_finish.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@@ -24,7 +23,7 @@ open class ThemeCardFlow(private val api: Int, nav: Int) : StatusCardFlow(0, nav
arguments?.apply { arguments?.apply {
getString("path")?.apply { theme = this } getString("path")?.apply { theme = this }
getString("name")?.apply { getString("name")?.apply {
mainWeakReference?.get()?.toolbar?.title = this activity?.toolbar?.title = this
} }
} }
} }
@@ -38,7 +37,7 @@ open class ThemeCardFlow(private val api: Int, nav: Int) : StatusCardFlow(0, nav
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
arguments?.getString("name")?.apply { arguments?.getString("name")?.apply {
mainWeakReference?.get()?.toolbar?.title = this activity?.toolbar?.title = this
} }
} }
} }

View File

@@ -35,14 +35,12 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.ThemeStructure import top.fumiama.copymanga.json.ThemeStructure
import top.fumiama.copymanga.manga.Reader import top.fumiama.copymanga.manga.Reader
import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.ui.GlideBlurTransformation import top.fumiama.copymanga.tools.ui.GlideBlurTransformation
import top.fumiama.copymanga.tools.ui.GlideHideLottieViewListener import top.fumiama.copymanga.tools.ui.GlideHideLottieViewListener
import top.fumiama.copymanga.tools.ui.Navigate import top.fumiama.copymanga.tools.ui.Navigate
import top.fumiama.copymanga.ui.vm.ViewMangaActivity
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@@ -123,7 +121,7 @@ class BookHandler(private val th: WeakReference<BookFragment>): Handler(Looper.m
that?.apply { that?.apply {
// tic?.text = book?.name // tic?.text = book?.name
// tic?.visibility = View.GONE // tic?.visibility = View.GONE
mainWeakReference?.get()?.toolbar?.title = book?.name activity?.toolbar?.title = book?.name
btauth?.text = that?.getString(R.string.text_format_region)?.format(book?.region?:"未知") btauth?.text = that?.getString(R.string.text_format_region)?.format(book?.region?:"未知")
bttag?.text = that?.getString(R.string.text_format_img_type)?.format(book?.imageType?:"未知") bttag?.text = that?.getString(R.string.text_format_img_type)?.format(book?.imageType?:"未知")
bthit?.text = that?.getString(R.string.text_format_hit)?.format(book?.popular?:-1) bthit?.text = that?.getString(R.string.text_format_hit)?.format(book?.popular?:-1)

View File

@@ -16,7 +16,6 @@ import top.fumiama.copymanga.json.VolumeStructure
import top.fumiama.copymanga.template.general.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.io.File import java.io.File
import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) { class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) {

View File

@@ -23,7 +23,6 @@ import kotlinx.android.synthetic.main.widget_downloadbar.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.ChapterStructure import top.fumiama.copymanga.json.ChapterStructure
import top.fumiama.copymanga.json.ComicStructureOld import top.fumiama.copymanga.json.ComicStructureOld
import top.fumiama.copymanga.json.VolumeStructure import top.fumiama.copymanga.json.VolumeStructure
@@ -126,6 +125,7 @@ class ComicDlHandler(looper: Looper, private val th: WeakReference<ComicDlFragme
} }
complete = true complete = true
} }
that?.hideKanban()
} }
private suspend fun addDiv() = withContext(Dispatchers.Main) { private suspend fun addDiv() = withContext(Dispatchers.Main) {
that?.ldwn?.addView( that?.ldwn?.addView(
@@ -191,7 +191,7 @@ class ComicDlHandler(looper: Looper, private val th: WeakReference<ComicDlFragme
val widthData = toolsBox.calcWidthFromDpRoot(8, 64) val widthData = toolsBox.calcWidthFromDpRoot(8, 64)
btnNumPerRow = widthData[0] btnNumPerRow = widthData[0]
btnw = widthData[1] btnw = widthData[1]
dl = mainWeakReference?.get()?.let { Dialog(it) } dl = that?.activity?.let { Dialog(it) }
dl?.setContentView(R.layout.dialog_unzipping) dl?.setContentView(R.layout.dialog_unzipping)
that?.dlsdwn?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{ that?.dlsdwn?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{
override fun onGlobalLayout() { override fun onGlobalLayout() {

View File

@@ -13,7 +13,6 @@ import kotlinx.android.synthetic.main.fragment_download.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.manga.Reader import top.fumiama.copymanga.manga.Reader
import top.fumiama.copymanga.template.general.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.tools.file.FileUtils import top.fumiama.copymanga.tools.file.FileUtils
@@ -27,7 +26,7 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
if(isFirstInflate) { if(isFirstInflate) {
arguments?.getString("title")?.let { arguments?.getString("title")?.let {
mainWeakReference?.get()?.toolbar?.title = it activity?.toolbar?.title = it
} }
lifecycleScope.launch { lifecycleScope.launch {
scanFile(arguments?.getString("file")?.let { File(it) }?:context?.getExternalFilesDir("")?:run { scanFile(arguments?.getString("file")?.let { File(it) }?:context?.getExternalFilesDir("")?:run {

View File

@@ -12,7 +12,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.manga.Reader import top.fumiama.copymanga.manga.Reader
import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate
import top.fumiama.copymanga.template.ui.CardList import top.fumiama.copymanga.template.ui.CardList
@@ -26,8 +26,8 @@ import java.lang.ref.WeakReference
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownload, forceLoad = true) { class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownload, forceLoad = true) {
private var sortedBookList: List<File>? = null private var sortedBookList: List<File>? = null
private val oldDlCardName = MainActivity.mainWeakReference?.get()?.getString(R.string.old_download_card_name)!! private val oldDlCardName = mainWeakReference?.get()?.getString(R.string.old_download_card_name)!!
private val extDir = MainActivity.mainWeakReference?.get()?.getExternalFilesDir("") private val extDir = mainWeakReference?.get()?.getExternalFilesDir("")
private var isReverse = false private var isReverse = false
private var isContentChanged = false private var isContentChanged = false
private var exit = false private var exit = false
@@ -35,8 +35,9 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
wn = WeakReference(this) wn = WeakReference(this)
val settingsPref = MainActivity.mainWeakReference?.get()?.let { PreferenceManager.getDefaultSharedPreferences(it) } showAll = activity?.let {
showAll = settingsPref?.getBoolean("settings_cat_md_sw_show_0m_manga", false)?:false PreferenceManager.getDefaultSharedPreferences(it)
}?.getBoolean("settings_cat_md_sw_show_0m_manga", false)?:false
} }
override fun onPause() { override fun onPause() {
@@ -221,9 +222,11 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
isContentChanged = true isContentChanged = true
lifecycleScope.launch { lifecycleScope.launch {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
showKanban()
reset() reset()
delay(600) delay(600)
addPage() addPage()
hideKanban()
} }
} }
} }

View File

@@ -26,10 +26,10 @@ import kotlinx.android.synthetic.main.viewpage_horizonal.view.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.MainActivity.Companion.ime import top.fumiama.copymanga.MainActivity.Companion.ime
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.BookListStructure import top.fumiama.copymanga.json.BookListStructure
import top.fumiama.copymanga.template.general.NoBackRefreshFragment import top.fumiama.copymanga.template.general.NoBackRefreshFragment
import top.fumiama.copymanga.template.http.PausableDownloader import top.fumiama.copymanga.template.http.PausableDownloader
@@ -46,9 +46,9 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
if(isFirstInflate) { if(isFirstInflate) {
val tb = mainWeakReference?.get()?.toolsBox val tb = (activity as MainActivity).toolsBox
val netInfo = tb?.netInfo val netInfo = tb.netInfo
if(netInfo != null && netInfo != tb.transportStringNull && netInfo != tb.transportStringError) if(netInfo != tb.transportStringNull && netInfo != tb.transportStringError)
MainActivity.member?.apply { lifecycleScope.launch { MainActivity.member?.apply { lifecycleScope.launch {
info().let { l -> info().let { l ->
if (l.code != 200 && l.code != 449) { if (l.code != 200 && l.code != 449) {
@@ -163,7 +163,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
setOnTouchListener { _, e -> setOnTouchListener { _, e ->
Log.d("MyHF", "fhns on touch") Log.d("MyHF", "fhns on touch")
if (e.action == MotionEvent.ACTION_UP && mSearchEditText?.text?.isNotEmpty() == true) { if (e.action == MotionEvent.ACTION_UP && mSearchEditText?.text?.isNotEmpty() == true) {
ime?.hideSoftInputFromWindow(mainWeakReference?.get()?.window?.decorView?.windowToken, 0) ime?.hideSoftInputFromWindow(activity?.window?.decorView?.windowToken, 0)
} }
false false
} }

View File

@@ -60,7 +60,12 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
override fun handleMessage(msg: Message) { override fun handleMessage(msg: Message) {
super.handleMessage(msg) super.handleMessage(msg)
when (msg.what) { when (msg.what) {
-1 -> homeF?.swiperefresh?.isRefreshing = msg.obj as Boolean -1 -> {
homeF?.apply {
swiperefresh?.isRefreshing = msg.obj as Boolean
lifecycleScope.launch { if(msg.obj as Boolean) showKanban() else hideKanban() }
}
}
//0 -> setLayouts() //0 -> setLayouts()
1 -> inflateCardLines() 1 -> inflateCardLines()
2 -> homeF?.swiperefresh?.let { setSwipe(it) } 2 -> homeF?.swiperefresh?.let { setSwipe(it) }
@@ -274,6 +279,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
Log.d("MyHFH", "Refresh items.") Log.d("MyHFH", "Refresh items.")
homeF?.lifecycleScope?.launch { homeF?.lifecycleScope?.launch {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
homeF?.showKanban()
fhib?.isAutoPlay = false fhib?.isAutoPlay = false
fhib?.adapter?.notifyDataSetChanged() fhib?.adapter?.notifyDataSetChanged()
index = null index = null

View File

@@ -1,15 +1,10 @@
package top.fumiama.copymanga.ui.settings package top.fumiama.copymanga.ui.settings
import android.animation.ObjectAnimator
import android.graphics.Rect
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.view.Window
import androidx.annotation.Keep
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.EditTextPreference import androidx.preference.EditTextPreference
import androidx.preference.EditTextPreferenceDialogFragmentCompat
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -17,6 +12,7 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import top.fumiama.copymanga.tools.ui.UITools import top.fumiama.copymanga.tools.ui.UITools
import top.fumiama.copymanga.views.AutoHideEditTextPreferenceDialogFragmentCompat
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
class SettingsFragment: PreferenceFragmentCompat() { class SettingsFragment: PreferenceFragmentCompat() {
@@ -41,50 +37,11 @@ class SettingsFragment: PreferenceFragmentCompat() {
override fun onDisplayPreferenceDialog(preference: Preference) { override fun onDisplayPreferenceDialog(preference: Preference) {
if (preference is EditTextPreference) { if (preference is EditTextPreference) {
Log.d("MySF", "preference is EditTextPreference") Log.d("MySF", "preference is EditTextPreference")
val f = EditTextPreferenceDialogFragmentCompat.newInstance(preference.key) val f = view?.let { AutoHideEditTextPreferenceDialogFragmentCompat.newInstance(it, preference.key) }?:return
f.setTargetFragment(this, 0) f.setTargetFragment(this, 0)
f.show(parentFragmentManager, null) f.show(parentFragmentManager, null)
lifecycleScope.launch {
withContext(Dispatchers.IO) {
var diff = 0
var cnt = 0
while (diff == 0 && cnt++ < 20) {
delay(50)
if (f.dialog == null) continue
val v = view?:return@withContext
// https://github.com/mikepenz/MaterialDrawer/blob/aa9136fb4f5b3a80460fe5f47213985026d20c88/library/src/main/java/com/mikepenz/materialdrawer/util/KeyboardUtil.java
val r = Rect()
//r will be populated with the coordinates of your view that area still visible.
v.getWindowVisibleDisplayFrame(r)
//get screen height and calculate the difference with the usable area from the r
val height = v.context.resources.displayMetrics.heightPixels
diff = height - r.bottom
Log.d("MySF", "diff: $diff")
}
Log.d("MySF", "diff out while: $diff")
if (diff <= 0) return@withContext
Log.d("MySF", "f.dialog is ${f.dialog}")
withContext(Dispatchers.Main) {
f.dialog?.window?.apply {
val attr = attributes
Log.d("MySF", "animate from ${attr.y} to ${attr.y-diff/2}")
ObjectAnimator.ofInt(WindowAttributeSetter(this), "y", attr.y, attr.y-diff/2).setDuration(233).start()
}
}
}
}
return return
} }
super.onDisplayPreferenceDialog(preference) super.onDisplayPreferenceDialog(preference)
} }
inner class WindowAttributeSetter(private val window: Window) {
@Keep
fun setY(y: Int) {
val attr = window.attributes
attr.y = y
Log.d("MySF", "set y to $y")
window.attributes = attr
}
}
} }

View File

@@ -0,0 +1,81 @@
package top.fumiama.copymanga.views
import android.animation.ObjectAnimator
import android.graphics.Rect
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.Window
import androidx.annotation.Keep
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.lifecycleScope
import androidx.preference.EditTextPreferenceDialogFragmentCompat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class AutoHideEditTextPreferenceDialogFragmentCompat(private val settingsFragmentView: View): EditTextPreferenceDialogFragmentCompat() {
var exit = false
override fun show(manager: FragmentManager, tag: String?) {
super.show(manager, tag)
lifecycleScope.launch { goUp() }
}
override fun onDestroy() {
super.onDestroy()
exit = true
}
private suspend fun goUp() = withContext(Dispatchers.IO) {
var round = 0
while(!exit) {
var diff = round
while (!exit && ((round == 0 && diff == 0) || (round > 0 && diff != 0))) {
delay(200)
if (dialog == null) continue
// https://github.com/mikepenz/MaterialDrawer/blob/aa9136fb4f5b3a80460fe5f47213985026d20c88/library/src/main/java/com/mikepenz/materialdrawer/util/KeyboardUtil.java
val r = Rect()
//r will be populated with the coordinates of your view that area still visible.
settingsFragmentView.getWindowVisibleDisplayFrame(r)
//get screen height and calculate the difference with the usable area from the r
val height = settingsFragmentView.context.resources.displayMetrics.heightPixels
diff = height - r.bottom
Log.d("MySF", "diff: $diff")
}
Log.d("MySF", "diff out while: $diff")
if (diff <= 0 && round == 0) return@withContext
Log.d("MySF", "f.dialog is $dialog")
withContext(Dispatchers.Main) {
dialog?.window?.apply {
val attr = attributes
if (diff != 0) {
Log.d("MySF", "animate from ${attr.y} to ${attr.y-diff/2}")
ObjectAnimator.ofInt(WindowAttributeSetter(this), "y", attr.y, attr.y-diff/2).setDuration(233).start()
} else {
Log.d("MySF", "animate from ${attr.y} to 0")
ObjectAnimator.ofInt(WindowAttributeSetter(this), "y", attr.y, 0).setDuration(233).start()
round = -1
}
}
}
round++
}
}
inner class WindowAttributeSetter(private val window: Window) {
@Keep
fun setY(y: Int) {
val attr = window.attributes
attr.y = y
Log.d("MySF", "set y to $y")
window.attributes = attr
}
}
companion object {
fun newInstance(view: View, key: String?): AutoHideEditTextPreferenceDialogFragmentCompat {
val fragment = AutoHideEditTextPreferenceDialogFragmentCompat(view)
val b = Bundle(1)
b.putString(ARG_KEY, key)
fragment.setArguments(b)
return fragment
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

View File

@@ -7,14 +7,30 @@
app:layout_behavior="@string/appbar_scrolling_view_behavior" app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/app_bar_main"> tools:showIn="@layout/app_bar_main">
<ImageView
android:id="@+id/cmaini"
android:layout_width="0dp"
android:layout_height="0dp"
android:alpha="0.6"
android:scaleType="fitEnd"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/kohima"
tools:visibility="visible" />
<fragment <fragment
android:id="@+id/nav_host_fragment" android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment" android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:defaultNavHost="true" app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" /> app:navGraph="@navigation/mobile_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -26,7 +26,10 @@
android:id="@+id/fbtab" android:id="@+id/fbtab"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:layout_scrollFlags="scroll"/> android:background="@android:color/transparent"
android:backgroundTint="@android:color/transparent"
app:layout_scrollFlags="scroll"
app:tabBackground="@android:color/transparent" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager2.widget.ViewPager2 <androidx.viewpager2.widget.ViewPager2

View File

@@ -141,6 +141,8 @@
<string name="settings_cat_general_et_summary_app_version">默认&appver;</string> <string name="settings_cat_general_et_summary_app_version">默认&appver;</string>
<string name="settings_cat_general_sb_card_per_row">每行加载卡片数偏移</string> <string name="settings_cat_general_sb_card_per_row">每行加载卡片数偏移</string>
<string name="settings_cat_general_sm_card_per_row">默认为0表示无偏移, 在此基础上加减</string> <string name="settings_cat_general_sm_card_per_row">默认为0表示无偏移, 在此基础上加减</string>
<string name="settings_cat_general_sw_disable_kanban_animation">不显示看板娘动画</string>
<string name="settings_cat_general_sm_disable_kanban_animation">如加载卡顿可考虑开启此选项</string>
<string name="settings_cat_net">网络</string> <string name="settings_cat_net">网络</string>
<string name="settings_cat_net_sb_title_image_resolution">图片分辨率</string> <string name="settings_cat_net_sb_title_image_resolution">图片分辨率</string>

View File

@@ -14,15 +14,12 @@
app:entries="@array/menus" app:entries="@array/menus"
app:entryValues="@array/menu_ids" app:entryValues="@array/menu_ids"
android:defaultValue="0"/> android:defaultValue="0"/>
<SeekBarPreference <SwitchPreferenceCompat
android:defaultValue="0"
android:max="8"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="settings_cat_general_sb_card_per_row" app:key="settings_cat_general_sw_disable_kanban_animation"
app:min="-8" app:selectable="true"
app:showSeekBarValue="true" app:summary="@string/settings_cat_general_sm_disable_kanban_animation"
app:summary="@string/settings_cat_general_sm_card_per_row" app:title="@string/settings_cat_general_sw_disable_kanban_animation" />
app:title="@string/settings_cat_general_sb_card_per_row" />
<EditTextPreference <EditTextPreference
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -34,6 +31,15 @@
app:enableCopying="true" app:enableCopying="true"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="settings_cat_general_et_app_version" /> app:key="settings_cat_general_et_app_version" />
<SeekBarPreference
android:defaultValue="0"
android:max="8"
app:iconSpaceReserved="false"
app:key="settings_cat_general_sb_card_per_row"
app:min="-8"
app:showSeekBarValue="true"
app:summary="@string/settings_cat_general_sm_card_per_row"
app:title="@string/settings_cat_general_sb_card_per_row" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:iconSpaceReserved="false" app:iconSpaceReserved="false"