diff --git a/app/src/main/java/com/all/pdfreader/pro/app/model/FragmentConfig.kt b/app/src/main/java/com/all/pdfreader/pro/app/model/FragmentConfig.kt new file mode 100644 index 0000000..aa0542a --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pro/app/model/FragmentConfig.kt @@ -0,0 +1,5 @@ +package com.all.pdfreader.pro.app.model + +enum class FragmentType { + HOME, RECENTLY, FAVORITE +} diff --git a/app/src/main/java/com/all/pdfreader/pro/app/room/entity/PdfDocumentEntity.kt b/app/src/main/java/com/all/pdfreader/pro/app/room/entity/PdfDocumentEntity.kt index 1103f8a..0df8061 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/room/entity/PdfDocumentEntity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/room/entity/PdfDocumentEntity.kt @@ -33,5 +33,6 @@ data class PdfDocumentEntity( val metadataModificationDate: Long? = null, // PDF修改时间 val password: String? = null,// PDF密码(加密存储) - val isPassword: Boolean = false//是否存在密码 + val isPassword: Boolean = false,//是否存在密码 + var isSelected: Boolean = false ) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt index 69aad5c..fac2895 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt @@ -11,6 +11,8 @@ import com.all.pdfreader.pro.app.PRApp import com.all.pdfreader.pro.app.R import com.all.pdfreader.pro.app.databinding.ActivityMainBinding import com.all.pdfreader.pro.app.model.FileActionEvent +import com.all.pdfreader.pro.app.model.FragmentType +import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.ui.dialog.PermissionDialogFragment import com.all.pdfreader.pro.app.ui.dialog.ProgressDialogFragment import com.all.pdfreader.pro.app.ui.dialog.SortDialogFragment @@ -27,25 +29,23 @@ import com.gyf.immersionbar.ImmersionBar import kotlinx.coroutines.launch class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback, - PermissionDialogFragment.CloseCallback { + PermissionDialogFragment.CloseCallback, HomeFrag.OnItemLongClickListener, + RecentlyFrag.OnItemLongClickListener, FavoriteFrag.OnItemLongClickListener { override val TAG: String = "MainActivity" private lateinit var binding: ActivityMainBinding private val pdfRepository = getRepository() private lateinit var pdfScanner: PdfScanner - private val homeFragment = HomeFrag() private val recentlyFragment = RecentlyFrag() private val favoriteFragment = FavoriteFrag() private val toolsFragment = ToolsFrag() - private var activeFragment: Fragment = homeFragment private val fragmentTag = "ACTIVE_FRAGMENT" - private val viewModel by lazy { ViewModelProvider(this)[PdfViewModel::class.java] } - private var progressDialog: ProgressDialogFragment? = null + private var fragmentType = FragmentType.HOME override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -67,6 +67,7 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback supportFragmentManager.beginTransaction().hide(homeFragment).hide(recentlyFragment) .hide(favoriteFragment).hide(toolsFragment).show(activeFragment).commit() } + updateMultiSelectUi(false, fragmentType) } private fun initObserve() { @@ -170,6 +171,35 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback (activeFragment as? SortableFragment)?.onSortTypeChanged(it) }).show(supportFragmentManager, TAG) } + binding.multiSelectBackBtn.setOnClickListener { + homeFragment.exitMultiSelectMode() + favoriteFragment.exitMultiSelectMode() + recentlyFragment.exitMultiSelectMode() + updateMultiSelectUi(false, fragmentType) + } + binding.multiSelectAllBtn.setOnClickListener { + homeFragment.adapter.toggleSelectAll() + val isAllSelected = homeFragment.adapter.isAllSelected() + if (isAllSelected) { + binding.multiSelectAllIv.setBackgroundResource(R.drawable.dr_circular_sel_on_bg) // 已全选图标 + } else { + binding.multiSelectAllIv.setBackgroundResource(R.drawable.dr_circular_sel_off_bg) // 未全选图标 + } + updateSelectNumber(homeFragment.adapter.getSelectedItems().size) + } + binding.multiSelectDeleteBtn.setOnClickListener { + val selectedItems = homeFragment.adapter.getSelectedItems() + logDebug("selectedItems->${selectedItems.size}") + } + binding.multiSelectMergeBtn.setOnClickListener { + logDebug("合并") + } + binding.multiSelectRemoveBtn.setOnClickListener { + logDebug("移除最新阅读") + } + binding.multiSelectUnFavoriteBtn.setOnClickListener { + logDebug("移除收藏") + } } private fun switchFragment(target: Fragment) { @@ -229,25 +259,6 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback binding.toolsIv.setImageResource(R.drawable.icon_tools_sel_on) } } - - -// binding.homeIv.alpha = 0.5f -// binding.recentlyIv.alpha = 0.5f -// binding.favoriteIv.alpha = 0.5f -// binding.toolsIv.alpha = 0.5f -// val targetIcon = when (fragment) { -// is HomeFrag -> binding.homeIv -// is RecentlyFrag -> binding.recentlyIv -// is FavoriteFrag -> binding.favoriteIv -// is ToolsFrag -> binding.toolsIv -// else -> null -// } -// targetIcon?.apply { -// alpha = 1f -// animate().scaleX(1.2f).scaleY(1.2f).setDuration(150).withEndAction { -// animate().scaleX(1f).scaleY(1f).setDuration(150).start() -// }.start() -// } } @@ -283,21 +294,6 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback } else { logDebug("❌ 权限不足,跳过扫描") } - -// // 智能扫描策略 -// if (pdfScanner.shouldScan()) { -// logDebug("🔄 需要扫描PDF文件 (首次启动或超过24小时)") -// if (StoragePermissionHelper.hasBasicStoragePermission(this)) { -// lifecycleScope.launch { -// pdfScanner.scanAndLoadPdfFiles() -// } -// } else { -// logDebug("❌ 权限不足,跳过扫描") -// } -// } else { -// val hoursAgo = pdfScanner.getHoursSinceLastScan() -// logDebug("⏭️ 跳过扫描,上次扫描在${hoursAgo}小时前") -// } } // 授权后续操作 @@ -337,4 +333,79 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback onClose() } } + + override fun onItemLongClicked(item: PdfDocumentEntity, type: FragmentType) { + fragmentType = type + updateMultiSelectUi(true, fragmentType) + updateSelectNumber(homeFragment.adapter.getSelectedItems().size) + } + + private fun updateMultiSelectUi(b: Boolean, type: FragmentType) { + if (b) { + binding.apply { + multiSelectTopLayout.visibility = View.VISIBLE + multiSelectBottomLayout.visibility = View.VISIBLE + navigationLayout.visibility = View.GONE + topLayout.visibility = View.GONE + } + when (type) { + FragmentType.HOME -> { + binding.multiSelectRemoveBtn.visibility = View.GONE + binding.multiSelectUnFavoriteBtn.visibility = View.GONE + } + + FragmentType.RECENTLY -> { + binding.multiSelectRemoveBtn.visibility = View.VISIBLE + binding.multiSelectUnFavoriteBtn.visibility = View.GONE + } + + FragmentType.FAVORITE -> { + binding.multiSelectRemoveBtn.visibility = View.GONE + binding.multiSelectUnFavoriteBtn.visibility = View.VISIBLE + } + } + } else { + binding.apply { + multiSelectTopLayout.visibility = View.GONE + multiSelectBottomLayout.visibility = View.GONE + navigationLayout.visibility = View.VISIBLE + topLayout.visibility = View.VISIBLE + } + } + } + + fun updateSelectNumber(number: Int) { + binding.multiSelectNumberTv.text = getString(R.string.selected_page, number) + if (number >= 1) { + binding.multiSelectDeleteIv.setImageResource(R.drawable.icon_delete_sel_on) + binding.multiSelectDeleteTv.setTextColor(getColor(R.color.black)) + binding.multiSelectDeleteBtn.isClickable = true + binding.multiSelectRemoveIv.setImageResource(R.drawable.icon_remove_sel_on) + binding.multiSelectRemoveTv.setTextColor(getColor(R.color.black)) + binding.multiSelectRemoveBtn.isClickable = true + binding.multiSelectUnFavoriteIv.setImageResource(R.drawable.icon_un_favorite_sel_on) + binding.multiSelectUnFavoriteTv.setTextColor(getColor(R.color.black)) + binding.multiSelectUnFavoriteBtn.isClickable = true + } else { + binding.multiSelectDeleteIv.setImageResource(R.drawable.icon_delete_sel_off) + binding.multiSelectDeleteTv.setTextColor(getColor(R.color.icon_sel_off_color)) + binding.multiSelectDeleteBtn.isClickable = false + binding.multiSelectRemoveIv.setImageResource(R.drawable.icon_remove_sel_off) + binding.multiSelectRemoveTv.setTextColor(getColor(R.color.icon_sel_off_color)) + binding.multiSelectRemoveBtn.isClickable = false + binding.multiSelectUnFavoriteIv.setImageResource(R.drawable.icon_un_favorite_sel_off) + binding.multiSelectUnFavoriteTv.setTextColor(getColor(R.color.icon_sel_off_color)) + binding.multiSelectUnFavoriteBtn.isClickable = false + } + + if (number >= 2) { + binding.multiSelectMergeIv.setImageResource(R.drawable.icon_merge_sel_on) + binding.multiSelectMergeTv.setTextColor(getColor(R.color.black)) + binding.multiSelectMergeBtn.isClickable = true + } else { + binding.multiSelectMergeIv.setImageResource(R.drawable.icon_merge_sel_off) + binding.multiSelectMergeTv.setTextColor(getColor(R.color.icon_sel_off_color)) + binding.multiSelectMergeBtn.isClickable = false + } + } } diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt index 7d15d46..acbdfee 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.all.pdfreader.pro.app.databinding.AdapterPdfItemBinding import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity +import com.all.pdfreader.pro.app.ui.act.MainActivity import com.all.pdfreader.pro.app.util.AppUtils.dpToPx import com.all.pdfreader.pro.app.util.FileUtils.toFormatFileSize import com.all.pdfreader.pro.app.util.FileUtils.toSlashDate @@ -17,8 +18,11 @@ import com.bumptech.glide.load.resource.bitmap.RoundedCorners class PdfAdapter( private var pdfList: MutableList, private val onItemClick: (PdfDocumentEntity) -> Unit, - private val onMoreClick: (PdfDocumentEntity) -> Unit + private val onMoreClick: (PdfDocumentEntity) -> Unit, + private val onLongClick: (PdfDocumentEntity) -> Unit, + private val onSelectModelItemClick: (Int) -> Unit = {} ) : RecyclerView.Adapter() { + private var isMultiSelectMode = false inner class PdfViewHolder(val binding: AdapterPdfItemBinding) : RecyclerView.ViewHolder(binding.root) @@ -29,7 +33,7 @@ class PdfAdapter( return PdfViewHolder(binding) } - @SuppressLint("SetTextI18n") + @SuppressLint("SetTextI18n", "NotifyDataSetChanged") override fun onBindViewHolder(holder: PdfViewHolder, position: Int) { val item = pdfList[position] holder.binding.tvFileName.text = item.fileName @@ -50,13 +54,40 @@ class PdfAdapter( } else { holder.binding.collectState.visibility = View.GONE } + if (isMultiSelectMode) { + holder.binding.checkBtn.visibility = View.VISIBLE + holder.binding.moreBtn.visibility = View.GONE + } else { + holder.binding.checkBtn.visibility = View.GONE + holder.binding.moreBtn.visibility = View.VISIBLE + } + holder.binding.checkbox.isChecked = item.isSelected + holder.binding.root.setOnClickListener { - onItemClick(item) + if (isMultiSelectMode) { + item.isSelected = !item.isSelected + notifyItemChanged(position) + onSelectModelItemClick(getSelectedItems().size) + } else { + onItemClick(item) + } } holder.binding.moreBtn.setOnClickListener { onMoreClick(item) } + holder.binding.root.setOnLongClickListener { + if (!isMultiSelectMode) { + isMultiSelectMode = true + item.isSelected = !item.isSelected + notifyDataSetChanged() + onLongClick(item) + } + true + } + holder.binding.checkBtn.setOnClickListener { + toggleSelection(item, holder.bindingAdapterPosition) + } } override fun getItemCount(): Int = pdfList.size @@ -67,4 +98,47 @@ class PdfAdapter( pdfList.addAll(newList) notifyDataSetChanged() } + + private fun toggleSelection(item: PdfDocumentEntity, position: Int) { + item.isSelected = !item.isSelected + notifyItemChanged(position) + } + + // 退出多选模式 + @SuppressLint("NotifyDataSetChanged") + fun exitMultiSelectMode() { + isMultiSelectMode = false + pdfList.forEach { it.isSelected = false } + notifyDataSetChanged() + } + + @SuppressLint("NotifyDataSetChanged") + fun toggleSelectAll() { + val allSelected = pdfList.all { it.isSelected } + if (allSelected) deselectAll() else selectAll() + } + + // 全选 + fun selectAll() { + pdfList.forEach { it.isSelected = true } + notifyDataSetChanged() + } + + // 取消全选 + fun deselectAll() { + pdfList.forEach { it.isSelected = false } + notifyDataSetChanged() + } + + // 判断是否全选 + fun isAllSelected(): Boolean = pdfList.isNotEmpty() && pdfList.all { it.isSelected } + + // 获取已选中的 item + fun getSelectedItems(): List { + return pdfList.filter { it.isSelected } + } + + fun getIsMultiSelectMode(): Boolean{ + return isMultiSelectMode + } } diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/FavoriteFrag.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/FavoriteFrag.kt index 462bf5e..022c972 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/FavoriteFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/FavoriteFrag.kt @@ -1,16 +1,19 @@ package com.all.pdfreader.pro.app.ui.fragment +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.LinearLayoutManager import com.all.pdfreader.pro.app.databinding.FragmentFavoriteBinding +import com.all.pdfreader.pro.app.model.FragmentType +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.act.MainActivity import com.all.pdfreader.pro.app.ui.act.PdfViewActivity import com.all.pdfreader.pro.app.ui.adapter.PdfAdapter import com.all.pdfreader.pro.app.ui.dialog.ListMoreDialogFragment @@ -24,7 +27,13 @@ class FavoriteFrag : BaseFrag() { } private lateinit var binding: FragmentFavoriteBinding - private lateinit var adapter: PdfAdapter + lateinit var adapter: PdfAdapter + + private var onItemLongClickListener: OnItemLongClickListener? = null + + interface OnItemLongClickListener { + fun onItemLongClicked(item: PdfDocumentEntity, type: FragmentType) + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -40,11 +49,17 @@ class FavoriteFrag : BaseFrag() { } private fun initView() { - adapter = PdfAdapter(pdfList = mutableListOf(),onItemClick = { pdf -> + adapter = PdfAdapter(pdfList = mutableListOf(), onItemClick = { pdf -> val intent = PdfViewActivity.createIntent(requireContext(), pdf.filePath) startActivity(intent) }, onMoreClick = { pdf -> ListMoreDialogFragment(pdf.filePath).show(parentFragmentManager, FRAG_TAG) + }, onLongClick = { pdf -> + onItemLongClickListener?.onItemLongClicked(pdf, FragmentType.FAVORITE) + updateSwipeRefreshState() + (requireActivity() as? MainActivity)?.updateSelectNumber(adapter.getSelectedItems().size) + }, onSelectModelItemClick = { number -> + (requireActivity() as? MainActivity)?.updateSelectNumber(number) }) binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) @@ -58,6 +73,15 @@ class FavoriteFrag : BaseFrag() { } } + fun updateSwipeRefreshState() { + binding.swipeRefreshLayout.isEnabled = !adapter.getIsMultiSelectMode() + } + + fun exitMultiSelectMode() { + adapter.exitMultiSelectMode() + updateSwipeRefreshState() + } + private fun observeDocuments(onComplete: () -> Unit = {}) { lifecycleScope.launch { viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { @@ -73,4 +97,11 @@ class FavoriteFrag : BaseFrag() { } } } + + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is OnItemLongClickListener) { + onItemLongClickListener = context + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt index 7f1145c..91ec484 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt @@ -1,5 +1,6 @@ package com.all.pdfreader.pro.app.ui.fragment +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -9,6 +10,7 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.LinearLayoutManager import com.all.pdfreader.pro.app.databinding.FragmentHomeBinding +import com.all.pdfreader.pro.app.model.FragmentType import com.all.pdfreader.pro.app.model.SortConfig import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.room.repository.PdfRepository @@ -27,7 +29,13 @@ class HomeFrag : BaseFrag(), MainActivity.SortableFragment { } private lateinit var binding: FragmentHomeBinding - private lateinit var adapter: PdfAdapter + lateinit var adapter: PdfAdapter + private var onItemLongClickListener: OnItemLongClickListener? = null + + interface OnItemLongClickListener { + fun onItemLongClicked(item: PdfDocumentEntity, type: FragmentType) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { @@ -47,6 +55,12 @@ class HomeFrag : BaseFrag(), MainActivity.SortableFragment { startActivity(intent) }, onMoreClick = { pdf -> ListMoreDialogFragment(pdf.filePath).show(parentFragmentManager, FRAG_TAG) + }, onLongClick = { pdf -> + onItemLongClickListener?.onItemLongClicked(pdf, FragmentType.HOME) + updateSwipeRefreshState() + (requireActivity() as? MainActivity)?.updateSelectNumber(adapter.getSelectedItems().size) + }, onSelectModelItemClick = { number -> + (requireActivity() as? MainActivity)?.updateSelectNumber(number) }) binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) @@ -63,6 +77,15 @@ class HomeFrag : BaseFrag(), MainActivity.SortableFragment { } } + fun updateSwipeRefreshState() { + binding.swipeRefreshLayout.isEnabled = !adapter.getIsMultiSelectMode() + } + + fun exitMultiSelectMode() { + adapter.exitMultiSelectMode() + binding.swipeRefreshLayout.isEnabled = !adapter.getIsMultiSelectMode() + } + override fun onSortTypeChanged(sortType: String) { // 排序类型改变时重新加载数据 observeDocuments() @@ -90,4 +113,11 @@ class HomeFrag : BaseFrag(), MainActivity.SortableFragment { return sortConfig.applySort(documents) } + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is OnItemLongClickListener) { + onItemLongClickListener = context + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/RecentlyFrag.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/RecentlyFrag.kt index c7e11d2..f97999b 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/RecentlyFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/RecentlyFrag.kt @@ -1,5 +1,6 @@ package com.all.pdfreader.pro.app.ui.fragment +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -9,7 +10,10 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.LinearLayoutManager import com.all.pdfreader.pro.app.databinding.FragmentRecentlyBinding +import com.all.pdfreader.pro.app.model.FragmentType +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.act.MainActivity import com.all.pdfreader.pro.app.ui.act.PdfViewActivity import com.all.pdfreader.pro.app.ui.adapter.PdfAdapter import com.all.pdfreader.pro.app.ui.dialog.ListMoreDialogFragment @@ -23,7 +27,12 @@ class RecentlyFrag : BaseFrag() { } private lateinit var binding: FragmentRecentlyBinding - private lateinit var adapter: PdfAdapter + lateinit var adapter: PdfAdapter + private var onItemLongClickListener: OnItemLongClickListener? = null + + interface OnItemLongClickListener { + fun onItemLongClicked(item: PdfDocumentEntity, type: FragmentType) + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -39,11 +48,17 @@ class RecentlyFrag : BaseFrag() { } private fun initView() { - adapter = PdfAdapter(pdfList = mutableListOf(),onItemClick = { pdf -> + adapter = PdfAdapter(pdfList = mutableListOf(), onItemClick = { pdf -> val intent = PdfViewActivity.createIntent(requireContext(), pdf.filePath) startActivity(intent) }, onMoreClick = { pdf -> ListMoreDialogFragment(pdf.filePath).show(parentFragmentManager, FRAG_TAG) + }, onLongClick = { pdf -> + onItemLongClickListener?.onItemLongClicked(pdf, FragmentType.RECENTLY) + updateSwipeRefreshState() + (requireActivity() as? MainActivity)?.updateSelectNumber(adapter.getSelectedItems().size) + }, onSelectModelItemClick = { number -> + (requireActivity() as? MainActivity)?.updateSelectNumber(number) }) binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) @@ -57,6 +72,15 @@ class RecentlyFrag : BaseFrag() { } } + fun updateSwipeRefreshState() { + binding.swipeRefreshLayout.isEnabled = !adapter.getIsMultiSelectMode() + } + + fun exitMultiSelectMode() { + adapter.exitMultiSelectMode() + updateSwipeRefreshState() + } + private fun observeDocuments(onComplete: () -> Unit = {}) { lifecycleScope.launch { viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { @@ -72,4 +96,11 @@ class RecentlyFrag : BaseFrag() { } } } + + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is OnItemLongClickListener) { + onItemLongClickListener = context + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_history_item.xml b/app/src/main/res/drawable/bg_history_item.xml index 050603d..202d079 100644 --- a/app/src/main/res/drawable/bg_history_item.xml +++ b/app/src/main/res/drawable/bg_history_item.xml @@ -1,5 +1,13 @@ - - - - + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/dr_cancel_btn_bg.xml b/app/src/main/res/drawable/dr_cancel_btn_bg.xml index b4189af..59149af 100644 --- a/app/src/main/res/drawable/dr_cancel_btn_bg.xml +++ b/app/src/main/res/drawable/dr_cancel_btn_bg.xml @@ -1,20 +1,13 @@ - + - - - - - - - - - + - - + + - + diff --git a/app/src/main/res/drawable/dr_click_btn_bg.xml b/app/src/main/res/drawable/dr_click_btn_bg.xml index ffaf102..c56f589 100644 --- a/app/src/main/res/drawable/dr_click_btn_bg.xml +++ b/app/src/main/res/drawable/dr_click_btn_bg.xml @@ -1,20 +1,13 @@ - + - - - - - - - - - + - - + + - + diff --git a/app/src/main/res/drawable/dr_click_effect_oval_transparent.xml b/app/src/main/res/drawable/dr_click_effect_oval_transparent.xml new file mode 100644 index 0000000..4b88eb9 --- /dev/null +++ b/app/src/main/res/drawable/dr_click_effect_oval_transparent.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/dr_click_effect_rectangle_transparent.xml b/app/src/main/res/drawable/dr_click_effect_rectangle_transparent.xml new file mode 100644 index 0000000..1dfe93e --- /dev/null +++ b/app/src/main/res/drawable/dr_click_effect_rectangle_transparent.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/dr_item_click_btn_bg.xml b/app/src/main/res/drawable/dr_item_click_btn_bg.xml new file mode 100644 index 0000000..595b3f2 --- /dev/null +++ b/app/src/main/res/drawable/dr_item_click_btn_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/dr_round_click_effect_bg.xml b/app/src/main/res/drawable/dr_round_click_effect_bg.xml deleted file mode 100644 index eb29795..0000000 --- a/app/src/main/res/drawable/dr_round_click_effect_bg.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/icon_delete_sel_off.xml b/app/src/main/res/drawable/icon_delete_sel_off.xml new file mode 100644 index 0000000..937a29e --- /dev/null +++ b/app/src/main/res/drawable/icon_delete_sel_off.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_delete_sel_on.xml b/app/src/main/res/drawable/icon_delete_sel_on.xml new file mode 100644 index 0000000..9b2c5b6 --- /dev/null +++ b/app/src/main/res/drawable/icon_delete_sel_on.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_merge_sel_off.xml b/app/src/main/res/drawable/icon_merge_sel_off.xml new file mode 100644 index 0000000..06e1b67 --- /dev/null +++ b/app/src/main/res/drawable/icon_merge_sel_off.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_merge_sel_on.xml b/app/src/main/res/drawable/icon_merge_sel_on.xml new file mode 100644 index 0000000..3243eab --- /dev/null +++ b/app/src/main/res/drawable/icon_merge_sel_on.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_remove_sel_off.xml b/app/src/main/res/drawable/icon_remove_sel_off.xml new file mode 100644 index 0000000..4118e82 --- /dev/null +++ b/app/src/main/res/drawable/icon_remove_sel_off.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_remove_sel_on.xml b/app/src/main/res/drawable/icon_remove_sel_on.xml new file mode 100644 index 0000000..c2f1691 --- /dev/null +++ b/app/src/main/res/drawable/icon_remove_sel_on.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_un_favorite_sel_off.xml b/app/src/main/res/drawable/icon_un_favorite_sel_off.xml new file mode 100644 index 0000000..6517252 --- /dev/null +++ b/app/src/main/res/drawable/icon_un_favorite_sel_off.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_un_favorite_sel_on.xml b/app/src/main/res/drawable/icon_un_favorite_sel_on.xml new file mode 100644 index 0000000..3b9fedd --- /dev/null +++ b/app/src/main/res/drawable/icon_un_favorite_sel_on.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8e1892d..d704804 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -19,9 +19,10 @@ + + + + + + + + + + + + + + + + + + @@ -202,6 +261,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center" android:orientation="vertical"> @@ -226,6 +286,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center" android:orientation="vertical"> @@ -250,6 +311,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center" android:orientation="vertical"> @@ -271,6 +333,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pdf_split.xml b/app/src/main/res/layout/activity_pdf_split.xml index 1c95400..59c5ccb 100644 --- a/app/src/main/res/layout/activity_pdf_split.xml +++ b/app/src/main/res/layout/activity_pdf_split.xml @@ -22,6 +22,7 @@ @@ -130,6 +133,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center" android:orientation="vertical"> @@ -155,6 +159,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center" android:orientation="vertical"> @@ -200,6 +205,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center" android:orientation="vertical"> diff --git a/app/src/main/res/layout/activity_search_pdf.xml b/app/src/main/res/layout/activity_search_pdf.xml index 16b8fb9..29a4db4 100644 --- a/app/src/main/res/layout/activity_search_pdf.xml +++ b/app/src/main/res/layout/activity_search_pdf.xml @@ -23,6 +23,7 @@ android:layout_width="40dp" android:layout_height="40dp" android:layout_marginStart="8dp" + android:background="@drawable/dr_click_effect_oval_transparent" android:layout_marginEnd="8dp" android:gravity="center"> @@ -107,10 +108,10 @@ @@ -122,6 +122,7 @@ android:id="@+id/moreBtn" android:layout_width="48dp" android:layout_height="48dp" + android:background="@drawable/dr_click_effect_oval_transparent" android:gravity="center"> + + + + + diff --git a/app/src/main/res/layout/dialog_list_more.xml b/app/src/main/res/layout/dialog_list_more.xml index d3d78a2..2c36c29 100644 --- a/app/src/main/res/layout/dialog_list_more.xml +++ b/app/src/main/res/layout/dialog_list_more.xml @@ -105,6 +105,7 @@ android:id="@+id/collectBtn" android:layout_width="48dp" android:layout_height="48dp" + android:background="@drawable/dr_click_effect_oval_transparent" android:gravity="center"> @@ -175,6 +177,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center" android:orientation="vertical"> @@ -198,6 +201,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center" android:orientation="vertical"> @@ -221,6 +225,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center" android:orientation="vertical"> @@ -258,6 +263,7 @@ android:id="@+id/duplicateFileBtn" android:layout_width="match_parent" android:layout_height="48dp" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center_vertical" android:orientation="horizontal"> @@ -279,6 +285,7 @@ android:id="@+id/splitBtn" android:layout_width="match_parent" android:layout_height="48dp" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center_vertical" android:orientation="horizontal"> @@ -301,6 +308,7 @@ android:id="@+id/setPasswordBtn" android:layout_width="match_parent" android:layout_height="48dp" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center_vertical" android:orientation="horizontal"> @@ -324,6 +332,7 @@ android:id="@+id/removeRecentBtn" android:layout_width="match_parent" android:layout_height="48dp" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center_vertical" android:orientation="horizontal"> @@ -346,6 +355,7 @@ android:id="@+id/deleteFileBtn" android:layout_width="match_parent" android:layout_height="48dp" + android:background="@drawable/dr_click_effect_rectangle_transparent" android:gravity="center_vertical" android:orientation="horizontal"> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 42cda27..4e55a51 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,6 +9,7 @@ #CC222222 #99222222 #FFFFFFFF + #00000000 #E6E6E6 #F9F9F9 #E0E0E0 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5cd6e97..1e29224 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,7 @@ Home Recently Favorite + Unfavorite Tools Professional PDF Document Reader Permission Required @@ -124,6 +125,7 @@ Split PDF Split Merge PDF + Merge %1$d Selected Loading Continue Now