2022-04-04 14:03:10 +00:00
|
|
|
|
package com.coldmint.rust.pro
|
|
|
|
|
|
|
|
|
|
import com.coldmint.rust.pro.base.BaseActivity
|
|
|
|
|
import com.coldmint.rust.pro.tool.BookmarkManager
|
|
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
|
|
import android.content.Intent
|
|
|
|
|
import com.coldmint.rust.pro.tool.GlobalMethod
|
|
|
|
|
import com.google.android.material.snackbar.Snackbar
|
|
|
|
|
import android.provider.MediaStore
|
|
|
|
|
import android.provider.DocumentsContract
|
|
|
|
|
import android.content.ContentUris
|
|
|
|
|
import android.content.Context
|
|
|
|
|
import android.database.Cursor
|
|
|
|
|
import android.net.Uri
|
|
|
|
|
import android.os.*
|
|
|
|
|
import android.view.*
|
|
|
|
|
import android.widget.*
|
|
|
|
|
import androidx.core.view.isVisible
|
2022-07-18 23:59:32 +00:00
|
|
|
|
import androidx.lifecycle.ViewModelProvider
|
2022-04-04 14:03:10 +00:00
|
|
|
|
import com.afollestad.materialdialogs.MaterialDialog
|
|
|
|
|
import com.afollestad.materialdialogs.WhichButton
|
|
|
|
|
import com.afollestad.materialdialogs.actions.setActionButtonEnabled
|
|
|
|
|
import com.afollestad.materialdialogs.input.getInputField
|
|
|
|
|
import com.afollestad.materialdialogs.input.input
|
|
|
|
|
import com.afollestad.materialdialogs.list.listItems
|
2022-08-10 09:27:38 +00:00
|
|
|
|
import com.coldmint.dialog.CoreDialog
|
|
|
|
|
import com.coldmint.dialog.InputDialog
|
2022-04-04 14:03:10 +00:00
|
|
|
|
import com.coldmint.rust.core.tool.FileOperator
|
2022-08-10 09:27:38 +00:00
|
|
|
|
import com.coldmint.rust.core.tool.LineParser
|
2022-04-04 14:03:10 +00:00
|
|
|
|
import com.coldmint.rust.pro.adapters.FileAdapter
|
2022-08-10 09:27:38 +00:00
|
|
|
|
import com.coldmint.rust.pro.adapters.FileTabAdapter
|
|
|
|
|
import com.coldmint.rust.pro.databean.FileTab
|
2022-04-04 14:03:10 +00:00
|
|
|
|
import com.coldmint.rust.pro.databinding.ActivityFileBinding
|
|
|
|
|
import com.coldmint.rust.pro.interfaces.BookmarkListener
|
2022-07-29 15:19:07 +00:00
|
|
|
|
import com.coldmint.rust.pro.tool.AppSettings
|
2022-07-18 23:59:32 +00:00
|
|
|
|
import com.coldmint.rust.pro.viewmodel.FileManagerViewModel
|
2022-08-10 09:27:38 +00:00
|
|
|
|
import com.google.android.material.chip.Chip
|
2022-04-04 14:03:10 +00:00
|
|
|
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
2022-08-10 09:27:38 +00:00
|
|
|
|
import com.google.android.material.snackbar.SnackbarContentLayout
|
2022-07-19 14:32:02 +00:00
|
|
|
|
import me.zhanghai.android.fastscroll.FastScrollerBuilder
|
2022-04-04 14:03:10 +00:00
|
|
|
|
import java.io.File
|
|
|
|
|
import java.lang.Exception
|
|
|
|
|
import java.util.*
|
|
|
|
|
import java.util.concurrent.Executors
|
|
|
|
|
import kotlin.collections.ArrayList
|
|
|
|
|
|
|
|
|
|
class FileManagerActivity : BaseActivity<ActivityFileBinding>() {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// private var directs = Environment.getExternalStorageDirectory()
|
|
|
|
|
// private var mRoot = directs
|
|
|
|
|
// var filePath = ""
|
|
|
|
|
//
|
2022-08-10 09:27:38 +00:00
|
|
|
|
|
|
|
|
|
// val executorService = Executors.newSingleThreadExecutor()
|
2022-07-18 23:59:32 +00:00
|
|
|
|
//
|
|
|
|
|
// //type可为默认default,选择文件夹selectDirectents,选择文件selectFile
|
|
|
|
|
// var mStartType: String? = "default"
|
|
|
|
|
// private var mFileAdapter: FileAdapter? = null
|
|
|
|
|
// private var mProcessFiles = false
|
|
|
|
|
// private var additionalData: String? = null
|
|
|
|
|
// private fun initView() {
|
|
|
|
|
// title = getString(R.string.file_manager)
|
|
|
|
|
// setReturnButton()
|
|
|
|
|
// viewBinding.fileList.layoutManager = LinearLayoutManager(this@FileManagerActivity)
|
|
|
|
|
// val intent = intent
|
|
|
|
|
// val bundle = intent.getBundleExtra("data")
|
|
|
|
|
// if (bundle == null) {
|
|
|
|
|
// showError("无效的请求。")
|
|
|
|
|
// finish()
|
|
|
|
|
// } else {
|
|
|
|
|
// mStartType = bundle.getString("type")
|
|
|
|
|
// when (mStartType) {
|
|
|
|
|
// "default" -> {
|
|
|
|
|
// }
|
|
|
|
|
// "selectDirectents" -> {
|
|
|
|
|
// setTitle(R.string.select_directents)
|
|
|
|
|
// viewBinding.fab.setIconResource(R.drawable.complete)
|
|
|
|
|
// viewBinding.fab.postDelayed({
|
|
|
|
|
// viewBinding.fab.text = getString(R.string.select_directents)
|
|
|
|
|
// viewBinding.fab.extend()
|
|
|
|
|
// }, 300)
|
|
|
|
|
// }
|
|
|
|
|
// "exportFile" -> {
|
|
|
|
|
// setTitle(R.string.export_file)
|
|
|
|
|
// val additional = bundle.getString("additionalData")
|
|
|
|
|
// if (additional == null) {
|
|
|
|
|
// showError("请输入 additionalData")
|
|
|
|
|
// return
|
|
|
|
|
// } else {
|
|
|
|
|
// viewBinding.fab.setIconResource(R.drawable.complete)
|
|
|
|
|
// viewBinding.fab.postDelayed({
|
|
|
|
|
// viewBinding.fab.text = getString(R.string.export_this)
|
|
|
|
|
// viewBinding.fab.extend()
|
|
|
|
|
// }, 300)
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// "selectFile" -> {
|
|
|
|
|
// setTitle(R.string.select_file)
|
|
|
|
|
// viewBinding.fab.setIconResource(R.drawable.complete)
|
|
|
|
|
// viewBinding.fab.hide()
|
|
|
|
|
// }
|
|
|
|
|
// else -> {
|
|
|
|
|
// Toast.makeText(this, "意外的请求", Toast.LENGTH_SHORT).show()
|
|
|
|
|
// finish()
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// if (bundle.containsKey("path")) {
|
|
|
|
|
// directs = File(bundle.getString("path"))
|
|
|
|
|
// }
|
|
|
|
|
// if (bundle.containsKey("rootpath")) {
|
|
|
|
|
// mRoot = File(bundle.getString("rootpath"))
|
|
|
|
|
// }
|
|
|
|
|
// if (bundle.containsKey("additionalData")) {
|
|
|
|
|
// additionalData = bundle.getString("additionalData")
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// loadFiles(directs)
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// private fun tryOpenFile(file: File?) {
|
|
|
|
|
// if (file == null) {
|
|
|
|
|
// returnDirects()
|
|
|
|
|
// } else {
|
|
|
|
|
// if (file.isDirectory) {
|
|
|
|
|
// loadFiles(file)
|
|
|
|
|
// } else {
|
|
|
|
|
// when (mStartType) {
|
|
|
|
|
// "default" -> {
|
|
|
|
|
// when (FileOperator.getFileType(file)) {
|
|
|
|
|
// "ini", "txt", "template" -> {
|
|
|
|
|
// val bundle = Bundle()
|
|
|
|
|
// bundle.putString("path", file.absolutePath)
|
|
|
|
|
// bundle.putString("modPath", FileOperator.getSuperDirectory(file))
|
|
|
|
|
// val intent =
|
|
|
|
|
// Intent(this@FileManagerActivity, EditActivity::class.java)
|
|
|
|
|
// intent.putExtra("data", bundle)
|
|
|
|
|
// this@FileManagerActivity.startActivity(intent)
|
|
|
|
|
// }
|
|
|
|
|
// "json" -> {
|
|
|
|
|
// val openList = listOf<String>(
|
|
|
|
|
// getString(R.string.edit_template), getString(
|
|
|
|
|
// R.string.open_action1
|
|
|
|
|
// )
|
|
|
|
|
// )
|
|
|
|
|
// MaterialDialog(this).title(R.string.open_type)
|
|
|
|
|
// .listItems(items = openList) { dialog, index, text ->
|
|
|
|
|
// when (text) {
|
|
|
|
|
// getString(R.string.edit_template) -> {
|
|
|
|
|
// editTemplate(file)
|
|
|
|
|
// }
|
|
|
|
|
// getString(R.string.open_action1) -> {
|
|
|
|
|
// editText(file)
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }.show()
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
// "zip", "rwmod", "rar" -> {
|
|
|
|
|
// Toast.makeText(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// "点击了压缩文件。",
|
|
|
|
|
// Toast.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// FileOperator.openFile(this@FileManagerActivity, file)
|
|
|
|
|
// }
|
|
|
|
|
// else -> {
|
|
|
|
|
// val ints = intArrayOf(
|
|
|
|
|
// R.string.open_action1,
|
|
|
|
|
// R.string.open_action4
|
|
|
|
|
// )
|
|
|
|
|
// val items = FileAdapter.conversionSymbol(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// ints
|
|
|
|
|
// )
|
|
|
|
|
//
|
|
|
|
|
// MaterialAlertDialogBuilder(this).setItems(
|
|
|
|
|
// items
|
|
|
|
|
// ) { dialog, which ->
|
|
|
|
|
// when (ints[which]) {
|
|
|
|
|
// R.string.open_action1 -> {
|
|
|
|
|
// editText(file)
|
|
|
|
|
// }
|
|
|
|
|
// R.string.open_action4 -> FileOperator.openFile(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// file
|
|
|
|
|
// )
|
|
|
|
|
// }
|
|
|
|
|
// }.show()
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// viewBinding.fab.show()
|
|
|
|
|
// filePath = file.absolutePath
|
|
|
|
|
// }
|
|
|
|
|
// "selectFile" -> {
|
|
|
|
|
// viewBinding.fab.show()
|
|
|
|
|
// viewBinding.fab.postDelayed({
|
|
|
|
|
// filePath = file.absolutePath
|
|
|
|
|
// viewBinding.fab.text =
|
|
|
|
|
// String.format(getString(R.string.select_file_ok), file.name)
|
|
|
|
|
// viewBinding.fab.extend()
|
|
|
|
|
// }, 300)
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 编辑模板
|
|
|
|
|
// * @param file File
|
|
|
|
|
// */
|
|
|
|
|
// fun editTemplate(file: File) {
|
|
|
|
|
// val intent = Intent(this, TemplateMakerActivity::class.java)
|
|
|
|
|
// val bundle = Bundle()
|
|
|
|
|
// intent.putExtra("data", bundle)
|
|
|
|
|
// bundle.putString("path", file.absolutePath)
|
|
|
|
|
// bundle.putBoolean("loadTemplate", true)
|
|
|
|
|
// bundle.putString("templatePath", additionalData)
|
|
|
|
|
// startActivity(intent)
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 编辑文本
|
|
|
|
|
// * @param file File
|
|
|
|
|
// */
|
|
|
|
|
// fun editText(file: File) {
|
|
|
|
|
// val bundle = Bundle()
|
|
|
|
|
// bundle.putString("path", file.absolutePath)
|
|
|
|
|
// bundle.putString(
|
|
|
|
|
// "modPath",
|
|
|
|
|
// FileOperator.getSuperDirectory(file)
|
|
|
|
|
// )
|
|
|
|
|
// val intent = Intent(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// EditActivity::class.java
|
|
|
|
|
// )
|
|
|
|
|
// intent.putExtra("data", bundle)
|
|
|
|
|
// this@FileManagerActivity.startActivity(intent)
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// //加载文件
|
|
|
|
|
// fun loadFiles(file: File) {
|
|
|
|
|
// executorService.submit {
|
|
|
|
|
// if (!file.exists()) {
|
|
|
|
|
// runOnUiThread {
|
|
|
|
|
// viewBinding.fileList.isVisible = false
|
|
|
|
|
// viewBinding.progressBar.isVisible = false
|
|
|
|
|
// viewBinding.fileError.isVisible = true
|
|
|
|
|
// viewBinding.fileError.setText(R.string.unable_to_open_this_directory)
|
|
|
|
|
// viewBinding.fab.hide()
|
|
|
|
|
// }
|
|
|
|
|
// return@submit
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// if (file.isDirectory) {
|
|
|
|
|
// val files = file.listFiles()
|
|
|
|
|
// directs = file
|
|
|
|
|
// val fileArrayList: ArrayList<File?> = ArrayList(listOf(*files))
|
|
|
|
|
// if (file.absolutePath != mRoot.absolutePath) {
|
|
|
|
|
// fileArrayList.add(0, null)
|
|
|
|
|
// }
|
|
|
|
|
// val finalFileAdapter: FileAdapter =
|
|
|
|
|
// if (mFileAdapter == null) {
|
|
|
|
|
// mFileAdapter = FileAdapter(this@FileManagerActivity, fileArrayList)
|
|
|
|
|
// mFileAdapter!!
|
|
|
|
|
// } else {
|
|
|
|
|
// mFileAdapter?.setNewDataList(fileArrayList)
|
|
|
|
|
// mFileAdapter!!
|
|
|
|
|
// }
|
|
|
|
|
// finalFileAdapter.setSortType(FileAdapter.SortType.FileName)
|
|
|
|
|
// finalFileAdapter.setItemEvent { i, fileItemBinding, viewHolder, itemFile ->
|
|
|
|
|
// fileItemBinding.root.setOnClickListener {
|
|
|
|
|
// tryOpenFile(itemFile)
|
|
|
|
|
// }
|
|
|
|
|
// fileItemBinding.more.setOnClickListener {
|
|
|
|
|
// if (itemFile == null) {
|
|
|
|
|
// return@setOnClickListener
|
|
|
|
|
// }
|
|
|
|
|
// val popupMenu =
|
|
|
|
|
// PopupMenu(this@FileManagerActivity, fileItemBinding.more)
|
|
|
|
|
// val cutBoardMenu =
|
|
|
|
|
// popupMenu.menu.addSubMenu(R.string.cut_board_operation)
|
|
|
|
|
// val fileMenu = popupMenu.menu.addSubMenu(R.string.file_operation)
|
|
|
|
|
// val bookmarksMenu =
|
|
|
|
|
// popupMenu.menu.addSubMenu(R.string.bookmarks_operation)
|
|
|
|
|
// cutBoardMenu.add(R.string.copy_file_name)
|
|
|
|
|
// cutBoardMenu.add(R.string.copy_file_path)
|
|
|
|
|
// fileMenu.add(R.string.copy)
|
|
|
|
|
// fileMenu.add(R.string.cut_off)
|
|
|
|
|
// fileMenu.add(R.string.mod_action9)
|
|
|
|
|
// fileMenu.add(R.string.delete_title)
|
|
|
|
|
// if (bookmarkManager.contains(file)) {
|
|
|
|
|
// bookmarksMenu.add(R.string.remove_bookmark)
|
|
|
|
|
// } else {
|
|
|
|
|
// bookmarksMenu.add(R.string.add_bookmark)
|
|
|
|
|
// }
|
|
|
|
|
// bookmarksMenu.add(R.string.bookmark_manager)
|
|
|
|
|
// addJumpBookMenu(bookmarksMenu)
|
|
|
|
|
// popupMenu.setOnMenuItemClickListener { item ->
|
|
|
|
|
// val title = item.title
|
|
|
|
|
// if (title == getText(R.string.copy_file_name)) {
|
|
|
|
|
// val name = itemFile.name
|
|
|
|
|
// GlobalMethod.copyText(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// name,
|
|
|
|
|
// viewBinding.fab
|
|
|
|
|
// )
|
|
|
|
|
// } else if (title == getText(R.string.copy_file_path)) {
|
|
|
|
|
// val path = itemFile.absolutePath
|
|
|
|
|
// GlobalMethod.copyText(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// path,
|
|
|
|
|
// viewBinding.fab
|
|
|
|
|
// )
|
|
|
|
|
// } else if (title == getText(R.string.delete_title)) {
|
|
|
|
|
// executorService.submit {
|
|
|
|
|
// FileOperator.delete_files(itemFile)
|
|
|
|
|
// runOnUiThread {
|
|
|
|
|
// loadFiles(directs)
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// } else if (title == getText(R.string.copy)) {
|
|
|
|
|
// finalFileAdapter.setSelectPath(itemFile.absolutePath, true)
|
|
|
|
|
// } else if (title == getText(R.string.cut_off)) {
|
|
|
|
|
// finalFileAdapter.setSelectPath(itemFile.absolutePath, false)
|
|
|
|
|
// } else if (title == getText(R.string.mod_action9)) {
|
|
|
|
|
// val oldName = itemFile.name
|
|
|
|
|
// MaterialDialog(this@FileManagerActivity).show {
|
|
|
|
|
// title(R.string.mod_action9)
|
|
|
|
|
// input(
|
|
|
|
|
// maxLength = 255,
|
|
|
|
|
// waitForPositiveButton = false, prefill = oldName
|
|
|
|
|
// ) { dialog, text ->
|
|
|
|
|
// if (text.length in 1..255) {
|
|
|
|
|
// dialog.setActionButtonEnabled(
|
|
|
|
|
// WhichButton.POSITIVE,
|
|
|
|
|
// true
|
|
|
|
|
// )
|
|
|
|
|
// }
|
|
|
|
|
// }.positiveButton(R.string.dialog_ok, null) { dialog ->
|
|
|
|
|
// val newName = dialog.getInputField().text.toString()
|
|
|
|
|
// if (!newName.isEmpty() || newName != oldName) {
|
|
|
|
|
// val reNameFile = File("$directs/$newName")
|
|
|
|
|
// itemFile.renameTo(reNameFile)
|
|
|
|
|
// loadFiles(directs)
|
|
|
|
|
// }
|
|
|
|
|
// }.negativeButton(R.string.dialog_close)
|
|
|
|
|
// }
|
|
|
|
|
// } else if (title == getString(R.string.remove_bookmark)) {
|
|
|
|
|
// val removeBookmark =
|
|
|
|
|
// bookmarkManager.removeBookmark(itemFile.absolutePath)
|
|
|
|
|
// if (removeBookmark) {
|
|
|
|
|
// Snackbar.make(
|
|
|
|
|
// viewBinding.fab,
|
|
|
|
|
// R.string.remove_bookmark_success,
|
|
|
|
|
// Snackbar.LENGTH_SHORT
|
|
|
|
|
// ).setAction(R.string.symbol10) {
|
|
|
|
|
// bookmarkManager.addBookmark(
|
|
|
|
|
// itemFile.absolutePath,
|
|
|
|
|
// FileOperator.getPrefixName(file)
|
|
|
|
|
// )
|
|
|
|
|
// }
|
|
|
|
|
// .show()
|
|
|
|
|
// } else {
|
|
|
|
|
// Snackbar.make(
|
|
|
|
|
// viewBinding.fab,
|
|
|
|
|
// R.string.remove_bookmark_fail,
|
|
|
|
|
// Snackbar.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// }
|
|
|
|
|
// } else if (title == getString(R.string.add_bookmark)) {
|
|
|
|
|
// val addBookmark = bookmarkManager.addBookmark(
|
|
|
|
|
// itemFile.absolutePath,
|
|
|
|
|
// FileOperator.getPrefixName(file)
|
|
|
|
|
// )
|
|
|
|
|
// if (addBookmark) {
|
|
|
|
|
// Snackbar.make(
|
|
|
|
|
// viewBinding.fab,
|
|
|
|
|
// R.string.add_bookmark_success,
|
|
|
|
|
// Snackbar.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// } else {
|
|
|
|
|
// Snackbar.make(
|
|
|
|
|
// viewBinding.fab,
|
|
|
|
|
// R.string.add_bookmark_fail,
|
|
|
|
|
// Snackbar.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// }
|
|
|
|
|
// } else if (title == getString(R.string.bookmark_manager)) {
|
|
|
|
|
// bookmarkManager.save()
|
|
|
|
|
// startActivity(
|
|
|
|
|
// Intent(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// BookmarkManagerActivity::class.java
|
|
|
|
|
// )
|
|
|
|
|
// )
|
|
|
|
|
// } else {
|
|
|
|
|
// loadBook(title)
|
|
|
|
|
// }
|
|
|
|
|
// false
|
|
|
|
|
// }
|
|
|
|
|
// popupMenu.show()
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// runOnUiThread {
|
|
|
|
|
// viewBinding.fileList.adapter = finalFileAdapter
|
|
|
|
|
// viewBinding.fileList.isVisible = true
|
|
|
|
|
// viewBinding.fileError.isVisible = false
|
|
|
|
|
// viewBinding.progressBar.isVisible = false
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
//
|
2022-08-10 09:27:38 +00:00
|
|
|
|
|
|
|
|
|
// /**
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// * 点击书签项目
|
|
|
|
|
// */
|
|
|
|
|
// fun loadBook(menuTitle: CharSequence) {
|
|
|
|
|
// if (bookmarkMap.containsKey(menuTitle)) {
|
|
|
|
|
// val path = bookmarkMap[menuTitle]
|
|
|
|
|
// if (path != null) {
|
2022-08-10 09:27:38 +00:00
|
|
|
|
// val rootPath = viewModel.getRootPath()
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// if (path.startsWith(rootPath)) {
|
|
|
|
|
// val newFile = File(path)
|
|
|
|
|
// if (newFile.exists()) {
|
|
|
|
|
// if (newFile.isDirectory) {
|
2022-08-10 09:27:38 +00:00
|
|
|
|
// viewModel.loadFiles(newFile.absolutePath)
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// } else {
|
2022-08-10 09:27:38 +00:00
|
|
|
|
//// tryOpenFile(newFile)
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// }
|
|
|
|
|
// } else {
|
|
|
|
|
// Snackbar.make(
|
|
|
|
|
// viewBinding.fab,
|
|
|
|
|
// R.string.bookmark_jump_failed,
|
|
|
|
|
// Snackbar.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// }
|
|
|
|
|
// } else {
|
|
|
|
|
// Snackbar.make(
|
|
|
|
|
// viewBinding.fab,
|
|
|
|
|
// R.string.cannot_be_accessed_this_directory,
|
|
|
|
|
// Snackbar.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// override fun onPause() {
|
2022-08-10 09:27:38 +00:00
|
|
|
|
// viewModel.getBookmarkManager().save()
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// super.onPause()
|
|
|
|
|
// }
|
2022-08-10 09:27:38 +00:00
|
|
|
|
|
|
|
|
|
override fun onResume() {
|
|
|
|
|
viewModel.getBookmarkManager().load()
|
|
|
|
|
loadMineBookmarksMenu()
|
|
|
|
|
super.onResume()
|
|
|
|
|
}
|
2022-07-18 23:59:32 +00:00
|
|
|
|
//
|
|
|
|
|
//
|
2022-08-10 09:27:38 +00:00
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
|
|
|
|
super.onActivityResult(requestCode, resultCode, data)
|
|
|
|
|
if (resultCode == RESULT_OK) {
|
|
|
|
|
if (viewModel.startTypeData == FileManagerViewModel.StartType.SELECT_FILE && requestCode == 1) {
|
|
|
|
|
val path = FileOperator.parsePicturePath(this@FileManagerActivity, data)
|
|
|
|
|
if (path != null) {
|
|
|
|
|
val intent = Intent()
|
|
|
|
|
intent.putExtra("File", path)
|
|
|
|
|
setResult(RESULT_OK, intent)
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// bookmarkManager.save()
|
2022-08-10 09:27:38 +00:00
|
|
|
|
finish()
|
|
|
|
|
}
|
|
|
|
|
} else if (viewModel.startTypeData == FileManagerViewModel.StartType.SELECT_FILE && requestCode == 2) {
|
|
|
|
|
val path = viewModel.parseFilePath(this@FileManagerActivity, data)
|
|
|
|
|
if (path != null) {
|
|
|
|
|
val intent = Intent()
|
|
|
|
|
intent.putExtra("File", path)
|
|
|
|
|
setResult(RESULT_OK, intent)
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// bookmarkManager.save()
|
2022-08-10 09:27:38 +00:00
|
|
|
|
finish()
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
Toast.makeText(this, "未设置的操作", Toast.LENGTH_SHORT).show()
|
|
|
|
|
}
|
|
|
|
|
// else if (requestCode == 3) {
|
|
|
|
|
//新建源文件
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// loadFiles(directs)
|
|
|
|
|
// } else if (requestCode == 4) {
|
|
|
|
|
// val file = File(data!!.getStringExtra("File"))
|
|
|
|
|
// val copyResult =
|
|
|
|
|
// FileOperator.copyFile(file, File(directs.toString() + "/" + file.name))
|
|
|
|
|
// if (!copyResult) {
|
|
|
|
|
// Snackbar.make(
|
|
|
|
|
// viewBinding.fab,
|
|
|
|
|
// getText(R.string.copy_file_error),
|
|
|
|
|
// Snackbar.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// } else {
|
|
|
|
|
// loadFiles(directs)
|
|
|
|
|
// }
|
|
|
|
|
// }
|
2022-08-10 09:27:38 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
|
|
|
|
val id = item.itemId
|
|
|
|
|
when (id) {
|
|
|
|
|
android.R.id.home -> {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// bookmarkManager.save()
|
2022-08-10 09:27:38 +00:00
|
|
|
|
finish()
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
R.id.reloadFile -> {
|
|
|
|
|
viewModel.loadFiles(viewModel.getCurrentPath())
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
R.id.photo_album -> {
|
|
|
|
|
this@FileManagerActivity.startActivityForResult(
|
|
|
|
|
Intent(
|
|
|
|
|
Intent.ACTION_PICK,
|
|
|
|
|
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
|
|
|
|
|
), 1
|
|
|
|
|
)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
R.id.system_file_manager -> {
|
|
|
|
|
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
|
|
|
|
intent.type = "*/*"
|
|
|
|
|
intent.addCategory(Intent.CATEGORY_OPENABLE)
|
|
|
|
|
this@FileManagerActivity.startActivityForResult(intent, 2)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
R.id.creteFolder -> {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// createFolderAction()
|
2022-08-10 09:27:38 +00:00
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// loadBook(item.title)
|
2022-08-10 09:27:38 +00:00
|
|
|
|
return super.onOptionsItemSelected(item)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
|
|
|
|
|
return if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_DOWN) {
|
|
|
|
|
if (viewModel.getCurrentPath() == viewModel.getRootPath()) {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// bookmarkManager.save()
|
2022-08-10 09:27:38 +00:00
|
|
|
|
finish()
|
|
|
|
|
true
|
|
|
|
|
} else {
|
|
|
|
|
viewModel.returnDirects()
|
|
|
|
|
false
|
|
|
|
|
}
|
|
|
|
|
} else super.onKeyDown(keyCode, event)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
|
|
|
|
// val inflater = menuInflater
|
|
|
|
|
// inflater.inflate(R.menu.menu_files, menu)
|
|
|
|
|
// if (mStartType != "selectFile") {
|
|
|
|
|
// menu.removeItem(R.id.selectFile)
|
|
|
|
|
// }
|
|
|
|
|
// addJumpBookMenu(menu)
|
|
|
|
|
// return true
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// //加载上级文件夹
|
|
|
|
|
// fun returnDirects() {
|
|
|
|
|
// val file = File(FileOperator.getSuperDirectory(directs, mRoot))
|
|
|
|
|
// directs = file
|
|
|
|
|
// loadFiles(file)
|
|
|
|
|
// }
|
|
|
|
|
//
|
2022-08-10 09:27:38 +00:00
|
|
|
|
fun initAction() {
|
|
|
|
|
viewBinding.fab.setOnClickListener {
|
|
|
|
|
val intent = Intent()
|
|
|
|
|
val startType = viewModel.startTypeData
|
|
|
|
|
when (startType) {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// "exportFile" -> {
|
|
|
|
|
// val oldFile = File(additionalData)
|
|
|
|
|
// val result = FileOperator.copyFile(
|
|
|
|
|
// oldFile,
|
|
|
|
|
// File(directs.absolutePath + "/" + oldFile.name)
|
|
|
|
|
// )
|
|
|
|
|
// if (result) {
|
|
|
|
|
// setResult(RESULT_OK)
|
|
|
|
|
// }
|
|
|
|
|
// finish()
|
|
|
|
|
// }
|
|
|
|
|
// "selectDirectents" -> {
|
|
|
|
|
// intent.putExtra("Directents", directs.absolutePath)
|
|
|
|
|
// setResult(RESULT_OK, intent)
|
|
|
|
|
// bookmarkManager.save()
|
|
|
|
|
// finish()
|
|
|
|
|
// }
|
|
|
|
|
// "selectFile" -> {
|
|
|
|
|
// intent.putExtra("File", filePath)
|
|
|
|
|
// setResult(RESULT_OK, intent)
|
|
|
|
|
// bookmarkManager.save()
|
|
|
|
|
// finish()
|
|
|
|
|
// }
|
2022-08-10 09:27:38 +00:00
|
|
|
|
FileManagerViewModel.StartType.SELECT_FILE -> {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
FileManagerViewModel.StartType.DEFAULT -> {
|
|
|
|
|
val popupMenu = PopupMenu(this@FileManagerActivity, viewBinding.fab)
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// if (mFileAdapter != null) {
|
|
|
|
|
// val selectPath = mFileAdapter!!.selectPath
|
|
|
|
|
// if (selectPath != null && mProcessFiles == false) {
|
|
|
|
|
// if (mFileAdapter!!.isCopyFile) {
|
|
|
|
|
// popupMenu.menu.add(R.string.copy_to_this)
|
|
|
|
|
// } else {
|
|
|
|
|
// popupMenu.menu.add(R.string.cut_to_this)
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
2022-08-10 09:27:38 +00:00
|
|
|
|
popupMenu.menu.add(R.string.create_unit)
|
|
|
|
|
popupMenu.menu.add(R.string.create_folder)
|
|
|
|
|
popupMenu.menu.add(R.string.select_file)
|
|
|
|
|
popupMenu.setOnMenuItemClickListener { item ->
|
|
|
|
|
val title = item.title
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// val handler = Handler(Looper.getMainLooper())
|
2022-08-10 09:27:38 +00:00
|
|
|
|
when (title) {
|
|
|
|
|
getText(R.string.create_unit) -> {
|
|
|
|
|
val intent =
|
|
|
|
|
Intent(this@FileManagerActivity, CreateUnitActivity::class.java)
|
|
|
|
|
val bundle = Bundle()
|
|
|
|
|
bundle.putString("modPath", viewModel.getCurrentPath())
|
|
|
|
|
bundle.putString("createPath", viewModel.getCurrentPath())
|
|
|
|
|
intent.putExtra("data", bundle)
|
|
|
|
|
startActivityForResult(intent, 3)
|
|
|
|
|
}
|
|
|
|
|
getText(R.string.select_file) -> {
|
|
|
|
|
val bundle = Bundle()
|
|
|
|
|
val intent =
|
|
|
|
|
Intent(
|
|
|
|
|
this@FileManagerActivity,
|
|
|
|
|
FileManagerActivity::class.java
|
|
|
|
|
)
|
|
|
|
|
bundle.putString("type", "selectFile")
|
|
|
|
|
//bundle.putString("path", modClass.getModFile().getAbsolutePath());
|
|
|
|
|
intent.putExtra("data", bundle)
|
|
|
|
|
startActivityForResult(intent, 4)
|
|
|
|
|
}
|
|
|
|
|
getText(R.string.create_folder) -> {
|
|
|
|
|
createFolderAction()
|
|
|
|
|
}
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// getText(R.string.copy_to_this) -> {
|
|
|
|
|
// Thread {
|
|
|
|
|
// mProcessFiles = true
|
|
|
|
|
// val oldFile = File(mFileAdapter!!.selectPath)
|
|
|
|
|
// val newFile = File(directs.absolutePath + "/" + oldFile.name)
|
|
|
|
|
// if (FileOperator.copyFiles(oldFile, newFile)) {
|
|
|
|
|
// handler.post {
|
|
|
|
|
// loadFiles(directs)
|
|
|
|
|
// mFileAdapter!!.cleanSelectPath()
|
|
|
|
|
// mProcessFiles = false
|
|
|
|
|
// }
|
|
|
|
|
// } else {
|
|
|
|
|
// handler.post {
|
|
|
|
|
// Toast.makeText(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// getText(R.string.copy_failed),
|
|
|
|
|
// Toast.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// mProcessFiles = false
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }.start()
|
|
|
|
|
// }
|
|
|
|
|
// getText(R.string.cut_to_this) -> {
|
|
|
|
|
// Thread {
|
|
|
|
|
// mProcessFiles = true
|
|
|
|
|
// val oldFile = File(mFileAdapter!!.selectPath)
|
|
|
|
|
// val newFile = File(directs.absolutePath + "/" + oldFile.name)
|
|
|
|
|
// if (FileOperator.removeFiles(oldFile, newFile)) {
|
|
|
|
|
// handler.post {
|
|
|
|
|
// loadFiles(directs)
|
|
|
|
|
// mFileAdapter!!.cleanSelectPath()
|
|
|
|
|
// mProcessFiles = false
|
|
|
|
|
// }
|
|
|
|
|
// } else {
|
|
|
|
|
// handler.post {
|
|
|
|
|
// Toast.makeText(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// getText(R.string.cut_failed),
|
|
|
|
|
// Toast.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// mProcessFiles = false
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }.start()
|
|
|
|
|
// }
|
2022-08-10 09:27:38 +00:00
|
|
|
|
}
|
|
|
|
|
false
|
|
|
|
|
}
|
|
|
|
|
popupMenu.show()
|
|
|
|
|
}
|
|
|
|
|
else -> {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-07-18 23:59:32 +00:00
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 创建文件夹活动
|
|
|
|
|
// */
|
|
|
|
|
// private fun createFolderAction() {
|
|
|
|
|
// MaterialDialog(this).show {
|
|
|
|
|
// title(R.string.create_folder)
|
|
|
|
|
// input(
|
|
|
|
|
// maxLength = 255,
|
|
|
|
|
// waitForPositiveButton = false
|
|
|
|
|
// ) { dialog, text ->
|
|
|
|
|
// if (text.length in 1..255) {
|
|
|
|
|
// dialog.setActionButtonEnabled(WhichButton.POSITIVE, true)
|
|
|
|
|
// }
|
|
|
|
|
// }.positiveButton(R.string.dialog_ok, null) { dialog ->
|
|
|
|
|
// val string = dialog.getInputField().text.toString()
|
|
|
|
|
// val file = File("$directs/$string")
|
|
|
|
|
// if (file.exists()) {
|
|
|
|
|
// Toast.makeText(
|
|
|
|
|
// this@FileManagerActivity,
|
|
|
|
|
// R.string.folder_error,
|
|
|
|
|
// Toast.LENGTH_SHORT
|
|
|
|
|
// ).show()
|
|
|
|
|
// } else {
|
|
|
|
|
// file.mkdirs()
|
|
|
|
|
// loadFiles(directs)
|
|
|
|
|
// }
|
|
|
|
|
// }.negativeButton(R.string.dialog_close)
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
//
|
2022-08-10 09:27:38 +00:00
|
|
|
|
|
|
|
|
|
//
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// private fun getPath(context: Context, uri: Uri?): String? {
|
|
|
|
|
// val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
|
|
|
|
|
//
|
|
|
|
|
// // DocumentProvider
|
|
|
|
|
// if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
|
|
|
|
|
// // ExternalStorageProvider
|
|
|
|
|
// if (isExternalStorageDocument(uri)) {
|
|
|
|
|
// val docId = DocumentsContract.getDocumentId(uri)
|
|
|
|
|
// val split = docId.split(":").toTypedArray()
|
|
|
|
|
// val type = split[0]
|
|
|
|
|
// if ("primary".equals(type, ignoreCase = true)) {
|
|
|
|
|
// return Environment.getExternalStorageDirectory().toString() + "/" + split[1]
|
|
|
|
|
// }
|
|
|
|
|
// } else if (isDownloadsDocument(uri)) {
|
|
|
|
|
// val id = DocumentsContract.getDocumentId(uri)
|
|
|
|
|
// val contentUri = ContentUris.withAppendedId(
|
|
|
|
|
// Uri.parse("content://downloads/public_downloads"),
|
|
|
|
|
// java.lang.Long.valueOf(id)
|
|
|
|
|
// )
|
|
|
|
|
// return getDataColumn(context, contentUri, null, null)
|
|
|
|
|
// } else if (isMediaDocument(uri)) {
|
|
|
|
|
// val docId = DocumentsContract.getDocumentId(uri)
|
|
|
|
|
// val split = docId.split(":").toTypedArray()
|
|
|
|
|
// val type = split[0]
|
|
|
|
|
// var contentUri: Uri? = null
|
|
|
|
|
// if ("image" == type) {
|
|
|
|
|
// contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
|
|
|
|
|
// } else if ("video" == type) {
|
|
|
|
|
// contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
|
|
|
|
|
// } else if ("audio" == type) {
|
|
|
|
|
// contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
|
|
|
|
|
// }
|
|
|
|
|
// val selection = "_id=?"
|
|
|
|
|
// val selectionArgs = arrayOf(split[1])
|
|
|
|
|
// return getDataColumn(context, contentUri, selection, selectionArgs)
|
|
|
|
|
// }
|
|
|
|
|
// } else if ("content".equals(uri!!.scheme, ignoreCase = true)) {
|
|
|
|
|
// return getDataColumn(context, uri, null, null)
|
|
|
|
|
// } else if ("file".equals(uri.scheme, ignoreCase = true)) {
|
|
|
|
|
// uri.path
|
|
|
|
|
// }
|
|
|
|
|
// return null
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// private fun isMediaDocument(uri: Uri?): Boolean {
|
|
|
|
|
// return "com.android.providers.media.documents" == uri!!.authority
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// private fun isExternalStorageDocument(uri: Uri?): Boolean {
|
|
|
|
|
// return "com.android.externalstorage.documents" == uri!!.authority
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// private fun isDownloadsDocument(uri: Uri?): Boolean {
|
|
|
|
|
// return "com.android.providers.downloads.documents" == uri!!.authority
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// private fun getDataColumn(
|
|
|
|
|
// context: Context,
|
|
|
|
|
// uri: Uri?,
|
|
|
|
|
// selection: String?,
|
|
|
|
|
// selectionArgs: Array<String>?
|
|
|
|
|
// ): String? {
|
|
|
|
|
// var cursor: Cursor? = null
|
|
|
|
|
// val column = "_data"
|
|
|
|
|
// val projection = arrayOf(column)
|
|
|
|
|
// try {
|
|
|
|
|
// cursor = context.contentResolver.query(
|
|
|
|
|
// uri!!, projection, selection, selectionArgs,
|
|
|
|
|
// null
|
|
|
|
|
// )
|
|
|
|
|
// if (cursor != null && cursor.moveToFirst()) {
|
|
|
|
|
// val column_index = cursor.getColumnIndexOrThrow(column)
|
|
|
|
|
// return cursor.getString(column_index)
|
|
|
|
|
// }
|
|
|
|
|
// } finally {
|
|
|
|
|
// cursor?.close()
|
|
|
|
|
// }
|
|
|
|
|
// return null
|
|
|
|
|
// }
|
|
|
|
|
//
|
2022-08-14 02:43:53 +00:00
|
|
|
|
// override fun getViewBindingObject(layoutInflater: LayoutInflater): ActivityFileBinding {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
// return ActivityFileBinding.inflate(layoutInflater)
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// override fun whenCreateActivity(savedInstanceState: Bundle?, canUseView: Boolean) {
|
|
|
|
|
// if (canUseView) {
|
|
|
|
|
// initView()
|
|
|
|
|
// initAction()
|
|
|
|
|
// }
|
|
|
|
|
// }
|
2022-07-19 14:32:02 +00:00
|
|
|
|
private lateinit var menuBinding: MenuBinding
|
2022-07-18 23:59:32 +00:00
|
|
|
|
private val viewModel: FileManagerViewModel by lazy {
|
|
|
|
|
ViewModelProvider(this).get(FileManagerViewModel::class.java)
|
|
|
|
|
}
|
2022-04-04 14:03:10 +00:00
|
|
|
|
|
2022-08-10 09:27:38 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建文件夹活动
|
|
|
|
|
*/
|
|
|
|
|
fun createFolderAction() {
|
|
|
|
|
InputDialog(this).setTitle(R.string.create_folder).setHint(R.string.file_name)
|
|
|
|
|
.setCancelable(false).setInputCanBeEmpty(false).setMaxNumber(255)
|
|
|
|
|
.setErrorTip { s, textInputLayout ->
|
|
|
|
|
val newFolder = File(viewModel.getCurrentPath() + "/" + s)
|
|
|
|
|
if (newFolder.exists()) {
|
|
|
|
|
textInputLayout.error = getString(R.string.folder_error)
|
|
|
|
|
} else {
|
|
|
|
|
textInputLayout.isErrorEnabled = false
|
|
|
|
|
}
|
|
|
|
|
}.setPositiveButton(R.string.dialog_ok) { i ->
|
|
|
|
|
val newFolder = File(viewModel.getCurrentPath() + "/" + i)
|
|
|
|
|
val res = newFolder.mkdirs()
|
|
|
|
|
adapter?.addItem(newFolder)
|
|
|
|
|
res
|
|
|
|
|
}.setNegativeButton(R.string.dialog_cancel) {
|
|
|
|
|
|
|
|
|
|
}.show()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-07-18 23:59:32 +00:00
|
|
|
|
private var adapter: FileAdapter? = null
|
2022-04-04 14:03:10 +00:00
|
|
|
|
|
2022-07-18 23:59:32 +00:00
|
|
|
|
override fun whenCreateActivity(savedInstanceState: Bundle?, canUseView: Boolean) {
|
|
|
|
|
if (canUseView) {
|
|
|
|
|
setReturnButton()
|
|
|
|
|
viewBinding.recyclerView.layoutManager = LinearLayoutManager(this@FileManagerActivity)
|
2022-08-10 09:27:38 +00:00
|
|
|
|
val linearLayoutManager = LinearLayoutManager(this)
|
|
|
|
|
linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL
|
|
|
|
|
viewBinding.fileTabNav.layoutManager = linearLayoutManager
|
2022-07-18 23:59:32 +00:00
|
|
|
|
loadTitle()
|
|
|
|
|
loadObserve()
|
2022-08-10 09:27:38 +00:00
|
|
|
|
initAction()
|
2022-08-14 02:43:53 +00:00
|
|
|
|
viewModel.initBookmarkManager(this)
|
|
|
|
|
viewModel.loadFiles()
|
|
|
|
|
viewModel.loadSortType(this)
|
2022-07-19 14:32:02 +00:00
|
|
|
|
viewBinding.swipeRefreshLayout.setOnRefreshListener {
|
|
|
|
|
viewModel.loadFiles(viewModel.getCurrentPath())
|
|
|
|
|
viewBinding.swipeRefreshLayout.isRefreshing = false
|
|
|
|
|
}
|
2022-08-14 02:43:53 +00:00
|
|
|
|
FastScrollerBuilder(viewBinding.recyclerView).useMd2Style()
|
|
|
|
|
.setPopupTextProvider(adapter).build()
|
2022-04-04 14:03:10 +00:00
|
|
|
|
} else {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
val bundle = intent.getBundleExtra("data")
|
|
|
|
|
if (bundle == null) {
|
|
|
|
|
showError("无效的请求。")
|
|
|
|
|
finish()
|
|
|
|
|
return
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|
|
|
|
|
if (bundle.containsKey("path")) {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
viewModel.currentPathLiveData.value = bundle.getString("path")
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|
2022-08-10 09:27:38 +00:00
|
|
|
|
if (bundle.containsKey("type")) {
|
|
|
|
|
val type = bundle.getString("type")
|
|
|
|
|
viewModel.startTypeData = when (type) {
|
|
|
|
|
"selectDirectents" -> {
|
|
|
|
|
FileManagerViewModel.StartType.SELECT_DIRECTORY
|
|
|
|
|
}
|
|
|
|
|
else -> {
|
|
|
|
|
FileManagerViewModel.StartType.DEFAULT
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-04-04 14:03:10 +00:00
|
|
|
|
if (bundle.containsKey("rootpath")) {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
viewModel.setRootPath(bundle.getString("rootpath"))
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-19 14:32:02 +00:00
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
|
|
|
|
menuBinding = MenuBinding.inflate(menu, menuInflater)
|
2022-07-29 15:19:07 +00:00
|
|
|
|
val value = viewModel.sortTypeLiveData.value
|
|
|
|
|
if (value != null) {
|
|
|
|
|
setSortType(value)
|
|
|
|
|
}
|
2022-08-10 09:27:38 +00:00
|
|
|
|
if (viewModel.startTypeData != FileManagerViewModel.StartType.SELECT_FILE) {
|
|
|
|
|
menu.removeItem(R.id.selectFile)
|
|
|
|
|
}
|
2022-07-30 13:53:14 +00:00
|
|
|
|
menuBinding.actionSortByType.setOnMenuItemClickListener {
|
|
|
|
|
viewModel.sortTypeLiveData.value = FileManagerViewModel.SortType.BY_TYPE
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
menuBinding.actionSortByName.setOnMenuItemClickListener {
|
|
|
|
|
viewModel.sortTypeLiveData.value = FileManagerViewModel.SortType.BY_NAME
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
menuBinding.actionSortBySize.setOnMenuItemClickListener {
|
|
|
|
|
viewModel.sortTypeLiveData.value = FileManagerViewModel.SortType.BY_SIZE
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
menuBinding.actionSortByLastModified.setOnMenuItemClickListener {
|
|
|
|
|
viewModel.sortTypeLiveData.value = FileManagerViewModel.SortType.BY_LAST_MODIFIED
|
|
|
|
|
true
|
|
|
|
|
}
|
2022-08-10 09:27:38 +00:00
|
|
|
|
loadMineBookmarksMenu()
|
|
|
|
|
menuBinding.bookmarkManagerItem.setOnMenuItemClickListener {
|
|
|
|
|
val intent = Intent(this, BookmarkManagerActivity::class.java)
|
|
|
|
|
startActivity(intent)
|
|
|
|
|
true
|
|
|
|
|
}
|
2022-07-19 14:32:02 +00:00
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-29 15:19:07 +00:00
|
|
|
|
|
2022-08-10 09:27:38 +00:00
|
|
|
|
/**
|
|
|
|
|
* 加载我的书签列表
|
|
|
|
|
*/
|
|
|
|
|
fun loadMineBookmarksMenu() {
|
|
|
|
|
if (this::menuBinding.isInitialized) {
|
|
|
|
|
menuBinding.mineBookmarksMenu.subMenu.clear()
|
|
|
|
|
viewModel.getBookmarkManager().fromList(object : BookmarkListener {
|
|
|
|
|
override fun find(path: String, name: String) {
|
|
|
|
|
val item = menuBinding.mineBookmarksMenu.subMenu.add(name)
|
|
|
|
|
item.setOnMenuItemClickListener {
|
|
|
|
|
viewModel.currentPathLiveData.value = path
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-04-04 14:03:10 +00:00
|
|
|
|
/**
|
2022-07-18 23:59:32 +00:00
|
|
|
|
* 加载观察者
|
2022-04-04 14:03:10 +00:00
|
|
|
|
*/
|
2022-07-18 23:59:32 +00:00
|
|
|
|
fun loadObserve() {
|
|
|
|
|
viewModel.loadStateLiveData.observe(this) {
|
2022-08-10 09:27:38 +00:00
|
|
|
|
viewBinding.fileTabNav.isVisible = !it
|
2022-07-18 23:59:32 +00:00
|
|
|
|
viewBinding.swipeRefreshLayout.isVisible = !it
|
|
|
|
|
viewBinding.fileError.isVisible = it
|
|
|
|
|
viewBinding.progressBar.isVisible = it
|
|
|
|
|
}
|
2022-07-29 15:19:07 +00:00
|
|
|
|
viewModel.sortTypeLiveData.observe(this) {
|
|
|
|
|
setSortType(it)
|
|
|
|
|
}
|
2022-07-18 23:59:32 +00:00
|
|
|
|
viewModel.fileListLiveData.observe(this) {
|
|
|
|
|
if (adapter == null) {
|
|
|
|
|
//创建实例(设置适配器)
|
|
|
|
|
adapter = FileAdapter(this, it)
|
|
|
|
|
adapter?.setItemEvent { i, fileItemBinding, viewHolder, file ->
|
2022-04-04 14:03:10 +00:00
|
|
|
|
fileItemBinding.root.setOnClickListener {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
if (file == null) {
|
|
|
|
|
viewModel.returnDirects()
|
2022-04-04 14:03:10 +00:00
|
|
|
|
} else {
|
2022-07-18 23:59:32 +00:00
|
|
|
|
if (file.isDirectory) {
|
|
|
|
|
viewModel.currentPathLiveData.value = file.absolutePath
|
2022-08-10 09:27:38 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
fileItemBinding.more.setOnClickListener {
|
|
|
|
|
if (file == null) {
|
|
|
|
|
return@setOnClickListener
|
|
|
|
|
}
|
|
|
|
|
val finalFile = file
|
|
|
|
|
val popupMenu = PopupMenu(this, fileItemBinding.more)
|
|
|
|
|
popupMenu.inflate(R.menu.menu_files_actions)
|
|
|
|
|
val bookAction = popupMenu.menu.findItem(R.id.bookmarkAction)
|
|
|
|
|
bookAction.title = if (viewModel.getBookmarkManager().contains(finalFile)) {
|
|
|
|
|
getString(R.string.remove_bookmark)
|
|
|
|
|
} else {
|
|
|
|
|
getString(R.string.add_bookmark)
|
|
|
|
|
}
|
|
|
|
|
popupMenu.show()
|
|
|
|
|
popupMenu.setOnMenuItemClickListener {
|
|
|
|
|
when (it.itemId) {
|
|
|
|
|
R.id.bookmarkAction -> {
|
|
|
|
|
if (viewModel.getBookmarkManager().contains(finalFile)) {
|
|
|
|
|
val remove =
|
|
|
|
|
viewModel.getBookmarkManager()
|
|
|
|
|
.removeBookmark(finalFile.absolutePath)
|
|
|
|
|
if (remove) {
|
|
|
|
|
Snackbar.make(
|
|
|
|
|
viewBinding.fab,
|
|
|
|
|
R.string.remove_bookmark_success,
|
|
|
|
|
Snackbar.LENGTH_SHORT
|
|
|
|
|
).show()
|
|
|
|
|
} else {
|
|
|
|
|
Snackbar.make(
|
|
|
|
|
viewBinding.fab,
|
|
|
|
|
R.string.remove_bookmark_fail,
|
|
|
|
|
Snackbar.LENGTH_SHORT
|
|
|
|
|
).show()
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
val add =
|
|
|
|
|
viewModel.getBookmarkManager()
|
|
|
|
|
.addBookmark(finalFile.absolutePath, finalFile.name)
|
|
|
|
|
if (add) {
|
|
|
|
|
Snackbar.make(
|
|
|
|
|
viewBinding.fab,
|
|
|
|
|
R.string.add_bookmark_success,
|
|
|
|
|
Snackbar.LENGTH_SHORT
|
|
|
|
|
).show()
|
|
|
|
|
} else {
|
|
|
|
|
Snackbar.make(
|
|
|
|
|
viewBinding.fab,
|
|
|
|
|
R.string.add_bookmark_fail,
|
|
|
|
|
Snackbar.LENGTH_SHORT
|
|
|
|
|
).show()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
viewModel.getBookmarkManager().save()
|
|
|
|
|
loadMineBookmarksMenu()
|
|
|
|
|
}
|
|
|
|
|
R.id.renameAction -> {
|
|
|
|
|
val finalFile =
|
|
|
|
|
adapter!!.getItemData(viewHolder.absoluteAdapterPosition)
|
|
|
|
|
val oldname = finalFile!!.name
|
|
|
|
|
InputDialog(this).setInputCanBeEmpty(false)
|
|
|
|
|
.setTitle(R.string.rename).setMaxNumber(255)
|
|
|
|
|
.setHint(R.string.file_name).setText(oldname)
|
|
|
|
|
.setPositiveButton(R.string.dialog_ok) { string ->
|
|
|
|
|
if (string.isNotEmpty() && string != oldname) {
|
|
|
|
|
val newFile =
|
|
|
|
|
File(FileOperator.getSuperDirectory(finalFile) + "/" + string)
|
|
|
|
|
finalFile.renameTo(newFile)
|
|
|
|
|
adapter?.replaceItem(
|
|
|
|
|
newFile,
|
|
|
|
|
viewHolder.absoluteAdapterPosition
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
true
|
|
|
|
|
}.setNegativeButton(R.string.dialog_cancel) {
|
|
|
|
|
|
|
|
|
|
}.setCancelable(false).show()
|
|
|
|
|
}
|
|
|
|
|
R.id.deleteAction -> {
|
|
|
|
|
val finalFile =
|
|
|
|
|
adapter!!.getItemData(viewHolder.absoluteAdapterPosition)
|
|
|
|
|
val tip = String.format(
|
|
|
|
|
getString(R.string.delete_prompt),
|
|
|
|
|
finalFile!!.name
|
|
|
|
|
)
|
|
|
|
|
CoreDialog(this).setTitle(R.string.delete_title)
|
|
|
|
|
.setMessage(tip)
|
|
|
|
|
.setPositiveButton(R.string.delete_title) {
|
|
|
|
|
val delete = FileOperator.delete_files(finalFile)
|
|
|
|
|
if (delete) {
|
|
|
|
|
adapter?.removeItem(i)
|
|
|
|
|
}
|
|
|
|
|
}.setNegativeButton(R.string.dialog_cancel) {
|
|
|
|
|
|
|
|
|
|
}.show()
|
2022-08-06 13:59:24 +00:00
|
|
|
|
}
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|
2022-08-10 09:27:38 +00:00
|
|
|
|
true
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-07-18 23:59:32 +00:00
|
|
|
|
viewBinding.recyclerView.adapter = adapter
|
|
|
|
|
} else {
|
|
|
|
|
adapter?.setNewDataList(it)
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-07-19 14:32:02 +00:00
|
|
|
|
viewModel.currentPathLiveData.observe(this) {
|
2022-08-14 02:43:53 +00:00
|
|
|
|
if (it==null)
|
|
|
|
|
{
|
|
|
|
|
return@observe
|
|
|
|
|
}
|
2022-08-10 09:27:38 +00:00
|
|
|
|
val root = getString(R.string.root_path)
|
|
|
|
|
val path = root + it.substring(viewModel.getRootPath().length)
|
|
|
|
|
val lineParser = LineParser(path)
|
|
|
|
|
lineParser.symbol = "/"
|
|
|
|
|
lineParser.parserSymbol = true
|
|
|
|
|
val fileTabList = ArrayList<FileTab>()
|
|
|
|
|
val stringBuilder = StringBuilder()
|
|
|
|
|
lineParser.analyse { lineNum, lineData, isEnd ->
|
|
|
|
|
stringBuilder.append(lineData)
|
|
|
|
|
if (lineData.isNotBlank() && lineData != lineParser.symbol) {
|
|
|
|
|
val tab = FileTab(
|
|
|
|
|
lineData,
|
|
|
|
|
viewModel.getRootPath() + stringBuilder.toString().substring(root.length)
|
|
|
|
|
)
|
|
|
|
|
fileTabList.add(tab)
|
|
|
|
|
}
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
val adapter = FileTabAdapter(this, fileTabList)
|
|
|
|
|
adapter.setItemEvent { i, itemFileTabBinding, viewHolder, fileTab ->
|
|
|
|
|
itemFileTabBinding.button.setOnClickListener {
|
|
|
|
|
viewModel.currentPathLiveData.value = fileTab.path
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
val manager = viewBinding.fileTabNav.layoutManager as LinearLayoutManager
|
|
|
|
|
manager.scrollToPosition(fileTabList.size - 1)
|
|
|
|
|
viewBinding.fileTabNav.adapter = adapter
|
2022-07-18 23:59:32 +00:00
|
|
|
|
viewModel.loadFiles(it)
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-29 15:19:07 +00:00
|
|
|
|
/**
|
|
|
|
|
* 设置排序方式
|
|
|
|
|
* @param sortType SortType
|
|
|
|
|
*/
|
|
|
|
|
fun setSortType(sortType: FileManagerViewModel.SortType) {
|
|
|
|
|
if (this::menuBinding.isInitialized) {
|
|
|
|
|
when (sortType) {
|
|
|
|
|
FileManagerViewModel.SortType.BY_NAME -> {
|
|
|
|
|
menuBinding.actionSortByName.isChecked = true
|
|
|
|
|
}
|
|
|
|
|
FileManagerViewModel.SortType.BY_SIZE -> {
|
|
|
|
|
menuBinding.actionSortBySize.isChecked = true
|
|
|
|
|
}
|
|
|
|
|
FileManagerViewModel.SortType.BY_LAST_MODIFIED -> {
|
|
|
|
|
menuBinding.actionSortByLastModified.isChecked = true
|
|
|
|
|
}
|
|
|
|
|
FileManagerViewModel.SortType.BY_TYPE -> {
|
|
|
|
|
menuBinding.actionSortByType.isChecked = true
|
|
|
|
|
}
|
|
|
|
|
else -> {
|
|
|
|
|
menuBinding.actionSortByName.isChecked = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
adapter?.setSort(sortType)
|
|
|
|
|
viewModel.loadFiles(viewModel.getCurrentPath())
|
2022-07-30 13:53:14 +00:00
|
|
|
|
viewModel.saveSortType(this)
|
2022-07-29 15:19:07 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-04 14:03:10 +00:00
|
|
|
|
/**
|
2022-07-18 23:59:32 +00:00
|
|
|
|
* 加载页面标题
|
2022-04-04 14:03:10 +00:00
|
|
|
|
*/
|
2022-07-18 23:59:32 +00:00
|
|
|
|
fun loadTitle() {
|
|
|
|
|
title = when (viewModel.startTypeData) {
|
|
|
|
|
FileManagerViewModel.StartType.DEFAULT -> {
|
|
|
|
|
getString(R.string.file_manager)
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|
2022-07-18 23:59:32 +00:00
|
|
|
|
else -> {
|
|
|
|
|
getString(R.string.file_manager)
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-14 02:43:53 +00:00
|
|
|
|
override fun getViewBindingObject(layoutInflater: LayoutInflater): ActivityFileBinding {
|
2022-04-04 14:03:10 +00:00
|
|
|
|
return ActivityFileBinding.inflate(layoutInflater)
|
|
|
|
|
}
|
2022-07-19 14:32:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MenuBinding private constructor(
|
|
|
|
|
val menu: Menu,
|
|
|
|
|
val reloadFileItem: MenuItem,
|
|
|
|
|
val photoAlbumItem: MenuItem,
|
2022-07-29 15:19:07 +00:00
|
|
|
|
val systemFileManagerItem: MenuItem,
|
|
|
|
|
val actionSortByName: MenuItem,
|
|
|
|
|
val actionSortByType: MenuItem,
|
2022-08-10 09:27:38 +00:00
|
|
|
|
val actionSortBySize: MenuItem,
|
|
|
|
|
val actionSortByLastModified: MenuItem,
|
|
|
|
|
val bookmarkItem: MenuItem,
|
|
|
|
|
val bookmarkManagerItem: MenuItem, val mineBookmarksMenu: MenuItem
|
2022-07-19 14:32:02 +00:00
|
|
|
|
) {
|
|
|
|
|
companion object {
|
|
|
|
|
//填充
|
|
|
|
|
fun inflate(menu: Menu, inflater: MenuInflater): MenuBinding {
|
|
|
|
|
inflater.inflate(R.menu.menu_files, menu)
|
|
|
|
|
return MenuBinding(
|
|
|
|
|
menu,
|
|
|
|
|
menu.findItem(R.id.reloadFile),
|
|
|
|
|
menu.findItem(R.id.photo_album),
|
2022-07-29 15:19:07 +00:00
|
|
|
|
menu.findItem(R.id.system_file_manager),
|
|
|
|
|
menu.findItem(R.id.action_sort_by_name),
|
|
|
|
|
menu.findItem(R.id.action_sort_by_type),
|
|
|
|
|
menu.findItem(R.id.action_sort_by_size),
|
2022-08-10 09:27:38 +00:00
|
|
|
|
menu.findItem(R.id.action_sort_by_last_modified),
|
|
|
|
|
menu.findItem(R.id.action_bookmark),
|
|
|
|
|
menu.findItem(R.id.bookmark_manager),
|
|
|
|
|
menu.findItem(R.id.mine_bookmarks)
|
2022-07-19 14:32:02 +00:00
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-04-04 14:03:10 +00:00
|
|
|
|
}
|