This commit is contained in:
ocean 2025-09-02 16:28:49 +08:00
parent 7a3efa2bee
commit fa82f2eb96
4 changed files with 77 additions and 27 deletions

View File

@ -14,8 +14,14 @@ class AppStore(context: Context) {
key = PERMISSIONS_DIALOG_PROMPT, defaultValue = false key = PERMISSIONS_DIALOG_PROMPT, defaultValue = false
) )
// 文档排序方式name_asc, name_desc, date_asc, date_desc, size_asc, size_desc
var documentSortType: String by store.string(
key = DOCUMENT_SORT_TYPE, defaultValue = "date_desc"
)
companion object { companion object {
private const val FILE_NAME = "prp_sp_name" private const val FILE_NAME = "prp_sp_name"
private const val PERMISSIONS_DIALOG_PROMPT = "permissions_dialog_prompt" private const val PERMISSIONS_DIALOG_PROMPT = "permissions_dialog_prompt"
private const val DOCUMENT_SORT_TYPE = "document_sort_type"
} }
} }

View File

@ -9,13 +9,12 @@ import androidx.lifecycle.lifecycleScope
import com.all.pdfreader.pro.app.R import com.all.pdfreader.pro.app.R
import com.all.pdfreader.pro.app.databinding.ActivityMainBinding import com.all.pdfreader.pro.app.databinding.ActivityMainBinding
import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
import com.all.pdfreader.pro.app.room.repository.PdfRepository
import com.all.pdfreader.pro.app.ui.dialog.PermissionDialogFragment import com.all.pdfreader.pro.app.ui.dialog.PermissionDialogFragment
import com.all.pdfreader.pro.app.ui.fragment.FavoriteFrag import com.all.pdfreader.pro.app.ui.fragment.FavoriteFrag
import com.all.pdfreader.pro.app.ui.fragment.HomeFrag import com.all.pdfreader.pro.app.ui.fragment.HomeFrag
import com.all.pdfreader.pro.app.ui.fragment.RecentlyFrag import com.all.pdfreader.pro.app.ui.fragment.RecentlyFrag
import com.all.pdfreader.pro.app.ui.fragment.ToolsFrag import com.all.pdfreader.pro.app.ui.fragment.ToolsFrag
import com.all.pdfreader.pro.app.util.AppUtils.setDebouncedClickWithAnimation import com.all.pdfreader.pro.app.util.AppUtils.setClickWithAnimation
import com.all.pdfreader.pro.app.util.FileChangeObserver import com.all.pdfreader.pro.app.util.FileChangeObserver
import com.all.pdfreader.pro.app.util.FileUtils import com.all.pdfreader.pro.app.util.FileUtils
import com.all.pdfreader.pro.app.util.PdfMetadataExtractor import com.all.pdfreader.pro.app.util.PdfMetadataExtractor
@ -100,16 +99,16 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback
requestPermissions() requestPermissions()
} }
binding.sidebarBtn.setDebouncedClickWithAnimation { binding.sidebarBtn.setClickWithAnimation {
} }
binding.searchBtn.setDebouncedClickWithAnimation { binding.searchBtn.setClickWithAnimation {
} }
binding.sortingBtn.setDebouncedClickWithAnimation { binding.sortingBtn.setClickWithAnimation {
showSortDialog()
} }
} }
@ -120,6 +119,40 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback
updateSelectedNav(target) updateSelectedNav(target)
} }
private fun showSortDialog() {
val sortOptions = arrayOf(
"名称升序", "名称降序",
"日期升序", "日期降序",
"大小升序", "大小降序"
)
val sortValues = arrayOf(
"name_asc", "name_desc",
"date_asc", "date_desc",
"size_asc", "size_desc"
)
val currentSort = appStore.documentSortType
val checkedItem = sortValues.indexOf(currentSort)
android.app.AlertDialog.Builder(this)
.setTitle("选择排序方式")
.setSingleChoiceItems(sortOptions, checkedItem) { dialog, which ->
val newSortType = sortValues[which]
appStore.documentSortType = newSortType
// 通知当前fragment更新排序
(activeFragment as? SortableFragment)?.onSortTypeChanged(newSortType)
dialog.dismiss()
}
.setNegativeButton("取消", null)
.show()
}
interface SortableFragment {
fun onSortTypeChanged(sortType: String)
}
private fun updateSelectedNav(fragment: Fragment) { private fun updateSelectedNav(fragment: Fragment) {
binding.homeIv.alpha = 0.5f binding.homeIv.alpha = 0.5f
binding.recentlyIv.alpha = 0.5f binding.recentlyIv.alpha = 0.5f

View File

@ -10,13 +10,14 @@ import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.all.pdfreader.pro.app.databinding.FragmentHomeBinding import com.all.pdfreader.pro.app.databinding.FragmentHomeBinding
import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
import com.all.pdfreader.pro.app.room.repository.PdfRepository import com.all.pdfreader.pro.app.room.repository.PdfRepository
import com.all.pdfreader.pro.app.ui.act.MainActivity import com.all.pdfreader.pro.app.ui.act.MainActivity
import com.all.pdfreader.pro.app.ui.adapter.PdfAdapter import com.all.pdfreader.pro.app.ui.adapter.PdfAdapter
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class HomeFrag : BaseFrag() { class HomeFrag : BaseFrag(), MainActivity.SortableFragment {
override val TAG: String = "HomeFrag" override val TAG: String = "HomeFrag"
private lateinit var binding: FragmentHomeBinding private lateinit var binding: FragmentHomeBinding
private lateinit var adapter: PdfAdapter private lateinit var adapter: PdfAdapter
@ -53,15 +54,33 @@ class HomeFrag : BaseFrag() {
} }
} }
override fun onSortTypeChanged(sortType: String) {
// 排序类型改变时重新加载数据
observeDocuments()
}
private fun observeDocuments() { private fun observeDocuments() {
lifecycleScope.launch { lifecycleScope.launch {
viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
PdfRepository.getInstance().getAllDocuments().collect { list -> PdfRepository.getInstance().getAllDocuments().collect { list ->
adapter.updateData(list) val sortedList = sortDocuments(list)
logDebug("更新adapter数据") adapter.updateData(sortedList)
logDebug("更新adapter数据排序方式: ${appStore.documentSortType}")
} }
} }
} }
} }
private fun sortDocuments(documents: List<PdfDocumentEntity>): List<PdfDocumentEntity> {
return when (appStore.documentSortType) {
"name_asc" -> documents.sortedBy { it.fileName.lowercase() }
"name_desc" -> documents.sortedByDescending { it.fileName.lowercase() }
"date_asc" -> documents.sortedBy { it.lastModified }
"date_desc" -> documents.sortedByDescending { it.lastModified }
"size_asc" -> documents.sortedBy { it.fileSize }
"size_desc" -> documents.sortedByDescending { it.fileSize }
else -> documents
}
}
} }

