增加内置文件管理器

This commit is contained in:
kunfei 2023-03-31 19:45:01 +08:00
parent 25fcb24a6c
commit 00881414c2
37 changed files with 98 additions and 53 deletions

View File

@ -292,12 +292,12 @@
android:hardwareAccelerated="true" />
<!-- 文件管理 -->
<activity
android:name=".ui.document.FileManageActivity"
android:name=".ui.file.FileManageActivity"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true" />
<!-- 选择文件 -->
<activity
android:name=".ui.document.HandleFileActivity"
android:name=".ui.file.HandleFileActivity"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true"
android:theme="@style/AppTheme.Transparent" />

View File

@ -15,7 +15,7 @@ import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.permission.Permissions
import io.legado.app.lib.permission.PermissionsCompat
import io.legado.app.ui.book.read.ReadBookActivity
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.IO

View File

@ -9,7 +9,7 @@ import io.legado.app.base.VMBaseActivity
import io.legado.app.data.appDb
import io.legado.app.data.entities.Bookmark
import io.legado.app.databinding.ActivityAllBookmarkBinding
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.launch
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.viewbindingdelegate.viewBinding

View File

@ -24,7 +24,7 @@ import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector
import io.legado.app.model.CacheBook
import io.legado.app.ui.about.AppLogDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.IO

View File

@ -7,19 +7,18 @@ import androidx.appcompat.widget.SearchView
import androidx.lifecycle.ViewModel
import io.legado.app.R
import io.legado.app.base.VMBaseActivity
import io.legado.app.databinding.ActivityImportBookBinding
import io.legado.app.data.appDb
import io.legado.app.constant.AppPattern
import io.legado.app.data.appDb
import io.legado.app.databinding.ActivityImportBookBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector
import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.model.localBook.LocalBook
import io.legado.app.ui.book.read.ReadBookActivity
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine

View File

@ -19,7 +19,7 @@ import io.legado.app.lib.permission.Permissions
import io.legado.app.lib.permission.PermissionsCompat
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.ui.book.import.BaseImportBookActivity
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.widget.SelectActionBar
import io.legado.app.utils.*
import kotlinx.coroutines.Dispatchers.IO

View File

@ -41,7 +41,7 @@ import io.legado.app.ui.book.read.ReadBookActivity
import io.legado.app.ui.book.search.SearchActivity
import io.legado.app.ui.book.source.edit.BookSourceEditActivity
import io.legado.app.ui.book.toc.TocActivityResult
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.widget.dialog.PhotoDialog
import io.legado.app.ui.widget.dialog.VariableDialog

View File

@ -32,7 +32,7 @@ import io.legado.app.model.ReadBook
import io.legado.app.ui.book.read.config.BgTextConfigDialog
import io.legado.app.ui.book.read.config.ClickActionConfigDialog
import io.legado.app.ui.book.read.config.PaddingConfigDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding

View File

@ -61,7 +61,7 @@ import io.legado.app.ui.book.toc.TocActivityResult
import io.legado.app.ui.book.toc.rule.TxtTocRuleDialog
import io.legado.app.ui.browser.WebViewActivity
import io.legado.app.ui.dict.DictDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.replace.ReplaceRuleActivity
import io.legado.app.ui.replace.edit.ReplaceEditActivity

View File

@ -31,7 +31,7 @@ import io.legado.app.lib.theme.bottomBackground
import io.legado.app.lib.theme.getPrimaryTextColor
import io.legado.app.lib.theme.getSecondaryTextColor
import io.legado.app.ui.book.read.ReadBookActivity
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.widget.seekbar.SeekBarChangeListener
import io.legado.app.utils.*
import io.legado.app.utils.compress.ZipUtils

View File

@ -26,7 +26,7 @@ import io.legado.app.lib.theme.primaryColor
import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook
import io.legado.app.ui.association.ImportHttpTtsDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding

View File

@ -25,7 +25,7 @@ import io.legado.app.lib.theme.accentColor
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.book.source.debug.BookSourceDebugActivity
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.qrcode.QrCodeResult
import io.legado.app.ui.widget.dialog.TextDialog

View File

@ -32,7 +32,7 @@ import io.legado.app.ui.book.search.SearchScope
import io.legado.app.ui.book.source.debug.BookSourceDebugActivity
import io.legado.app.ui.book.source.edit.BookSourceEditActivity
import io.legado.app.ui.config.CheckSourceConfig
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.qrcode.QrCodeResult
import io.legado.app.ui.widget.SelectActionBar
import io.legado.app.ui.widget.dialog.TextDialog

View File

@ -17,7 +17,7 @@ import io.legado.app.help.DirectLinkUpload
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.association.ImportTxtTocRuleDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.qrcode.QrCodeResult
import io.legado.app.ui.widget.SelectActionBar
import io.legado.app.ui.widget.dialog.TextDialog

View File

@ -25,7 +25,7 @@ import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.association.ImportTxtTocRuleDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.qrcode.QrCodeResult
import io.legado.app.ui.widget.dialog.TextDialog
import io.legado.app.ui.widget.recycler.ItemTouchCallback

View File

@ -22,7 +22,7 @@ import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.theme.accentColor
import io.legado.app.model.Download
import io.legado.app.ui.association.OnLineImportActivity
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import java.net.URLDecoder

View File

@ -34,7 +34,7 @@ import io.legado.app.lib.permission.PermissionsCompat
import io.legado.app.lib.prefs.fragment.PreferenceFragment
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.about.AppLogDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.widget.dialog.TextDialog
import io.legado.app.ui.widget.dialog.WaitDialog
import io.legado.app.utils.*

View File

@ -2,7 +2,6 @@ package io.legado.app.ui.config
import android.annotation.SuppressLint
import android.content.ComponentName
import android.content.Context
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.os.Bundle
@ -24,7 +23,7 @@ import io.legado.app.model.CheckSource
import io.legado.app.receiver.SharedReceiverActivity
import io.legado.app.service.WebService
import io.legado.app.ui.book.read.page.provider.ImageProvider
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.widget.number.NumberPickerDialog
import io.legado.app.utils.*
import splitties.init.appCtx

View File

@ -18,7 +18,7 @@ import io.legado.app.help.DirectLinkUpload
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.association.ImportDictRuleDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.qrcode.QrCodeResult
import io.legado.app.ui.widget.SelectActionBar
import io.legado.app.ui.widget.dialog.TextDialog

View File

@ -1,8 +1,10 @@
package io.legado.app.ui.document
package io.legado.app.ui.file
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.PopupMenu
import androidx.activity.viewModels
import androidx.appcompat.widget.SearchView
import androidx.core.content.FileProvider
@ -17,7 +19,7 @@ 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.utils.FilePickerIcon
import io.legado.app.ui.file.utils.FilePickerIcon
import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.ConvertUtils
import io.legado.app.utils.applyTint
@ -152,7 +154,7 @@ class FileManageActivity : VMBaseActivity<ActivityFileManageBinding, FileManageV
binding.root.setOnClickListener {
val item = getItemByLayoutPosition(holder.layoutPosition)
item?.let {
if (item == (viewModel.subDocs.lastOrNull() ?: viewModel.rootDoc)) {
if (item == viewModel.lastDir) {
viewModel.subDocs.removeLastOrNull()
pathAdapter.setItems(viewModel.subDocs)
viewModel.upFiles(viewModel.subDocs.lastOrNull() ?: viewModel.rootDoc)
@ -171,6 +173,16 @@ class FileManageActivity : VMBaseActivity<ActivityFileManageBinding, FileManageV
}
}
}
binding.root.setOnLongClickListener { view ->
val item = getItemByLayoutPosition(holder.layoutPosition)
if (item == viewModel.lastDir) {
return@setOnLongClickListener true
}
item?.let {
showFileMenu(view, item)
}
return@setOnLongClickListener true
}
}
override fun convert(
@ -179,7 +191,7 @@ class FileManageActivity : VMBaseActivity<ActivityFileManageBinding, FileManageV
item: File,
payloads: MutableList<Any>
) {
if (item == (viewModel.subDocs.lastOrNull() ?: viewModel.rootDoc)) {
if (item == viewModel.lastDir) {
binding.imageView.setImageDrawable(upIcon)
binding.textView.text = dirParent
} else if (item.isDirectory) {
@ -191,6 +203,17 @@ class FileManageActivity : VMBaseActivity<ActivityFileManageBinding, FileManageV
}
}
private fun showFileMenu(view: View, file: File) {
val popupMenu = PopupMenu(context, view)
popupMenu.inflate(R.menu.file_long_click)
popupMenu.setOnMenuItemClickListener {
when (it.itemId) {
R.id.menu_del -> viewModel.delFile(file)
}
true
}
popupMenu.show()
}
}

View File

