From 4a55d826d9e5b403ed654eaeffffc12c16e4e039 Mon Sep 17 00:00:00 2001 From: Hardcore Sushi Date: Thu, 24 Mar 2022 20:08:23 +0100 Subject: [PATCH] Volume renaming --- .../sushi/hardcore/droidfs/CameraActivity.kt | 40 +++----- .../sushi/hardcore/droidfs/MainActivity.kt | 48 +++++++++- .../hardcore/droidfs/SettingsActivity.kt | 28 ++---- .../sushi/hardcore/droidfs/VolumeDatabase.kt | 9 ++ .../droidfs/explorers/BaseExplorerActivity.kt | 95 ++++++------------- .../droidfs/explorers/ExplorerActivity.kt | 27 ++---- .../widgets/CustomAlertDialogBuilder.kt | 2 +- .../droidfs/widgets/EditTextDialog.kt | 32 +++++++ app/src/main/res/menu/main_activity.xml | 6 ++ app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values/strings.xml | 3 +- 12 files changed, 150 insertions(+), 142 deletions(-) create mode 100644 app/src/main/java/sushi/hardcore/droidfs/widgets/EditTextDialog.kt diff --git a/app/src/main/java/sushi/hardcore/droidfs/CameraActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/CameraActivity.kt index 56fa4ef..557cb50 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/CameraActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/CameraActivity.kt @@ -13,11 +13,9 @@ import android.util.Size import android.view.MotionEvent import android.view.ScaleGestureDetector import android.view.View -import android.view.WindowManager import android.view.animation.Animation import android.view.animation.LinearInterpolator import android.view.animation.RotateAnimation -import android.widget.EditText import android.widget.ImageView import android.widget.RelativeLayout import android.widget.Toast @@ -35,6 +33,7 @@ import sushi.hardcore.droidfs.util.PathUtils import sushi.hardcore.droidfs.video_recording.SeekableWriter import sushi.hardcore.droidfs.video_recording.VideoCapture import sushi.hardcore.droidfs.widgets.CustomAlertDialogBuilder +import sushi.hardcore.droidfs.widgets.EditTextDialog import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.text.SimpleDateFormat @@ -161,29 +160,16 @@ class CameraActivity : BaseActivity(), SensorOrientationListener.Listener { } } binding.imageTimer.setOnClickListener { - val dialogEditTextView = layoutInflater.inflate(R.layout.dialog_edit_text, null) - val dialogEditText = dialogEditTextView.findViewById(R.id.dialog_edit_text) - dialogEditText.inputType = InputType.TYPE_CLASS_NUMBER - val dialog = CustomAlertDialogBuilder(this, themeValue) - .setView(dialogEditTextView) - .setTitle(getString(R.string.enter_timer_duration)) - .setPositiveButton(R.string.ok) { _, _ -> - val enteredValue = dialogEditText.text.toString() - if (enteredValue.isEmpty()){ - Toast.makeText(this, getString(R.string.timer_empty_error_msg), Toast.LENGTH_SHORT).show() - } else { - timerDuration = enteredValue.toInt() - } + with (EditTextDialog(this, R.string.enter_timer_duration) { + try { + timerDuration = it.toInt() + } catch (e: NumberFormatException) { + Toast.makeText(this, R.string.invalid_number, Toast.LENGTH_SHORT).show() } - .setNegativeButton(R.string.cancel, null) - .create() - dialogEditText.setOnEditorActionListener { _, _, _ -> - timerDuration = dialogEditText.text.toString().toInt() - dialog.dismiss() - true + }) { + binding.dialogEditText.inputType = InputType.TYPE_CLASS_NUMBER + show() } - dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - dialog.show() } binding.imageFlash.setOnClickListener { binding.imageFlash.setImageResource(if (isInVideoMode) { @@ -384,9 +370,11 @@ class CameraActivity : BaseActivity(), SensorOrientationListener.Listener { runOnUiThread { binding.textTimer.text = i.toString() } Thread.sleep(1000) } - runOnUiThread { - action() - binding.textTimer.visibility = View.GONE + if (!isFinishing) { + runOnUiThread { + action() + binding.textTimer.visibility = View.GONE + } } isWaitingForTimer = false }.start() diff --git a/app/src/main/java/sushi/hardcore/droidfs/MainActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/MainActivity.kt index 9892f51..c9584b1 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/MainActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/MainActivity.kt @@ -30,6 +30,7 @@ import sushi.hardcore.droidfs.explorers.ExplorerActivityPick import sushi.hardcore.droidfs.file_operations.FileOperationService import sushi.hardcore.droidfs.util.PathUtils import sushi.hardcore.droidfs.widgets.CustomAlertDialogBuilder +import sushi.hardcore.droidfs.widgets.EditTextDialog import java.io.File import java.util.* @@ -78,7 +79,12 @@ class MainActivity : BaseActivity() { startActivity(intent) } .setNegativeButton(R.string.ok, null) - .setOnDismissListener { sharedPrefs.edit().putBoolean("applicationFirstOpening", false).apply() } + .setOnDismissListener { + with (sharedPrefs.edit()) { + putBoolean("applicationFirstOpening", false) + apply() + } + } .show() } pickMode = intent.action == "pick" @@ -263,6 +269,11 @@ class MainActivity : BaseActivity() { } true } + R.id.rename -> { + val position = volumeAdapter.selectedItems.elementAt(0) + renameVolume(volumeAdapter.volumes[position], position) + true + } R.id.settings -> { val intent = Intent(this, SettingsActivity::class.java) startActivity(intent) @@ -288,10 +299,10 @@ class MainActivity : BaseActivity() { } } menu.findItem(R.id.forget_password).isVisible = showForgetPassword && !pickMode - menu.findItem(R.id.change_password).isVisible = - !pickMode && !dropMode && - volumeAdapter.selectedItems.size == 1 && - volumeAdapter.volumes[volumeAdapter.selectedItems.elementAt(0)].canWrite(filesDir.path) + val onlyOneAndWriteable = !pickMode && !dropMode && + volumeAdapter.selectedItems.size == 1 && + volumeAdapter.volumes[volumeAdapter.selectedItems.elementAt(0)].canWrite(filesDir.path) + menu.findItem(R.id.change_password).isVisible = onlyOneAndWriteable with(menu.findItem(R.id.copy)) { isVisible = !pickMode && !dropMode && volumeAdapter.selectedItems.size == 1 if (isVisible) { @@ -302,6 +313,7 @@ class MainActivity : BaseActivity() { ) } } + menu.findItem(R.id.rename).isVisible = onlyOneAndWriteable supportActionBar?.setDisplayHomeAsUpEnabled(isSelecting || pickMode || dropMode) return true } @@ -358,6 +370,32 @@ class MainActivity : BaseActivity() { } } + private fun renameVolume(volume: Volume, position: Int) { + EditTextDialog(this, R.string.new_volume_name) { newName -> + val srcPath = File(volume.getFullPath(filesDir.path)) + val dstPath = File(srcPath.parent, newName).canonicalFile + val newDBName: String + val success = if (volume.isHidden) { + if (newName.contains("/")) { + Toast.makeText(this, R.string.error_slash_in_name, Toast.LENGTH_SHORT).show() + renameVolume(volume, position) + return@EditTextDialog + } + newDBName = newName + srcPath.renameTo(dstPath) + } else { + newDBName = dstPath.path + DocumentFile.fromFile(srcPath).renameTo(newName) + } + if (success) { + volumeDatabase.renameVolume(volume.name, newDBName) + unselect(position) + } else { + Toast.makeText(this, R.string.volume_rename_failed, Toast.LENGTH_SHORT).show() + } + }.show() + } + @SuppressLint("NewApi") // fingerprintProtector is non-null only when SDK_INT >= 23 private fun openVolume(volume: Volume, position: Int) { var askForPassword = true diff --git a/app/src/main/java/sushi/hardcore/droidfs/SettingsActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/SettingsActivity.kt index 7809426..1ae86de 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/SettingsActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/SettingsActivity.kt @@ -3,18 +3,17 @@ package sushi.hardcore.droidfs import android.content.SharedPreferences import android.os.Build import android.os.Bundle +import android.text.InputType import android.view.MenuItem -import android.view.inputmethod.EditorInfo import android.widget.Toast import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreference import sushi.hardcore.droidfs.databinding.ActivitySettingsBinding -import sushi.hardcore.droidfs.databinding.DialogEditTextBinding import sushi.hardcore.droidfs.util.PathUtils import sushi.hardcore.droidfs.widgets.CustomAlertDialogBuilder -import java.lang.NumberFormatException +import sushi.hardcore.droidfs.widgets.EditTextDialog class SettingsActivity : BaseActivity() { @@ -71,24 +70,15 @@ class SettingsActivity : BaseActivity() { } private fun showMaxSizeDialog() { - val dialogBinding = DialogEditTextBinding.inflate(layoutInflater) - with (dialogBinding.dialogEditText) { - inputType = EditorInfo.TYPE_CLASS_NUMBER - hint = getString(R.string.size_hint) - } - val dialog = CustomAlertDialogBuilder(requireContext(), (requireActivity() as BaseActivity).themeValue) - .setTitle(R.string.thumbnail_max_size) - .setView(dialogBinding.root) - .setPositiveButton(R.string.ok) { _, _ -> - setThumbnailMaxSize(dialogBinding.dialogEditText.text.toString()) + with (EditTextDialog((requireActivity() as BaseActivity), R.string.thumbnail_max_size) { + setThumbnailMaxSize(it) + }) { + with (binding.dialogEditText) { + inputType = InputType.TYPE_CLASS_NUMBER + hint = getString(R.string.size_hint) } - .create() - dialogBinding.dialogEditText.setOnEditorActionListener { _, _, _ -> - dialog.dismiss() - setThumbnailMaxSize(dialogBinding.dialogEditText.text.toString()) - true + show() } - dialog.show() } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { diff --git a/app/src/main/java/sushi/hardcore/droidfs/VolumeDatabase.kt b/app/src/main/java/sushi/hardcore/droidfs/VolumeDatabase.kt index 1f30d38..14bf791 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/VolumeDatabase.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/VolumeDatabase.kt @@ -94,6 +94,15 @@ class VolumeDatabase(context: Context): SQLiteOpenHelper(context, ), "$COLUMN_NAME=?", arrayOf(volume.name)) > 0 } + fun renameVolume(oldName: String, newName: String): Boolean { + return writableDatabase.update(TABLE_NAME, + ContentValues().apply { + put(COLUMN_NAME, newName) + }, + "$COLUMN_NAME=?",arrayOf(oldName) + ) > 0 + } + fun removeVolume(volumeName: String): Boolean { return writableDatabase.delete(TABLE_NAME, "$COLUMN_NAME=?", arrayOf(volumeName)) > 0 } diff --git a/app/src/main/java/sushi/hardcore/droidfs/explorers/BaseExplorerActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/explorers/BaseExplorerActivity.kt index 0c5ba30..dfa140e 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/explorers/BaseExplorerActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/explorers/BaseExplorerActivity.kt @@ -10,8 +10,6 @@ import android.os.IBinder import android.view.Menu import android.view.MenuItem import android.view.View -import android.view.WindowManager -import android.widget.EditText import android.widget.TextView import android.widget.Toast import androidx.core.content.ContextCompat @@ -39,6 +37,7 @@ import sushi.hardcore.droidfs.file_operations.OperationFile import sushi.hardcore.droidfs.file_viewers.* import sushi.hardcore.droidfs.util.PathUtils import sushi.hardcore.droidfs.widgets.CustomAlertDialogBuilder +import sushi.hardcore.droidfs.widgets.EditTextDialog open class BaseExplorerActivity : BaseActivity() { private lateinit var sortOrderEntries: Array @@ -314,25 +313,9 @@ open class BaseExplorerActivity : BaseActivity() { } protected fun openDialogCreateFolder() { - val dialogEditTextView = layoutInflater.inflate(R.layout.dialog_edit_text, null) - val dialogEditText = dialogEditTextView.findViewById(R.id.dialog_edit_text) - val dialog = CustomAlertDialogBuilder(this, themeValue) - .setView(dialogEditTextView) - .setTitle(R.string.enter_folder_name) - .setPositiveButton(R.string.ok) { _, _ -> - val folderName = dialogEditText.text.toString() - createFolder(folderName) - } - .setNegativeButton(R.string.cancel, null) - .create() - dialogEditText.setOnEditorActionListener { _, _, _ -> - val folderName = dialogEditText.text.toString() - dialog.dismiss() - createFolder(folderName) - true - } - dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - dialog.show() + EditTextDialog(this, R.string.enter_folder_name) { + createFolder(it) + }.show() } protected fun checkPathOverwrite(items: ArrayList, dstDirectoryPath: String, callback: (ArrayList?) -> Unit) { @@ -363,36 +346,26 @@ open class BaseExplorerActivity : BaseActivity() { checkPathOverwrite(items, dstDirectoryPath, callback) } .setNegativeButton(R.string.no) { _, _ -> - val dialogEditTextView = layoutInflater.inflate(R.layout.dialog_edit_text, null) - val dialogEditText = dialogEditTextView.findViewById(R.id.dialog_edit_text) - dialogEditText.setText(items[i].explorerElement.name) - dialogEditText.selectAll() - val dialog = CustomAlertDialogBuilder(this, themeValue) - .setView(dialogEditTextView) - .setTitle(R.string.enter_new_name) - .setPositiveButton(R.string.ok) { _, _ -> - items[i].dstPath = PathUtils.pathJoin(dstDirectoryPath, PathUtils.getRelativePath(srcDirectoryPath, items[i].explorerElement.parentPath), dialogEditText.text.toString()) - if (items[i].explorerElement.isDirectory){ - for (j in 0 until items.size){ - if (PathUtils.isChildOf(items[j].explorerElement.fullPath, items[i].explorerElement.fullPath)){ - items[j].dstPath = PathUtils.pathJoin(items[i].dstPath!!, PathUtils.getRelativePath(items[i].explorerElement.fullPath, items[j].explorerElement.fullPath)) - } - } + with(EditTextDialog(this, R.string.enter_new_name) { + items[i].dstPath = PathUtils.pathJoin(dstDirectoryPath, PathUtils.getRelativePath(srcDirectoryPath, items[i].explorerElement.parentPath), it) + if (items[i].explorerElement.isDirectory){ + for (j in 0 until items.size){ + if (PathUtils.isChildOf(items[j].explorerElement.fullPath, items[i].explorerElement.fullPath)){ + items[j].dstPath = PathUtils.pathJoin(items[i].dstPath!!, PathUtils.getRelativePath(items[i].explorerElement.fullPath, items[j].explorerElement.fullPath)) } - checkPathOverwrite(items, dstDirectoryPath, callback) } - .setOnCancelListener{ - callback(null) - } - .create() - dialogEditText.setOnEditorActionListener { _, _, _ -> - dialog.dismiss() - items[i].dstPath = PathUtils.pathJoin(dstDirectoryPath, PathUtils.getRelativePath(srcDirectoryPath, items[i].explorerElement.parentPath), dialogEditText.text.toString()) + } checkPathOverwrite(items, dstDirectoryPath, callback) - true + }) { + with (binding.dialogEditText) { + setText(items[i].explorerElement.name) + selectAll() + } + setOnCancelListener{ + callback(null) + } + show() } - dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - dialog.show() } .setOnCancelListener{ callback(null) @@ -521,28 +494,16 @@ open class BaseExplorerActivity : BaseActivity() { true } R.id.rename -> { - val dialogEditTextView = layoutInflater.inflate(R.layout.dialog_edit_text, null) val oldName = explorerElements[explorerAdapter.selectedItems[0]].name - val dialogEditText = dialogEditTextView.findViewById(R.id.dialog_edit_text) - dialogEditText.setText(oldName) - dialogEditText.selectAll() - val dialog = CustomAlertDialogBuilder(this, themeValue) - .setView(dialogEditTextView) - .setTitle(R.string.rename_title) - .setPositiveButton(R.string.ok) { _, _ -> - val newName = dialogEditText.text.toString() - rename(oldName, newName) - } - .setNegativeButton(R.string.cancel, null) - .create() - dialogEditText.setOnEditorActionListener { _, _, _ -> - val newName = dialogEditText.text.toString() - dialog.dismiss() - rename(oldName, newName) - true + with(EditTextDialog(this, R.string.rename_title) { + rename(oldName, it) + }) { + with(binding.dialogEditText) { + setText(oldName) + selectAll() + } + show() } - dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - dialog.show() true } R.id.open_as -> { diff --git a/app/src/main/java/sushi/hardcore/droidfs/explorers/ExplorerActivity.kt b/app/src/main/java/sushi/hardcore/droidfs/explorers/ExplorerActivity.kt index 99747f6..5645ee9 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/explorers/ExplorerActivity.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/explorers/ExplorerActivity.kt @@ -5,8 +5,6 @@ import android.content.Intent import android.net.Uri import android.view.Menu import android.view.MenuItem -import android.view.WindowManager -import android.widget.EditText import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.documentfile.provider.DocumentFile @@ -20,6 +18,7 @@ import sushi.hardcore.droidfs.databinding.ActivityExplorerBinding import sushi.hardcore.droidfs.file_operations.OperationFile import sushi.hardcore.droidfs.util.PathUtils import sushi.hardcore.droidfs.widgets.CustomAlertDialogBuilder +import sushi.hardcore.droidfs.widgets.EditTextDialog import java.io.File class ExplorerActivity : BaseExplorerActivity() { @@ -192,25 +191,9 @@ class ExplorerActivity : BaseExplorerActivity() { pickImportDirectory.launch(null) } "createFile" -> { - val dialogEditTextView = layoutInflater.inflate(R.layout.dialog_edit_text, null) - val dialogEditText = dialogEditTextView.findViewById(R.id.dialog_edit_text) - val dialog = CustomAlertDialogBuilder(this, themeValue) - .setView(dialogEditTextView) - .setTitle(getString(R.string.enter_file_name)) - .setPositiveButton(R.string.ok) { _, _ -> - val fileName = dialogEditText.text.toString() - createNewFile(fileName) - } - .setNegativeButton(R.string.cancel, null) - .create() - dialogEditText.setOnEditorActionListener { _, _, _ -> - val fileName = dialogEditText.text.toString() - dialog.dismiss() - createNewFile(fileName) - true - } - dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - dialog.show() + EditTextDialog(this, R.string.enter_file_name) { + createNewFile(it) + }.show() } "createFolder" -> { openDialogCreateFolder() @@ -343,6 +326,7 @@ class ExplorerActivity : BaseExplorerActivity() { } } cancelItemAction() + invalidateOptionsMenu() } } else if (currentItemAction == ItemsActions.MOVE){ mapFileForMove(itemsToProcess, itemsToProcess[0].explorerElement.parentPath) @@ -364,6 +348,7 @@ class ExplorerActivity : BaseExplorerActivity() { } } cancelItemAction() + invalidateOptionsMenu() } } true diff --git a/app/src/main/java/sushi/hardcore/droidfs/widgets/CustomAlertDialogBuilder.kt b/app/src/main/java/sushi/hardcore/droidfs/widgets/CustomAlertDialogBuilder.kt index 6f643be..dd0f33f 100644 --- a/app/src/main/java/sushi/hardcore/droidfs/widgets/CustomAlertDialogBuilder.kt +++ b/app/src/main/java/sushi/hardcore/droidfs/widgets/CustomAlertDialogBuilder.kt @@ -8,7 +8,7 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat import sushi.hardcore.droidfs.R -class CustomAlertDialogBuilder(context: Context, theme: String) : AlertDialog.Builder( +open class CustomAlertDialogBuilder(context: Context, theme: String) : AlertDialog.Builder( context, when (theme) { "black_green" -> R.style.BlackGreenDialog "dark_red" -> R.style.DarkRedDialog diff --git a/app/src/main/java/sushi/hardcore/droidfs/widgets/EditTextDialog.kt b/app/src/main/java/sushi/hardcore/droidfs/widgets/EditTextDialog.kt new file mode 100644 index 0000000..05c37df --- /dev/null +++ b/app/src/main/java/sushi/hardcore/droidfs/widgets/EditTextDialog.kt @@ -0,0 +1,32 @@ +package sushi.hardcore.droidfs.widgets + +import android.view.WindowManager +import androidx.appcompat.app.AlertDialog +import sushi.hardcore.droidfs.BaseActivity +import sushi.hardcore.droidfs.R +import sushi.hardcore.droidfs.databinding.DialogEditTextBinding + +class EditTextDialog( + activity: BaseActivity, + private val titleId: Int, + private val callback: (String) -> Unit, +): CustomAlertDialogBuilder(activity, activity.themeValue) { + val binding = DialogEditTextBinding.inflate(activity.layoutInflater) + + override fun create(): AlertDialog { + setTitle(titleId) + setView(binding.root) + setPositiveButton(R.string.ok) { _, _ -> + callback(binding.dialogEditText.text.toString()) + } + setNegativeButton(R.string.cancel, null) + val dialog = super.create() + binding.dialogEditText.setOnEditorActionListener { _, _, _ -> + dialog.dismiss() + callback(binding.dialogEditText.text.toString()) + true + } + dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) + return dialog + } +} \ No newline at end of file diff --git a/app/src/main/res/menu/main_activity.xml b/app/src/main/res/menu/main_activity.xml index dc97a65..5386ec9 100644 --- a/app/src/main/res/menu/main_activity.xml +++ b/app/src/main/res/menu/main_activity.xml @@ -39,4 +39,10 @@ app:showAsAction="never" android:visible="false"/> + + \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e83f8b3..8c5d663 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -127,7 +127,6 @@ Transferência do arquivo %s falhou. Transferência bem sucedida! Definir a duração do tempo (em s) - Por favor, digite um valor numérico Falha ao carregar a localização selecionada. DroidFS não pode salvar neste local. Por favor, tente algum outro. DroidFS só pode escrever em memórias SD removíveis sob: diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 43ba973..ec94527 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -122,7 +122,6 @@ Ошибка при перемещении %s. Перемещение выполнено! Введите время таймера (в сек.) - Введите числовое значение. Невозможно получить выбранный путь. DroidFS не имеет доступа на запись по этому пути. Попробуйте найти другое место. DroidFS не имеет доступа на запись по этому пути. Добавление тома с доступом только для чтения. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 42b01a4..3336aca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -127,7 +127,6 @@ Move of %s failed. Move successful ! Enter the timer duration (in s) - Please enter a numeric value Failed to retrieve the selected path. DroidFS doesn\'t have write access to this path. Please try another location. DroidFS doesn\'t have write access to this path. Adding volume with read-only access. @@ -232,4 +231,6 @@ Maximum file size for which to load a thumbnail. Current value: %s Size (in KB) Invalid number + New volume name: + Failed to rename volume