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 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://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/assets/images/f-droid.png' alt='Get it on F-Droid' 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;"> <div style="display:flex;">
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/english/1.jpg" width="30%"> <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 { android {
compileSdkVersion 29 compileSdkVersion 30
buildToolsVersion "29.0.3"
defaultConfig { defaultConfig {
applicationId "com.simplemobiletools.filemanager.pro" applicationId "com.simplemobiletools.filemanager.pro"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 29 targetSdkVersion 30
versionCode 110 versionCode 110
versionName "6.10.1" versionName "6.10.1"
multiDexEnabled true multiDexEnabled true
@ -58,7 +57,7 @@ android {
} }
dependencies { 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:RootTools:df729dcb13'
implementation 'com.github.Stericson:RootShell:1.6' implementation 'com.github.Stericson:RootShell:1.6'
implementation 'com.alexvasilkov:gesture-views:2.5.2' 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.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-feature <uses-feature
android:name="android.hardware.faketouch" android:name="android.hardware.faketouch"
@ -113,21 +114,11 @@
android:label="@string/about" android:label="@string/about"
android:parentActivityName=".activities.MainActivity"/> 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 <activity
android:name="com.simplemobiletools.commons.activities.CustomizationActivity" android:name="com.simplemobiletools.commons.activities.CustomizationActivity"
android:label="@string/customize_colors" android:label="@string/customize_colors"
android:parentActivityName=".activities.SettingsActivity"/> 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 <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider" android:authorities="${applicationId}.provider"

View File

@ -1,5 +1,6 @@
package com.simplemobiletools.filemanager.pro.activities package com.simplemobiletools.filemanager.pro.activities
import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.app.SearchManager import android.app.SearchManager
import android.content.ClipData import android.content.ClipData
@ -8,13 +9,18 @@ import android.content.Intent
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.media.RingtoneManager import android.media.RingtoneManager
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import android.os.Handler import android.os.Handler
import android.provider.Settings
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat import androidx.core.view.MenuItemCompat
import androidx.viewpager.widget.ViewPager 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.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
@ -46,6 +52,7 @@ import java.util.*
class MainActivity : SimpleActivity() { class MainActivity : SimpleActivity() {
private val BACK_PRESS_TIMEOUT = 5000 private val BACK_PRESS_TIMEOUT = 5000
private val MANAGE_STORAGE_RC = 201
private val PICKED_PATH = "picked_path" private val PICKED_PATH = "picked_path"
private var isSearchOpen = false private var isSearchOpen = false
private var wasBackJustPressed = false private var wasBackJustPressed = false
@ -132,11 +139,11 @@ class MainActivity : SimpleActivity() {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
storeStateVariables() storeStateVariables()
config.lastUsedViewPagerPage = main_view_pager.currentItem
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
config.lastUsedViewPagerPage = main_view_pager.currentItem
config.temporarilyShowHidden = false config.temporarilyShowHidden = false
} }
@ -282,8 +289,8 @@ class MainActivity : SimpleActivity() {
} }
private fun tryInitFileManager() { private fun tryInitFileManager() {
val hadPermission = hasPermission(PERMISSION_WRITE_STORAGE) val hadPermission = hasStoragePermission()
handlePermission(PERMISSION_WRITE_STORAGE) { handleStoragePermission {
checkOTGPath() checkOTGPath()
if (it) { if (it) {
if (main_view_pager.adapter == null) { 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) { private fun initFileManager(refreshRecents: Boolean) {
if (intent.action == Intent.ACTION_VIEW && intent.data != null) { if (intent.action == Intent.ACTION_VIEW && intent.data != null) {
val data = intent.data val data = intent.data

View File

@ -61,6 +61,9 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
ensureBackgroundThread { ensureBackgroundThread {
reFetchItems() reFetchItems()
} }
val adjustedPrimaryColor = getAdjustedPrimaryColor()
mimetypes_fastscroller.updateColors(adjustedPrimaryColor, adjustedPrimaryColor.getContrastColor())
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
@ -130,13 +133,13 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
lastSearchedText = searchText lastSearchedText = searchText
when { when {
searchText.isEmpty() -> { searchText.isEmpty() -> {
mimetypes_list.beVisible() mimetypes_fastscroller.beVisible()
getRecyclerAdapter()?.updateItems(storedItems) getRecyclerAdapter()?.updateItems(storedItems)
mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty()) mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty())
mimetypes_placeholder_2.beGone() mimetypes_placeholder_2.beGone()
} }
searchText.length == 1 -> { searchText.length == 1 -> {
mimetypes_list.beGone() mimetypes_fastscroller.beGone()
mimetypes_placeholder.beVisible() mimetypes_placeholder.beVisible()
mimetypes_placeholder_2.beVisible() mimetypes_placeholder_2.beVisible()
} }
@ -150,14 +153,9 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
runOnUiThread { runOnUiThread {
getRecyclerAdapter()?.updateItems(listItems, text) getRecyclerAdapter()?.updateItems(listItems, text)
mimetypes_list.beVisibleIf(listItems.isNotEmpty()) mimetypes_fastscroller.beVisibleIf(listItems.isNotEmpty())
mimetypes_placeholder.beVisibleIf(listItems.isEmpty()) mimetypes_placeholder.beVisibleIf(listItems.isEmpty())
mimetypes_placeholder_2.beGone() 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 isSearchOpen = false
lastSearchedText = "" lastSearchedText = ""
mimetypes_list.beVisible() mimetypes_fastscroller.beVisible()
mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty()) mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty())
mimetypes_placeholder_2.beGone() mimetypes_placeholder_2.beGone()
} }
@ -321,7 +319,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
} }
storedItems = items 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) tryOpenPathIntent((it as ListItem).path, false)
}.apply { }.apply {
setupZoomListener(zoomListener) setupZoomListener(zoomListener)
@ -332,13 +330,6 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
mimetypes_list.scheduleLayoutAnimation() 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()) mimetypes_placeholder.beVisibleIf(items.isEmpty())
} }
@ -390,18 +381,9 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
invalidateOptionsMenu() invalidateOptionsMenu()
getRecyclerAdapter()?.apply { getRecyclerAdapter()?.apply {
notifyItemRangeChanged(0, listItems.size) 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() { private fun setupLayoutManager() {
if (config.getFolderViewType(currentMimeType) == VIEW_TYPE_GRID) { if (config.getFolderViewType(currentMimeType) == VIEW_TYPE_GRID) {
currentViewType = 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.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
import com.simplemobiletools.commons.extensions.getFileSignature
import com.simplemobiletools.commons.extensions.getTextSize import com.simplemobiletools.commons.extensions.getTextSize
import com.simplemobiletools.commons.extensions.getTimeFormat import com.simplemobiletools.commons.extensions.getTimeFormat
import com.simplemobiletools.commons.helpers.getFilePlaceholderDrawables import com.simplemobiletools.commons.helpers.getFilePlaceholderDrawables
@ -25,7 +24,7 @@ import kotlinx.android.synthetic.main.item_file_dir_list.view.*
import java.util.* import java.util.*
class DecompressItemsAdapter(activity: SimpleActivity, var listItems: MutableList<ListItem>, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : 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 fileDrawable: Drawable
private lateinit var folderDrawable: 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.bitmap.RoundedCorners
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.* import com.simplemobiletools.commons.dialogs.*
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.filemanager.pro.R import com.simplemobiletools.filemanager.pro.R
import com.simplemobiletools.filemanager.pro.activities.SimpleActivity 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_icon
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_name import kotlinx.android.synthetic.main.item_file_dir_list.view.item_name
import kotlinx.android.synthetic.main.item_section.view.* import kotlinx.android.synthetic.main.item_section.view.*
import java.io.BufferedInputStream
import java.io.Closeable import java.io.Closeable
import java.io.File import java.io.File
import java.io.FileInputStream
import java.util.* import java.util.*
import java.util.zip.ZipEntry import java.util.zip.ZipEntry
import java.util.zip.ZipFile import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream import java.util.zip.ZipOutputStream
class ItemsAdapter( class ItemsAdapter(
activity: SimpleActivity, var listItems: MutableList<ListItem>, val listener: ItemOperationsListener?, recyclerView: MyRecyclerView, 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_FILE_DIR = 1
private val TYPE_SECTION = 2 private val TYPE_SECTION = 2
@ -326,18 +326,31 @@ class ItemsAdapter(
} }
} }
@SuppressLint("NewApi")
private fun addFileUris(path: String, paths: ArrayList<String>) { private fun addFileUris(path: String, paths: ArrayList<String>) {
if (activity.getIsPathDirectory(path)) { if (activity.getIsPathDirectory(path)) {
val shouldShowHidden = activity.config.shouldShowHidden val shouldShowHidden = activity.config.shouldShowHidden
if (activity.isPathOnOTG(path)) { when {
activity.isRestrictedSAFOnlyRoot(path) -> {
activity.getAndroidSAFFileItems(path, shouldShowHidden, false) { files ->
files.forEach {
addFileUris(activity.getAndroidSAFUri(it.path).toString(), paths)
}
}
}
activity.isPathOnOTG(path) -> {
activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }?.forEach { activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }?.forEach {
addFileUris(it.uri.toString(), paths) addFileUris(it.uri.toString(), paths)
} }
} else { }
else -> {
File(path).listFiles()?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }?.forEach { File(path).listFiles()?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }?.forEach {
addFileUris(it.absolutePath, paths) addFileUris(it.absolutePath, paths)
} }
} }
}
} else { } else {
paths.add(path) paths.add(path)
} }
@ -390,7 +403,16 @@ class ItemsAdapter(
activity.copyMoveFilesTo(files, source, it, isCopyOperation, false, activity.config.shouldShowHidden) { activity.copyMoveFilesTo(files, source, it, isCopyOperation, false, activity.config.shouldShowHidden) {
if (!isCopyOperation) { if (!isCopyOperation) {
files.forEach { sourceFileDir -> files.forEach { sourceFileDir ->
val sourceFile = File(sourceFileDir.path) val sourcePath = sourceFileDir.path
if (activity.isRestrictedSAFOnlyRoot(sourcePath) && activity.getDoesFilePathExist(sourcePath)) {
activity.deleteFile(sourceFileDir, true) {
listener?.refreshFragment()
activity.runOnUiThread {
finishActMode()
}
}
} else {
val sourceFile = File(sourcePath)
if (activity.getDoesFilePathExist(source) && activity.getIsPathDirectory(source) && if (activity.getDoesFilePathExist(source) && activity.getIsPathDirectory(source) &&
sourceFile.list()?.isEmpty() == true && sourceFile.getProperSize(true) == 0L && sourceFile.getFileCount(true) == 0 sourceFile.list()?.isEmpty() == true && sourceFile.getProperSize(true) == 0L && sourceFile.getFileCount(true) == 0
) { ) {
@ -406,6 +428,7 @@ class ItemsAdapter(
finishActMode() finishActMode()
} }
} }
}
} else { } else {
listener?.refreshFragment() listener?.refreshFragment()
finishActMode() finishActMode()
@ -443,6 +466,10 @@ class ItemsAdapter(
CompressAsDialog(activity, firstPath) { CompressAsDialog(activity, firstPath) {
val destination = it val destination = it
activity.handleAndroidSAFDialog(firstPath) { granted ->
if (!granted) {
return@handleAndroidSAFDialog
}
activity.handleSAFDialog(firstPath) { activity.handleSAFDialog(firstPath) {
if (!it) { if (!it) {
return@handleSAFDialog return@handleSAFDialog
@ -464,6 +491,7 @@ class ItemsAdapter(
} }
} }
} }
}
private fun decompressSelection() { private fun decompressSelection() {
val firstPath = getFirstSelectedItemPath() val firstPath = getFirstSelectedItemPath()
@ -478,33 +506,36 @@ class ItemsAdapter(
} }
val paths = getSelectedFileDirItems().asSequence().map { it.path }.filter { it.isZipFile() }.toList() val paths = getSelectedFileDirItems().asSequence().map { it.path }.filter { it.isZipFile() }.toList()
tryDecompressingPaths(paths) { ensureBackgroundThread {
if (it) { tryDecompressingPaths(paths) { success ->
activity.toast(R.string.decompression_successful)
activity.runOnUiThread { activity.runOnUiThread {
if (success) {
activity.toast(R.string.decompression_successful)
listener?.refreshFragment() listener?.refreshFragment()
finishActMode() finishActMode()
}
} else { } else {
activity.toast(R.string.decompressing_failed) 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)
} }
private fun tryDecompressingPaths(sourcePaths: List<String>, callback: (success: Boolean) -> Unit) {
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('/') val destinationPath = fileDirItems.first().getParentPath().trimEnd('/')
activity.checkConflicts(fileDirItems, destinationPath, 0, LinkedHashMap()) { activity.checkConflicts(fileDirItems, destinationPath, 0, LinkedHashMap()) {
ensureBackgroundThread { ensureBackgroundThread {
@ -516,27 +547,28 @@ class ItemsAdapter(
} }
} }
} }
}
private fun decompressPaths(paths: List<String>, conflictResolutions: LinkedHashMap<String, Int>, callback: (success: Boolean) -> Unit) { private fun decompressPaths(paths: List<String>, conflictResolutions: LinkedHashMap<String, Int>, callback: (success: Boolean) -> Unit) {
paths.forEach { paths.forEach { path ->
val zipInputStream = ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path)))
zipInputStream.use {
try { try {
val zipFile = ZipFile(it) var entry = zipInputStream.nextEntry
val entries = zipFile.entries() val zipFileName = path.getFilenameFromPath()
val zipFileName = it.getFilenameFromPath()
val newFolderName = zipFileName.subSequence(0, zipFileName.length - 4) val newFolderName = zipFileName.subSequence(0, zipFileName.length - 4)
while (entries.hasMoreElements()) { while (entry != null) {
val entry = entries.nextElement() val parentPath = path.getParentPath()
val parentPath = it.getParentPath()
val newPath = "$parentPath/$newFolderName/${entry.name.trimEnd('/')}" val newPath = "$parentPath/$newFolderName/${entry.name.trimEnd('/')}"
val resolution = getConflictResolution(conflictResolutions, newPath) val resolution = getConflictResolution(conflictResolutions, newPath)
val doesPathExist = activity.getDoesFilePathExist(newPath) val doesPathExist = activity.getDoesFilePathExist(newPath)
if (doesPathExist && resolution == CONFLICT_OVERWRITE) { if (doesPathExist && resolution == CONFLICT_OVERWRITE) {
val fileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), entry.isDirectory) val fileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), entry.isDirectory)
if (activity.getIsPathDirectory(it)) { if (activity.getIsPathDirectory(path)) {
activity.deleteFolderBg(fileDirItem, false) { activity.deleteFolderBg(fileDirItem, false) {
if (it) { if (it) {
extractEntry(newPath, entry, zipFile) extractEntry(newPath, entry, zipInputStream)
} else { } else {
callback(false) callback(false)
} }
@ -544,15 +576,18 @@ class ItemsAdapter(
} else { } else {
activity.deleteFileBg(fileDirItem, false) { activity.deleteFileBg(fileDirItem, false) {
if (it) { if (it) {
extractEntry(newPath, entry, zipFile) extractEntry(newPath, entry, zipInputStream)
} else { } else {
callback(false) callback(false)
} }
} }
} }
} else if (!doesPathExist) { } else if (!doesPathExist) {
extractEntry(newPath, entry, zipFile) extractEntry(newPath, entry, zipInputStream)
} }
zipInputStream.closeEntry()
entry = zipInputStream.nextEntry
} }
callback(true) callback(true)
} catch (e: Exception) { } catch (e: Exception) {
@ -561,20 +596,18 @@ class ItemsAdapter(
} }
} }
} }
}
private fun extractEntry(newPath: String, entry: ZipEntry, zipFile: ZipFile) { private fun extractEntry(newPath: String, entry: ZipEntry, zipInputStream: ZipInputStream) {
if (entry.isDirectory) { if (entry.isDirectory) {
if (!activity.createDirectorySync(newPath) && !activity.getDoesFilePathExist(newPath)) { if (!activity.createDirectorySync(newPath) && !activity.getDoesFilePathExist(newPath)) {
val error = String.format(activity.getString(R.string.could_not_create_file), newPath) val error = String.format(activity.getString(R.string.could_not_create_file), newPath)
activity.showErrorToast(error) activity.showErrorToast(error)
} }
} else { } else {
val ins = zipFile.getInputStream(entry)
ins.use {
val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType()) val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType())
if (fos != null) { if (fos != null) {
ins.copyTo(fos) zipInputStream.copyTo(fos)
}
} }
} }
} }
@ -589,44 +622,64 @@ class ItemsAdapter(
} }
} }
@SuppressLint("NewApi")
private fun compressPaths(sourcePaths: List<String>, targetPath: String): Boolean { 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 fos = activity.getFileOutputStreamSync(targetPath, "application/zip") ?: return false
val zout = ZipOutputStream(fos) val zout = ZipOutputStream(fos)
var res: Closeable = fos var res: Closeable = fos
try { try {
sourcePaths.forEach { sourcePaths.forEach { currentPath ->
var name: String var name: String
var mainFile = File(it) var mainFilePath = currentPath
val base = mainFile.parentFile.toURI() val base = "${mainFilePath.getParentPath()}/"
res = zout res = zout
queue.push(mainFile) queue.push(mainFilePath)
if (activity.getIsPathDirectory(mainFile.absolutePath)) { if (activity.getIsPathDirectory(mainFilePath)) {
name = "${mainFile.name.trimEnd('/')}/" name = "${mainFilePath.getFilenameFromPath()}/"
zout.putNextEntry(ZipEntry(name)) zout.putNextEntry(ZipEntry(name))
} }
while (!queue.isEmpty()) { while (!queue.isEmpty()) {
mainFile = queue.pop() mainFilePath = queue.pop()
if (activity.getIsPathDirectory(mainFile.absolutePath)) { if (activity.getIsPathDirectory(mainFilePath)) {
for (file in mainFile.listFiles()) { if (activity.isRestrictedSAFOnlyRoot(mainFilePath)) {
name = base.relativize(file.toURI()).path activity.getAndroidSAFFileItems(mainFilePath, true) { files ->
if (activity.getIsPathDirectory(file.absolutePath)) { for (file in files) {
queue.push(file) name = file.path.relativizeWith(base)
if (activity.getIsPathDirectory(file.path)) {
queue.push(file.path)
name = "${name.trimEnd('/')}/" name = "${name.trimEnd('/')}/"
zout.putNextEntry(ZipEntry(name)) zout.putNextEntry(ZipEntry(name))
} else { } else {
zout.putNextEntry(ZipEntry(name)) zout.putNextEntry(ZipEntry(name))
FileInputStream(file).copyTo(zout) activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
zout.closeEntry() zout.closeEntry()
} }
} }
}
} else { } else {
name = if (base.path == it) it.getFilenameFromPath() else base.relativize(mainFile.toURI()).path 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)) zout.putNextEntry(ZipEntry(name))
FileInputStream(mainFile).copyTo(zout) } else {
zout.putNextEntry(ZipEntry(name))
activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
zout.closeEntry()
}
}
}
} else {
name = if (base == currentPath) currentPath.getFilenameFromPath() else mainFilePath.relativizeWith(base)
zout.putNextEntry(ZipEntry(name))
activity.getFileInputStreamSync(mainFilePath)!!.copyTo(zout)
zout.closeEntry() zout.closeEntry()
} }
} }
@ -708,7 +761,6 @@ class ItemsAdapter(
textToHighlight = highlightText textToHighlight = highlightText
notifyDataSetChanged() notifyDataSetChanged()
} }
fastScroller?.measureRecyclerView()
} }
fun updateFontSizes() { fun updateFontSizes() {
@ -833,7 +885,9 @@ class ItemsAdapter(
path 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) itemToLoad = getOTGPublicPath(itemToLoad)
} }
@ -846,4 +900,6 @@ class ItemsAdapter(
fileDrawable = resources.getDrawable(R.drawable.ic_file_generic) fileDrawable = resources.getDrawable(R.drawable.ic_file_generic)
fileDrawables = getFilePlaceholderDrawables(activity) 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 kotlinx.android.synthetic.main.item_manage_favorite.view.*
import java.util.* import java.util.*
class ManageFavoritesAdapter(activity: BaseSimpleActivity, var favorites: ArrayList<String>, val listener: RefreshRecyclerViewListener?, class ManageFavoritesAdapter(
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { activity: BaseSimpleActivity, var favorites: ArrayList<String>, val listener: RefreshRecyclerViewListener?,
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
private val config = activity.config private val config = activity.config

View File

@ -3,6 +3,7 @@ package com.simplemobiletools.filemanager.pro.dialogs
import android.view.View import android.view.View
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.isRPlus
import com.simplemobiletools.filemanager.pro.R import com.simplemobiletools.filemanager.pro.R
import com.simplemobiletools.filemanager.pro.activities.SimpleActivity import com.simplemobiletools.filemanager.pro.activities.SimpleActivity
import com.simplemobiletools.filemanager.pro.helpers.RootHelpers import com.simplemobiletools.filemanager.pro.helpers.RootHelpers
@ -50,6 +51,27 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
private fun createDirectory(path: String, alertDialog: AlertDialog, callback: (Boolean) -> Unit) { private fun createDirectory(path: String, alertDialog: AlertDialog, callback: (Boolean) -> Unit) {
when { 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) { activity.needsStupidWritePermissions(path) -> activity.handleSAFDialog(path) {
if (!it) { if (!it) {
return@handleSAFDialog return@handleSAFDialog
@ -65,11 +87,6 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
documentFile.createDirectory(path.getFilenameFromPath()) documentFile.createDirectory(path.getFilenameFromPath())
success(alertDialog) success(alertDialog)
} }
path.startsWith(activity.internalStoragePath, true) -> {
if (File(path).mkdirs()) {
success(alertDialog)
}
}
else -> { else -> {
RootHelpers(activity).createFileFolder(path, false) { RootHelpers(activity).createFileFolder(path, false) {
if (it) { 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) { private fun createFile(path: String, alertDialog: AlertDialog, callback: (Boolean) -> Unit) {
try { try {
when { 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.needsStupidWritePermissions(path) -> {
activity.handleSAFDialog(path) { activity.handleSAFDialog(path) {
if (!it) { if (!it) {
@ -102,7 +135,8 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
success(alertDialog) success(alertDialog)
} }
} }
path.startsWith(activity.internalStoragePath, true) -> {
isRPlus() || path.startsWith(activity.internalStoragePath, true) -> {
if (File(path).createNewFile()) { if (File(path).createNewFile()) {
success(alertDialog) success(alertDialog)
} }

View File

@ -1,5 +1,6 @@
package com.simplemobiletools.filemanager.pro.fragments package com.simplemobiletools.filemanager.pro.fragments
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.os.Parcelable import android.os.Parcelable
import android.util.AttributeSet import android.util.AttributeSet
@ -51,7 +52,6 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
override fun onResume(textColor: Int, primaryColor: Int) { override fun onResume(textColor: Int, primaryColor: Int) {
context!!.updateTextColors(this) context!!.updateTextColors(this)
items_fastscroller.updatePrimaryColor()
storedItems = ArrayList() storedItems = ArrayList()
getRecyclerAdapter()?.apply { getRecyclerAdapter()?.apply {
updatePrimaryColor(primaryColor) updatePrimaryColor(primaryColor)
@ -59,15 +59,20 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
initDrawables() initDrawables()
} }
items_fastscroller.updateColors(primaryColor, primaryColor.getContrastColor())
if (currentPath != "") {
breadcrumbs.updateColor(textColor) breadcrumbs.updateColor(textColor)
items_fastscroller.updateBubbleColors() }
items_swipe_refresh.isEnabled = activity?.config?.enablePullToRefresh != false items_swipe_refresh.isEnabled = activity?.config?.enablePullToRefresh != false
} }
override fun setupFontSize() { override fun setupFontSize() {
getRecyclerAdapter()?.updateFontSizes() getRecyclerAdapter()?.updateFontSizes()
if (currentPath != "") {
breadcrumbs.updateFontSize(context!!.getTextSize()) breadcrumbs.updateFontSize(context!!.getTextSize())
} }
}
override fun setupDateTimeFormat() { override fun setupDateTimeFormat() {
getRecyclerAdapter()?.updateDateTimeFormat() getRecyclerAdapter()?.updateDateTimeFormat()
@ -121,10 +126,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
breadcrumbs.updateFontSize(context!!.getTextSize()) breadcrumbs.updateFontSize(context!!.getTextSize())
} }
ItemsAdapter( ItemsAdapter(activity as SimpleActivity, storedItems, this, items_list, isPickMultipleIntent, items_swipe_refresh) {
activity as SimpleActivity, storedItems, this, items_list, isPickMultipleIntent, items_fastscroller,
items_swipe_refresh
) {
if ((it as? ListItem)?.isSectionTitle == true) { if ((it as? ListItem)?.isSectionTitle == true) {
openDirectory(it.mPath) openDirectory(it.mPath)
searchClosed() searchClosed()
@ -140,18 +142,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
items_list.scheduleLayoutAnimation() 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]) 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) private fun getRecyclerLayoutManager() = (items_list.layoutManager as MyGridLayoutManager)
@SuppressLint("NewApi")
private fun getItems(path: String, callback: (originalPath: String, items: ArrayList<ListItem>) -> Unit) { private fun getItems(path: String, callback: (originalPath: String, items: ArrayList<ListItem>) -> Unit) {
skipItemUpdating = false skipItemUpdating = false
ensureBackgroundThread { ensureBackgroundThread {
if (activity?.isDestroyed == false && activity?.isFinishing == false) { if (activity?.isDestroyed == false && activity?.isFinishing == false) {
val config = context!!.config 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 val getProperFileSize = context!!.config.getFolderSorting(currentPath) and SORT_BY_SIZE != 0
context!!.getOTGItems(path, config.shouldShowHidden, getProperFileSize) { context!!.getOTGItems(path, config.shouldShowHidden, getProperFileSize) {
callback(path, getListItemsFromFileDirItems(it)) callback(path, getListItemsFromFileDirItems(it))
@ -203,7 +206,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
if (getProperChildCount) { if (getProperChildCount) {
items.filter { it.mIsDirectory }.forEach { items.filter { it.mIsDirectory }.forEach {
if (context != null) { if (context != null) {
val childrenCount = it.getDirectChildrenCount(context!!, showHidden) val childrenCount = it.getDirectChildrenCount(activity as BaseSimpleActivity, showHidden)
if (childrenCount != 0) { if (childrenCount != 0) {
activity?.runOnUiThread { activity?.runOnUiThread {
getRecyclerAdapter()?.updateChildCount(it.mPath, childrenCount) getRecyclerAdapter()?.updateChildCount(it.mPath, childrenCount)
@ -223,7 +226,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
var lastModified = lastModifieds.remove(curPath) var lastModified = lastModifieds.remove(curPath)
val isDirectory = if (lastModified != null) false else file.isDirectory 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) { val size = if (isDirectory) {
if (isSortingBySize) { if (isSortingBySize) {
file.getProperSize(showHidden) file.getProperSize(showHidden)
@ -275,13 +278,13 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
when { when {
searchText.isEmpty() -> { searchText.isEmpty() -> {
items_list.beVisible() items_fastscroller.beVisible()
getRecyclerAdapter()?.updateItems(storedItems) getRecyclerAdapter()?.updateItems(storedItems)
items_placeholder.beGone() items_placeholder.beGone()
items_placeholder_2.beGone() items_placeholder_2.beGone()
} }
searchText.length == 1 -> { searchText.length == 1 -> {
items_list.beGone() items_fastscroller.beGone()
items_placeholder.beVisible() items_placeholder.beVisible()
items_placeholder_2.beVisible() items_placeholder_2.beVisible()
} }
@ -318,14 +321,9 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
activity?.runOnUiThread { activity?.runOnUiThread {
getRecyclerAdapter()?.updateItems(listItems, text) getRecyclerAdapter()?.updateItems(listItems, text)
items_list.beVisibleIf(listItems.isNotEmpty()) items_fastscroller.beVisibleIf(listItems.isNotEmpty())
items_placeholder.beVisibleIf(listItems.isEmpty()) items_placeholder.beVisibleIf(listItems.isEmpty())
items_placeholder_2.beGone() 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 isSearchOpen = false
if (!skipItemUpdating) { if (!skipItemUpdating) {
getRecyclerAdapter()?.updateItems(storedItems) getRecyclerAdapter()?.updateItems(storedItems)
calculateContentHeight(storedItems)
} }
skipItemUpdating = false skipItemUpdating = false
lastSearchedText = "" lastSearchedText = ""
items_swipe_refresh.isEnabled = activity?.config?.enablePullToRefresh != false items_swipe_refresh.isEnabled = activity?.config?.enablePullToRefresh != false
items_list.beVisible() items_fastscroller.beVisible()
items_placeholder.beGone() items_placeholder.beGone()
items_placeholder_2.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() { override fun increaseColumnCount() {
if (currentViewType == VIEW_TYPE_GRID) { if (currentViewType == VIEW_TYPE_GRID) {
context?.config?.fileColumnCnt = ++(items_list.layoutManager as MyGridLayoutManager).spanCount context?.config?.fileColumnCnt = ++(items_list.layoutManager as MyGridLayoutManager).spanCount
@ -484,7 +474,6 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
activity?.invalidateOptionsMenu() activity?.invalidateOptionsMenu()
getRecyclerAdapter()?.apply { getRecyclerAdapter()?.apply {
notifyItemRangeChanged(0, listItems.size) notifyItemRangeChanged(0, listItems.size)
calculateContentHeight(listItems)
} }
} }

View File

@ -1,14 +1,14 @@
package com.simplemobiletools.filemanager.pro.fragments package com.simplemobiletools.filemanager.pro.fragments
import android.content.ContentResolver
import android.content.Context import android.content.Context
import android.provider.MediaStore.Files import android.provider.MediaStore.Files
import android.provider.MediaStore.Files.FileColumns import android.provider.MediaStore.Files.FileColumns
import android.util.AttributeSet import android.util.AttributeSet
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.helpers.VIEW_TYPE_LIST
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.filemanager.pro.R import com.simplemobiletools.filemanager.pro.R
@ -24,6 +24,8 @@ import kotlinx.android.synthetic.main.recents_fragment.view.*
import java.util.* import java.util.*
class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), ItemOperationsListener { class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), ItemOperationsListener {
private val RECENTS_LIMIT = 50
override fun setupFragment(activity: SimpleActivity) { override fun setupFragment(activity: SimpleActivity) {
if (this.activity == null) { if (this.activity == null) {
this.activity = activity this.activity = activity
@ -53,7 +55,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
return 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) clickedPath((it as FileDirItem).path)
}.apply { }.apply {
recents_list.adapter = this recents_list.adapter = this
@ -122,9 +124,20 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
FileColumns.SIZE FileColumns.SIZE
) )
val sortOrder = "${FileColumns.DATE_MODIFIED} DESC LIMIT 50" try {
if (isOreoPlus()) {
context?.queryCursor(uri, projection, sortOrder = sortOrder, showErrors = true) { cursor -> 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 path = cursor.getStringValue(FileColumns.DATA)
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath() val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
val size = cursor.getLongValue(FileColumns.SIZE) val size = cursor.getLongValue(FileColumns.SIZE)
@ -133,6 +146,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) { if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) {
listItems.add(fileDirItem) listItems.add(fileDirItem)
} }
} while (cursor.moveToNext())
}
}
} catch (e: Exception) {
activity?.showErrorToast(e)
} }
activity?.runOnUiThread { activity?.runOnUiThread {

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
android:width="24dp" <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"/>
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> </vector>

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
android:width="24dp" <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"/>
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" />
</vector> </vector>

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
android:width="24dp" <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"/>
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> </vector>

View File

@ -35,6 +35,11 @@
android:textStyle="italic" android:textStyle="italic"
android:visibility="gone" /> android:visibility="gone" />
<com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
android:id="@+id/mimetypes_fastscroller"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.simplemobiletools.commons.views.MyRecyclerView <com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/mimetypes_list" android:id="@+id/mimetypes_list"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -45,14 +50,5 @@
android:scrollbars="none" android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager" /> 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_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical" />
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout> </RelativeLayout>

View File

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

View File

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

View File

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

View File

@ -9,11 +9,11 @@
<string name="copy_path">نسخ المسار الى الحافظة</string> <string name="copy_path">نسخ المسار الى الحافظة</string>
<string name="path_copied">تم نسخ المسار</string> <string name="path_copied">تم نسخ المسار</string>
<string name="select_audio_file">الرجاء تحديد ملف صوتي</string> <string name="select_audio_file">الرجاء تحديد ملف صوتي</string>
<string name="search_folder">Search folder</string> <string name="search_folder">مجلد البحث</string>
<string name="rooted_device_only">This operation works only on rooted devices</string> <string name="rooted_device_only">تعمل هذه العملية فقط على الأجهزة المتجذرة</string>
<string name="recents">Recents</string> <string name="recents">الأحدث</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Open as</string> <string name="open_as">Open as</string>
<string name="text_file">Text file</string> <string name="text_file">Text file</string>
@ -21,7 +21,6 @@
<string name="audio_file">Audio file</string> <string name="audio_file">Audio file</string>
<string name="video_file">Video file</string> <string name="video_file">Video file</string>
<string name="other_file">Other file</string> <string name="other_file">Other file</string>
<!-- Compression --> <!-- Compression -->
<string name="compress">ضغط</string> <string name="compress">ضغط</string>
<string name="decompress">فك الضغط</string> <string name="decompress">فك الضغط</string>
@ -32,72 +31,32 @@
<string name="decompression_successful">نجح التفكيك</string> <string name="decompression_successful">نجح التفكيك</string>
<string name="compressing_failed">أخفق الضغط</string> <string name="compressing_failed">أخفق الضغط</string>
<string name="decompressing_failed">أخفق إلغاء الضغط</string> <string name="decompressing_failed">أخفق إلغاء الضغط</string>
<!-- Favorites --> <!-- Favorites -->
<string name="manage_favorites">إدارة المفضلة</string> <string name="manage_favorites">إدارة المفضلة</string>
<string name="go_to_favorite">الذهاب الى المفضلة</string> <string name="go_to_favorite">الذهاب الى المفضلة</string>
<string name="favorites_activity_placeholder">يمكنك إضافة المجلدات المستخدمة بشكل متكرر إلى المفضلة لسهولة الوصول إليها من أي مكان.</string> <string name="favorites_activity_placeholder">يمكنك إضافة المجلدات المستخدمة بشكل متكرر إلى المفضلة لسهولة الوصول إليها من أي مكان.</string>
<!-- File Editor --> <!-- File Editor -->
<string name="file_editor">محرر الملفات</string> <string name="file_editor">محرر الملفات</string>
<!-- Storage analysis --> <!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string> <string name="storage_analysis">تحليل التخزين</string>
<string name="images">Images</string> <string name="images">الصور</string>
<string name="videos">Videos</string> <string name="videos">الفيديوات</string>
<string name="audio">Audio</string> <string name="audio">Audio</string>
<string name="documents">Documents</string> <string name="documents">Documents</string>
<string name="downloads">Downloads</string> <string name="downloads">Downloads</string>
<string name="archives">Archives</string> <string name="archives">الأرشيف</string>
<string name="others">Others</string> <string name="others">الاخرين</string>
<string name="storage_free">free</string> <string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string> <string name="total_storage">إجمالي مساحة التخزين: %s</string>
<!-- Settings --> <!-- Settings -->
<string name="enable_root_access">تفعيل الدخول الى مسار الروت</string> <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 --> <!-- 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 --> <!-- 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 --> <!-- 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">التطبيق السهل لإدارة الملفات الخاصة بك دون إعلانات، واحترام خصوصيتك والأمن</string>
<string name="app_long_description"> <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>
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>
<!-- <!--
Haven't found some strings? There's more at Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

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="rooted_device_only">Bu əməliyyat yalnız root\'lu cihazlarda işləyir</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Open as</string> <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="rooted_device_only">Tato operace funguje pouze u rootnutých zařízení</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Otevřít jako</string> <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="rooted_device_only">Dyw\'r weithred hon ond yn gweithio ar ddyfeisiau wedi\'u gwreddio</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Agor fel</string> <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="rooted_device_only">Denne funkton virker kun på rootede enheder</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Åbn som</string> <string name="open_as">Åbn som</string>

View File

@ -8,12 +8,12 @@
<string name="home_folder_updated">Start-Verzeichnis aktualisiert</string> <string name="home_folder_updated">Start-Verzeichnis aktualisiert</string>
<string name="copy_path">Kopiere Pfad in die Zwischenablage</string> <string name="copy_path">Kopiere Pfad in die Zwischenablage</string>
<string name="path_copied">Pfad kopiert</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="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="recents">Neueste</string>
<string name="show_recents">Zeige die Neuesten</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 --> <!-- Open as -->
<string name="open_as">Öffnen als</string> <string name="open_as">Öffnen als</string>
<string name="text_file">Text-Datei</string> <string name="text_file">Text-Datei</string>
@ -21,47 +21,41 @@
<string name="audio_file">Audio-Datei</string> <string name="audio_file">Audio-Datei</string>
<string name="video_file">Video-Datei</string> <string name="video_file">Video-Datei</string>
<string name="other_file">Anderer Dateityp</string> <string name="other_file">Anderer Dateityp</string>
<!-- Compression --> <!-- Compression -->
<string name="compress">Komprimieren</string> <string name="compress">Komprimieren</string>
<string name="decompress">Entpacken</string> <string name="decompress">Entpacken</string>
<string name="compress_as">Komprimieren als</string> <string name="compress_as">Komprimieren als</string>
<string name="compressing">Komprimiere…</string> <string name="compressing">Komprimiere…</string>
<string name="decompressing">Entpacke…</string> <string name="decompressing">Entpacke…</string>
<string name="compression_successful">Komprimieren erfolgreich.</string> <string name="compression_successful">Komprimieren erfolgreich</string>
<string name="decompression_successful">Entpacken erfolgreich.</string> <string name="decompression_successful">Entpacken erfolgreich</string>
<string name="compressing_failed">Komprimieren fehlgeschlagen.</string> <string name="compressing_failed">Komprimieren fehlgeschlagen</string>
<string name="decompressing_failed">Entpacken fehlgeschlagen.</string> <string name="decompressing_failed">Entpacken fehlgeschlagen</string>
<!-- Favorites --> <!-- Favorites -->
<string name="manage_favorites">Verwalte Favoriten</string> <string name="manage_favorites">Verwalte Favoriten</string>
<string name="go_to_favorite">Gehe zu 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 --> <!-- File Editor -->
<string name="file_editor">Dateieditor</string> <string name="file_editor">Dateieditor</string>
<!-- Storage analysis --> <!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string> <string name="storage_analysis">Speicheranalyse</string>
<string name="images">Images</string> <string name="images">Bilder</string>
<string name="videos">Videos</string> <string name="videos">Videos</string>
<string name="audio">Audio</string> <string name="audio">Audio</string>
<string name="documents">Documents</string> <string name="documents">Documents</string>
<string name="downloads">Downloads</string> <string name="downloads">Downloads</string>
<string name="archives">Archives</string> <string name="archives">Archiv</string>
<string name="others">Others</string> <string name="others">Andere</string>
<string name="storage_free">free</string> <string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string> <string name="total_storage">Gesamter Speicherplatz: %s</string>
<!-- Settings --> <!-- Settings -->
<string name="enable_root_access">Root-Zugriff erlauben</string> <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 --> <!-- 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 --> <!-- 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 --> <!-- 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"> <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. 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,7 +91,6 @@
<b>Reddit:</b> <b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools https://www.reddit.com/r/SimpleMobileTools
</string> </string>
<!-- <!--
Haven't found some strings? There's more at Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Αυτό το χαρακτηριστικό λειτουργεί μόνο σε συσκευές με πρόσβαση στον ριζικό κατάλογο.</string> <string name="rooted_device_only">Αυτό το χαρακτηριστικό λειτουργεί μόνο σε συσκευές με πρόσβαση στον ριζικό κατάλογο.</string>
<string name="recents">Πρόσφατα</string> <string name="recents">Πρόσφατα</string>
<string name="show_recents">Εμφάνιση προσφάτων</string> <string name="show_recents">Εμφάνιση προσφάτων</string>
<string name="access_storage_prompt">Παρακαλώ παραχωρήστε την πρόσβαση σε όλα τα αρχεία σας, γιατί χωρίς αυτή μπορεί να μην λειτουργεί καλά.</string>
<!-- Open as --> <!-- Open as -->
<string name="open_as">Άνοιγμα ως</string> <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="rooted_device_only">Esta operación solo funciona en dispositivos rooteados</string>
<string name="recents">Recientes</string> <string name="recents">Recientes</string>
<string name="show_recents">Mostrar 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 --> <!-- Open as -->
<string name="open_as">Abrir como</string> <string name="open_as">Abrir como</string>
@ -50,7 +51,7 @@
<string name="downloads">Descargas</string> <string name="downloads">Descargas</string>
<string name="archives">Archivos</string> <string name="archives">Archivos</string>
<string name="others">Otros</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> <string name="total_storage">Almacenamiento total: %s</string>
<!-- Settings --> <!-- Settings -->

View File

@ -13,7 +13,7 @@
<string name="rooted_device_only">Tämä toiminto vaatii rootatun laitteen</string> <string name="rooted_device_only">Tämä toiminto vaatii rootatun laitteen</string>
<string name="recents">Viimeaikaiset</string> <string name="recents">Viimeaikaiset</string>
<string name="show_recents">Näytä 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 --> <!-- Open as -->
<string name="open_as">Avaa...</string> <string name="open_as">Avaa...</string>
<string name="text_file">Tekstitiedostona</string> <string name="text_file">Tekstitiedostona</string>
@ -21,7 +21,6 @@
<string name="audio_file">Äänitiedostona</string> <string name="audio_file">Äänitiedostona</string>
<string name="video_file">Videotiedostona</string> <string name="video_file">Videotiedostona</string>
<string name="other_file">Jonakin muuna tiedostona</string> <string name="other_file">Jonakin muuna tiedostona</string>
<!-- Compression --> <!-- Compression -->
<string name="compress">Pakkaa</string> <string name="compress">Pakkaa</string>
<string name="decompress">Pura</string> <string name="decompress">Pura</string>
@ -32,34 +31,29 @@
<string name="decompression_successful">Purkaminen valmis</string> <string name="decompression_successful">Purkaminen valmis</string>
<string name="compressing_failed">Pakkaaminen epäonnistui</string> <string name="compressing_failed">Pakkaaminen epäonnistui</string>
<string name="decompressing_failed">Purkaminen epäonnistui</string> <string name="decompressing_failed">Purkaminen epäonnistui</string>
<!-- Favorites --> <!-- Favorites -->
<string name="manage_favorites">Hallitse suosikkeja</string> <string name="manage_favorites">Hallitse suosikkeja</string>
<string name="go_to_favorite">Mene suosikkiin</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> <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 --> <!-- File Editor -->
<string name="file_editor">Tiedostoeditori</string> <string name="file_editor">Tiedostoeditori</string>
<!-- Storage analysis --> <!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string> <string name="storage_analysis">Tallennustilan analyysi</string>
<string name="images">Images</string> <string name="images">Kuvat</string>
<string name="videos">Videos</string> <string name="videos">Videot</string>
<string name="audio">Audio</string> <string name="audio">Audio</string>
<string name="documents">Documents</string> <string name="documents">Documents</string>
<string name="downloads">Downloads</string> <string name="downloads">Downloads</string>
<string name="archives">Archives</string> <string name="archives">Arkistot</string>
<string name="others">Others</string> <string name="others">Muut</string>
<string name="storage_free">free</string> <string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string> <string name="total_storage">Total storage: %s</string>
<!-- Settings --> <!-- Settings -->
<string name="enable_root_access">Ota käyttöön root-ominaisuudet</string> <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> <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 --> <!-- 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 --> <!-- 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 --> <!-- 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_short_description">Helppo tiedostonhallinta turvallisesti yksityisyyttä kunnioittaen, ei mainoksia.</string>
<string name="app_long_description"> <string name="app_long_description">
@ -97,7 +91,6 @@
<b>Reddit:</b> <b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools https://www.reddit.com/r/SimpleMobileTools
</string> </string>
<!-- <!--
Haven't found some strings? There's more at Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -11,9 +11,9 @@
<string name="select_audio_file">Veuillez sélectionner un fichier audio</string> <string name="select_audio_file">Veuillez sélectionner un fichier audio</string>
<string name="search_folder">Chercher dans le dossier</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="rooted_device_only">Cette opération ne fonctionne que sur les périphériques rooté</string>
<string name="recents">Recents</string> <string name="recents">Récents</string>
<string name="show_recents">Show recents</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 --> <!-- Open as -->
<string name="open_as">Ouvert comme</string> <string name="open_as">Ouvert comme</string>
<string name="text_file">Fichier texte</string> <string name="text_file">Fichier texte</string>
@ -21,7 +21,6 @@
<string name="audio_file">Fichier audio</string> <string name="audio_file">Fichier audio</string>
<string name="video_file">Fichier vidéo</string> <string name="video_file">Fichier vidéo</string>
<string name="other_file">Autre fichier</string> <string name="other_file">Autre fichier</string>
<!-- Compression --> <!-- Compression -->
<string name="compress">Compresser</string> <string name="compress">Compresser</string>
<string name="decompress">Décompresser</string> <string name="decompress">Décompresser</string>
@ -32,36 +31,31 @@
<string name="decompression_successful">Décompression réussie</string> <string name="decompression_successful">Décompression réussie</string>
<string name="compressing_failed">Compression ratée</string> <string name="compressing_failed">Compression ratée</string>
<string name="decompressing_failed">Décompression ratée</string> <string name="decompressing_failed">Décompression ratée</string>
<!-- Favorites --> <!-- Favorites -->
<string name="manage_favorites">Gérer les favoris</string> <string name="manage_favorites">Gérer les favoris</string>
<string name="go_to_favorite">Aller au favori</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> <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 --> <!-- File Editor -->
<string name="file_editor">Éditeur de fichier</string> <string name="file_editor">Éditeur de fichier</string>
<!-- Storage analysis --> <!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string> <string name="storage_analysis">Analyse du stockage</string>
<string name="images">Images</string> <string name="images">Images</string>
<string name="videos">Videos</string> <string name="videos">Vidéos</string>
<string name="audio">Audio</string> <string name="audio">Audio</string>
<string name="documents">Documents</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="archives">Archives</string>
<string name="others">Others</string> <string name="others">Autres</string>
<string name="storage_free">free</string> <string name="storage_free">libre</string>
<string name="total_storage">Total storage: %s</string> <string name="total_storage">Stockage total : %s</string>
<!-- Settings --> <!-- Settings -->
<string name="enable_root_access">Activer les droits root</string> <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 --> <!-- 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 --> <!-- 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 --> <!-- 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"> <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. 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,7 +91,6 @@
<b>Reddit:</b> <b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools https://www.reddit.com/r/SimpleMobileTools
</string> </string>
<!-- <!--
Haven't found some strings? There's more at Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -11,6 +11,9 @@
<string name="select_audio_file">Seleccione un ficheiro de audio</string> <string name="select_audio_file">Seleccione un ficheiro de audio</string>
<string name="search_folder">Buscar cartafol</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="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 --> <!-- Open as -->
<string name="open_as">Abrir como</string> <string name="open_as">Abrir como</string>
@ -39,14 +42,27 @@
<!-- File Editor --> <!-- File Editor -->
<string name="file_editor">Editor de ficheiros</string> <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 --> <!-- Settings -->
<string name="enable_root_access">Activar acceso root</string> <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 --> <!-- 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 --> <!-- 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 --> <!-- 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"> <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. 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.

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">यह ऑपरेशन केवल रूटेड डिवाइस पर काम करता है</string> <string name="rooted_device_only">यह ऑपरेशन केवल रूटेड डिवाइस पर काम करता है</string>
<string name="recents">हाल के</string> <string name="recents">हाल के</string>
<string name="show_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 --> <!-- Open as -->
<string name="open_as">इस रूप में खोलें</string> <string name="open_as">इस रूप में खोलें</string>
<string name="text_file">टेकस्ट फ़ाइलें</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="rooted_device_only">Ova radnja funkcionira samo na uređajima s root pristupom</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Otvori kao</string> <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="rooted_device_only">This operation works only on rooted devices</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Open as</string> <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="rooted_device_only">Tindakan ini hanya bekerja pada perangkat dengan akses root</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Buka sebagai</string> <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="rooted_device_only">Questa operazione funziona solo nei dispositivi con permessi di root</string>
<string name="recents">Recenti</string> <string name="recents">Recenti</string>
<string name="show_recents">Mostra i 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 --> <!-- Open as -->
<string name="open_as">Apri come</string> <string name="open_as">Apri come</string>
<string name="text_file">File di testo</string> <string name="text_file">File di testo</string>
@ -21,7 +21,6 @@
<string name="audio_file">File audio</string> <string name="audio_file">File audio</string>
<string name="video_file">File video</string> <string name="video_file">File video</string>
<string name="other_file">Altro</string> <string name="other_file">Altro</string>
<!-- Compression --> <!-- Compression -->
<string name="compress">Comprimi</string> <string name="compress">Comprimi</string>
<string name="decompress">Decomprimi</string> <string name="decompress">Decomprimi</string>
@ -32,31 +31,26 @@
<string name="decompression_successful">Decompressione completata</string> <string name="decompression_successful">Decompressione completata</string>
<string name="compressing_failed">Impossibile comprimere</string> <string name="compressing_failed">Impossibile comprimere</string>
<string name="decompressing_failed">Impossibile decomprimere</string> <string name="decompressing_failed">Impossibile decomprimere</string>
<!-- Favorites --> <!-- Favorites -->
<string name="manage_favorites">Gestisci i preferiti</string> <string name="manage_favorites">Gestisci i preferiti</string>
<string name="go_to_favorite">Vai al preferito</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> <string name="favorites_activity_placeholder">Si possono aggiungere le cartelle usate frequentemente ai preferiti, per un rapido accesso da qualsiasi posizione.</string>
<!-- File Editor --> <!-- File Editor -->
<string name="file_editor">Editor dei file</string> <string name="file_editor">Editor dei file</string>
<!-- Storage analysis --> <!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string> <string name="storage_analysis">Analisi dello stoccaggio</string>
<string name="images">Images</string> <string name="images">Immagini</string>
<string name="videos">Videos</string> <string name="videos">Video</string>
<string name="audio">Audio</string> <string name="audio">Audio</string>
<string name="documents">Documents</string> <string name="documents">Documenti</string>
<string name="downloads">Downloads</string> <string name="downloads">Scaricamenti</string>
<string name="archives">Archives</string> <string name="archives">Archivi</string>
<string name="others">Others</string> <string name="others">Altri</string>
<string name="storage_free">free</string> <string name="storage_free">libero</string>
<string name="total_storage">Total storage: %s</string> <string name="total_storage">Memoria totale: %s</string>
<!-- Settings --> <!-- Settings -->
<string name="enable_root_access">Abilita accesso root</string> <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> <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 --> <!-- 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 --> <!-- 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> <string name="app_title">Semplice Gestore di file Pro - Facile e veloce</string>
@ -97,7 +91,6 @@
<b>Reddit:</b> <b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools https://www.reddit.com/r/SimpleMobileTools
</string> </string>
<!-- <!--
Haven't found some strings? There's more at Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">この操作はルート化された端末でのみ機能します</string> <string name="rooted_device_only">この操作はルート化された端末でのみ機能します</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">ファイル形式を指定して開く</string> <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="rooted_device_only">This operation works only on rooted devices</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Open as</string> <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="rooted_device_only">This operation works only on rooted devices</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Open as</string> <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="rooted_device_only">Denne handlingen fungerer bare på rootede enheter.</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Open as</string> <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="rooted_device_only">Deze bewerking is alleen mogelijk op een geroot apparaat</string>
<string name="recents">Recent geopend</string> <string name="recents">Recent geopend</string>
<string name="show_recents">Recente items tonen</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 --> <!-- Open as -->
<string name="open_as">Openen als</string> <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="rooted_device_only">Ta operacja działa tylko na zrootowanych urządzeniach</string>
<string name="recents">Ostatnie</string> <string name="recents">Ostatnie</string>
<string name="show_recents">Pokaż 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 --> <!-- Open as -->
<string name="open_as">Otwórz jako</string> <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="rooted_device_only">Esta operação só funciona em dispositivos rooteados</string>
<string name="recents">Recentes</string> <string name="recents">Recentes</string>
<string name="show_recents">Mostrar 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 --> <!-- Open as -->
<string name="open_as">Abrir como</string> <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="select_audio_file">Selecione um ficheiro de áudio</string>
<string name="search_folder">Pesquisar pasta</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="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="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 --> <!-- Open as -->
<string name="open_as">Abrir como</string> <string name="open_as">Abrir como</string>
@ -23,15 +24,15 @@
<string name="other_file">Outro tipo</string> <string name="other_file">Outro tipo</string>
<!-- Compression --> <!-- Compression -->
<string name="compress">Comprimir</string> <string name="compress">Compactar</string>
<string name="decompress">Descomprimir</string> <string name="decompress">Descompactar</string>
<string name="compress_as">Comprimir como</string> <string name="compress_as">Compactar como</string>
<string name="compressing">A comprimir…</string> <string name="compressing">A compactar…</string>
<string name="decompressing">A descomprimir…</string> <string name="decompressing">A descompactar…</string>
<string name="compression_successful">Compressão terminada</string> <string name="compression_successful">Compactação terminada</string>
<string name="decompression_successful">Descompressão terminada</string> <string name="decompression_successful">Descompactação terminada</string>
<string name="compressing_failed">Falha ao comprimir</string> <string name="compressing_failed">Falha ao compactar</string>
<string name="decompressing_failed">Falha ao descomprimir</string> <string name="decompressing_failed">Falha ao descompactar</string>
<!-- Favorites --> <!-- Favorites -->
<string name="manage_favorites">Gerir favoritos</string> <string name="manage_favorites">Gerir favoritos</string>
@ -42,20 +43,20 @@
<string name="file_editor">Editor de ficheiros</string> <string name="file_editor">Editor de ficheiros</string>
<!-- Storage analysis --> <!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string> <string name="storage_analysis">Análise ao armazenamento</string>
<string name="images">Images</string> <string name="images">Imagens</string>
<string name="videos">Videos</string> <string name="videos">Vídeos</string>
<string name="audio">Audio</string> <string name="audio">Áudio</string>
<string name="documents">Documents</string> <string name="documents">Documentos</string>
<string name="downloads">Downloads</string> <string name="downloads">Descargas</string>
<string name="archives">Archives</string> <string name="archives">Arquivos</string>
<string name="others">Others</string> <string name="others">Outros</string>
<string name="storage_free">free</string> <string name="storage_free">livre</string>
<string name="total_storage">Total storage: %s</string> <string name="total_storage">Armazenamento total: %s</string>
<!-- Settings --> <!-- Settings -->
<string name="enable_root_access">Ativar acesso root</string> <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 --> <!-- 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 --> <!-- 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\'. 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 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 https://www.simplemobiletools.com/filemanager
<b>Facebook:</b> <b>Facebook:</b>

View File

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

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Táto operácia funguje iba na rootnutých zariadeniach</string> <string name="rooted_device_only">Táto operácia funguje iba na rootnutých zariadeniach</string>
<string name="recents">Nedávne</string> <string name="recents">Nedávne</string>
<string name="show_recents">Zobraziť 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 --> <!-- Open as -->
<string name="open_as">Otvoriť ako</string> <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="rooted_device_only">Åtgärden fungerar bara på rotade enheter</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Öppna som</string> <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="select_audio_file">Lütfen bir ses dosyası seçin</string>
<string name="search_folder">Klasör ara</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="rooted_device_only">Bu işlem sadece rootlu cihazlarda çalışır</string>
<string name="recents">Recents</string> <string name="recents">Son dosyalar</string>
<string name="show_recents">Show recents</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 --> <!-- Open as -->
<string name="open_as">Farklı</string> <string name="open_as">Farklı</string>
@ -42,20 +43,20 @@
<string name="file_editor">Dosya Düzenleyici</string> <string name="file_editor">Dosya Düzenleyici</string>
<!-- Storage analysis --> <!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string> <string name="storage_analysis">Depolama analizi</string>
<string name="images">Images</string> <string name="images">Resimler</string>
<string name="videos">Videos</string> <string name="videos">Videolar</string>
<string name="audio">Audio</string> <string name="audio">Sesler</string>
<string name="documents">Documents</string> <string name="documents">Belgeler</string>
<string name="downloads">Downloads</string> <string name="downloads">İndirilenler</string>
<string name="archives">Archives</string> <string name="archives">Arşivler</string>
<string name="others">Others</string> <string name="others">Diğerleri</string>
<string name="storage_free">free</string> <string name="storage_free">boş</string>
<string name="total_storage">Total storage: %s</string> <string name="total_storage">Toplam depolama: %s</string>
<!-- Settings --> <!-- Settings -->
<string name="enable_root_access">Root erişimini etkinleştir</string> <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 --> <!-- 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 --> <!-- 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"> <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. 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. Bu modern dosya düzenleyici, root dosyalarının, SD kartların ve USB cihazlarının hızlı taranmasını destekler.
@ -77,7 +78,7 @@
Bir dosya veya klasör yolunu hızlı bir şekilde almak için, uzun basıp panoya kopyalayarak onu kolayca seçebilirsiniz. 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.

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">Ця команда працює лише на пристроях з root-доступом</string> <string name="rooted_device_only">Ця команда працює лише на пристроях з root-доступом</string>
<string name="recents">Останні</string> <string name="recents">Останні</string>
<string name="show_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 --> <!-- Open as -->
<string name="open_as">Відкрити як файл</string> <string name="open_as">Відкрити як файл</string>

View File

@ -11,9 +11,9 @@
<string name="select_audio_file">请选择一个音频文件</string> <string name="select_audio_file">请选择一个音频文件</string>
<string name="search_folder">搜索文件夹</string> <string name="search_folder">搜索文件夹</string>
<string name="rooted_device_only">该选项仅在 root 后的设备上工作</string> <string name="rooted_device_only">该选项仅在 root 后的设备上工作</string>
<string name="recents">Recents</string> <string name="recents">最近</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">打开为</string> <string name="open_as">打开为</string>
<string name="text_file">文本文件</string> <string name="text_file">文本文件</string>
@ -21,7 +21,6 @@
<string name="audio_file">音频文件</string> <string name="audio_file">音频文件</string>
<string name="video_file">视频文件</string> <string name="video_file">视频文件</string>
<string name="other_file">其他文件</string> <string name="other_file">其他文件</string>
<!-- Compression --> <!-- Compression -->
<string name="compress">压缩</string> <string name="compress">压缩</string>
<string name="decompress">解压缩</string> <string name="decompress">解压缩</string>
@ -32,31 +31,26 @@
<string name="decompression_successful">解压缩成功</string> <string name="decompression_successful">解压缩成功</string>
<string name="compressing_failed">压缩失败</string> <string name="compressing_failed">压缩失败</string>
<string name="decompressing_failed">解压缩失败</string> <string name="decompressing_failed">解压缩失败</string>
<!-- Favorites --> <!-- Favorites -->
<string name="manage_favorites">管理收藏</string> <string name="manage_favorites">管理收藏</string>
<string name="go_to_favorite">前往收藏</string> <string name="go_to_favorite">前往收藏</string>
<string name="favorites_activity_placeholder">您可以将经常访问的文件夹添加至收藏便于从任意位置快速访问。</string> <string name="favorites_activity_placeholder">您可以将经常访问的文件夹添加至收藏便于从任意位置快速访问。</string>
<!-- File Editor --> <!-- File Editor -->
<string name="file_editor">文件编辑器</string> <string name="file_editor">文件编辑器</string>
<!-- Storage analysis --> <!-- Storage analysis -->
<string name="storage_analysis">Storage analysis</string> <string name="storage_analysis">存储分析</string>
<string name="images">Images</string> <string name="images">图片</string>
<string name="videos">Videos</string> <string name="videos">视频</string>
<string name="audio">Audio</string> <string name="audio">Audio</string>
<string name="documents">Documents</string> <string name="documents">Documents</string>
<string name="downloads">Downloads</string> <string name="downloads">Downloads</string>
<string name="archives">Archives</string> <string name="archives">存档</string>
<string name="others">Others</string> <string name="others">其他</string>
<string name="storage_free">free</string> <string name="storage_free">free</string>
<string name="total_storage">Total storage: %s</string> <string name="total_storage">总存储: %s</string>
<!-- Settings --> <!-- Settings -->
<string name="enable_root_access">启用 root 访问</string> <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 --> <!-- 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 --> <!-- 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> <string name="app_title">简易文件管理 Pro - 轻松管理文件 &amp; 快速体验</string>
@ -97,7 +91,6 @@
<b>Reddit:</b> <b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools https://www.reddit.com/r/SimpleMobileTools
</string> </string>
<!-- <!--
Haven't found some strings? There's more at Haven't found some strings? There's more at
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res

View File

@ -13,6 +13,7 @@
<string name="rooted_device_only">這操作只對已root的裝置有用</string> <string name="rooted_device_only">這操作只對已root的裝置有用</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">開啟成</string> <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="rooted_device_only">This operation works only on rooted devices</string>
<string name="recents">Recents</string> <string name="recents">Recents</string>
<string name="show_recents">Show 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 --> <!-- Open as -->
<string name="open_as">Open as</string> <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. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.5.31' ext.kotlin_version = '1.6.0'
repositories { repositories {
google() google()
@ -9,7 +9,7 @@ buildscript {
} }
dependencies { 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" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong