From f7d85a0869f1531ca8ae721357d87fb311bbb56a Mon Sep 17 00:00:00 2001 From: renhaoting <370797079@qq.com> Date: Fri, 7 Nov 2025 16:55:22 +0800 Subject: [PATCH] =?UTF-8?q?1=20=E5=8E=86=E5=8F=B2=E9=A1=B5=E9=9D=A23?= =?UTF-8?q?=E4=B8=AAfragment=20ui=E5=88=9D=E6=AD=A5=202.room=E5=BC=95?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VisualNovel/app/build.gradle.kts | 37 +++++++++++++++--- .../repository/api/ChatRepository.kt | 1 + .../ui/main/history/HistoryFragment.kt | 30 +++++++++++++- .../customui/HistoryActorFilterView.kt | 22 +++++++++++ .../customui/HistoryComicFilterView.kt | 20 ++++++++++ .../customui/HistoryMangaFilterView.kt | 21 ++++++++++ .../history/fragments/HistoryActorFragment.kt | 8 ++-- .../history/fragments/HistoryComicFragment.kt | 4 +- .../history/fragments/HistoryMangaFragment.kt | 3 +- .../com/remax/visualnovel/utils/Routers.kt | 4 ++ .../main/res/layout/fragment_main_history.xml | 2 + .../layout/fragment_main_history_actor.xml | 21 ++++++++++ .../layout/fragment_main_history_comic.xml | 21 ++++++++++ .../layout/fragment_main_history_manga.xml | 21 ++++++++++ .../res/layout/hisotry_filter_bar_actor.xml | 39 +++++++++++++++++++ .../res/layout/hisotry_filter_bar_comic.xml | 39 +++++++++++++++++++ .../res/layout/hisotry_filter_bar_manga.xml | 39 +++++++++++++++++++ .../src/main/res/layout/item_smooth_tab.xml | 18 +++++---- .../app/src/main/res/values/colors.xml | 4 +- .../app/src/main/res/values/strings.xml | 2 +- VisualNovel/buildSrc/src/main/java/Deps.kt | 7 ++++ 21 files changed, 340 insertions(+), 23 deletions(-) create mode 100644 VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryActorFilterView.kt create mode 100644 VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryComicFilterView.kt create mode 100644 VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryMangaFilterView.kt create mode 100644 VisualNovel/app/src/main/res/layout/fragment_main_history_actor.xml create mode 100644 VisualNovel/app/src/main/res/layout/fragment_main_history_comic.xml create mode 100644 VisualNovel/app/src/main/res/layout/fragment_main_history_manga.xml create mode 100644 VisualNovel/app/src/main/res/layout/hisotry_filter_bar_actor.xml create mode 100644 VisualNovel/app/src/main/res/layout/hisotry_filter_bar_comic.xml create mode 100644 VisualNovel/app/src/main/res/layout/hisotry_filter_bar_manga.xml diff --git a/VisualNovel/app/build.gradle.kts b/VisualNovel/app/build.gradle.kts index 733602b..a221ce7 100644 --- a/VisualNovel/app/build.gradle.kts +++ b/VisualNovel/app/build.gradle.kts @@ -1,26 +1,30 @@ +import Deps.room_version import com.android.build.api.dsl.ApplicationProductFlavor plugins { id("com.android.application") - kotlin("android") + id("org.jetbrains.kotlin.android") id("kotlin-parcelize") - kotlin("kapt") + id("kotlin-kapt") id("dagger.hilt.android.plugin") - //TODO - enable later: id("com.google.gms.google-services") id("com.google.firebase.crashlytics") } + + + + android { // 禁用重复类检查(调试模式) - if (gradle.startParameter.taskNames.any { it.contains("Debug", ignoreCase = true) }) { + /*if (gradle.startParameter.taskNames.any { it.contains("Debug", ignoreCase = true) }) { tasks.configureEach { if (name.contains("check", ignoreCase = true) && name.contains("DuplicateClasses", ignoreCase = true)) { enabled = false } } - } + }*/ namespace = Version.applicationId compileSdk = 36 @@ -168,6 +172,23 @@ android { } } +configurations.all { + resolutionStrategy { + force("org.jetbrains:annotations:23.0.0") + + dependencySubstitution { + substitute(module("com.intellij:annotations")) + .using(module("org.jetbrains:annotations:23.0.0")) + } + + eachDependency { + if (requested.group == "com.intellij" && requested.name == "annotations") { + useTarget("org.jetbrains:annotations:23.0.0") + } + } + } +} + dependencies { implementation(fileTree("dir" to "libs", "include" to listOf("*.jar", "*.aar"))) coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") @@ -322,6 +343,12 @@ dependencies { implementation(Deps.immersionbar) implementation(Deps.immersionbarktx) + // room + implementation(Deps.room_runtime) + implementation(Deps.room_ktx) + implementation(Deps.room_compiler) + + implementation(project(mapOf("path" to ":loadingstateview"))) diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/repository/api/ChatRepository.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/repository/api/ChatRepository.kt index 2c15927..0936b16 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/repository/api/ChatRepository.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/repository/api/ChatRepository.kt @@ -60,6 +60,7 @@ class ChatRepository @Inject constructor(private val chatService: ChatService) : ) = executeHttp { /*val params = mutableMapOf() params["userId"] = param.userId.toRequestBody(("text/plain").toMediaType())*/ + val idBody = param.userId.toRequestBody(("text/plain").toMediaType()) val filePart = FileUtil.createFilePart("file", fileUri.toFile)?: return@executeHttp ApiFailedResponse(1, message = "File not exist") chatService.uploadCustomBgPic(idBody, filePart) diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/HistoryFragment.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/HistoryFragment.kt index b555def..6bd1032 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/HistoryFragment.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/HistoryFragment.kt @@ -1,14 +1,24 @@ package com.remax.visualnovel.ui.main.history import android.os.Bundle +import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.viewpager2.adapter.FragmentStateAdapter import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter import com.dylanc.loadingstateview.BgColorType import com.remax.visualnovel.R import com.remax.visualnovel.app.base.BaseBindingFragment import com.remax.visualnovel.databinding.FragmentMainHistoryBinding +import com.remax.visualnovel.ui.main.actor.ActorListFragment +import com.remax.visualnovel.ui.main.book.BookListFragment import com.remax.visualnovel.ui.main.history.customui.beans.TabItem +import com.remax.visualnovel.ui.main.history.fragments.HistoryActorFragment +import com.remax.visualnovel.ui.main.history.fragments.HistoryActorViewModel +import com.remax.visualnovel.ui.main.history.fragments.HistoryComicFragment +import com.remax.visualnovel.ui.main.history.fragments.HistoryComicViewModel +import com.remax.visualnovel.ui.main.history.fragments.HistoryMangaFragment +import com.remax.visualnovel.ui.main.managa.MangaListFragment import com.remax.visualnovel.utils.Routers import com.remax.visualnovel.utils.StatusBarUtil3 import dagger.hilt.android.AndroidEntryPoint @@ -36,6 +46,24 @@ class HistoryFragment : BaseBindingFragment() { } initTabLayout() + initViewPager() + } + + private fun initViewPager() { + with(binding.viewPager) { + val fragments = listOf( + HistoryMangaFragment.newInstance(), + HistoryComicFragment.newInstance(), + HistoryActorFragment.newInstance(), + ) + + offscreenPageLimit = fragments.size + isUserInputEnabled = false + adapter = object : FragmentStateAdapter(this@HistoryFragment) { + override fun getItemCount() = fragments.size + override fun createFragment(position: Int): Fragment = fragments[position] + } + } } private fun initTabLayout() { @@ -54,7 +82,7 @@ class HistoryFragment : BaseBindingFragment() { } private fun switchFragment(fragmentIndex: Int) { - + binding.viewPager.setCurrentItem(fragmentIndex, true) } companion object { diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryActorFilterView.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryActorFilterView.kt new file mode 100644 index 0000000..1ae2794 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryActorFilterView.kt @@ -0,0 +1,22 @@ +package com.remax.visualnovel.ui.main.history.customui + + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import com.remax.visualnovel.databinding.HisotryFilterBarActorBinding +import com.remax.visualnovel.databinding.HisotryFilterBarMangaBinding + +class HistoryActorFilterView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + private lateinit var mBinding: HisotryFilterBarActorBinding + + + init { + mBinding = HisotryFilterBarActorBinding.inflate(LayoutInflater.from(context), this, true) + } +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryComicFilterView.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryComicFilterView.kt new file mode 100644 index 0000000..389f4f0 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryComicFilterView.kt @@ -0,0 +1,20 @@ +package com.remax.visualnovel.ui.main.history.customui + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import com.remax.visualnovel.databinding.HisotryFilterBarComicBinding + +class HistoryComicFilterView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + private lateinit var mBinding: HisotryFilterBarComicBinding + + + init { + mBinding = HisotryFilterBarComicBinding.inflate(LayoutInflater.from(context), this, true) + } +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryMangaFilterView.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryMangaFilterView.kt new file mode 100644 index 0000000..1ec9eed --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/HistoryMangaFilterView.kt @@ -0,0 +1,21 @@ +package com.remax.visualnovel.ui.main.history.customui + + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import com.remax.visualnovel.databinding.HisotryFilterBarMangaBinding + +class HistoryMangaFilterView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + private lateinit var mBinding: HisotryFilterBarMangaBinding + + + init { + mBinding = HisotryFilterBarMangaBinding.inflate(LayoutInflater.from(context), this, true) + } +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryActorFragment.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryActorFragment.kt index 987bf5d..b8140a9 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryActorFragment.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryActorFragment.kt @@ -6,7 +6,7 @@ import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter import com.dylanc.loadingstateview.BgColorType import com.remax.visualnovel.app.base.BaseBindingFragment -import com.remax.visualnovel.databinding.FragmentMainBookBinding +import com.remax.visualnovel.databinding.FragmentMainHistoryActorBinding import com.remax.visualnovel.utils.Routers import dagger.hilt.android.AndroidEntryPoint import kotlin.getValue @@ -15,7 +15,7 @@ import kotlin.getValue @AndroidEntryPoint @Route(path = Routers.ROUTE_HISTORY_ACTOR) -class HistoryActorFragment : BaseBindingFragment() { +class HistoryActorFragment : BaseBindingFragment() { private val mViewModel by viewModels() @@ -32,9 +32,9 @@ class HistoryActorFragment : BaseBindingFragment() { } companion object { - fun newInstance(): HistoryMangaFragment { + fun newInstance(): HistoryActorFragment { return ARouter.getInstance().build(Routers.ROUTE_HISTORY_ACTOR) - .navigation() as HistoryMangaFragment + .navigation() as HistoryActorFragment } } diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryComicFragment.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryComicFragment.kt index 1be897b..9300316 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryComicFragment.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryComicFragment.kt @@ -6,7 +6,7 @@ import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter import com.dylanc.loadingstateview.BgColorType import com.remax.visualnovel.app.base.BaseBindingFragment -import com.remax.visualnovel.databinding.FragmentMainBookBinding +import com.remax.visualnovel.databinding.FragmentMainHistoryComicBinding import com.remax.visualnovel.utils.Routers import dagger.hilt.android.AndroidEntryPoint import kotlin.getValue @@ -15,7 +15,7 @@ import kotlin.getValue @AndroidEntryPoint @Route(path = Routers.ROUTE_HISTORY_COMIC) -class HistoryComicFragment : BaseBindingFragment() { +class HistoryComicFragment : BaseBindingFragment() { private val mViewModel by viewModels() diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryMangaFragment.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryMangaFragment.kt index 35301a8..cc8e639 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryMangaFragment.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/fragments/HistoryMangaFragment.kt @@ -7,6 +7,7 @@ import com.alibaba.android.arouter.launcher.ARouter import com.dylanc.loadingstateview.BgColorType import com.remax.visualnovel.app.base.BaseBindingFragment import com.remax.visualnovel.databinding.FragmentMainBookBinding +import com.remax.visualnovel.databinding.FragmentMainHistoryMangaBinding import com.remax.visualnovel.utils.Routers import dagger.hilt.android.AndroidEntryPoint import kotlin.getValue @@ -15,7 +16,7 @@ import kotlin.getValue @AndroidEntryPoint @Route(path = Routers.ROUTE_HISTORY_MANGA) -class HistoryMangaFragment : BaseBindingFragment() { +class HistoryMangaFragment : BaseBindingFragment() { private val mViewModel by viewModels() diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/utils/Routers.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/utils/Routers.kt index ba6b05b..332d071 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/utils/Routers.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/utils/Routers.kt @@ -38,6 +38,10 @@ class Routers { const val SEARCH = "${ROUTER}search" const val CHECK_IN = "${ROUTER}checkin" + const val ROUTE_HISTORY_MANGA = "${ROUTER}history_manga" + const val ROUTE_HISTORY_COMIC = "${ROUTER}history_comic" + const val ROUTE_HISTORY_ACTOR = "${ROUTER}history_actor" + diff --git a/VisualNovel/app/src/main/res/layout/fragment_main_history.xml b/VisualNovel/app/src/main/res/layout/fragment_main_history.xml index 3380c07..792c486 100644 --- a/VisualNovel/app/src/main/res/layout/fragment_main_history.xml +++ b/VisualNovel/app/src/main/res/layout/fragment_main_history.xml @@ -17,6 +17,7 @@ android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/dp_20" android:layout_marginTop="@dimen/dp_10" app:tabCornerRadius="@dimen/dp_20" app:textColorNormal="@color/gray6" @@ -28,6 +29,7 @@ /> + + + + + + diff --git a/VisualNovel/app/src/main/res/layout/fragment_main_history_comic.xml b/VisualNovel/app/src/main/res/layout/fragment_main_history_comic.xml new file mode 100644 index 0000000..cbc65a6 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/fragment_main_history_comic.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/VisualNovel/app/src/main/res/layout/fragment_main_history_manga.xml b/VisualNovel/app/src/main/res/layout/fragment_main_history_manga.xml new file mode 100644 index 0000000..68cc7f6 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/fragment_main_history_manga.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/VisualNovel/app/src/main/res/layout/hisotry_filter_bar_actor.xml b/VisualNovel/app/src/main/res/layout/hisotry_filter_bar_actor.xml new file mode 100644 index 0000000..eb122be --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/hisotry_filter_bar_actor.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + diff --git a/VisualNovel/app/src/main/res/layout/hisotry_filter_bar_comic.xml b/VisualNovel/app/src/main/res/layout/hisotry_filter_bar_comic.xml new file mode 100644 index 0000000..3f6e989 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/hisotry_filter_bar_comic.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + diff --git a/VisualNovel/app/src/main/res/layout/hisotry_filter_bar_manga.xml b/VisualNovel/app/src/main/res/layout/hisotry_filter_bar_manga.xml new file mode 100644 index 0000000..a62e73f --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/hisotry_filter_bar_manga.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + diff --git a/VisualNovel/app/src/main/res/layout/item_smooth_tab.xml b/VisualNovel/app/src/main/res/layout/item_smooth_tab.xml index 6634e7d..e3206c3 100644 --- a/VisualNovel/app/src/main/res/layout/item_smooth_tab.xml +++ b/VisualNovel/app/src/main/res/layout/item_smooth_tab.xml @@ -1,17 +1,17 @@ - + android:paddingHorizontal="@dimen/dp_8"> @@ -19,8 +19,10 @@ android:id="@+id/tvTabText" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="@color/gray6" + android:textColor="@color/graybe" android:textSize="@dimen/sp_14" + android:textStyle="bold" + android:singleLine="true" android:fontFamily="sans-serif-medium" /> - \ No newline at end of file + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/values/colors.xml b/VisualNovel/app/src/main/res/values/colors.xml index 534a796..af30bfa 100644 --- a/VisualNovel/app/src/main/res/values/colors.xml +++ b/VisualNovel/app/src/main/res/values/colors.xml @@ -194,6 +194,8 @@ #fff6f6f6 #ff282828 #fff3f4ff + #ffbebebe + #ffff3b30 @@ -221,7 +223,7 @@ #ff4d3e6b #ff312645 - + #ff739ba7 diff --git a/VisualNovel/app/src/main/res/values/strings.xml b/VisualNovel/app/src/main/res/values/strings.xml index ece6d14..e3fe690 100644 --- a/VisualNovel/app/src/main/res/values/strings.xml +++ b/VisualNovel/app/src/main/res/values/strings.xml @@ -490,7 +490,7 @@ This will permanently remove all data. This action is irreversible. Are you sure? SURE NO - + Sort by Date \ No newline at end of file diff --git a/VisualNovel/buildSrc/src/main/java/Deps.kt b/VisualNovel/buildSrc/src/main/java/Deps.kt index c19992f..a82d210 100644 --- a/VisualNovel/buildSrc/src/main/java/Deps.kt +++ b/VisualNovel/buildSrc/src/main/java/Deps.kt @@ -278,5 +278,12 @@ object Deps { const val immersionbar = "com.geyifeng.immersionbar:immersionbar:3.2.2" const val immersionbarktx = "com.geyifeng.immersionbar:immersionbar-ktx:3.2.2" + // room + const val room_version = "2.5.2" + const val room_runtime = "androidx.room:room-runtime:$room_version" + const val room_ktx = "androidx.room:room-ktx:$room_version" + const val room_compiler = "androidx.room:room-compiler:$room_version" + + }