@ -1,4 +1,4 @@
package io.legado.app.ui.document
package io.legado.app.ui.file
import android.app.Application
import androidx.lifecycle.MutableLiveData
@ -12,13 +12,20 @@ class FileManageViewModel(application: Application) : BaseViewModel(application)
var subDocs = mutableListOf<File>()
val filesLiveData = MutableLiveData<List<File>>()
val lastDir: File? get() = subDocs.lastOrNull() ?: rootDoc
fun upFiles(parentFile: File?) {
execute {
parentFile ?: return@execute emptyList()
if (parentFile == rootDoc) {
parentFile?.listFiles()?.toList()
parentFile.listFiles()?.sortedWith(
compareBy({ it.isFile }, { it.name })
)
} else {
val list = arrayListOf(parentFile)
parentFile?.listFiles()?.let {
parentFile.listFiles()?.sortedWith(
compareBy({ it.isFile }, { it.name })
)?.let {
list.addAll(it)
}
list
@ -32,5 +39,14 @@ class FileManageViewModel(application: Application) : BaseViewModel(application)
}
}
fun delFile(file: File) {
execute {
file.delete()
}.onSuccess {
upFiles(lastDir)
}.onError {
context.toastOnUi(it.localizedMessage)
}
}
}

View File

@ -1,4 +1,4 @@
package io.legado.app.ui.document
package io.legado.app.ui.file
import android.content.DialogInterface
import android.content.Intent
@ -14,10 +14,10 @@ import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogFileChooserBinding
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.document.HandleFileContract.Companion.DIR
import io.legado.app.ui.document.HandleFileContract.Companion.FILE
import io.legado.app.ui.document.adapter.FileAdapter
import io.legado.app.ui.document.adapter.PathAdapter
import io.legado.app.ui.file.HandleFileContract.Companion.DIR
import io.legado.app.ui.file.HandleFileContract.Companion.FILE
import io.legado.app.ui.file.adapter.FileAdapter
import io.legado.app.ui.file.adapter.PathAdapter
import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding

View File

@ -1,4 +1,4 @@
package io.legado.app.ui.document
package io.legado.app.ui.file
import android.content.Intent
import android.net.Uri

View File

@ -1,4 +1,4 @@
package io.legado.app.ui.document
package io.legado.app.ui.file
import android.app.Activity.RESULT_OK
import android.content.Context

View File

@ -1,4 +1,4 @@
package io.legado.app.ui.document
package io.legado.app.ui.file
import android.app.Application
import android.net.Uri

View File

@ -1,4 +1,4 @@
package io.legado.app.ui.document.adapter
package io.legado.app.ui.file.adapter
import android.content.Context
@ -9,8 +9,8 @@ import io.legado.app.databinding.ItemFilePickerBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.lib.theme.getPrimaryDisabledTextColor
import io.legado.app.lib.theme.getPrimaryTextColor
import io.legado.app.ui.document.entity.FileItem
import io.legado.app.ui.document.utils.FilePickerIcon
import io.legado.app.ui.file.entity.FileItem
import io.legado.app.ui.file.utils.FilePickerIcon
import io.legado.app.utils.ConvertUtils
import io.legado.app.utils.FileUtils
import java.io.File

View File

@ -1,4 +1,4 @@
package io.legado.app.ui.document.adapter
package io.legado.app.ui.file.adapter
import android.content.Context
import android.os.Environment
@ -6,7 +6,7 @@ import android.view.ViewGroup
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.RecyclerAdapter
import io.legado.app.databinding.ItemPathPickerBinding
import io.legado.app.ui.document.utils.FilePickerIcon
import io.legado.app.ui.file.utils.FilePickerIcon
import io.legado.app.utils.ConvertUtils
import java.util.*

View File

@ -1,4 +1,4 @@
package io.legado.app.ui.document.entity
package io.legado.app.ui.file.entity
import android.graphics.drawable.Drawable

View File

@ -1,4 +1,4 @@
package io.legado.app.ui.document.utils;
package io.legado.app.ui.file.utils;
/**
* Generated by https://github.com/gzu-liyujiang/Image2ByteVar

View File

@ -18,7 +18,7 @@ import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.permission.Permissions
import io.legado.app.lib.permission.PermissionsCompat
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.Main

View File

@ -25,7 +25,7 @@ import io.legado.app.ui.book.import.local.ImportBookActivity
import io.legado.app.ui.book.import.remote.RemoteBookActivity
import io.legado.app.ui.book.manage.BookshelfManageActivity
import io.legado.app.ui.book.search.SearchActivity
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.main.MainViewModel
import io.legado.app.utils.*

View File

@ -29,7 +29,7 @@ import io.legado.app.ui.book.toc.rule.TxtTocRuleActivity
import io.legado.app.ui.config.ConfigActivity
import io.legado.app.ui.config.ConfigTag
import io.legado.app.ui.dict.rule.DictRuleActivity
import io.legado.app.ui.document.FileManageActivity
import io.legado.app.ui.file.FileManageActivity
import io.legado.app.ui.replace.ReplaceRuleActivity
import io.legado.app.ui.widget.dialog.TextDialog
import io.legado.app.utils.*

View File

@ -28,7 +28,7 @@ import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor
import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.ui.association.ImportReplaceRuleDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.qrcode.QrCodeResult
import io.legado.app.ui.replace.edit.ReplaceEditActivity
import io.legado.app.ui.widget.SelectActionBar

View File

@ -21,7 +21,7 @@ import io.legado.app.lib.theme.accentColor
import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.model.Download
import io.legado.app.ui.association.OnLineImportActivity
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding

View File

@ -18,7 +18,7 @@ import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.accentColor
import io.legado.app.lib.theme.backgroundColor
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.qrcode.QrCodeResult
import io.legado.app.ui.rss.source.debug.RssSourceDebugActivity

View File

@ -23,7 +23,7 @@ import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor
import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.ui.association.ImportRssSourceDialog
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.file.HandleFileContract
import io.legado.app.ui.qrcode.QrCodeResult
import io.legado.app.ui.rss.source.edit.RssSourceEditActivity
import io.legado.app.ui.widget.SelectActionBar

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_del"
android:title="@string/delete" />
</menu>