Merge branch 'master' into pull-to-refresh-option

This commit is contained in:
Agnieszka C 2021-11-23 12:24:48 +01:00 committed by GitHub
commit 2c9438d216
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
52 changed files with 591 additions and 637 deletions

View File

@ -10,8 +10,8 @@ Contains no ads or unnecessary permissions. It is fully opensource, provides cus
This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
<a href='https://play.google.com/store/apps/details?id=com.simplemobiletools.filemanager.pro'><img src='https://simplemobiletools.com/assets/images/google-play.png' alt='Get it on Google Play' height='45' /></a>
<a href='https://f-droid.org/packages/com.simplemobiletools.filemanager.pro'><img src='https://simplemobiletools.com/assets/images/f-droid.png' alt='Get it on F-Droid' height='45' /></a>
<a href='https://play.google.com/store/apps/details?id=com.simplemobiletools.filemanager.pro'><img src='https://simplemobiletools.com/images/button-google-play.svg' alt='Get it on Google Play' height='45' /></a>
<a href='https://f-droid.org/packages/com.simplemobiletools.filemanager.pro'><img src='https://simplemobiletools.com/images/button-f-droid.png' alt='Get it on F-Droid' height='45' /></a>
<div style="display:flex;">
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/english/1.jpg" width="30%">

View File