View File

@ -5,26 +5,19 @@ import android.view.View
object AppUtils { object AppUtils {
/** /**
* View 点击事件添加防抖点击 + 动画 + 执行逻辑 * 添加点击动画点击立即执行逻辑动画期间禁用点击
* *
* @param debounceTime 防抖间隔默认 500 毫秒 * @param onClick 点击后立即执行的逻辑
* @param onClick 点击后执行的逻辑动画完成后调用
*/ */
fun View.setDebouncedClickWithAnimation( fun View.setClickWithAnimation(onClick: () -> Unit) {
debounceTime: Long = 500L,
onClick: () -> Unit
) {
var lastClickTime = 0L
this.setOnClickListener { this.setOnClickListener {
val currentTime = System.currentTimeMillis() // 禁用点击,防止动画未完成重复点击
if (currentTime - lastClickTime < debounceTime) {
return@setOnClickListener
}
lastClickTime = currentTime
// 动画 + 禁用点击
this.isEnabled = false this.isEnabled = false
// 立即执行逻辑
onClick()
// 播放动画
this.animate() this.animate()
.scaleX(1.2f) .scaleX(1.2f)
.scaleY(1.2f) .scaleY(1.2f)
@ -35,13 +28,12 @@ object AppUtils {
.scaleY(1f) .scaleY(1f)
.setDuration(150) .setDuration(150)
.withEndAction { .withEndAction {
// 动画结束恢复点击
this.isEnabled = true this.isEnabled = true
onClick() // 执行传入的逻辑
} }
.start() .start()
} }
.start() .start()
} }
} }
} }