From 9972530851973d6ff8af2dc8ce279a1b11f78a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Tue, 31 Oct 2023 00:03:10 +0900 Subject: [PATCH] =?UTF-8?q?v2.0.2=20=E6=96=B0=E5=A2=9E=201.=20=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E5=8F=AF=E4=BB=A5=E5=8A=A0=E8=BD=BD=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=201.=20=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=95=B0=E6=8D=AE=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E9=97=AA=E9=80=80(#34)=202.=20=E4=BF=9D=E5=AD=98=E5=B0=81?= =?UTF-8?q?=E9=9D=A2=E8=B6=85=E6=97=B6=E5=AF=BC=E8=87=B4=E7=9A=84=E9=97=AA?= =?UTF-8?q?=E9=80=80(870551a6)=20=E4=BC=98=E5=8C=96=201.=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20targetSdkVersion=20=E5=88=B0=2034(870551a6)=202.=20?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=94=AF=E6=8C=81=E5=B5=8C=E5=A5=97=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=203.=20=E5=BA=95=E9=83=A8=E6=8C=89=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E6=A0=8F=E9=AB=98=E5=BA=A6=E5=9E=AB=E9=AB=98=204.=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=20Gson=20=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 ++-- .../general/MangaPagesFragmentTemplate.kt | 2 ++ .../template/general/NoBackRefreshFragment.kt | 3 ++ .../top/fumiama/copymanga/tools/ui/UITools.kt | 27 ++++++++++----- .../fumiama/copymanga/ui/book/BookFragment.kt | 2 ++ .../fumiama/copymanga/ui/book/BookHandler.kt | 27 ++++++++------- .../ui/cardflow/search/SearchFragment.kt | 24 ++++++++++++++ .../copymanga/ui/comicdl/ComicDlFragment.kt | 2 ++ .../copymanga/ui/download/DownloadFragment.kt | 3 +- .../fumiama/copymanga/ui/home/HomeFragment.kt | 33 ++++++++++++++++--- .../copymanga/ui/settings/SettingsFragment.kt | 11 ++++++- .../top/fumiama/copymanga/update/Update.kt | 2 +- app/src/main/res/layout/fragment_book.xml | 3 +- app/src/main/res/layout/fragment_dlcomic.xml | 3 +- app/src/main/res/layout/fragment_download.xml | 3 +- app/src/main/res/layout/fragment_home.xml | 3 +- app/src/main/res/layout/fragment_search.xml | 10 ++++++ .../main/res/layout/line_lazybooklines.xml | 3 +- .../main/res/navigation/mobile_navigation.xml | 23 ++++++++++++- app/src/main/res/values/strings.xml | 3 ++ 20 files changed, 153 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/top/fumiama/copymanga/ui/cardflow/search/SearchFragment.kt create mode 100644 app/src/main/res/layout/fragment_search.xml diff --git a/app/build.gradle b/app/build.gradle index 1fd51de..33db89f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId 'top.fumiama.copymanga' minSdkVersion 23 targetSdkVersion 34 - versionCode 37 - versionName '2.0.1' + versionCode 38 + versionName '2.0.2' resConfigs 'zh', 'zh-rCN' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -69,7 +69,7 @@ dependencies { implementation 'com.to.aboomy:pager2banner:1.0.1' implementation 'com.github.bumptech.glide:glide:4.14.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2' - implementation 'com.google.code.gson:gson:2.9.1' + implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.github.vovaksenov99:OverscrollableScrollView:1.0' implementation 'com.liaoinstan.springview:library:1.7.0' implementation 'com.github.zawadz88.materialpopupmenu:material-popup-menu:4.0.1' diff --git a/app/src/main/java/top/fumiama/copymanga/template/general/MangaPagesFragmentTemplate.kt b/app/src/main/java/top/fumiama/copymanga/template/general/MangaPagesFragmentTemplate.kt index 2e3809e..977b3ac 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/general/MangaPagesFragmentTemplate.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/general/MangaPagesFragmentTemplate.kt @@ -91,6 +91,8 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, val isLazy: Boolean = true Log.d("MyMPAT", "Card per row: $cardPerRow") Log.d("MyMPAT", "Card width: $cardWidth") + mydll?.setPadding(0, 0, 0, navBarHeight) + initCardList(WeakReference(this)) managePage() setListeners() diff --git a/app/src/main/java/top/fumiama/copymanga/template/general/NoBackRefreshFragment.kt b/app/src/main/java/top/fumiama/copymanga/template/general/NoBackRefreshFragment.kt index 1cdcaab..84ff2e0 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/general/NoBackRefreshFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/general/NoBackRefreshFragment.kt @@ -6,11 +6,13 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import top.fumiama.copymanga.tools.ui.UITools open class NoBackRefreshFragment(private val layoutToLoad: Int): Fragment() { private var _rootView: View? = null val rootView: View get() = _rootView!! var isFirstInflate = true + var navBarHeight = 0 override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -24,6 +26,7 @@ open class NoBackRefreshFragment(private val layoutToLoad: Int): Fragment() { isFirstInflate = false Log.d("MyNBRF", "not first inflate") } + navBarHeight = context?.let { UITools.getNavigationBarHeight(it) } ?: 0 return rootView } override fun onDestroy() { diff --git a/app/src/main/java/top/fumiama/copymanga/tools/ui/UITools.kt b/app/src/main/java/top/fumiama/copymanga/tools/ui/UITools.kt index ee0ed46..7f9c9a6 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/ui/UITools.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/ui/UITools.kt @@ -113,14 +113,25 @@ class UITools(that: Context?, w: WeakReference? = null) { val totalWidth = ((zis?.resources?.displayMetrics?.widthPixels?:1080)-marginPx)/numPerRow return listOf(numPerRow, w, totalWidth) } - fun toHexStr(byteArray: ByteArray) = - with(StringBuilder()) { - byteArray.forEach { - val hex = it.toInt() and (0xFF) - val hexStr = Integer.toHexString(hex) - if (hexStr.length == 1) append("0").append(hexStr) - else append(hexStr) + companion object { + fun toHexStr(byteArray: ByteArray) = + with(StringBuilder()) { + byteArray.forEach { + val hex = it.toInt() and (0xFF) + val hexStr = Integer.toHexString(hex) + if (hexStr.length == 1) append("0").append(hexStr) + else append(hexStr) + } + toString() + } + fun getNavigationBarHeight(context: Context): Int { + val resources = context.resources + val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") + return if (resourceId > 0) { + resources.getDimensionPixelSize(resourceId) + } else { + 0 } - toString() } + } } \ 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 7fea6a9..69fdaf2 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 @@ -8,6 +8,7 @@ import android.view.View import android.widget.Toast import androidx.navigation.fragment.findNavController import com.google.gson.Gson +import kotlinx.android.synthetic.main.fragment_book.* import kotlinx.android.synthetic.main.line_bookinfo_text.* import kotlinx.android.synthetic.main.line_booktandb.* import top.fumiama.copymanga.MainActivity @@ -30,6 +31,7 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) { super.onViewCreated(view, savedInstanceState) ComicDlFragment.exit = false + fbl?.setPadding(0, 0, 0, navBarHeight) if(isFirstInflate) { var path = "" 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 cf3b38d..109ff1d 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 @@ -385,19 +385,24 @@ class BookHandler(private val th: WeakReference, val path: String) File(mangaFolder, "grps.json").writeText(Gson().toJson(keys)) that?.apply { Thread { - sleep(1000) - if (exit) return@Thread - File(mangaFolder, "head.jpg").let { head -> - val fo = head.outputStream() - try { - imic.drawable.toBitmap().compress(Bitmap.CompressFormat.JPEG, 90, fo) - } catch (e: Exception) { - e.printStackTrace() - that?.activity?.runOnUiThread { - Toast.makeText(that?.context, R.string.download_cover_timeout, Toast.LENGTH_SHORT).show() + var cnt = 0 + var success = false + while (cnt++ < 10 && !success) { + sleep(1000) + if (exit) return@Thread + File(mangaFolder, "head.jpg").let { head -> + val fo = head.outputStream() + try { + imic.drawable.toBitmap().compress(Bitmap.CompressFormat.JPEG, 90, fo) + success = true + } catch (e: Exception) { + e.printStackTrace() } + fo.close() } - fo.close() + } + if (!success) that?.activity?.runOnUiThread { + Toast.makeText(that?.context, R.string.download_cover_timeout, Toast.LENGTH_SHORT).show() } }.start() } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/search/SearchFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/search/SearchFragment.kt new file mode 100644 index 0000000..39ff6ac --- /dev/null +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/search/SearchFragment.kt @@ -0,0 +1,24 @@ +package top.fumiama.copymanga.ui.cardflow.search + +import android.os.Bundle +import android.util.Log +import top.fumiama.copymanga.template.ui.InfoCardLoader +import top.fumiama.copymanga.tools.api.CMApi +import top.fumiama.dmzj.copymanga.R + +@ExperimentalStdlibApi +class SearchFragment : InfoCardLoader(R.layout.fragment_search, R.id.action_nav_search_to_nav_book) { + private var query: String? = null + private var type: String? = null + override fun getApiUrl() = + getString(R.string.searchApiUrl).format(CMApi.myHostApiUrl, page * 21, query, type) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (isFirstInflate) { + query = arguments?.getCharSequence("query")?.toString() + type = arguments?.getString("type") + Log.d("MySF", "get query=$query, type=$type") + } + } +} 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 686b079..d40a6d9 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 @@ -5,6 +5,7 @@ import android.os.Looper import android.util.Log import android.view.View import com.google.gson.Gson +import kotlinx.android.synthetic.main.fragment_dlcomic.* import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.json.ChapterStructure import top.fumiama.copymanga.json.VolumeStructure @@ -22,6 +23,7 @@ class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) exit = false + ldwn?.setPadding(0, 0, 0, navBarHeight) if(isFirstInflate){ when { arguments?.getBoolean("callFromOldDL", false) == true -> initOldComicData() diff --git a/app/src/main/java/top/fumiama/copymanga/ui/download/DownloadFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/download/DownloadFragment.kt index 2c0bfe3..a483bad 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/download/DownloadFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/download/DownloadFragment.kt @@ -38,7 +38,8 @@ class DownloadFragment: NoBackRefreshFragment(R.layout.fragment_download) { if(o1.endsWith(".zip") && o2.endsWith(".zip")) (10000*getFloat(o1) - 10000*getFloat(o2) + 0.5).toInt() else o1[0] - o2[0] }?.let { - mylv.apply { + mylv?.apply { + setPadding(0, 0, 0, navBarHeight) context.let { c -> adapter = ArrayAdapter(c, android.R.layout.simple_list_item_1, it) setOnItemClickListener { _, _, position, _ -> diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt index 50c039b..14f266e 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt @@ -30,6 +30,7 @@ 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.ui.Navigate +import top.fumiama.copymanga.tools.ui.UITools import top.fumiama.dmzj.copymanga.R import java.lang.Thread.sleep import java.lang.ref.WeakReference @@ -37,6 +38,7 @@ import java.lang.ref.WeakReference class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { lateinit var homeHandler: HomeHandler + @SuppressLint("ClickableViewAccessibility") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if(isFirstInflate) { @@ -47,8 +49,13 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { resources.getColor(R.color.colorGreen, theme)) swiperefresh?.isEnabled = true - fhs.apply { + fhl?.setPadding(0, 0, 0, navBarHeight) + + fhs?.apply { + isNestedScrollingEnabled = true val recyclerView = findViewById(R.id.search_recycler_view) + recyclerView.isNestedScrollingEnabled = true + recyclerView.setPadding(0, 0, 0, navBarHeight) setAdapterLayoutManager(LinearLayoutManager(context)) val adapter = ListViewHolder(recyclerView).RecyclerViewAdapter() setAdapter(adapter) @@ -182,7 +189,9 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { inner class RecyclerViewAdapter : RecyclerView.Adapter() { private var results: BookListStructure? = null - var type = "" + var type = "" + private var query: CharSequence? = null + private var count = 0 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder { return ListViewHolder( LayoutInflater.from(parent.context) @@ -193,7 +202,21 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { @SuppressLint("ClickableViewAccessibility", "SetTextI18n") override fun onBindViewHolder(holder: ListViewHolder, position: Int) { Log.d("MyMain", "Bind open at $position") + if (position == itemCount-1) { + holder.itemView.tn.setText(R.string.button_more) + holder.itemView.ta.text = "搜索 \"$query\"" + holder.itemView.tb.text = "共 $count 条结果" + holder.itemView.lwi.visibility = View.INVISIBLE + if (query?.isNotEmpty() == true) holder.itemView.lwc.setOnClickListener { + val bundle = Bundle() + bundle.putCharSequence("query", query) + bundle.putString("type", type) + Navigate.safeNavigateTo(findNavController(), R.id.action_nav_home_to_nav_search, bundle) + } + return + } results?.results?.list?.get(position)?.apply { + holder.itemView.lwi.visibility = View.VISIBLE holder.itemView.tn.text = name holder.itemView.ta.text = author.let { var t = "" @@ -215,12 +238,14 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { } } - override fun getItemCount() = results?.results?.list?.size?:0 + override fun getItemCount() = (results?.results?.list?.size?:0)+1 - fun refresh(query: CharSequence) { + fun refresh(q: CharSequence) { + query = q mainWeakReference?.get()?.apply { AutoDownloadThread(getString(R.string.searchApiUrl).format(CMApi.myHostApiUrl, 0, query, type)) { results = Gson().fromJson(it?.decodeToString(), BookListStructure::class.java) + count = results?.results?.total?:0 runOnUiThread { notifyDataSetChanged() } }.start() } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/settings/SettingsFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/settings/SettingsFragment.kt index 420c650..cd6241b 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/settings/SettingsFragment.kt @@ -4,12 +4,14 @@ 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.preference.EditTextPreference import androidx.preference.EditTextPreferenceDialogFragmentCompat import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import top.fumiama.copymanga.tools.ui.UITools import top.fumiama.dmzj.copymanga.R import java.lang.Thread.sleep @@ -18,6 +20,13 @@ class SettingsFragment: PreferenceFragmentCompat() { setPreferencesFromResource(R.xml.pref_setting, rootKey) } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + context?.let { c -> + view.setPadding(0, 0, 0, UITools.getNavigationBarHeight(c)) + } + } + override fun onDisplayPreferenceDialog(preference: Preference) { if (preference is EditTextPreference) { Log.d("MySF", "preference is EditTextPreference") @@ -41,7 +50,7 @@ class SettingsFragment: PreferenceFragmentCompat() { Log.d("MySF", "diff: $diff") } Log.d("MySF", "diff out while: $diff") - if (diff == 0) return@Thread + if (diff <= 0) return@Thread Log.d("MySF", "f.dialog is ${f.dialog}") f.activity?.runOnUiThread { f.dialog?.window?.apply { 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 14b42a4..642c2f8 100644 --- a/app/src/main/java/top/fumiama/copymanga/update/Update.kt +++ b/app/src/main/java/top/fumiama/copymanga/update/Update.kt @@ -47,7 +47,7 @@ object Update { } }) { val md5 = msg.substringAfterLast("md5:") - if (md5 == toolsBox.toHexStr( + if (md5 == UITools.toHexStr( MessageDigest.getInstance("MD5").digest(it) ) ) { diff --git a/app/src/main/res/layout/fragment_book.xml b/app/src/main/res/layout/fragment_book.xml index 31e9de0..ae49f73 100644 --- a/app/src/main/res/layout/fragment_book.xml +++ b/app/src/main/res/layout/fragment_book.xml @@ -13,8 +13,7 @@ android:id="@+id/fbl" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="@dimen/global_content_padding_bottom"/> + android:orientation="vertical"/> + android:orientation="vertical"/> + android:nestedScrollingEnabled="true"/> diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 6f2671c..746b351 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -28,8 +28,7 @@ android:id="@+id/fhl" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - android:paddingBottom="@dimen/global_content_padding_bottom"> + android:orientation="vertical"> diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml new file mode 100644 index 0000000..fcfa627 --- /dev/null +++ b/app/src/main/res/layout/fragment_search.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line_lazybooklines.xml b/app/src/main/res/layout/line_lazybooklines.xml index f497295..2499494 100644 --- a/app/src/main/res/layout/line_lazybooklines.xml +++ b/app/src/main/res/layout/line_lazybooklines.xml @@ -25,8 +25,7 @@ android:id="@+id/mydll" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="@dimen/global_content_padding_bottom"/> + android:orientation="vertical"/> diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 2add780..e4fb17c 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -45,6 +45,13 @@ app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_out_left_exit" app:popExitAnim="@anim/slide_in_right_exit"/> + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3d2c33a..df5bab1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,6 +21,7 @@ 章节内容 漫画下载 专题系列 + 漫画搜索 检查更新 设置搜索类别 @@ -37,6 +38,7 @@ N/A 获取图书信息失败 网络错误 + 保存封面失败 保存封面超时 https://%1$s/api/v3/h5/homeIndex?platform=3 @@ -93,6 +95,7 @@ 加入书架 已加书架 开始阅读 + 更多 热度 %1$d 状态 %1$s