@ -9,13 +9,12 @@ if (keystorePropertiesFile.exists()) {
}
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
compileSdkVersion 30
defaultConfig {
applicationId "com.simplemobiletools.filemanager.pro"
minSdkVersion 21
targetSdkVersion 29
targetSdkVersion 30
versionCode 110
versionName "6.10.1"
multiDexEnabled true
@ -58,7 +57,7 @@ android {
}
dependencies {
implementation 'com.github.SimpleMobileTools:Simple-Commons:5079455be9'
implementation 'com.github.SimpleMobileTools:Simple-Commons:51f1996098'
implementation 'com.github.Stericson:RootTools:df729dcb13'
implementation 'com.github.Stericson:RootShell:1.6'
implementation 'com.alexvasilkov:gesture-views:2.5.2'

View File

@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-feature
android:name="android.hardware.faketouch"
@ -113,21 +114,11 @@
android:label="@string/about"
android:parentActivityName=".activities.MainActivity"/>
<activity
android:name="com.simplemobiletools.commons.activities.LicenseActivity"
android:label="@string/third_party_licences"
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
<activity
android:name="com.simplemobiletools.commons.activities.CustomizationActivity"
android:label="@string/customize_colors"
android:parentActivityName=".activities.SettingsActivity"/>
<activity
android:name="com.simplemobiletools.commons.activities.FAQActivity"
android:label="@string/frequently_asked_questions"
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"

View File

@ -1,5 +1,6 @@
package com.simplemobiletools.filemanager.pro.activities
import android.annotation.SuppressLint
import android.app.Activity
import android.app.SearchManager
import android.content.ClipData
@ -8,13 +9,18 @@ import android.content.Intent
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.media.RingtoneManager
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.os.Handler
import android.provider.Settings
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import androidx.viewpager.widget.ViewPager
import com.simplemobiletools.commons.dialogs.ConfirmationAdvancedDialog
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
@ -46,6 +52,7 @@ import java.util.*
class MainActivity : SimpleActivity() {
private val BACK_PRESS_TIMEOUT = 5000
private val MANAGE_STORAGE_RC = 201
private val PICKED_PATH = "picked_path"
private var isSearchOpen = false
private var wasBackJustPressed = false
@ -132,11 +139,11 @@ class MainActivity : SimpleActivity() {
override fun onPause() {
super.onPause()
storeStateVariables()
config.lastUsedViewPagerPage = main_view_pager.currentItem
}
override fun onDestroy() {
super.onDestroy()
config.lastUsedViewPagerPage = main_view_pager.currentItem
config.temporarilyShowHidden = false
}
@ -282,8 +289,8 @@ class MainActivity : SimpleActivity() {
}
private fun tryInitFileManager() {
val hadPermission = hasPermission(PERMISSION_WRITE_STORAGE)
handlePermission(PERMISSION_WRITE_STORAGE) {
val hadPermission = hasStoragePermission()
handleStoragePermission {
checkOTGPath()
if (it) {
if (main_view_pager.adapter == null) {
@ -300,6 +307,56 @@ class MainActivity : SimpleActivity() {
}
}
@SuppressLint("InlinedApi")
private fun handleStoragePermission(callback: (granted: Boolean) -> Unit) {
actionOnPermission = null
if (hasStoragePermission()) {
callback(true)
} else {
if (isRPlus()) {
ConfirmationAdvancedDialog(this, "", R.string.access_storage_prompt, R.string.ok, 0) { success ->
if (success ) {
isAskingPermissions = true
actionOnPermission = callback
try {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:$packageName")
startActivityForResult(intent, MANAGE_STORAGE_RC)
} catch (e: Exception) {
showErrorToast(e)
val intent = Intent()
intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
startActivityForResult(intent, MANAGE_STORAGE_RC)
}
} else {
finish()
}
}
} else {
handlePermission(PERMISSION_WRITE_STORAGE, callback)
}
}
}
@SuppressLint("NewApi")
private fun hasStoragePermission(): Boolean {
return if (isRPlus()) {
Environment.isExternalStorageManager()
} else {
hasPermission(PERMISSION_WRITE_STORAGE)
}
}
@SuppressLint("NewApi")
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
isAskingPermissions = false
if (requestCode == MANAGE_STORAGE_RC && isRPlus()) {
actionOnPermission?.invoke(Environment.isExternalStorageManager())
}
}
private fun initFileManager(refreshRecents: Boolean) {
if (intent.action == Intent.ACTION_VIEW && intent.data != null) {
val data = intent.data

View File

@ -61,6 +61,9 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
ensureBackgroundThread {
reFetchItems()
}
val adjustedPrimaryColor = getAdjustedPrimaryColor()
mimetypes_fastscroller.updateColors(adjustedPrimaryColor, adjustedPrimaryColor.getContrastColor())
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
@ -130,13 +133,13 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
lastSearchedText = searchText
when {
searchText.isEmpty() -> {
mimetypes_list.beVisible()
mimetypes_fastscroller.beVisible()
getRecyclerAdapter()?.updateItems(storedItems)
mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty())
mimetypes_placeholder_2.beGone()
}
searchText.length == 1 -> {
mimetypes_list.beGone()
mimetypes_fastscroller.beGone()
mimetypes_placeholder.beVisible()
mimetypes_placeholder_2.beVisible()
}
@ -150,14 +153,9 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
runOnUiThread {
getRecyclerAdapter()?.updateItems(listItems, text)
mimetypes_list.beVisibleIf(listItems.isNotEmpty())
mimetypes_fastscroller.beVisibleIf(listItems.isNotEmpty())
mimetypes_placeholder.beVisibleIf(listItems.isEmpty())
mimetypes_placeholder_2.beGone()
mimetypes_list.onGlobalLayout {
items_fastscroller.setScrollToY(mimetypes_list.computeVerticalScrollOffset())
calculateContentHeight(listItems)
}
}
}
}
@ -232,7 +230,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
isSearchOpen = false
lastSearchedText = ""
mimetypes_list.beVisible()
mimetypes_fastscroller.beVisible()
mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty())
mimetypes_placeholder_2.beGone()
}
@ -321,7 +319,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
}
storedItems = items
ItemsAdapter(this as SimpleActivity, storedItems, this, mimetypes_list, false, items_fastscroller, null) {
ItemsAdapter(this as SimpleActivity, storedItems, this, mimetypes_list, false, null) {
tryOpenPathIntent((it as ListItem).path, false)
}.apply {
setupZoomListener(zoomListener)
@ -332,13 +330,6 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
mimetypes_list.scheduleLayoutAnimation()
}
val dateFormat = config.dateFormat
val timeFormat = getTimeFormat()
items_fastscroller.setViews(mimetypes_list) {
val listItem = getRecyclerAdapter()?.listItems?.getOrNull(it)
items_fastscroller.updateBubbleText(listItem?.getBubbleText(this, dateFormat, timeFormat) ?: "")
}
mimetypes_placeholder.beVisibleIf(items.isEmpty())
}
@ -390,18 +381,9 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
invalidateOptionsMenu()
getRecyclerAdapter()?.apply {
notifyItemRangeChanged(0, listItems.size)
calculateContentHeight(listItems)
}
}
private fun calculateContentHeight(items: MutableList<ListItem>) {
val layoutManager = mimetypes_list.layoutManager as MyGridLayoutManager
val thumbnailHeight = layoutManager.getChildAt(0)?.height ?: 0
val fullHeight = ((items.size - 1) / layoutManager.spanCount + 1) * thumbnailHeight
items_fastscroller.setContentHeight(fullHeight)
items_fastscroller.setScrollToY(mimetypes_list.computeVerticalScrollOffset())
}
private fun setupLayoutManager() {
if (config.getFolderViewType(currentMimeType) == VIEW_TYPE_GRID) {
currentViewType = VIEW_TYPE_GRID

View File

@ -12,7 +12,6 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
import com.simplemobiletools.commons.extensions.getFileSignature
import com.simplemobiletools.commons.extensions.getTextSize
import com.simplemobiletools.commons.extensions.getTimeFormat
import com.simplemobiletools.commons.helpers.getFilePlaceholderDrawables
@ -25,7 +24,7 @@ import kotlinx.android.synthetic.main.item_file_dir_list.view.*
import java.util.*
class DecompressItemsAdapter(activity: SimpleActivity, var listItems: MutableList<ListItem>, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) :
MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
private lateinit var fileDrawable: Drawable
private lateinit var folderDrawable: Drawable

View File

@ -24,13 +24,13 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.*
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.filemanager.pro.R
import com.simplemobiletools.filemanager.pro.activities.SimpleActivity
@ -47,19 +47,19 @@ import kotlinx.android.synthetic.main.item_file_dir_list.view.item_frame
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_icon
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_name
import kotlinx.android.synthetic.main.item_section.view.*
import java.io.BufferedInputStream
import java.io.Closeable
import java.io.File
import java.io.FileInputStream
import java.util.*
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream
class ItemsAdapter(
activity: SimpleActivity, var listItems: MutableList<ListItem>, val listener: ItemOperationsListener?, recyclerView: MyRecyclerView,
val isPickMultipleIntent: Boolean, fastScroller: FastScroller?, val swipeRefreshLayout: SwipeRefreshLayout?, itemClick: (Any) -> Unit
val isPickMultipleIntent: Boolean, val swipeRefreshLayout: SwipeRefreshLayout?, itemClick: (Any) -> Unit
) :
MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
private val TYPE_FILE_DIR = 1
private val TYPE_SECTION = 2
@ -326,16 +326,29 @@ class ItemsAdapter(
}
}
@SuppressLint("NewApi")
private fun addFileUris(path: String, paths: ArrayList<String>) {
if (activity.getIsPathDirectory(path)) {
val shouldShowHidden = activity.config.shouldShowHidden
if (activity.isPathOnOTG(path)) {
activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }?.forEach {
addFileUris(it.uri.toString(), paths)
when {
activity.isRestrictedSAFOnlyRoot(path) -> {
activity.getAndroidSAFFileItems(path, shouldShowHidden, false) { files ->
files.forEach {
addFileUris(activity.getAndroidSAFUri(it.path).toString(), paths)
}
}
}
} else {
File(path).listFiles()?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }?.forEach {
addFileUris(it.absolutePath, paths)
activity.isPathOnOTG(path) -> {
activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }?.forEach {
addFileUris(it.uri.toString(), paths)
}
}
else -> {
File(path).listFiles()?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }?.forEach {
addFileUris(it.absolutePath, paths)
}
}
}
} else {
@ -390,20 +403,30 @@ class ItemsAdapter(
activity.copyMoveFilesTo(files, source, it, isCopyOperation, false, activity.config.shouldShowHidden) {
if (!isCopyOperation) {
files.forEach { sourceFileDir ->
val sourceFile = File(sourceFileDir.path)
if (activity.getDoesFilePathExist(source) && activity.getIsPathDirectory(source) &&
sourceFile.list()?.isEmpty() == true && sourceFile.getProperSize(true) == 0L && sourceFile.getFileCount(true) == 0
) {
val sourceFolder = sourceFile.toFileDirItem(activity)
activity.deleteFile(sourceFolder, true) {
val sourcePath = sourceFileDir.path
if (activity.isRestrictedSAFOnlyRoot(sourcePath) && activity.getDoesFilePathExist(sourcePath)) {
activity.deleteFile(sourceFileDir, true) {
listener?.refreshFragment()
activity.runOnUiThread {
finishActMode()
}
}
} else {
listener?.refreshFragment()
finishActMode()
val sourceFile = File(sourcePath)
if (activity.getDoesFilePathExist(source) && activity.getIsPathDirectory(source) &&
sourceFile.list()?.isEmpty() == true && sourceFile.getProperSize(true) == 0L && sourceFile.getFileCount(true) == 0
) {
val sourceFolder = sourceFile.toFileDirItem(activity)
activity.deleteFile(sourceFolder, true) {
listener?.refreshFragment()
activity.runOnUiThread {
finishActMode()
}
}
} else {
listener?.refreshFragment()
finishActMode()
}
}
}
} else {
@ -443,22 +466,27 @@ class ItemsAdapter(
CompressAsDialog(activity, firstPath) {
val destination = it
activity.handleSAFDialog(firstPath) {
if (!it) {
return@handleSAFDialog
activity.handleAndroidSAFDialog(firstPath) { granted ->
if (!granted) {
return@handleAndroidSAFDialog
}
activity.handleSAFDialog(firstPath) {
if (!it) {
return@handleSAFDialog
}
activity.toast(R.string.compressing)
val paths = getSelectedFileDirItems().map { it.path }
ensureBackgroundThread {
if (compressPaths(paths, destination)) {
activity.runOnUiThread {
activity.toast(R.string.compression_successful)
listener?.refreshFragment()
finishActMode()
activity.toast(R.string.compressing)
val paths = getSelectedFileDirItems().map { it.path }
ensureBackgroundThread {
if (compressPaths(paths, destination)) {
activity.runOnUiThread {
activity.toast(R.string.compression_successful)
listener?.refreshFragment()
finishActMode()
}
} else {
activity.toast(R.string.compressing_failed)
}
} else {
activity.toast(R.string.compressing_failed)
}
}
}
@ -478,103 +506,108 @@ class ItemsAdapter(
}
val paths = getSelectedFileDirItems().asSequence().map { it.path }.filter { it.isZipFile() }.toList()
tryDecompressingPaths(paths) {
if (it) {
activity.toast(R.string.decompression_successful)
ensureBackgroundThread {
tryDecompressingPaths(paths) { success ->
activity.runOnUiThread {
listener?.refreshFragment()
finishActMode()
if (success) {
activity.toast(R.string.decompression_successful)
listener?.refreshFragment()
finishActMode()
} else {
activity.toast(R.string.decompressing_failed)
}
}
} else {
activity.toast(R.string.decompressing_failed)
}
}
}
}
private fun tryDecompressingPaths(sourcePaths: List<String>, callback: (success: Boolean) -> Unit) {
sourcePaths.forEach {
try {
val zipFile = ZipFile(it)
val entries = zipFile.entries()
val fileDirItems = ArrayList<FileDirItem>()
while (entries.hasMoreElements()) {
val entry = entries.nextElement()
val currPath = if (entry.isDirectory) it else "${it.getParentPath().trimEnd('/')}/${entry.name}"
val fileDirItem = FileDirItem(currPath, entry.name, entry.isDirectory, 0, entry.size)
fileDirItems.add(fileDirItem)
}
val destinationPath = fileDirItems.first().getParentPath().trimEnd('/')
activity.checkConflicts(fileDirItems, destinationPath, 0, LinkedHashMap()) {
ensureBackgroundThread {
decompressPaths(sourcePaths, it, callback)
sourcePaths.forEach { path ->
ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path))).use { zipInputStream ->
try {
val fileDirItems = ArrayList<FileDirItem>()
var entry = zipInputStream.nextEntry
while (entry != null) {
val currPath = if (entry.isDirectory) path else "${path.getParentPath().trimEnd('/')}/${entry.name}"
val fileDirItem = FileDirItem(currPath, entry.name, entry.isDirectory, 0, entry.size)
fileDirItems.add(fileDirItem)
zipInputStream.closeEntry()
entry = zipInputStream.nextEntry
}
zipInputStream.closeEntry()
val destinationPath = fileDirItems.first().getParentPath().trimEnd('/')
activity.checkConflicts(fileDirItems, destinationPath, 0, LinkedHashMap()) {
ensureBackgroundThread {
decompressPaths(sourcePaths, it, callback)
}
}
} catch (exception: Exception) {
activity.showErrorToast(exception)
}
} catch (exception: Exception) {
activity.showErrorToast(exception)
}
}
}
private fun decompressPaths(paths: List<String>, conflictResolutions: LinkedHashMap<String, Int>, callback: (success: Boolean) -> Unit) {
paths.forEach {
try {
val zipFile = ZipFile(it)
val entries = zipFile.entries()
val zipFileName = it.getFilenameFromPath()
val newFolderName = zipFileName.subSequence(0, zipFileName.length - 4)
while (entries.hasMoreElements()) {
val entry = entries.nextElement()
val parentPath = it.getParentPath()
val newPath = "$parentPath/$newFolderName/${entry.name.trimEnd('/')}"
paths.forEach { path ->
val zipInputStream = ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path)))
zipInputStream.use {
try {
var entry = zipInputStream.nextEntry
val zipFileName = path.getFilenameFromPath()
val newFolderName = zipFileName.subSequence(0, zipFileName.length - 4)
while (entry != null) {
val parentPath = path.getParentPath()
val newPath = "$parentPath/$newFolderName/${entry.name.trimEnd('/')}"
val resolution = getConflictResolution(conflictResolutions, newPath)
val doesPathExist = activity.getDoesFilePathExist(newPath)
if (doesPathExist && resolution == CONFLICT_OVERWRITE) {
val fileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), entry.isDirectory)
if (activity.getIsPathDirectory(it)) {
activity.deleteFolderBg(fileDirItem, false) {
if (it) {
extractEntry(newPath, entry, zipFile)
} else {
callback(false)
}
}
} else {
activity.deleteFileBg(fileDirItem, false) {
if (it) {
extractEntry(newPath, entry, zipFile)
} else {
callback(false)
val resolution = getConflictResolution(conflictResolutions, newPath)
val doesPathExist = activity.getDoesFilePathExist(newPath)
if (doesPathExist && resolution == CONFLICT_OVERWRITE) {
val fileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), entry.isDirectory)
if (activity.getIsPathDirectory(path)) {
activity.deleteFolderBg(fileDirItem, false) {
if (it) {
extractEntry(newPath, entry, zipInputStream)
} else {
callback(false)
}
}
} else {
activity.deleteFileBg(fileDirItem, false) {
if (it) {
extractEntry(newPath, entry, zipInputStream)
} else {
callback(false)
}
}
}
} else if (!doesPathExist) {
extractEntry(newPath, entry, zipInputStream)
}
} else if (!doesPathExist) {
extractEntry(newPath, entry, zipFile)
zipInputStream.closeEntry()
entry = zipInputStream.nextEntry
}
callback(true)
} catch (e: Exception) {
activity.showErrorToast(e)
callback(false)
}
callback(true)
} catch (e: Exception) {
activity.showErrorToast(e)
callback(false)
}
}
}
private fun extractEntry(newPath: String, entry: ZipEntry, zipFile: ZipFile) {
private fun extractEntry(newPath: String, entry: ZipEntry, zipInputStream: ZipInputStream) {
if (entry.isDirectory) {
if (!activity.createDirectorySync(newPath) && !activity.getDoesFilePathExist(newPath)) {
val error = String.format(activity.getString(R.string.could_not_create_file), newPath)
activity.showErrorToast(error)
}
} else {
val ins = zipFile.getInputStream(entry)
ins.use {
val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType())
if (fos != null) {
ins.copyTo(fos)
}
val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType())
if (fos != null) {
zipInputStream.copyTo(fos)
}
}
}
@ -589,44 +622,64 @@ class ItemsAdapter(
}
}
@SuppressLint("NewApi")
private fun compressPaths(sourcePaths: List<String>, targetPath: String): Boolean {
val queue = LinkedList<File>()
val queue = LinkedList<String>()
val fos = activity.getFileOutputStreamSync(targetPath, "application/zip") ?: return false
val zout = ZipOutputStream(fos)
var res: Closeable = fos
try {
sourcePaths.forEach {
sourcePaths.forEach { currentPath ->
var name: String
var mainFile = File(it)
val base = mainFile.parentFile.toURI()
var mainFilePath = currentPath
val base = "${mainFilePath.getParentPath()}/"
res = zout
queue.push(mainFile)
if (activity.getIsPathDirectory(mainFile.absolutePath)) {
name = "${mainFile.name.trimEnd('/')}/"
queue.push(mainFilePath)
if (activity.getIsPathDirectory(mainFilePath)) {
name = "${mainFilePath.getFilenameFromPath()}/"
zout.putNextEntry(ZipEntry(name))
}
while (!queue.isEmpty()) {
mainFile = queue.pop()
if (activity.getIsPathDirectory(mainFile.absolutePath)) {
for (file in mainFile.listFiles()) {
name = base.relativize(file.toURI()).path
if (activity.getIsPathDirectory(file.absolutePath)) {
queue.push(file)
name = "${name.trimEnd('/')}/"
zout.putNextEntry(ZipEntry(name))
} else {
zout.putNextEntry(ZipEntry(name))
FileInputStream(file).copyTo(zout)
zout.closeEntry()
mainFilePath = queue.pop()
if (activity.getIsPathDirectory(mainFilePath)) {
if (activity.isRestrictedSAFOnlyRoot(mainFilePath)) {
activity.getAndroidSAFFileItems(mainFilePath, true) { files ->
for (file in files) {
name = file.path.relativizeWith(base)
if (activity.getIsPathDirectory(file.path)) {
queue.push(file.path)
name = "${name.trimEnd('/')}/"
zout.putNextEntry(ZipEntry(name))
} else {
zout.putNextEntry(ZipEntry(name))
activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
zout.closeEntry()
}
}
}
} else {
val mainFile = File(mainFilePath)
for (file in mainFile.listFiles()) {
name = file.path.relativizeWith(base)
if (activity.getIsPathDirectory(file.absolutePath)) {
queue.push(file.absolutePath)
name = "${name.trimEnd('/')}/"
zout.putNextEntry(ZipEntry(name))
} else {
zout.putNextEntry(ZipEntry(name))
activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
zout.closeEntry()
}
}
}
} else {
name = if (base.path == it) it.getFilenameFromPath() else base.relativize(mainFile.toURI()).path
name = if (base == currentPath) currentPath.getFilenameFromPath() else mainFilePath.relativizeWith(base)
zout.putNextEntry(ZipEntry(name))
FileInputStream(mainFile).copyTo(zout)
activity.getFileInputStreamSync(mainFilePath)!!.copyTo(zout)
zout.closeEntry()
}
}
@ -708,7 +761,6 @@ class ItemsAdapter(
textToHighlight = highlightText
notifyDataSetChanged()
}
fastScroller?.measureRecyclerView()
}
fun updateFontSizes() {
@ -833,7 +885,9 @@ class ItemsAdapter(
path
}
if (hasOTGConnected && itemToLoad is String && activity.isPathOnOTG(itemToLoad) && baseConfig.OTGTreeUri.isNotEmpty() && baseConfig.OTGPartition.isNotEmpty()) {
if (activity.isRestrictedSAFOnlyRoot(path)) {
itemToLoad = activity.getAndroidSAFUri(path)
} else if (hasOTGConnected && itemToLoad is String && activity.isPathOnOTG(itemToLoad) && baseConfig.OTGTreeUri.isNotEmpty() && baseConfig.OTGPartition.isNotEmpty()) {
itemToLoad = getOTGPublicPath(itemToLoad)
}
@ -846,4 +900,6 @@ class ItemsAdapter(
fileDrawable = resources.getDrawable(R.drawable.ic_file_generic)
fileDrawables = getFilePlaceholderDrawables(activity)
}
override fun onChange(position: Int) = listItems.getOrNull(position)?.getBubbleText(activity, dateFormat, timeFormat) ?: ""
}

View File

@ -12,8 +12,10 @@ import com.simplemobiletools.filemanager.pro.extensions.config
import kotlinx.android.synthetic.main.item_manage_favorite.view.*
import java.util.*
class ManageFavoritesAdapter(activity: BaseSimpleActivity, var favorites: ArrayList<String>, val listener: RefreshRecyclerViewListener?,
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
class ManageFavoritesAdapter(
activity: BaseSimpleActivity, var favorites: ArrayList<String>, val listener: RefreshRecyclerViewListener?,
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
private val config = activity.config

View File

@ -3,6 +3,7 @@ package com.simplemobiletools.filemanager.pro.dialogs
import android.view.View
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.filemanager.pro.R
import com.simplemobiletools.filemanager.pro.activities.SimpleActivity
import com.simplemobiletools.filemanager.pro.helpers.RootHelpers
@ -15,41 +16,62 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
init {
AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.create().apply {
activity.setupDialogStuff(view, this, R.string.create_new) {
showKeyboard(view.item_name)
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(View.OnClickListener {
val name = view.item_name.value
if (name.isEmpty()) {
activity.toast(R.string.empty_name)
} else if (name.isAValidFilename()) {
val newPath = "$path/$name"
if (activity.getDoesFilePathExist(newPath)) {
activity.toast(R.string.name_taken)
return@OnClickListener
}
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.create().apply {
activity.setupDialogStuff(view, this, R.string.create_new) {
showKeyboard(view.item_name)
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(View.OnClickListener {
val name = view.item_name.value
if (name.isEmpty()) {
activity.toast(R.string.empty_name)
} else if (name.isAValidFilename()) {
val newPath = "$path/$name"
if (activity.getDoesFilePathExist(newPath)) {
activity.toast(R.string.name_taken)
return@OnClickListener
}
if (view.dialog_radio_group.checkedRadioButtonId == R.id.dialog_radio_directory) {
createDirectory(newPath, this) {
callback(it)
}
} else {
createFile(newPath, this) {
callback(it)
}
if (view.dialog_radio_group.checkedRadioButtonId == R.id.dialog_radio_directory) {
createDirectory(newPath, this) {
callback(it)
}
} else {
activity.toast(R.string.invalid_name)
createFile(newPath, this) {
callback(it)
}
}
})
}
} else {
activity.toast(R.string.invalid_name)
}
})
}
}
}
private fun createDirectory(path: String, alertDialog: AlertDialog, callback: (Boolean) -> Unit) {
when {
isRPlus() || path.startsWith(activity.internalStoragePath, true) -> {
if (activity.isRestrictedSAFOnlyRoot(path)) {
activity.handleAndroidSAFDialog(path) {
if (!it) {
callback(false)
return@handleAndroidSAFDialog
}
if (activity.createAndroidSAFDirectory(path)) {
success(alertDialog)
} else {
val error = String.format(activity.getString(R.string.could_not_create_folder), path)
activity.showErrorToast(error)
callback(false)
}
}
} else {
if (File(path).mkdirs()) {
success(alertDialog)
}
}
}
activity.needsStupidWritePermissions(path) -> activity.handleSAFDialog(path) {
if (!it) {
return@handleSAFDialog
@ -65,11 +87,6 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
documentFile.createDirectory(path.getFilenameFromPath())
success(alertDialog)
}
path.startsWith(activity.internalStoragePath, true) -> {
if (File(path).mkdirs()) {
success(alertDialog)
}
}
else -> {
RootHelpers(activity).createFileFolder(path, false) {
if (it) {
@ -85,6 +102,22 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
private fun createFile(path: String, alertDialog: AlertDialog, callback: (Boolean) -> Unit) {
try {
when {
activity.isRestrictedSAFOnlyRoot(path) -> {
activity.handleAndroidSAFDialog(path) {
if (!it) {
callback(false)
return@handleAndroidSAFDialog
}
if (activity.createAndroidSAFFile(path)) {
success(alertDialog)
} else {
val error = String.format(activity.getString(R.string.could_not_create_file), path)
activity.showErrorToast(error)
callback(false)
}
}
}
activity.needsStupidWritePermissions(path) -> {
activity.handleSAFDialog(path) {
if (!it) {
@ -102,7 +135,8 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
success(alertDialog)
}
}
path.startsWith(activity.internalStoragePath, true) -> {
isRPlus() || path.startsWith(activity.internalStoragePath, true) -> {
if (File(path).createNewFile()) {
success(alertDialog)
}

View File

@ -1,5 +1,6 @@
package com.simplemobiletools.filemanager.pro.fragments
import android.annotation.SuppressLint
import android.content.Context
import android.os.Parcelable
import android.util.AttributeSet
@ -51,7 +52,6 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
override fun onResume(textColor: Int, primaryColor: Int) {
context!!.updateTextColors(this)
items_fastscroller.updatePrimaryColor()
storedItems = ArrayList()
getRecyclerAdapter()?.apply {
updatePrimaryColor(primaryColor)
@ -59,14 +59,19 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
initDrawables()
}
breadcrumbs.updateColor(textColor)
items_fastscroller.updateBubbleColors()
items_fastscroller.updateColors(primaryColor, primaryColor.getContrastColor())
if (currentPath != "") {
breadcrumbs.updateColor(textColor)
}
items_swipe_refresh.isEnabled = activity?.config?.enablePullToRefresh != false
}
override fun setupFontSize() {
getRecyclerAdapter()?.updateFontSizes()
breadcrumbs.updateFontSize(context!!.getTextSize())
if (currentPath != "") {
breadcrumbs.updateFontSize(context!!.getTextSize())
}
}
override fun setupDateTimeFormat() {
@ -121,10 +126,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
breadcrumbs.updateFontSize(context!!.getTextSize())
}
ItemsAdapter(
activity as SimpleActivity, storedItems, this, items_list, isPickMultipleIntent, items_fastscroller,
items_swipe_refresh
) {
ItemsAdapter(activity as SimpleActivity, storedItems, this, items_list, isPickMultipleIntent, items_swipe_refresh) {
if ((it as? ListItem)?.isSectionTitle == true) {
openDirectory(it.mPath)
searchClosed()
@ -140,18 +142,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
items_list.scheduleLayoutAnimation()
}
val dateFormat = context!!.config.dateFormat
val timeFormat = context!!.getTimeFormat()
items_fastscroller.setViews(items_list, items_swipe_refresh) {
val listItem = getRecyclerAdapter()?.listItems?.getOrNull(it)
items_fastscroller.updateBubbleText(listItem?.getBubbleText(context, dateFormat, timeFormat) ?: "")
}
getRecyclerLayoutManager().onRestoreInstanceState(scrollStates[currentPath])
items_list.onGlobalLayout {
items_fastscroller.setScrollToY(items_list.computeVerticalScrollOffset())
calculateContentHeight(storedItems)
}
}
}
@ -159,12 +150,24 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
private fun getRecyclerLayoutManager() = (items_list.layoutManager as MyGridLayoutManager)
@SuppressLint("NewApi")
private fun getItems(path: String, callback: (originalPath: String, items: ArrayList<ListItem>) -> Unit) {
skipItemUpdating = false
ensureBackgroundThread {
if (activity?.isDestroyed == false && activity?.isFinishing == false) {
val config = context!!.config
if (context!!.isPathOnOTG(path) && config.OTGTreeUri.isNotEmpty()) {
if (context.isRestrictedSAFOnlyRoot(path)) {
activity?.handleAndroidSAFDialog(path) {
if (!it) {
activity?.toast(R.string.no_storage_permissions)
return@handleAndroidSAFDialog
}
val getProperChildCount = context!!.config.getFolderViewType(currentPath) == VIEW_TYPE_LIST
context.getAndroidSAFFileItems(path, context.config.shouldShowHidden, getProperChildCount) { fileItems ->
callback(path, getListItemsFromFileDirItems(fileItems))
}
}
} else if (context!!.isPathOnOTG(path) && config.OTGTreeUri.isNotEmpty()) {
val getProperFileSize = context!!.config.getFolderSorting(currentPath) and SORT_BY_SIZE != 0
context!!.getOTGItems(path, config.shouldShowHidden, getProperFileSize) {
callback(path, getListItemsFromFileDirItems(it))
@ -203,7 +206,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
if (getProperChildCount) {
items.filter { it.mIsDirectory }.forEach {
if (context != null) {
val childrenCount = it.getDirectChildrenCount(context!!, showHidden)
val childrenCount = it.getDirectChildrenCount(activity as BaseSimpleActivity, showHidden)
if (childrenCount != 0) {
activity?.runOnUiThread {
getRecyclerAdapter()?.updateChildCount(it.mPath, childrenCount)
@ -223,7 +226,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
var lastModified = lastModifieds.remove(curPath)
val isDirectory = if (lastModified != null) false else file.isDirectory
val children = if (isDirectory && getProperChildCount) file.getDirectChildrenCount(showHidden) else 0
val children = if (isDirectory && getProperChildCount) file.getDirectChildrenCount(context, showHidden) else 0
val size = if (isDirectory) {
if (isSortingBySize) {
file.getProperSize(showHidden)
@ -275,13 +278,13 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
when {
searchText.isEmpty() -> {
items_list.beVisible()
items_fastscroller.beVisible()
getRecyclerAdapter()?.updateItems(storedItems)
items_placeholder.beGone()
items_placeholder_2.beGone()
}
searchText.length == 1 -> {
items_list.beGone()
items_fastscroller.beGone()
items_placeholder.beVisible()
items_placeholder_2.beVisible()
}
@ -318,14 +321,9 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
activity?.runOnUiThread {
getRecyclerAdapter()?.updateItems(listItems, text)
items_list.beVisibleIf(listItems.isNotEmpty())
items_fastscroller.beVisibleIf(listItems.isNotEmpty())
items_placeholder.beVisibleIf(listItems.isEmpty())
items_placeholder_2.beGone()
items_list.onGlobalLayout {
items_fastscroller.setScrollToY(items_list.computeVerticalScrollOffset())
calculateContentHeight(listItems)
}
}
}
}
@ -377,13 +375,13 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
isSearchOpen = false
if (!skipItemUpdating) {
getRecyclerAdapter()?.updateItems(storedItems)
calculateContentHeight(storedItems)
}
skipItemUpdating = false
lastSearchedText = ""
items_swipe_refresh.isEnabled = activity?.config?.enablePullToRefresh != false
items_list.beVisible()
items_fastscroller.beVisible()
items_placeholder.beGone()
items_placeholder_2.beGone()
}
@ -458,14 +456,6 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
}
}
private fun calculateContentHeight(items: MutableList<ListItem>) {
val layoutManager = items_list.layoutManager as MyGridLayoutManager
val thumbnailHeight = layoutManager.getChildAt(0)?.height ?: 0
val fullHeight = ((items.size - 1) / layoutManager.spanCount + 1) * thumbnailHeight
items_fastscroller.setContentHeight(fullHeight)
items_fastscroller.setScrollToY(items_list.computeVerticalScrollOffset())
}
override fun increaseColumnCount() {
if (currentViewType == VIEW_TYPE_GRID) {
context?.config?.fileColumnCnt = ++(items_list.layoutManager as MyGridLayoutManager).spanCount
@ -484,7 +474,6 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
activity?.invalidateOptionsMenu()
getRecyclerAdapter()?.apply {
notifyItemRangeChanged(0, listItems.size)
calculateContentHeight(listItems)
}
}

View File

@ -1,14 +1,14 @@
package com.simplemobiletools.filemanager.pro.fragments
import android.content.ContentResolver
import android.content.Context
import android.provider.MediaStore.Files
import android.provider.MediaStore.Files.FileColumns
import android.util.AttributeSet
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.GridLayoutManager
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.commons.helpers.VIEW_TYPE_LIST
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.filemanager.pro.R
@ -24,6 +24,8 @@ import kotlinx.android.synthetic.main.recents_fragment.view.*
import java.util.*
class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), ItemOperationsListener {
private val RECENTS_LIMIT = 50
override fun setupFragment(activity: SimpleActivity) {
if (this.activity == null) {
this.activity = activity
@ -53,7 +55,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
return
}
ItemsAdapter(activity as SimpleActivity, recents, this, recents_list, isPickMultipleIntent, null, recents_swipe_refresh) {
ItemsAdapter(activity as SimpleActivity, recents, this, recents_list, isPickMultipleIntent, recents_swipe_refresh) {
clickedPath((it as FileDirItem).path)
}.apply {
recents_list.adapter = this
@ -122,17 +124,33 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
FileColumns.SIZE
)
val sortOrder = "${FileColumns.DATE_MODIFIED} DESC LIMIT 50"
context?.queryCursor(uri, projection, sortOrder = sortOrder, showErrors = true) { cursor ->
val path = cursor.getStringValue(FileColumns.DATA)
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
val size = cursor.getLongValue(FileColumns.SIZE)
val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000
val fileDirItem = ListItem(path, name, false, 0, size, modified, false)
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) {
listItems.add(fileDirItem)
try {
if (isOreoPlus()) {
val queryArgs = bundleOf(
ContentResolver.QUERY_ARG_LIMIT to RECENTS_LIMIT,
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(FileColumns.DATE_MODIFIED),
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
)
context?.contentResolver?.query(uri, projection, queryArgs, null)
} else {
val sortOrder = "${FileColumns.DATE_MODIFIED} DESC LIMIT $RECENTS_LIMIT"
context?.contentResolver?.query(uri, projection, null, null, sortOrder)
}?.use { cursor ->
if (cursor.moveToFirst()) {
do {
val path = cursor.getStringValue(FileColumns.DATA)
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
val size = cursor.getLongValue(FileColumns.SIZE)
val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000
val fileDirItem = ListItem(path, name, false, 0, size, modified, false)
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) {
listItems.add(fileDirItem)
}
} while (cursor.moveToNext())
}
}
} catch (e: Exception) {
activity?.showErrorToast(e)
}
activity?.runOnUiThread {

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M19,12v7L5,19v-7L3,12v7c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2zM13,12.67l2.59,-2.58L17,11.5l-5,5 -5,-5 1.41,-1.41L11,12.67L11,3h2z" />
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M16.3 10.3c-0.39-0.39-1.01-0.39-1.4 0L13 12.2V3c0-0.55-0.45-1-1-1s-1 0.45-1 1v9.2l-1.9-1.9c-0.39-0.39-1.01-0.39-1.4 0-0.39 0.39-0.39 1.01 0 1.4l3.59 3.59c0.39 0.39 1.02 0.39 1.41 0l3.6-3.59c0.39-0.39 0.39-1.01 0-1.4zM5 20v-7c0-0.55-0.45-1-1-1s-1 0.45-1 1v7c0 1.1 0.9 2 2 2h14c1.1 0 2-0.9 2-2v-7c0-0.55-0.45-1-1-1s-1 0.45-1 1v7z" android:fillColor="#FFFFFFFF"/>
</vector>

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" />
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M10 19v-5h4v5c0 0.55 0.45 1 1 1h3c0.55 0 1-0.45 1-1v-7h1.7c0.46 0 0.68-0.57 0.33-0.87L12.67 3.6c-0.38-0.34-0.96-0.34-1.34 0l-8.36 7.53C2.63 11.43 2.84 12 3.3 12H5v7c0 0.55 0.45 1 1 1h3c0.55 0 1-0.45 1-1z" android:fillColor="#FFFFFFFF"/>
</vector>

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M2,20h20v-4L2,16v4zM4,17h2v2L4,19v-2zM2,4v4h20L22,4L2,4zM6,7L4,7L4,5h2v2zM2,14h20v-4L2,10v4zM4,11h2v2L4,13v-2z" />
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M4 20h16c1.1 0 2-0.9 2-2s-0.9-2-2-2H4c-1.1 0-2 0.9-2 2s0.9 2 2 2zm0-3h2v2H4v-2zM2 6c0 1.1 0.9 2 2 2h16c1.1 0 2-0.9 2-2s-0.9-2-2-2H4C2.9 4 2 4.9 2 6zm4 1H4V5h2v2zm-2 7h16c1.1 0 2-0.9 2-2s-0.9-2-2-2H4c-1.1 0-2 0.9-2 2s0.9 2 2 2zm0-3h2v2H4v-2z" android:fillColor="#FFFFFFFF"/>
</vector>

View File

@ -35,24 +35,20 @@
android:textStyle="italic"
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/mimetypes_list"
<com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
android:id="@+id/mimetypes_fastscroller"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation"
android:paddingTop="@dimen/small_margin"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager" />
android:layout_height="wrap_content">
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/items_fastscroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin">
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/mimetypes_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation"
android:paddingTop="@dimen/small_margin"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager" />
<include layout="@layout/fastscroller_handle_vertical" />
</com.simplemobiletools.commons.views.FastScroller>
</com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
</RelativeLayout>

View File

@ -60,27 +60,22 @@
android:textStyle="italic"
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/items_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/breadcrumbs"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager" />
<com.simplemobiletools.commons.views.FastScroller
<com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
android:id="@+id/items_fastscroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@+id/breadcrumbs"
android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/breadcrumbs">
<include layout="@layout/fastscroller_handle_vertical" />
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/items_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager" />
</com.simplemobiletools.commons.views.FastScroller>
</com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
</RelativeLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

View File

@ -13,12 +13,12 @@
app:showAsAction="always"/>
<item
android:id="@+id/cab_properties"
android:icon="@drawable/ic_info"
android:icon="@drawable/ic_info_vector"
android:title="@string/properties"
app:showAsAction="always"/>
<item
android:id="@+id/cab_rename"
android:icon="@drawable/ic_rename_new"
android:icon="@drawable/ic_rename_vector"
android:title="@string/rename"
app:showAsAction="always"/>
<item
@ -28,7 +28,7 @@
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_hide"
android:icon="@drawable/ic_hide"
android:icon="@drawable/ic_hide_vector"
android:title="@string/hide"
app:showAsAction="ifRoom"/>
<item

View File

@ -24,12 +24,12 @@
app:showAsAction="ifRoom" />
<item
android:id="@+id/add_favorite"
android:icon="@drawable/ic_star_off_vector"
android:icon="@drawable/ic_star_outline_vector"
android:title="@string/add_to_favorites"
app:showAsAction="ifRoom" />
<item
android:id="@+id/remove_favorite"
android:icon="@drawable/ic_star_on_vector"
android:icon="@drawable/ic_star_vector"
android:title="@string/remove_from_favorites"
app:showAsAction="ifRoom" />
<item
@ -64,10 +64,12 @@
app:showAsAction="never" />
<item
android:id="@+id/settings"
android:icon="@drawable/ic_settings_cog_vector"
android:title="@string/settings"
app:showAsAction="never" />
app:showAsAction="ifRoom" />
<item
android:id="@+id/about"
android:icon="@drawable/ic_info_vector"
android:title="@string/about"
app:showAsAction="never" />
app:showAsAction="ifRoom" />
</menu>

View File

@ -9,11 +9,11 @@
<string name="copy_path">نسخ المسار الى الحافظة</string>
<string name="path_copied">تم نسخ المسار</string>
<string name="select_audio_file">الرجاء تحديد ملف صوتي</string>
<string name="search_folder">Search folder</string>
<string name="rooted_device_only">This operation works only on rooted devices</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="search_folder">مجلد البحث</string>
<string name="rooted_device_only">تعمل هذه العملية فقط على الأجهزة المتجذرة</string>
<string name="recents">الأحدث</string>
<string name="show_recents">إظهار الأحدث</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Open as</string>
<string name="text_file">Text file</string>
@ -21,7 +21,6 @@
<string name="audio_file">Audio file</string>
<string name="video_file">Video file</string>
<string name="other_file">Other file</string>
<!-- Compression -->
<string name="compress">ضغط</string>
<string name="decompress">فك الضغط</string>
@ -32,74 +31,34 @@
<string name="decompression_successful">نجح التفكيك</string>
<string name="compressing_failed">أخفق الضغط</string>
<string name="decompressing_failed">أخفق إلغاء الضغط</string>
<!-- Favorites -->
<string name="manage_favorites">إدارة المفضلة</string>
<string name="go_to_favorite">الذهاب الى المفضلة</string>
<string name="favorites_activity_placeholder">يمكنك إضافة المجلدات المستخدمة بشكل متكرر إلى المفضلة لسهولة الوصول إليها من أي مكان.</string>
<!-- File Editor -->
<string name="file_editor">محرر الملفات</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="videos">Videos</string>
<string name="storage_analysis">تحليل التخزين</string>
<string name="images">الصور</string>
<string name="videos">الفيديوات</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="archives">الأرشيف</string>
<string name="others">الاخرين</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<string name="total_storage">إجمالي مساحة التخزين: %s</string>
<!-- Settings -->
<string name="enable_root_access">تفعيل الدخول الى مسار الروت</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<string name="press_back_twice">تتطلب الضغط على رجوع مرتين لمغادرة التطبيق</string>
<!-- Strings displayed only on Google Play Store. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple File Manager Pro - Manage files easy &amp; fast</string>
<string name="app_title">مدير الملفات البسيط برو -- إدارة الملفات سهلة وسريعة</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Easy app for managing your files without ads, respecting your privacy &amp; security</string>
<string name="app_long_description">
A lightweight quick file manager for everyday use. It offers a userful search functionality, you can also customize the home folder and select favorite folders for quick access.
The app contains multiple powerful security related functions, like password protecting hidden items, deleting files, or the whole app. You can choose between using a pattern, pin, or a fingerprint to keep your data private.
This modern file organizer supports fast browsing of root files, SD cards and USB devices.
To keep your productive, it obviously has all the standard file operations like rename, copy, move, delete, share etc. It can also be used for saving up some storage, since it allows compressing and decompressing too. You can easily create new files or folders if you wish so.
You can obviously select sorting by multiple different values, toggle between ascending and descending, or use a folder specific sorting.
By just a few clicks you can also check file or folder properties, which shows various fields like the file size, date of the last modification, or EXIF values like the creation date, camera model at photos etc.
To get a file or folders path quickly, you can easily select it by long pressing and copying it in the clipboard.
You can create handy desktop shortcuts for accessing your favorite items quickly.
It contains a light file editor that you can use either for printing documents, editing them, or read easily with using zoom gestures, whenever needed.
It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps.
Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
<b>Check out the full suite of Simple Tools here:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple File Manager Pro:</b>
https://www.simplemobiletools.com/filemanager
<b>Facebook:</b>
https://www.facebook.com/simplemobiletools
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<string name="app_short_description">التطبيق السهل لإدارة الملفات الخاصة بك دون إعلانات، واحترام خصوصيتك والأمن</string>
<string name="app_long_description"> مدير ملفات سريع خفيف الوزن للاستخدام اليومي. وهو يوفر وظيفة بحث المستخدم، يمكنك أيضا تخصيص المجلد الرئيسي وتحديد المجلدات المفضلة للوصول السريع. يحتوي التطبيق على العديد من الوظائف الأمنية القوية ذات الصلة، مثل كلمة المرور لحماية العناصر المخفية، وحذف الملفات، أو التطبيق بأكمله. يمكنك الاختيار بين استخدام نمط أو دبوس أو بصمة إصبع للحفاظ على خصوصية بياناتك. يدعم منظم الملفات الحديث هذا التصفح السريع للملفات الجذرية وبطاقات SD وأجهزة USB. للحفاظ على الإنتاجية الخاصة بك، فمن الواضح أن لديها كل عمليات الملفات القياسية مثل إعادة تسمية، نسخ، نقل، حذف، مشاركة الخ. ويمكن أيضا أن تستخدم لتوفير بعض التخزين، لأنه يسمح ضغط وفك الضغط أيضا. يمكنك بسهولة إنشاء ملفات أو مجلدات جديدة إذا كنت ترغب في ذلك. من الواضح أنه يمكنك تحديد الفرز حسب قيم مختلفة متعددة أو التبديل بين تصاعدي و تنازلي أو استخدام فرز مجلد معين. من خلال عدد قليل من النقرات يمكنك أيضا التحقق من خصائص الملف أو المجلد ، والتي تظهر حقولا مختلفة مثل حجم الملف ، وتاريخ التعديل الأخير ، أو قيم EXIF مثل تاريخ الإنشاء ، طراز الكاميرا في الصور وما إلى ذلك. للحصول على مسار ملف أو مجلدات بسرعة، يمكنك تحديده بسهولة عن طريق الضغط عليه ونسخه لفترة طويلة في الحافظة. يمكنك إنشاء اختصارات سطح المكتب مفيد للوصول إلى العناصر المفضلة لديك بسرعة. وهو يحتوي على محرر ملفات خفيف يمكنك استخدامه إما لطباعة المستندات أو تحريرها أو قراءتها بسهولة باستخدام إيماءات التكبير/ التصغير، كلما دعت الحاجة. لأنه يأتي مع تصميم المواد وموضوع الظلام افتراضيا، ويوفر تجربة مستخدم كبيرة لسهولة الاستخدام. عدم الوصول إلى الإنترنت يمنحك المزيد من الخصوصية والأمان والاستقرار أكثر من التطبيقات الأخرى. لا يحتوي على إعلانات أو أذونات غير ضرورية. فمن مفتوحة المصدر تماما، ويوفر ألوان قابلة للتخصيص. <b> تحقق من مجموعة كاملة من أدوات بسيطة هنا:</b> https://www.simplemobiletools.com <b>موقع مستقل من مدير الملفات البسيطة برو:</b> https://www.simplemobiletools.com/filemanager <b>Facebook:</b> https://www.facebook.com/simplemobiletools <b>Reddit:</b> https://www.reddit.com/r/SimpleMobileTools </string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Bu əməliyyat yalnız root\'lu cihazlarda işləyir</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Open as</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Tato operace funguje pouze u rootnutých zařízení</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Otevřít jako</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Dyw\'r weithred hon ond yn gweithio ar ddyfeisiau wedi\'u gwreddio</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Agor fel</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Denne funkton virker kun på rootede enheder</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Åbn som</string>

View File

@ -8,12 +8,12 @@
<string name="home_folder_updated">Start-Verzeichnis aktualisiert</string>
<string name="copy_path">Kopiere Pfad in die Zwischenablage</string>
<string name="path_copied">Pfad kopiert</string>
<string name="select_audio_file">Bitte wähle eine Audiodatei aus.</string>
<string name="select_audio_file">Bitte wähle eine Audiodatei aus</string>
<string name="search_folder">Ordner suchen</string>
<string name="rooted_device_only">Dies kann nur auf gerooteten Geräten durchgeführt werden.</string>
<string name="rooted_device_only">Dies kann nur auf gerooteten Geräten durchgeführt werden</string>
<string name="recents">Neueste</string>
<string name="show_recents">Zeige die Neuesten</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Öffnen als</string>
<string name="text_file">Text-Datei</string>
@ -21,47 +21,41 @@
<string name="audio_file">Audio-Datei</string>
<string name="video_file">Video-Datei</string>
<string name="other_file">Anderer Dateityp</string>
<!-- Compression -->
<string name="compress">Komprimieren</string>
<string name="decompress">Entpacken</string>
<string name="compress_as">Komprimieren als</string>
<string name="compressing">Komprimiere…</string>
<string name="decompressing">Entpacke…</string>
<string name="compression_successful">Komprimieren erfolgreich.</string>
<string name="decompression_successful">Entpacken erfolgreich.</string>
<string name="compressing_failed">Komprimieren fehlgeschlagen.</string>
<string name="decompressing_failed">Entpacken fehlgeschlagen.</string>
<string name="compression_successful">Komprimieren erfolgreich</string>
<string name="decompression_successful">Entpacken erfolgreich</string>
<string name="compressing_failed">Komprimieren fehlgeschlagen</string>
<string name="decompressing_failed">Entpacken fehlgeschlagen</string>
<!-- Favorites -->
<string name="manage_favorites">Verwalte Favoriten</string>
<string name="go_to_favorite">Gehe zu Favoriten</string>
<string name="favorites_activity_placeholder">Du kannst häufig benutzte Ordner für einen einfacheren Zugriff zu den Favoriten hinzufügen</string>
<string name="favorites_activity_placeholder">Du kannst häufig benutzte Ordner für einen einfacheren Zugriff zu den Favoriten hinzufügen.</string>
<!-- File Editor -->
<string name="file_editor">Dateieditor</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="storage_analysis">Speicheranalyse</string>
<string name="images">Bilder</string>
<string name="videos">Videos</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="archives">Archiv</string>
<string name="others">Andere</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<string name="total_storage">Gesamter Speicherplatz: %s</string>
<!-- Settings -->
<string name="enable_root_access">Root-Zugriff erlauben</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<string name="press_back_twice">Zweimaliges Drücken von Zurück ist erforderlich, um die Anwendung zu verlassen</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple File Manager Pro - Manage files easy &amp; fast</string>
<string name="app_title">Simple File Manager Pro - Dateien einfach und schnell verwalten</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Easy app for managing your files without ads, respecting your privacy &amp; security</string>
<string name="app_short_description">Einfache Anwendung zur Verwaltung Ihrer Dateien ohne Werbung, unter Wahrung Ihrer Privatsphäre und Sicherheit</string>
<string name="app_long_description">
Ein leichter, schneller Dateimanager für den täglichen Gebrauch. Es bietet eine nützliche Suchfunktion; zudem kannst du den Home-Ordner anpassen und Lieblingsordner für den schnellen Zugriff konfigurieren.
@ -97,9 +91,8 @@
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Αυτό το χαρακτηριστικό λειτουργεί μόνο σε συσκευές με πρόσβαση στον ριζικό κατάλογο.</string>
<string name="recents">Πρόσφατα</string>
<string name="show_recents">Εμφάνιση προσφάτων</string>
<string name="access_storage_prompt">Παρακαλώ παραχωρήστε την πρόσβαση σε όλα τα αρχεία σας, γιατί χωρίς αυτή μπορεί να μην λειτουργεί καλά.</string>
<!-- Open as -->
<string name="open_as">Άνοιγμα ως</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Esta operación solo funciona en dispositivos rooteados</string>
<string name="recents">Recientes</string>
<string name="show_recents">Mostrar recientes</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Abrir como</string>
@ -50,7 +51,7 @@
<string name="downloads">Descargas</string>
<string name="archives">Archivos</string>
<string name="others">Otros</string>
<string name="storage_free">gratis</string>
<string name="storage_free">libre</string>
<string name="total_storage">Almacenamiento total: %s</string>
<!-- Settings -->

View File

@ -13,7 +13,7 @@
<string name="rooted_device_only">Tämä toiminto vaatii rootatun laitteen</string>
<string name="recents">Viimeaikaiset</string>
<string name="show_recents">Näytä viimeaikaiset</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Avaa...</string>
<string name="text_file">Tekstitiedostona</string>
@ -21,7 +21,6 @@
<string name="audio_file">Äänitiedostona</string>
<string name="video_file">Videotiedostona</string>
<string name="other_file">Jonakin muuna tiedostona</string>
<!-- Compression -->
<string name="compress">Pakkaa</string>
<string name="decompress">Pura</string>
@ -32,34 +31,29 @@
<string name="decompression_successful">Purkaminen valmis</string>
<string name="compressing_failed">Pakkaaminen epäonnistui</string>
<string name="decompressing_failed">Purkaminen epäonnistui</string>
<!-- Favorites -->
<string name="manage_favorites">Hallitse suosikkeja</string>
<string name="go_to_favorite">Mene suosikkiin</string>
<string name="favorites_activity_placeholder">Voit lisätä usein käyttämiäsi kansiota suosikeiksi, jolloin niiden käyttö on helppoa mistä vain.</string>
<!-- File Editor -->
<string name="file_editor">Tiedostoeditori</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="videos">Videos</string>
<string name="storage_analysis">Tallennustilan analyysi</string>
<string name="images">Kuvat</string>
<string name="videos">Videot</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="archives">Arkistot</string>
<string name="others">Muut</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<!-- Settings -->
<string name="enable_root_access">Ota käyttöön root-ominaisuudet</string>
<string name="press_back_twice">Ota käyttöön sovelluksesta poistuminen kahdella takaisin-painikkeen painalluksella</string>
<!-- Strings displayed only on Google Play Store. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple File Manager Pro - Manage files easy &amp; fast</string>
<string name="app_title">Simple File Manager Pro - Tehokas tiedostohallinta</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Helppo tiedostonhallinta turvallisesti yksityisyyttä kunnioittaen, ei mainoksia.</string>
<string name="app_long_description">
@ -97,9 +91,8 @@
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -11,9 +11,9 @@
<string name="select_audio_file">Veuillez sélectionner un fichier audio</string>
<string name="search_folder">Chercher dans le dossier</string>
<string name="rooted_device_only">Cette opération ne fonctionne que sur les périphériques rooté</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="recents">Récents</string>
<string name="show_recents">Afficher les récents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Ouvert comme</string>
<string name="text_file">Fichier texte</string>
@ -21,7 +21,6 @@
<string name="audio_file">Fichier audio</string>
<string name="video_file">Fichier vidéo</string>
<string name="other_file">Autre fichier</string>
<!-- Compression -->
<string name="compress">Compresser</string>
<string name="decompress">Décompresser</string>
@ -32,36 +31,31 @@
<string name="decompression_successful">Décompression réussie</string>
<string name="compressing_failed">Compression ratée</string>
<string name="decompressing_failed">Décompression ratée</string>
<!-- Favorites -->
<string name="manage_favorites">Gérer les favoris</string>
<string name="go_to_favorite">Aller au favori</string>
<string name="favorites_activity_placeholder">Vous pouvez ajouter des dossiers souvent utilisés comme favoris pour y avoir accès rapidement depuis n\'importe où.</string>
<!-- File Editor -->
<string name="file_editor">Éditeur de fichier</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="storage_analysis">Analyse du stockage</string>
<string name="images">Images</string>
<string name="videos">Videos</string>
<string name="videos">Vidéos</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="downloads">Téléchargements</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<string name="others">Autres</string>
<string name="storage_free">libre</string>
<string name="total_storage">Stockage total : %s</string>
<!-- Settings -->
<string name="enable_root_access">Activer les droits root</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<string name="press_back_twice">Obligation d\'appuyer deux fois sur la touche Retour pour quitter l\'application</string>
<!-- Strings displayed only on Google Play Store. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple File Manager Pro - Manage files easy &amp; fast</string>
<string name="app_title">Simple File Manager Pro Gérer les fichiers facilement et rapidement</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Easy app for managing your files without ads, respecting your privacy &amp; security</string>
<string name="app_short_description">Une application simple pour gérer vos fichiers sans publicité, en respectant votre vie privée et votre sécurité</string>
<string name="app_long_description">
A lightweight quick file manager for everyday use. It offers a userful search functionality, you can also customize the home folder and select favorite folders for quick access.
@ -97,9 +91,8 @@
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -11,6 +11,9 @@
<string name="select_audio_file">Seleccione un ficheiro de audio</string>
<string name="search_folder">Buscar cartafol</string>
<string name="rooted_device_only">Esta operación só funciona en dispositivos con root</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Abrir como</string>
@ -39,14 +42,27 @@
<!-- File Editor -->
<string name="file_editor">Editor de ficheiros</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="videos">Videos</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<!-- Settings -->
<string name="enable_root_access">Activar acceso root</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple File Manager Pro - Manage files easily & fast</string>
<string name="app_title">Simple File Manager Pro - Manage files easily &amp; fast</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Quick file management with no ads. Browse files easily, securely & fast</string>
<string name="app_short_description">Quick file management with no ads. Browse files easily, securely &amp; fast</string>
<string name="app_long_description">
Un xestor de ficheiros rápido e lixeiro para uso diario. Ofrece unha funcionalidade de busca útil e podes personalizar o cartafol de inicio e seleccionar os cartafoles favoritos para un acceso rápido.
@ -65,11 +81,11 @@
Podes crear accesos directos nas pantallas para acceder rapidamente aos teus elementos favoritos.
Contén un editor de ficheiros lixeiro que pode empregar para imprimir documentos, editalos ou lelos facilmente usando xestos de zoom, sempre que sexa necesario.
E, por último, vén cun deseño material e un tema escuro de xeito predeterminado, fornece unha excelente experiencia de usuario cun uso sinxelo. Ao non requirir acceso a Internet, tes máis privacidade, seguridade e estabilidade
Non contén anuncios nin permisos innecesarios. Dispón dun tema escuro e é totalmente de código aberto.
<b>Visita a páxina nesta ligazón:</b>
https://www.simplemobiletools.com

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">यह ऑपरेशन केवल रूटेड डिवाइस पर काम करता है</string>
<string name="recents">हाल के</string>
<string name="show_recents">हाल ही में दिखाएं</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">इस रूप में खोलें</string>
<string name="text_file">टेकस्ट फ़ाइलें</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Ova radnja funkcionira samo na uređajima s root pristupom</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Otvori kao</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">This operation works only on rooted devices</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Open as</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Tindakan ini hanya bekerja pada perangkat dengan akses root</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Buka sebagai</string>

View File

@ -1,105 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Simple File Manager</string>
<string name="app_launcher_name">File Manager</string>
<string name="press_back_again">Tekan sekali lagi untuk keluar</string>
<string name="go_to_home_folder">Buka folder beranda</string>
<string name="set_as_home_folder">Setel sebagai folder beranda</string>
<string name="home_folder_updated">Folder beranda diperbarui</string>
<string name="copy_path">Salin jalur ke papan klip</string>
<string name="path_copied">Jalur disalin</string>
<string name="select_audio_file">Silakan pilih berkas audio</string>
<string name="search_folder">Cari folder</string>
<string name="rooted_device_only">Tindakan ini hanya bekerja pada perangkat dengan akses root</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<!-- Open as -->
<string name="open_as">Buka sebagai</string>
<string name="text_file">Berkas teks</string>
<string name="image_file">Berkas gambar</string>
<string name="audio_file">Berkas audio</string>
<string name="video_file">Berkas video</string>
<string name="other_file">Berkas lainnya</string>
<!-- Compression -->
<string name="compress">Kompres</string>
<string name="decompress">Dekompres</string>
<string name="compress_as">Kompres sebagai</string>
<string name="compressing">Mengompres…</string>
<string name="decompressing">Dekompres…</string>
<string name="compression_successful">Berhasil mengompres</string>
<string name="decompression_successful">Berhasil dekompresi</string>
<string name="compressing_failed">Gagal mengompres</string>
<string name="decompressing_failed">Gagal dekompresi</string>
<!-- Favorites -->
<string name="manage_favorites">Kelola favorit</string>
<string name="go_to_favorite">Buka favorit</string>
<string name="favorites_activity_placeholder">Anda bisa menambahkan folder yang sering digunakan ke favorit untuk kemudahan akses dari mana saja.</string>
<!-- File Editor -->
<string name="file_editor">Penyunting Berkas</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="videos">Videos</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<!-- Settings -->
<string name="enable_root_access">Aktifkan akses root</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<!-- Strings displayed only on Google Play Store. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple File Manager Pro - Manage files easy &amp; fast</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Easy app for managing your files without ads, respecting your privacy &amp; security</string>
<string name="app_long_description">
A lightweight quick file manager for everyday use. It offers a userful search functionality, you can also customize the home folder and select favorite folders for quick access.
The app contains multiple powerful security related functions, like password protecting hidden items, deleting files, or the whole app. You can choose between using a pattern, pin, or a fingerprint to keep your data private.
This modern file organizer supports fast browsing of root files, SD cards and USB devices.
To keep your productive, it obviously has all the standard file operations like rename, copy, move, delete, share etc. It can also be used for saving up some storage, since it allows compressing and decompressing too. You can easily create new files or folders if you wish so.
You can obviously select sorting by multiple different values, toggle between ascending and descending, or use a folder specific sorting.
By just a few clicks you can also check file or folder properties, which shows various fields like the file size, date of the last modification, or EXIF values like the creation date, camera model at photos etc.
To get a file or folders path quickly, you can easily select it by long pressing and copying it in the clipboard.
You can create handy desktop shortcuts for accessing your favorite items quickly.
It contains a light file editor that you can use either for printing documents, editing them, or read easily with using zoom gestures, whenever needed.
It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps.
Sama sekali tidak berisi iklan dan tidak membutuhkan perizinan yang tidak perlu. Sepenuhnya sumber terbuka, dengan warna yang bisa disesuaikan.
<b>Check out the full suite of Simple Tools here:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple File Manager Pro:</b>
https://www.simplemobiletools.com/filemanager
<b>Facebook:</b>
https://www.facebook.com/simplemobiletools
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>

View File

@ -13,7 +13,7 @@
<string name="rooted_device_only">Questa operazione funziona solo nei dispositivi con permessi di root</string>
<string name="recents">Recenti</string>
<string name="show_recents">Mostra i recenti</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Apri come</string>
<string name="text_file">File di testo</string>
@ -21,7 +21,6 @@
<string name="audio_file">File audio</string>
<string name="video_file">File video</string>
<string name="other_file">Altro</string>
<!-- Compression -->
<string name="compress">Comprimi</string>
<string name="decompress">Decomprimi</string>
@ -32,31 +31,26 @@
<string name="decompression_successful">Decompressione completata</string>
<string name="compressing_failed">Impossibile comprimere</string>
<string name="decompressing_failed">Impossibile decomprimere</string>
<!-- Favorites -->
<string name="manage_favorites">Gestisci i preferiti</string>
<string name="go_to_favorite">Vai al preferito</string>
<string name="favorites_activity_placeholder">Si possono aggiungere le cartelle usate frequentemente ai preferiti, per un rapido accesso da qualsiasi posizione.</string>
<!-- File Editor -->
<string name="file_editor">Editor dei file</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="videos">Videos</string>
<string name="storage_analysis">Analisi dello stoccaggio</string>
<string name="images">Immagini</string>
<string name="videos">Video</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<string name="documents">Documenti</string>
<string name="downloads">Scaricamenti</string>
<string name="archives">Archivi</string>
<string name="others">Altri</string>
<string name="storage_free">libero</string>
<string name="total_storage">Memoria totale: %s</string>
<!-- Settings -->
<string name="enable_root_access">Abilita accesso root</string>
<string name="press_back_twice">Richiedi di premere Indietro due volte per uscire dall\'app</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Semplice Gestore di file Pro - Facile e veloce</string>
@ -97,9 +91,8 @@
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">この操作はルート化された端末でのみ機能します</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">ファイル形式を指定して開く</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">This operation works only on rooted devices</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Open as</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">This operation works only on rooted devices</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Open as</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Denne handlingen fungerer bare på rootede enheter.</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Open as</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Deze bewerking is alleen mogelijk op een geroot apparaat</string>
<string name="recents">Recent geopend</string>
<string name="show_recents">Recente items tonen</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Openen als</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Ta operacja działa tylko na zrootowanych urządzeniach</string>
<string name="recents">Ostatnie</string>
<string name="show_recents">Pokaż ostatnie</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Otwórz jako</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Esta operação só funciona em dispositivos rooteados</string>
<string name="recents">Recentes</string>
<string name="show_recents">Mostrar recentes</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Abrir como</string>

View File

@ -11,8 +11,9 @@
<string name="select_audio_file">Selecione um ficheiro de áudio</string>
<string name="search_folder">Pesquisar pasta</string>
<string name="rooted_device_only">Esta operação apenas funciona em dispositivos com root</string>
<string name="recents">Recents</string>
<string name="recents">Recentes</string>
<string name="show_recents">Mostrar recentes</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Abrir como</string>
@ -23,15 +24,15 @@
<string name="other_file">Outro tipo</string>
<!-- Compression -->
<string name="compress">Comprimir</string>
<string name="decompress">Descomprimir</string>
<string name="compress_as">Comprimir como</string>
<string name="compressing">A comprimir…</string>
<string name="decompressing">A descomprimir…</string>
<string name="compression_successful">Compressão terminada</string>
<string name="decompression_successful">Descompressão terminada</string>
<string name="compressing_failed">Falha ao comprimir</string>
<string name="decompressing_failed">Falha ao descomprimir</string>
<string name="compress">Compactar</string>
<string name="decompress">Descompactar</string>
<string name="compress_as">Compactar como</string>
<string name="compressing">A compactar…</string>
<string name="decompressing">A descompactar…</string>
<string name="compression_successful">Compactação terminada</string>
<string name="decompression_successful">Descompactação terminada</string>
<string name="compressing_failed">Falha ao compactar</string>
<string name="decompressing_failed">Falha ao descompactar</string>
<!-- Favorites -->
<string name="manage_favorites">Gerir favoritos</string>
@ -42,20 +43,20 @@
<string name="file_editor">Editor de ficheiros</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="videos">Videos</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<string name="storage_analysis">Análise ao armazenamento</string>
<string name="images">Imagens</string>
<string name="videos">Vídeos</string>
<string name="audio">Áudio</string>
<string name="documents">Documentos</string>
<string name="downloads">Descargas</string>
<string name="archives">Arquivos</string>
<string name="others">Outros</string>
<string name="storage_free">livre</string>
<string name="total_storage">Armazenamento total: %s</string>
<!-- Settings -->
<string name="enable_root_access">Ativar acesso root</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<string name="press_back_twice">Premir duas vezes a tecla Back para sair da aplicação</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
@ -85,10 +86,10 @@
Não contém anúncios nem permissões desnecessárias. Disponibiliza um tema escuro e é totalmente \'open source\'.
<b>Consulte o conjunto completo das aplicações Simple Tools aqui:</b>
<b>Consulte o conjunto completo de aplicações Simple Tools aqui:</b>
https://www.simplemobiletools.com
<b>Site específico da aplicação Simple File Manager Pro:</b>
<b>Site da aplicação Simple File Manager Pro:</b>
https://www.simplemobiletools.com/filemanager
<b>Facebook:</b>

View File

@ -13,7 +13,7 @@
<string name="rooted_device_only">Это работает только на устройствах с root-доступом</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Открыть как</string>
<string name="text_file">Текст</string>
@ -21,7 +21,6 @@
<string name="audio_file">Аудио</string>
<string name="video_file">Видео</string>
<string name="other_file">Другое</string>
<!-- Compression -->
<string name="compress">Сжать</string>
<string name="decompress">Распаковать</string>
@ -32,18 +31,15 @@
<string name="decompression_successful">Распаковка успешна</string>
<string name="compressing_failed">Не удалось сжать</string>
<string name="decompressing_failed">Не удалось распаковать</string>
<!-- Favorites -->
<string name="manage_favorites">Настроить избранное</string>
<string name="go_to_favorite">Открыть избранное</string>
<string name="favorites_activity_placeholder">Вы можете добавить часто используемые папки в избранное для быстрого доступа к ним.</string>
<!-- File Editor -->
<string name="file_editor">Редактор файлов</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="images">Изображения</string>
<string name="videos">Videos</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
@ -52,11 +48,9 @@
<string name="others">Others</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<!-- Settings -->
<string name="enable_root_access">Включить root-доступ</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple File Manager Pro - Manage files easy &amp; fast</string>
@ -97,9 +91,8 @@
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Táto operácia funguje iba na rootnutých zariadeniach</string>
<string name="recents">Nedávne</string>
<string name="show_recents">Zobraziť nedávne</string>
<string name="access_storage_prompt">Prosím povoľte našej apke prístup ku všetkým vašim súborom. Bez neho nebude fungovať správne.</string>
<!-- Open as -->
<string name="open_as">Otvoriť ako</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Åtgärden fungerar bara på rotade enheter</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Öppna som</string>

View File

@ -11,8 +11,9 @@
<string name="select_audio_file">Lütfen bir ses dosyası seçin</string>
<string name="search_folder">Klasör ara</string>
<string name="rooted_device_only">Bu işlem sadece rootlu cihazlarda çalışır</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="recents">Son dosyalar</string>
<string name="show_recents">Son dosyaları göster</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Farklı</string>
@ -42,20 +43,20 @@
<string name="file_editor">Dosya Düzenleyici</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="videos">Videos</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<string name="storage_analysis">Depolama analizi</string>
<string name="images">Resimler</string>
<string name="videos">Videolar</string>
<string name="audio">Sesler</string>
<string name="documents">Belgeler</string>
<string name="downloads">İndirilenler</string>
<string name="archives">Arşivler</string>
<string name="others">Diğerleri</string>
<string name="storage_free">boş</string>
<string name="total_storage">Toplam depolama: %s</string>
<!-- Settings -->
<string name="enable_root_access">Root erişimini etkinleştir</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<string name="press_back_twice">Uygulamadan çıkmak için Geri tuşuna iki kez basmayı gerektir</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
@ -65,7 +66,7 @@
<string name="app_long_description">
Günlük kullanım için hafif ve hızlı bir dosya yöneticisi. Kullanıcı dostu bir arama işlevi sunar, ayrıca ana klasörü özelleştirebilir ve hızlı erişim için favori klasörleri seçebilirsiniz.
Uygulama, gizli öğeleri parolayla koruma, dosyaları silme veya tüm uygulama gibi güvenlikle ilgili çok sayıda güçlü işlev içerir. Verilerinizi gizli tutmak için desen, pin veya parmak izi kullanmayı seçebilirsiniz.
Uygulama, gizli ögeleri parolayla koruma, dosyaları silme veya tüm uygulama gibi güvenlikle ilgili çok sayıda güçlü işlev içerir. Verilerinizi gizli tutmak için desen, pin veya parmak izi kullanmayı seçebilirsiniz.
Bu modern dosya düzenleyici, root dosyalarının, SD kartların ve USB cihazlarının hızlı taranmasını destekler.
@ -77,11 +78,11 @@
Bir dosya veya klasör yolunu hızlı bir şekilde almak için, uzun basıp panoya kopyalayarak onu kolayca seçebilirsiniz.
Favori öğelerinize hızlı bir şekilde erişmek için kullanışlı masaüstü kısayolları oluşturabilirsiniz.
Favori ögelerinize hızlı bir şekilde erişmek için kullanışlı masaüstü kısayolları oluşturabilirsiniz.
Belgeleri yazdırmak, düzenlemek veya gerektiğinde yakınlaştırma hareketlerini kullanarak kolayca okumak için kullanabileceğiniz hafif bir dosya düzenleyici içerir.
Belgeleri yazdırmak, düzenlemek veya gerektiğinde yakınlaştırma hareketlerini kullanarak kolayca okumak için kullanabileceğiniz hafif bir dosya düzenleyici içerir.
Varsayılan olarak materyal tasarım ve koyu tema ile birlikte gelir, kolay kullanım için harika bir kullanıcı deneyimi sağlar. İnternet erişiminin olmaması size diğer uygulamalardan daha fazla gizlilik, güvenlik ve istikrar sağlar.
Varsayılan olarak materyal tasarım ve koyu tema ile birlikte gelir, kolay kullanım için harika bir kullanıcı deneyimi sağlar. İnternet erişiminin olmaması size diğer uygulamalardan daha fazla gizlilik, güvenlik ve istikrar sağlar.
Reklam veya gereksiz izinler içermez. Tamamen açık kaynaktır, özelleştirilebilir renkler sunar.

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Ця команда працює лише на пристроях з root-доступом</string>
<string name="recents">Останні</string>
<string name="show_recents">Показати останні</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Відкрити як файл</string>

View File

@ -11,9 +11,9 @@
<string name="select_audio_file">请选择一个音频文件</string>
<string name="search_folder">搜索文件夹</string>
<string name="rooted_device_only">该选项仅在 root 后的设备上工作</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="recents">最近</string>
<string name="show_recents">显示最近</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">打开为</string>
<string name="text_file">文本文件</string>
@ -21,7 +21,6 @@
<string name="audio_file">音频文件</string>
<string name="video_file">视频文件</string>
<string name="other_file">其他文件</string>
<!-- Compression -->
<string name="compress">压缩</string>
<string name="decompress">解压缩</string>
@ -32,31 +31,26 @@
<string name="decompression_successful">解压缩成功</string>
<string name="compressing_failed">压缩失败</string>
<string name="decompressing_failed">解压缩失败</string>
<!-- Favorites -->
<string name="manage_favorites">管理收藏</string>
<string name="go_to_favorite">前往收藏</string>
<string name="favorites_activity_placeholder">您可以将经常访问的文件夹添加至收藏便于从任意位置快速访问。</string>
<!-- File Editor -->
<string name="file_editor">文件编辑器</string>
<!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string>
<string name="images">Images</string>
<string name="videos">Videos</string>
<string name="storage_analysis">存储分析</string>
<string name="images">图片</string>
<string name="videos">视频</string>
<string name="audio">Audio</string>
<string name="documents">Documents</string>
<string name="downloads">Downloads</string>
<string name="archives">Archives</string>
<string name="others">Others</string>
<string name="archives">存档</string>
<string name="others">其他</string>
<string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string>
<string name="total_storage">总存储: %s</string>
<!-- Settings -->
<string name="enable_root_access">启用 root 访问</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<string name="press_back_twice">需要按两次返回键才能离开应用程序</string>
<!-- Strings displayed only on Google Play Store. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">简易文件管理 Pro - 轻松管理文件 &amp; 快速体验</string>
@ -97,9 +91,8 @@
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>
</resources>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">這操作只對已root的裝置有用</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">開啟成</string>

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">This operation works only on rooted devices</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
<!-- Open as -->
<string name="open_as">Open as</string>

View File

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.5.31'
ext.kotlin_version = '1.6.0'
repositories {
google()
@ -9,7 +9,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.2'
classpath 'com.android.tools.build:gradle:7.0.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong