diff --git a/app/src/main/java/io/legado/app/ui/document/FileManageActivity.kt b/app/src/main/java/io/legado/app/ui/document/FileManageActivity.kt index ace0b2af0..2471de82b 100644 --- a/app/src/main/java/io/legado/app/ui/document/FileManageActivity.kt +++ b/app/src/main/java/io/legado/app/ui/document/FileManageActivity.kt @@ -1,28 +1,28 @@ package io.legado.app.ui.document +import android.annotation.SuppressLint import android.os.Bundle import android.view.ViewGroup import androidx.activity.viewModels import androidx.appcompat.widget.SearchView import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.databinding.ActivityFileManageBinding import io.legado.app.databinding.ItemFileBinding +import io.legado.app.databinding.ItemPathPickerBinding import io.legado.app.lib.theme.primaryTextColor -import io.legado.app.ui.document.adapter.PathAdapter import io.legado.app.ui.document.utils.FilePickerIcon import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.ConvertUtils -import io.legado.app.utils.FileDoc import io.legado.app.utils.applyTint -import io.legado.app.utils.list import io.legado.app.utils.viewbindingdelegate.viewBinding +import java.io.File -class FileManageActivity : VMBaseActivity(), - PathAdapter.CallBack { +class FileManageActivity : VMBaseActivity() { override val binding by viewBinding(ActivityFileManageBinding::inflate) override val viewModel by viewModels() @@ -30,7 +30,7 @@ class FileManageActivity : VMBaseActivity(this@FileManageActivity) { + + private val arrowIcon = ConvertUtils.toDrawable(FilePickerIcon.getArrow()) + + init { + addHeaderView { + ItemPathPickerBinding.inflate(inflater, it, false).apply { + textView.text = "root" + imageView.setImageDrawable(arrowIcon) + root.setOnClickListener { + viewModel.subDocs.clear() + setItems(viewModel.subDocs) + viewModel.upFiles(viewModel.rootDoc) + } + } + } + } + + override fun getViewBinding(parent: ViewGroup): ItemPathPickerBinding { + return ItemPathPickerBinding.inflate(inflater, parent, false).apply { + imageView.setImageDrawable(arrowIcon) + } + } + + override fun registerListener(holder: ItemViewHolder, binding: ItemPathPickerBinding) { + binding.root.setOnClickListener { + viewModel.subDocs = viewModel.subDocs.subList(0, holder.layoutPosition) + setItems(viewModel.subDocs) + viewModel.upFiles(viewModel.subDocs.lastOrNull()) + } + } + + override fun convert( + holder: ItemViewHolder, + binding: ItemPathPickerBinding, + item: File, + payloads: MutableList + ) { + binding.textView.text = item.name + } } - inner class FileAdapter : RecyclerAdapter(this@FileManageActivity) { + inner class FileAdapter : RecyclerAdapter(this@FileManageActivity) { private val upIcon = ConvertUtils.toDrawable(FilePickerIcon.getUpDir())!! private val folderIcon = ConvertUtils.toDrawable(FilePickerIcon.getFolder())!! private val fileIcon = ConvertUtils.toDrawable(FilePickerIcon.getFile())!! + private val dirParent = ".." override fun getViewBinding(parent: ViewGroup): ItemFileBinding { return ItemFileBinding.inflate(inflater, parent, false) } override fun registerListener(holder: ItemViewHolder, binding: ItemFileBinding) { - + binding.root.setOnClickListener { + val item = getItemByLayoutPosition(holder.layoutPosition) + item?.let { + if (item == (viewModel.subDocs.lastOrNull() ?: viewModel.rootDoc)) { + viewModel.subDocs.removeLastOrNull() + pathAdapter.setItems(viewModel.subDocs) + viewModel.upFiles(viewModel.subDocs.lastOrNull() ?: viewModel.rootDoc) + } else if (item.isDirectory) { + viewModel.subDocs.add(item) + pathAdapter.setItems(viewModel.subDocs) + viewModel.upFiles(item) + } + } + } } override fun convert( holder: ItemViewHolder, binding: ItemFileBinding, - item: FileDoc, + item: File, payloads: MutableList ) { - if (!item.isDir) { - binding.imageView.setImageDrawable(fileIcon) - } else if (holder.layoutPosition == 0 && viewModel.subDocs.isNotEmpty()) { + if (item == (viewModel.subDocs.lastOrNull() ?: viewModel.rootDoc)) { binding.imageView.setImageDrawable(upIcon) - } else { + binding.textView.text = dirParent + } else if (item.isDirectory) { binding.imageView.setImageDrawable(folderIcon) + binding.textView.text = item.name + } else { + binding.imageView.setImageDrawable(fileIcon) + binding.textView.text = item.name } - binding.textView.text = item.name } diff --git a/app/src/main/java/io/legado/app/ui/document/FileManageViewModel.kt b/app/src/main/java/io/legado/app/ui/document/FileManageViewModel.kt index 9b8090cd9..01970ac79 100644 --- a/app/src/main/java/io/legado/app/ui/document/FileManageViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/document/FileManageViewModel.kt @@ -1,14 +1,36 @@ package io.legado.app.ui.document import android.app.Application +import androidx.lifecycle.MutableLiveData import io.legado.app.base.BaseViewModel -import io.legado.app.utils.FileDoc +import io.legado.app.utils.toastOnUi +import java.io.File class FileManageViewModel(application: Application) : BaseViewModel(application) { - val rootDoc = context.getExternalFilesDir(null)?.parentFile?.let { - FileDoc.fromFile(it) + val rootDoc = context.getExternalFilesDir(null)?.parentFile + var subDocs = mutableListOf() + val filesLiveData = MutableLiveData>() + + fun upFiles(parentFile: File?) { + execute { + if (parentFile == rootDoc) { + parentFile?.listFiles()?.toList() + } else { + val list = arrayListOf(parentFile) + parentFile?.listFiles()?.let { + list.addAll(it) + } + list + } + }.onStart { + filesLiveData.postValue(emptyList()) + }.onSuccess { + filesLiveData.postValue(it ?: emptyList()) + }.onError { + context.toastOnUi(it.localizedMessage) + } } - val subDocs = arrayListOf() + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/document/adapter/FileAdapter.kt b/app/src/main/java/io/legado/app/ui/document/adapter/FileAdapter.kt index 66ec8c2a5..eadb4d514 100644 --- a/app/src/main/java/io/legado/app/ui/document/adapter/FileAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/document/adapter/FileAdapter.kt @@ -27,6 +27,8 @@ class FileAdapter(context: Context, val callBack: CallBack) : private val fileIcon = ConvertUtils.toDrawable(FilePickerIcon.getFile())!! private val primaryTextColor = context.getPrimaryTextColor(!AppConfig.isNightTheme) private val disabledTextColor = context.getPrimaryDisabledTextColor(!AppConfig.isNightTheme) + private val dirRoot = "." + private val dirParent = ".." fun loadData(path: String?) { if (path == null) { @@ -42,7 +44,7 @@ class FileAdapter(context: Context, val callBack: CallBack) : val fileRoot = FileItem( isDirectory = true, icon = homeIcon, - name = DIR_ROOT, + name = dirRoot, path = rootPath ?: path ) data.add(fileRoot) @@ -52,7 +54,7 @@ class FileAdapter(context: Context, val callBack: CallBack) : val fileParent = FileItem( isDirectory = true, icon = upIcon, - name = DIR_PARENT, + name = dirParent, path = File(path).parent ?: "" ) data.add(fileParent) @@ -152,10 +154,5 @@ class FileAdapter(context: Context, val callBack: CallBack) : var isShowHideDir: Boolean } - companion object { - const val DIR_ROOT = "." - const val DIR_PARENT = ".." - } - } diff --git a/app/src/main/res/layout/activity_file_manage.xml b/app/src/main/res/layout/activity_file_manage.xml index 8de73a71b..ee30e24c0 100644 --- a/app/src/main/res/layout/activity_file_manage.xml +++ b/app/src/main/res/layout/activity_file_manage.xml @@ -24,18 +24,12 @@ android:elevation="5dp" app:layout_constraintTop_toBottomOf="@+id/titleBar" /> - - + app:layout_constraintTop_toBottomOf="@id/rv_path">