mirror of
https://github.com/SimpleMobileTools/Simple-File-Manager.git
synced 2025-02-09 16:38:40 +01:00
Merge branch 'master' into pull-to-refresh-option
This commit is contained in:
commit
2c9438d216
@ -10,8 +10,8 @@ Contains no ads or unnecessary permissions. It is fully opensource, provides cus
|
||||
|
||||
This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
|
||||
|
||||
<a href='https://play.google.com/store/apps/details?id=com.simplemobiletools.filemanager.pro'><img src='https://simplemobiletools.com/assets/images/google-play.png' alt='Get it on Google Play' height='45' /></a>
|
||||
<a href='https://f-droid.org/packages/com.simplemobiletools.filemanager.pro'><img src='https://simplemobiletools.com/assets/images/f-droid.png' alt='Get it on F-Droid' height='45' /></a>
|
||||
<a href='https://play.google.com/store/apps/details?id=com.simplemobiletools.filemanager.pro'><img src='https://simplemobiletools.com/images/button-google-play.svg' alt='Get it on Google Play' height='45' /></a>
|
||||
<a href='https://f-droid.org/packages/com.simplemobiletools.filemanager.pro'><img src='https://simplemobiletools.com/images/button-f-droid.png' alt='Get it on F-Droid' height='45' /></a>
|
||||
|
||||
<div style="display:flex;">
|
||||
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/english/1.jpg" width="30%">
|
||||
|
@ -9,13 +9,12 @@ if (keystorePropertiesFile.exists()) {
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 29
|
||||
buildToolsVersion "29.0.3"
|
||||
compileSdkVersion 30
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.simplemobiletools.filemanager.pro"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 29
|
||||
targetSdkVersion 30
|
||||
versionCode 110
|
||||
versionName "6.10.1"
|
||||
multiDexEnabled true
|
||||
@ -58,7 +57,7 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'com.github.SimpleMobileTools:Simple-Commons:5079455be9'
|
||||
implementation 'com.github.SimpleMobileTools:Simple-Commons:51f1996098'
|
||||
implementation 'com.github.Stericson:RootTools:df729dcb13'
|
||||
implementation 'com.github.Stericson:RootShell:1.6'
|
||||
implementation 'com.alexvasilkov:gesture-views:2.5.2'
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
|
||||
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.faketouch"
|
||||
@ -113,21 +114,11 @@
|
||||
android:label="@string/about"
|
||||
android:parentActivityName=".activities.MainActivity"/>
|
||||
|
||||
<activity
|
||||
android:name="com.simplemobiletools.commons.activities.LicenseActivity"
|
||||
android:label="@string/third_party_licences"
|
||||
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
|
||||
|
||||
<activity
|
||||
android:name="com.simplemobiletools.commons.activities.CustomizationActivity"
|
||||
android:label="@string/customize_colors"
|
||||
android:parentActivityName=".activities.SettingsActivity"/>
|
||||
|
||||
<activity
|
||||
android:name="com.simplemobiletools.commons.activities.FAQActivity"
|
||||
android:label="@string/frequently_asked_questions"
|
||||
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
|
||||
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.provider"
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.simplemobiletools.filemanager.pro.activities
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.app.SearchManager
|
||||
import android.content.ClipData
|
||||
@ -8,13 +9,18 @@ import android.content.Intent
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.media.RingtoneManager
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.os.Environment
|
||||
import android.os.Handler
|
||||
import android.provider.Settings
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import androidx.appcompat.widget.SearchView
|
||||
import androidx.core.view.MenuItemCompat
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import com.simplemobiletools.commons.dialogs.ConfirmationAdvancedDialog
|
||||
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
||||
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.*
|
||||
@ -46,6 +52,7 @@ import java.util.*
|
||||
|
||||
class MainActivity : SimpleActivity() {
|
||||
private val BACK_PRESS_TIMEOUT = 5000
|
||||
private val MANAGE_STORAGE_RC = 201
|
||||
private val PICKED_PATH = "picked_path"
|
||||
private var isSearchOpen = false
|
||||
private var wasBackJustPressed = false
|
||||
@ -132,11 +139,11 @@ class MainActivity : SimpleActivity() {
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
storeStateVariables()
|
||||
config.lastUsedViewPagerPage = main_view_pager.currentItem
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
config.lastUsedViewPagerPage = main_view_pager.currentItem
|
||||
config.temporarilyShowHidden = false
|
||||
}
|
||||
|
||||
@ -282,8 +289,8 @@ class MainActivity : SimpleActivity() {
|
||||
}
|
||||
|
||||
private fun tryInitFileManager() {
|
||||
val hadPermission = hasPermission(PERMISSION_WRITE_STORAGE)
|
||||
handlePermission(PERMISSION_WRITE_STORAGE) {
|
||||
val hadPermission = hasStoragePermission()
|
||||
handleStoragePermission {
|
||||
checkOTGPath()
|
||||
if (it) {
|
||||
if (main_view_pager.adapter == null) {
|
||||
@ -300,6 +307,56 @@ class MainActivity : SimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("InlinedApi")
|
||||
private fun handleStoragePermission(callback: (granted: Boolean) -> Unit) {
|
||||
actionOnPermission = null
|
||||
if (hasStoragePermission()) {
|
||||
callback(true)
|
||||
} else {
|
||||
if (isRPlus()) {
|
||||
ConfirmationAdvancedDialog(this, "", R.string.access_storage_prompt, R.string.ok, 0) { success ->
|
||||
if (success ) {
|
||||
isAskingPermissions = true
|
||||
actionOnPermission = callback
|
||||
try {
|
||||
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
|
||||
intent.addCategory("android.intent.category.DEFAULT")
|
||||
intent.data = Uri.parse("package:$packageName")
|
||||
startActivityForResult(intent, MANAGE_STORAGE_RC)
|
||||
} catch (e: Exception) {
|
||||
showErrorToast(e)
|
||||
val intent = Intent()
|
||||
intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
|
||||
startActivityForResult(intent, MANAGE_STORAGE_RC)
|
||||
}
|
||||
} else {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
handlePermission(PERMISSION_WRITE_STORAGE, callback)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
private fun hasStoragePermission(): Boolean {
|
||||
return if (isRPlus()) {
|
||||
Environment.isExternalStorageManager()
|
||||
} else {
|
||||
hasPermission(PERMISSION_WRITE_STORAGE)
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, resultData)
|
||||
isAskingPermissions = false
|
||||
if (requestCode == MANAGE_STORAGE_RC && isRPlus()) {
|
||||
actionOnPermission?.invoke(Environment.isExternalStorageManager())
|
||||
}
|
||||
}
|
||||
|
||||
private fun initFileManager(refreshRecents: Boolean) {
|
||||
if (intent.action == Intent.ACTION_VIEW && intent.data != null) {
|
||||
val data = intent.data
|
||||
|
@ -61,6 +61,9 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
ensureBackgroundThread {
|
||||
reFetchItems()
|
||||
}
|
||||
|
||||
val adjustedPrimaryColor = getAdjustedPrimaryColor()
|
||||
mimetypes_fastscroller.updateColors(adjustedPrimaryColor, adjustedPrimaryColor.getContrastColor())
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
@ -130,13 +133,13 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
lastSearchedText = searchText
|
||||
when {
|
||||
searchText.isEmpty() -> {
|
||||
mimetypes_list.beVisible()
|
||||
mimetypes_fastscroller.beVisible()
|
||||
getRecyclerAdapter()?.updateItems(storedItems)
|
||||
mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty())
|
||||
mimetypes_placeholder_2.beGone()
|
||||
}
|
||||
searchText.length == 1 -> {
|
||||
mimetypes_list.beGone()
|
||||
mimetypes_fastscroller.beGone()
|
||||
mimetypes_placeholder.beVisible()
|
||||
mimetypes_placeholder_2.beVisible()
|
||||
}
|
||||
@ -150,14 +153,9 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
|
||||
runOnUiThread {
|
||||
getRecyclerAdapter()?.updateItems(listItems, text)
|
||||
mimetypes_list.beVisibleIf(listItems.isNotEmpty())
|
||||
mimetypes_fastscroller.beVisibleIf(listItems.isNotEmpty())
|
||||
mimetypes_placeholder.beVisibleIf(listItems.isEmpty())
|
||||
mimetypes_placeholder_2.beGone()
|
||||
|
||||
mimetypes_list.onGlobalLayout {
|
||||
items_fastscroller.setScrollToY(mimetypes_list.computeVerticalScrollOffset())
|
||||
calculateContentHeight(listItems)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -232,7 +230,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
isSearchOpen = false
|
||||
lastSearchedText = ""
|
||||
|
||||
mimetypes_list.beVisible()
|
||||
mimetypes_fastscroller.beVisible()
|
||||
mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty())
|
||||
mimetypes_placeholder_2.beGone()
|
||||
}
|
||||
@ -321,7 +319,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
}
|
||||
|
||||
storedItems = items
|
||||
ItemsAdapter(this as SimpleActivity, storedItems, this, mimetypes_list, false, items_fastscroller, null) {
|
||||
ItemsAdapter(this as SimpleActivity, storedItems, this, mimetypes_list, false, null) {
|
||||
tryOpenPathIntent((it as ListItem).path, false)
|
||||
}.apply {
|
||||
setupZoomListener(zoomListener)
|
||||
@ -332,13 +330,6 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
mimetypes_list.scheduleLayoutAnimation()
|
||||
}
|
||||
|
||||
val dateFormat = config.dateFormat
|
||||
val timeFormat = getTimeFormat()
|
||||
items_fastscroller.setViews(mimetypes_list) {
|
||||
val listItem = getRecyclerAdapter()?.listItems?.getOrNull(it)
|
||||
items_fastscroller.updateBubbleText(listItem?.getBubbleText(this, dateFormat, timeFormat) ?: "")
|
||||
}
|
||||
|
||||
mimetypes_placeholder.beVisibleIf(items.isEmpty())
|
||||
}
|
||||
|
||||
@ -390,18 +381,9 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
|
||||
invalidateOptionsMenu()
|
||||
getRecyclerAdapter()?.apply {
|
||||
notifyItemRangeChanged(0, listItems.size)
|
||||
calculateContentHeight(listItems)
|
||||
}
|
||||
}
|
||||
|
||||
private fun calculateContentHeight(items: MutableList<ListItem>) {
|
||||
val layoutManager = mimetypes_list.layoutManager as MyGridLayoutManager
|
||||
val thumbnailHeight = layoutManager.getChildAt(0)?.height ?: 0
|
||||
val fullHeight = ((items.size - 1) / layoutManager.spanCount + 1) * thumbnailHeight
|
||||
items_fastscroller.setContentHeight(fullHeight)
|
||||
items_fastscroller.setScrollToY(mimetypes_list.computeVerticalScrollOffset())
|
||||
}
|
||||
|
||||
private fun setupLayoutManager() {
|
||||
if (config.getFolderViewType(currentMimeType) == VIEW_TYPE_GRID) {
|
||||
currentViewType = VIEW_TYPE_GRID
|
||||
|
@ -12,7 +12,6 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
|
||||
import com.bumptech.glide.request.RequestOptions
|
||||
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
|
||||
import com.simplemobiletools.commons.extensions.getFileSignature
|
||||
import com.simplemobiletools.commons.extensions.getTextSize
|
||||
import com.simplemobiletools.commons.extensions.getTimeFormat
|
||||
import com.simplemobiletools.commons.helpers.getFilePlaceholderDrawables
|
||||
@ -25,7 +24,7 @@ import kotlinx.android.synthetic.main.item_file_dir_list.view.*
|
||||
import java.util.*
|
||||
|
||||
class DecompressItemsAdapter(activity: SimpleActivity, var listItems: MutableList<ListItem>, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) :
|
||||
MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
|
||||
MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
|
||||
|
||||
private lateinit var fileDrawable: Drawable
|
||||
private lateinit var folderDrawable: Drawable
|
||||
|
@ -24,13 +24,13 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop
|
||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
|
||||
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
|
||||
import com.bumptech.glide.request.RequestOptions
|
||||
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
||||
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||
import com.simplemobiletools.commons.dialogs.*
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.*
|
||||
import com.simplemobiletools.commons.models.FileDirItem
|
||||
import com.simplemobiletools.commons.models.RadioItem
|
||||
import com.simplemobiletools.commons.views.FastScroller
|
||||
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||
import com.simplemobiletools.filemanager.pro.R
|
||||
import com.simplemobiletools.filemanager.pro.activities.SimpleActivity
|
||||
@ -47,19 +47,19 @@ import kotlinx.android.synthetic.main.item_file_dir_list.view.item_frame
|
||||
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_icon
|
||||
import kotlinx.android.synthetic.main.item_file_dir_list.view.item_name
|
||||
import kotlinx.android.synthetic.main.item_section.view.*
|
||||
import java.io.BufferedInputStream
|
||||
import java.io.Closeable
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.util.*
|
||||
import java.util.zip.ZipEntry
|
||||
import java.util.zip.ZipFile
|
||||
import java.util.zip.ZipInputStream
|
||||
import java.util.zip.ZipOutputStream
|
||||
|
||||
class ItemsAdapter(
|
||||
activity: SimpleActivity, var listItems: MutableList<ListItem>, val listener: ItemOperationsListener?, recyclerView: MyRecyclerView,
|
||||
val isPickMultipleIntent: Boolean, fastScroller: FastScroller?, val swipeRefreshLayout: SwipeRefreshLayout?, itemClick: (Any) -> Unit
|
||||
val isPickMultipleIntent: Boolean, val swipeRefreshLayout: SwipeRefreshLayout?, itemClick: (Any) -> Unit
|
||||
) :
|
||||
MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
|
||||
MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
|
||||
|
||||
private val TYPE_FILE_DIR = 1
|
||||
private val TYPE_SECTION = 2
|
||||
@ -326,16 +326,29 @@ class ItemsAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
private fun addFileUris(path: String, paths: ArrayList<String>) {
|
||||
if (activity.getIsPathDirectory(path)) {
|
||||
val shouldShowHidden = activity.config.shouldShowHidden
|
||||
if (activity.isPathOnOTG(path)) {
|
||||
activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }?.forEach {
|
||||
addFileUris(it.uri.toString(), paths)
|
||||
when {
|
||||
activity.isRestrictedSAFOnlyRoot(path) -> {
|
||||
activity.getAndroidSAFFileItems(path, shouldShowHidden, false) { files ->
|
||||
files.forEach {
|
||||
addFileUris(activity.getAndroidSAFUri(it.path).toString(), paths)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
File(path).listFiles()?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }?.forEach {
|
||||
addFileUris(it.absolutePath, paths)
|
||||
|
||||
activity.isPathOnOTG(path) -> {
|
||||
activity.getDocumentFile(path)?.listFiles()?.filter { if (shouldShowHidden) true else !it.name!!.startsWith(".") }?.forEach {
|
||||
addFileUris(it.uri.toString(), paths)
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
File(path).listFiles()?.filter { if (shouldShowHidden) true else !it.name.startsWith('.') }?.forEach {
|
||||
addFileUris(it.absolutePath, paths)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -390,20 +403,30 @@ class ItemsAdapter(
|
||||
activity.copyMoveFilesTo(files, source, it, isCopyOperation, false, activity.config.shouldShowHidden) {
|
||||
if (!isCopyOperation) {
|
||||
files.forEach { sourceFileDir ->
|
||||
val sourceFile = File(sourceFileDir.path)
|
||||
if (activity.getDoesFilePathExist(source) && activity.getIsPathDirectory(source) &&
|
||||
sourceFile.list()?.isEmpty() == true && sourceFile.getProperSize(true) == 0L && sourceFile.getFileCount(true) == 0
|
||||
) {
|
||||
val sourceFolder = sourceFile.toFileDirItem(activity)
|
||||
activity.deleteFile(sourceFolder, true) {
|
||||
val sourcePath = sourceFileDir.path
|
||||
if (activity.isRestrictedSAFOnlyRoot(sourcePath) && activity.getDoesFilePathExist(sourcePath)) {
|
||||
activity.deleteFile(sourceFileDir, true) {
|
||||
listener?.refreshFragment()
|
||||
activity.runOnUiThread {
|
||||
finishActMode()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
listener?.refreshFragment()
|
||||
finishActMode()
|
||||
val sourceFile = File(sourcePath)
|
||||
if (activity.getDoesFilePathExist(source) && activity.getIsPathDirectory(source) &&
|
||||
sourceFile.list()?.isEmpty() == true && sourceFile.getProperSize(true) == 0L && sourceFile.getFileCount(true) == 0
|
||||
) {
|
||||
val sourceFolder = sourceFile.toFileDirItem(activity)
|
||||
activity.deleteFile(sourceFolder, true) {
|
||||
listener?.refreshFragment()
|
||||
activity.runOnUiThread {
|
||||
finishActMode()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
listener?.refreshFragment()
|
||||
finishActMode()
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -443,22 +466,27 @@ class ItemsAdapter(
|
||||
|
||||
CompressAsDialog(activity, firstPath) {
|
||||
val destination = it
|
||||
activity.handleSAFDialog(firstPath) {
|
||||
if (!it) {
|
||||
return@handleSAFDialog
|
||||
activity.handleAndroidSAFDialog(firstPath) { granted ->
|
||||
if (!granted) {
|
||||
return@handleAndroidSAFDialog
|
||||
}
|
||||
activity.handleSAFDialog(firstPath) {
|
||||
if (!it) {
|
||||
return@handleSAFDialog
|
||||
}
|
||||
|
||||
activity.toast(R.string.compressing)
|
||||
val paths = getSelectedFileDirItems().map { it.path }
|
||||
ensureBackgroundThread {
|
||||
if (compressPaths(paths, destination)) {
|
||||
activity.runOnUiThread {
|
||||
activity.toast(R.string.compression_successful)
|
||||
listener?.refreshFragment()
|
||||
finishActMode()
|
||||
activity.toast(R.string.compressing)
|
||||
val paths = getSelectedFileDirItems().map { it.path }
|
||||
ensureBackgroundThread {
|
||||
if (compressPaths(paths, destination)) {
|
||||
activity.runOnUiThread {
|
||||
activity.toast(R.string.compression_successful)
|
||||
listener?.refreshFragment()
|
||||
finishActMode()
|
||||
}
|
||||
} else {
|
||||
activity.toast(R.string.compressing_failed)
|
||||
}
|
||||
} else {
|
||||
activity.toast(R.string.compressing_failed)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -478,103 +506,108 @@ class ItemsAdapter(
|
||||
}
|
||||
|
||||
val paths = getSelectedFileDirItems().asSequence().map { it.path }.filter { it.isZipFile() }.toList()
|
||||
tryDecompressingPaths(paths) {
|
||||
if (it) {
|
||||
activity.toast(R.string.decompression_successful)
|
||||
ensureBackgroundThread {
|
||||
tryDecompressingPaths(paths) { success ->
|
||||
activity.runOnUiThread {
|
||||
listener?.refreshFragment()
|
||||
finishActMode()
|
||||
if (success) {
|
||||
activity.toast(R.string.decompression_successful)
|
||||
listener?.refreshFragment()
|
||||
finishActMode()
|
||||
} else {
|
||||
activity.toast(R.string.decompressing_failed)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
activity.toast(R.string.decompressing_failed)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun tryDecompressingPaths(sourcePaths: List<String>, callback: (success: Boolean) -> Unit) {
|
||||
sourcePaths.forEach {
|
||||
try {
|
||||
val zipFile = ZipFile(it)
|
||||
val entries = zipFile.entries()
|
||||
val fileDirItems = ArrayList<FileDirItem>()
|
||||
while (entries.hasMoreElements()) {
|
||||
val entry = entries.nextElement()
|
||||
val currPath = if (entry.isDirectory) it else "${it.getParentPath().trimEnd('/')}/${entry.name}"
|
||||
val fileDirItem = FileDirItem(currPath, entry.name, entry.isDirectory, 0, entry.size)
|
||||
fileDirItems.add(fileDirItem)
|
||||
}
|
||||
|
||||
val destinationPath = fileDirItems.first().getParentPath().trimEnd('/')
|
||||
activity.checkConflicts(fileDirItems, destinationPath, 0, LinkedHashMap()) {
|
||||
ensureBackgroundThread {
|
||||
decompressPaths(sourcePaths, it, callback)
|
||||
sourcePaths.forEach { path ->
|
||||
ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path))).use { zipInputStream ->
|
||||
try {
|
||||
val fileDirItems = ArrayList<FileDirItem>()
|
||||
var entry = zipInputStream.nextEntry
|
||||
while (entry != null) {
|
||||
val currPath = if (entry.isDirectory) path else "${path.getParentPath().trimEnd('/')}/${entry.name}"
|
||||
val fileDirItem = FileDirItem(currPath, entry.name, entry.isDirectory, 0, entry.size)
|
||||
fileDirItems.add(fileDirItem)
|
||||
zipInputStream.closeEntry()
|
||||
entry = zipInputStream.nextEntry
|
||||
}
|
||||
zipInputStream.closeEntry()
|
||||
val destinationPath = fileDirItems.first().getParentPath().trimEnd('/')
|
||||
activity.checkConflicts(fileDirItems, destinationPath, 0, LinkedHashMap()) {
|
||||
ensureBackgroundThread {
|
||||
decompressPaths(sourcePaths, it, callback)
|
||||
}
|
||||
}
|
||||
} catch (exception: Exception) {
|
||||
activity.showErrorToast(exception)
|
||||
}
|
||||
} catch (exception: Exception) {
|
||||
activity.showErrorToast(exception)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun decompressPaths(paths: List<String>, conflictResolutions: LinkedHashMap<String, Int>, callback: (success: Boolean) -> Unit) {
|
||||
paths.forEach {
|
||||
try {
|
||||
val zipFile = ZipFile(it)
|
||||
val entries = zipFile.entries()
|
||||
val zipFileName = it.getFilenameFromPath()
|
||||
val newFolderName = zipFileName.subSequence(0, zipFileName.length - 4)
|
||||
while (entries.hasMoreElements()) {
|
||||
val entry = entries.nextElement()
|
||||
val parentPath = it.getParentPath()
|
||||
val newPath = "$parentPath/$newFolderName/${entry.name.trimEnd('/')}"
|
||||
paths.forEach { path ->
|
||||
val zipInputStream = ZipInputStream(BufferedInputStream(activity.getFileInputStreamSync(path)))
|
||||
zipInputStream.use {
|
||||
try {
|
||||
var entry = zipInputStream.nextEntry
|
||||
val zipFileName = path.getFilenameFromPath()
|
||||
val newFolderName = zipFileName.subSequence(0, zipFileName.length - 4)
|
||||
while (entry != null) {
|
||||
val parentPath = path.getParentPath()
|
||||
val newPath = "$parentPath/$newFolderName/${entry.name.trimEnd('/')}"
|
||||
|
||||
val resolution = getConflictResolution(conflictResolutions, newPath)
|
||||
val doesPathExist = activity.getDoesFilePathExist(newPath)
|
||||
if (doesPathExist && resolution == CONFLICT_OVERWRITE) {
|
||||
val fileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), entry.isDirectory)
|
||||
if (activity.getIsPathDirectory(it)) {
|
||||
activity.deleteFolderBg(fileDirItem, false) {
|
||||
if (it) {
|
||||
extractEntry(newPath, entry, zipFile)
|
||||
} else {
|
||||
callback(false)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
activity.deleteFileBg(fileDirItem, false) {
|
||||
if (it) {
|
||||
extractEntry(newPath, entry, zipFile)
|
||||
} else {
|
||||
callback(false)
|
||||
val resolution = getConflictResolution(conflictResolutions, newPath)
|
||||
val doesPathExist = activity.getDoesFilePathExist(newPath)
|
||||
if (doesPathExist && resolution == CONFLICT_OVERWRITE) {
|
||||
val fileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), entry.isDirectory)
|
||||
if (activity.getIsPathDirectory(path)) {
|
||||
activity.deleteFolderBg(fileDirItem, false) {
|
||||
if (it) {
|
||||
extractEntry(newPath, entry, zipInputStream)
|
||||
} else {
|
||||
callback(false)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
activity.deleteFileBg(fileDirItem, false) {
|
||||
if (it) {
|
||||
extractEntry(newPath, entry, zipInputStream)
|
||||
} else {
|
||||
callback(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (!doesPathExist) {
|
||||
extractEntry(newPath, entry, zipInputStream)
|
||||
}
|
||||
} else if (!doesPathExist) {
|
||||
extractEntry(newPath, entry, zipFile)
|
||||
|
||||
zipInputStream.closeEntry()
|
||||
entry = zipInputStream.nextEntry
|
||||
}
|
||||
callback(true)
|
||||
} catch (e: Exception) {
|
||||
activity.showErrorToast(e)
|
||||
callback(false)
|
||||
}
|
||||
callback(true)
|
||||
} catch (e: Exception) {
|
||||
activity.showErrorToast(e)
|
||||
callback(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun extractEntry(newPath: String, entry: ZipEntry, zipFile: ZipFile) {
|
||||
private fun extractEntry(newPath: String, entry: ZipEntry, zipInputStream: ZipInputStream) {
|
||||
if (entry.isDirectory) {
|
||||
if (!activity.createDirectorySync(newPath) && !activity.getDoesFilePathExist(newPath)) {
|
||||
val error = String.format(activity.getString(R.string.could_not_create_file), newPath)
|
||||
activity.showErrorToast(error)
|
||||
}
|
||||
} else {
|
||||
val ins = zipFile.getInputStream(entry)
|
||||
ins.use {
|
||||
val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType())
|
||||
if (fos != null) {
|
||||
ins.copyTo(fos)
|
||||
}
|
||||
val fos = activity.getFileOutputStreamSync(newPath, newPath.getMimeType())
|
||||
if (fos != null) {
|
||||
zipInputStream.copyTo(fos)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -589,44 +622,64 @@ class ItemsAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
private fun compressPaths(sourcePaths: List<String>, targetPath: String): Boolean {
|
||||
val queue = LinkedList<File>()
|
||||
val queue = LinkedList<String>()
|
||||
val fos = activity.getFileOutputStreamSync(targetPath, "application/zip") ?: return false
|
||||
|
||||
val zout = ZipOutputStream(fos)
|
||||
var res: Closeable = fos
|
||||
|
||||
try {
|
||||
sourcePaths.forEach {
|
||||
sourcePaths.forEach { currentPath ->
|
||||
var name: String
|
||||
var mainFile = File(it)
|
||||
val base = mainFile.parentFile.toURI()
|
||||
var mainFilePath = currentPath
|
||||
val base = "${mainFilePath.getParentPath()}/"
|
||||
res = zout
|
||||
queue.push(mainFile)
|
||||
if (activity.getIsPathDirectory(mainFile.absolutePath)) {
|
||||
name = "${mainFile.name.trimEnd('/')}/"
|
||||
queue.push(mainFilePath)
|
||||
if (activity.getIsPathDirectory(mainFilePath)) {
|
||||
name = "${mainFilePath.getFilenameFromPath()}/"
|
||||
zout.putNextEntry(ZipEntry(name))
|
||||
}
|
||||
|
||||
while (!queue.isEmpty()) {
|
||||
mainFile = queue.pop()
|
||||
if (activity.getIsPathDirectory(mainFile.absolutePath)) {
|
||||
for (file in mainFile.listFiles()) {
|
||||
name = base.relativize(file.toURI()).path
|
||||
if (activity.getIsPathDirectory(file.absolutePath)) {
|
||||
queue.push(file)
|
||||
name = "${name.trimEnd('/')}/"
|
||||
zout.putNextEntry(ZipEntry(name))
|
||||
} else {
|
||||
zout.putNextEntry(ZipEntry(name))
|
||||
FileInputStream(file).copyTo(zout)
|
||||
zout.closeEntry()
|
||||
mainFilePath = queue.pop()
|
||||
if (activity.getIsPathDirectory(mainFilePath)) {
|
||||
if (activity.isRestrictedSAFOnlyRoot(mainFilePath)) {
|
||||
activity.getAndroidSAFFileItems(mainFilePath, true) { files ->
|
||||
for (file in files) {
|
||||
name = file.path.relativizeWith(base)
|
||||
if (activity.getIsPathDirectory(file.path)) {
|
||||
queue.push(file.path)
|
||||
name = "${name.trimEnd('/')}/"
|
||||
zout.putNextEntry(ZipEntry(name))
|
||||
} else {
|
||||
zout.putNextEntry(ZipEntry(name))
|
||||
activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
|
||||
zout.closeEntry()
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
val mainFile = File(mainFilePath)
|
||||
for (file in mainFile.listFiles()) {
|
||||
name = file.path.relativizeWith(base)
|
||||
if (activity.getIsPathDirectory(file.absolutePath)) {
|
||||
queue.push(file.absolutePath)
|
||||
name = "${name.trimEnd('/')}/"
|
||||
zout.putNextEntry(ZipEntry(name))
|
||||
} else {
|
||||
zout.putNextEntry(ZipEntry(name))
|
||||
activity.getFileInputStreamSync(file.path)!!.copyTo(zout)
|
||||
zout.closeEntry()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
name = if (base.path == it) it.getFilenameFromPath() else base.relativize(mainFile.toURI()).path
|
||||
name = if (base == currentPath) currentPath.getFilenameFromPath() else mainFilePath.relativizeWith(base)
|
||||
zout.putNextEntry(ZipEntry(name))
|
||||
FileInputStream(mainFile).copyTo(zout)
|
||||
activity.getFileInputStreamSync(mainFilePath)!!.copyTo(zout)
|
||||
zout.closeEntry()
|
||||
}
|
||||
}
|
||||
@ -708,7 +761,6 @@ class ItemsAdapter(
|
||||
textToHighlight = highlightText
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
fastScroller?.measureRecyclerView()
|
||||
}
|
||||
|
||||
fun updateFontSizes() {
|
||||
@ -833,7 +885,9 @@ class ItemsAdapter(
|
||||
path
|
||||
}
|
||||
|
||||
if (hasOTGConnected && itemToLoad is String && activity.isPathOnOTG(itemToLoad) && baseConfig.OTGTreeUri.isNotEmpty() && baseConfig.OTGPartition.isNotEmpty()) {
|
||||
if (activity.isRestrictedSAFOnlyRoot(path)) {
|
||||
itemToLoad = activity.getAndroidSAFUri(path)
|
||||
} else if (hasOTGConnected && itemToLoad is String && activity.isPathOnOTG(itemToLoad) && baseConfig.OTGTreeUri.isNotEmpty() && baseConfig.OTGPartition.isNotEmpty()) {
|
||||
itemToLoad = getOTGPublicPath(itemToLoad)
|
||||
}
|
||||
|
||||
@ -846,4 +900,6 @@ class ItemsAdapter(
|
||||
fileDrawable = resources.getDrawable(R.drawable.ic_file_generic)
|
||||
fileDrawables = getFilePlaceholderDrawables(activity)
|
||||
}
|
||||
|
||||
override fun onChange(position: Int) = listItems.getOrNull(position)?.getBubbleText(activity, dateFormat, timeFormat) ?: ""
|
||||
}
|
||||
|
@ -12,8 +12,10 @@ import com.simplemobiletools.filemanager.pro.extensions.config
|
||||
import kotlinx.android.synthetic.main.item_manage_favorite.view.*
|
||||
import java.util.*
|
||||
|
||||
class ManageFavoritesAdapter(activity: BaseSimpleActivity, var favorites: ArrayList<String>, val listener: RefreshRecyclerViewListener?,
|
||||
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
|
||||
class ManageFavoritesAdapter(
|
||||
activity: BaseSimpleActivity, var favorites: ArrayList<String>, val listener: RefreshRecyclerViewListener?,
|
||||
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit
|
||||
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
|
||||
|
||||
private val config = activity.config
|
||||
|
||||
|
@ -3,6 +3,7 @@ package com.simplemobiletools.filemanager.pro.dialogs
|
||||
import android.view.View
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.isRPlus
|
||||
import com.simplemobiletools.filemanager.pro.R
|
||||
import com.simplemobiletools.filemanager.pro.activities.SimpleActivity
|
||||
import com.simplemobiletools.filemanager.pro.helpers.RootHelpers
|
||||
@ -15,41 +16,62 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
|
||||
|
||||
init {
|
||||
AlertDialog.Builder(activity)
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.create().apply {
|
||||
activity.setupDialogStuff(view, this, R.string.create_new) {
|
||||
showKeyboard(view.item_name)
|
||||
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(View.OnClickListener {
|
||||
val name = view.item_name.value
|
||||
if (name.isEmpty()) {
|
||||
activity.toast(R.string.empty_name)
|
||||
} else if (name.isAValidFilename()) {
|
||||
val newPath = "$path/$name"
|
||||
if (activity.getDoesFilePathExist(newPath)) {
|
||||
activity.toast(R.string.name_taken)
|
||||
return@OnClickListener
|
||||
}
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.create().apply {
|
||||
activity.setupDialogStuff(view, this, R.string.create_new) {
|
||||
showKeyboard(view.item_name)
|
||||
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(View.OnClickListener {
|
||||
val name = view.item_name.value
|
||||
if (name.isEmpty()) {
|
||||
activity.toast(R.string.empty_name)
|
||||
} else if (name.isAValidFilename()) {
|
||||
val newPath = "$path/$name"
|
||||
if (activity.getDoesFilePathExist(newPath)) {
|
||||
activity.toast(R.string.name_taken)
|
||||
return@OnClickListener
|
||||
}
|
||||
|
||||
if (view.dialog_radio_group.checkedRadioButtonId == R.id.dialog_radio_directory) {
|
||||
createDirectory(newPath, this) {
|
||||
callback(it)
|
||||
}
|
||||
} else {
|
||||
createFile(newPath, this) {
|
||||
callback(it)
|
||||
}
|
||||
if (view.dialog_radio_group.checkedRadioButtonId == R.id.dialog_radio_directory) {
|
||||
createDirectory(newPath, this) {
|
||||
callback(it)
|
||||
}
|
||||
} else {
|
||||
activity.toast(R.string.invalid_name)
|
||||
createFile(newPath, this) {
|
||||
callback(it)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
} else {
|
||||
activity.toast(R.string.invalid_name)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun createDirectory(path: String, alertDialog: AlertDialog, callback: (Boolean) -> Unit) {
|
||||
when {
|
||||
isRPlus() || path.startsWith(activity.internalStoragePath, true) -> {
|
||||
if (activity.isRestrictedSAFOnlyRoot(path)) {
|
||||
activity.handleAndroidSAFDialog(path) {
|
||||
if (!it) {
|
||||
callback(false)
|
||||
return@handleAndroidSAFDialog
|
||||
}
|
||||
if (activity.createAndroidSAFDirectory(path)) {
|
||||
success(alertDialog)
|
||||
} else {
|
||||
val error = String.format(activity.getString(R.string.could_not_create_folder), path)
|
||||
activity.showErrorToast(error)
|
||||
callback(false)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (File(path).mkdirs()) {
|
||||
success(alertDialog)
|
||||
}
|
||||
}
|
||||
}
|
||||
activity.needsStupidWritePermissions(path) -> activity.handleSAFDialog(path) {
|
||||
if (!it) {
|
||||
return@handleSAFDialog
|
||||
@ -65,11 +87,6 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
|
||||
documentFile.createDirectory(path.getFilenameFromPath())
|
||||
success(alertDialog)
|
||||
}
|
||||
path.startsWith(activity.internalStoragePath, true) -> {
|
||||
if (File(path).mkdirs()) {
|
||||
success(alertDialog)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
RootHelpers(activity).createFileFolder(path, false) {
|
||||
if (it) {
|
||||
@ -85,6 +102,22 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
|
||||
private fun createFile(path: String, alertDialog: AlertDialog, callback: (Boolean) -> Unit) {
|
||||
try {
|
||||
when {
|
||||
activity.isRestrictedSAFOnlyRoot(path) -> {
|
||||
activity.handleAndroidSAFDialog(path) {
|
||||
if (!it) {
|
||||
callback(false)
|
||||
return@handleAndroidSAFDialog
|
||||
}
|
||||
if (activity.createAndroidSAFFile(path)) {
|
||||
success(alertDialog)
|
||||
} else {
|
||||
val error = String.format(activity.getString(R.string.could_not_create_file), path)
|
||||
activity.showErrorToast(error)
|
||||
callback(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
activity.needsStupidWritePermissions(path) -> {
|
||||
activity.handleSAFDialog(path) {
|
||||
if (!it) {
|
||||
@ -102,7 +135,8 @@ class CreateNewItemDialog(val activity: SimpleActivity, val path: String, val ca
|
||||
success(alertDialog)
|
||||
}
|
||||
}
|
||||
path.startsWith(activity.internalStoragePath, true) -> {
|
||||
|
||||
isRPlus() || path.startsWith(activity.internalStoragePath, true) -> {
|
||||
if (File(path).createNewFile()) {
|
||||
success(alertDialog)
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.simplemobiletools.filemanager.pro.fragments
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.os.Parcelable
|
||||
import android.util.AttributeSet
|
||||
@ -51,7 +52,6 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
|
||||
override fun onResume(textColor: Int, primaryColor: Int) {
|
||||
context!!.updateTextColors(this)
|
||||
items_fastscroller.updatePrimaryColor()
|
||||
storedItems = ArrayList()
|
||||
getRecyclerAdapter()?.apply {
|
||||
updatePrimaryColor(primaryColor)
|
||||
@ -59,14 +59,19 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
initDrawables()
|
||||
}
|
||||
|
||||
breadcrumbs.updateColor(textColor)
|
||||
items_fastscroller.updateBubbleColors()
|
||||
items_fastscroller.updateColors(primaryColor, primaryColor.getContrastColor())
|
||||
|
||||
if (currentPath != "") {
|
||||
breadcrumbs.updateColor(textColor)
|
||||
}
|
||||
items_swipe_refresh.isEnabled = activity?.config?.enablePullToRefresh != false
|
||||
}
|
||||
|
||||
override fun setupFontSize() {
|
||||
getRecyclerAdapter()?.updateFontSizes()
|
||||
breadcrumbs.updateFontSize(context!!.getTextSize())
|
||||
if (currentPath != "") {
|
||||
breadcrumbs.updateFontSize(context!!.getTextSize())
|
||||
}
|
||||
}
|
||||
|
||||
override fun setupDateTimeFormat() {
|
||||
@ -121,10 +126,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
breadcrumbs.updateFontSize(context!!.getTextSize())
|
||||
}
|
||||
|
||||
ItemsAdapter(
|
||||
activity as SimpleActivity, storedItems, this, items_list, isPickMultipleIntent, items_fastscroller,
|
||||
items_swipe_refresh
|
||||
) {
|
||||
ItemsAdapter(activity as SimpleActivity, storedItems, this, items_list, isPickMultipleIntent, items_swipe_refresh) {
|
||||
if ((it as? ListItem)?.isSectionTitle == true) {
|
||||
openDirectory(it.mPath)
|
||||
searchClosed()
|
||||
@ -140,18 +142,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
items_list.scheduleLayoutAnimation()
|
||||
}
|
||||
|
||||
val dateFormat = context!!.config.dateFormat
|
||||
val timeFormat = context!!.getTimeFormat()
|
||||
items_fastscroller.setViews(items_list, items_swipe_refresh) {
|
||||
val listItem = getRecyclerAdapter()?.listItems?.getOrNull(it)
|
||||
items_fastscroller.updateBubbleText(listItem?.getBubbleText(context, dateFormat, timeFormat) ?: "")
|
||||
}
|
||||
|
||||
getRecyclerLayoutManager().onRestoreInstanceState(scrollStates[currentPath])
|
||||
items_list.onGlobalLayout {
|
||||
items_fastscroller.setScrollToY(items_list.computeVerticalScrollOffset())
|
||||
calculateContentHeight(storedItems)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -159,12 +150,24 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
|
||||
private fun getRecyclerLayoutManager() = (items_list.layoutManager as MyGridLayoutManager)
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
private fun getItems(path: String, callback: (originalPath: String, items: ArrayList<ListItem>) -> Unit) {
|
||||
skipItemUpdating = false
|
||||
ensureBackgroundThread {
|
||||
if (activity?.isDestroyed == false && activity?.isFinishing == false) {
|
||||
val config = context!!.config
|
||||
if (context!!.isPathOnOTG(path) && config.OTGTreeUri.isNotEmpty()) {
|
||||
if (context.isRestrictedSAFOnlyRoot(path)) {
|
||||
activity?.handleAndroidSAFDialog(path) {
|
||||
if (!it) {
|
||||
activity?.toast(R.string.no_storage_permissions)
|
||||
return@handleAndroidSAFDialog
|
||||
}
|
||||
val getProperChildCount = context!!.config.getFolderViewType(currentPath) == VIEW_TYPE_LIST
|
||||
context.getAndroidSAFFileItems(path, context.config.shouldShowHidden, getProperChildCount) { fileItems ->
|
||||
callback(path, getListItemsFromFileDirItems(fileItems))
|
||||
}
|
||||
}
|
||||
} else if (context!!.isPathOnOTG(path) && config.OTGTreeUri.isNotEmpty()) {
|
||||
val getProperFileSize = context!!.config.getFolderSorting(currentPath) and SORT_BY_SIZE != 0
|
||||
context!!.getOTGItems(path, config.shouldShowHidden, getProperFileSize) {
|
||||
callback(path, getListItemsFromFileDirItems(it))
|
||||
@ -203,7 +206,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
if (getProperChildCount) {
|
||||
items.filter { it.mIsDirectory }.forEach {
|
||||
if (context != null) {
|
||||
val childrenCount = it.getDirectChildrenCount(context!!, showHidden)
|
||||
val childrenCount = it.getDirectChildrenCount(activity as BaseSimpleActivity, showHidden)
|
||||
if (childrenCount != 0) {
|
||||
activity?.runOnUiThread {
|
||||
getRecyclerAdapter()?.updateChildCount(it.mPath, childrenCount)
|
||||
@ -223,7 +226,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
|
||||
var lastModified = lastModifieds.remove(curPath)
|
||||
val isDirectory = if (lastModified != null) false else file.isDirectory
|
||||
val children = if (isDirectory && getProperChildCount) file.getDirectChildrenCount(showHidden) else 0
|
||||
val children = if (isDirectory && getProperChildCount) file.getDirectChildrenCount(context, showHidden) else 0
|
||||
val size = if (isDirectory) {
|
||||
if (isSortingBySize) {
|
||||
file.getProperSize(showHidden)
|
||||
@ -275,13 +278,13 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
|
||||
when {
|
||||
searchText.isEmpty() -> {
|
||||
items_list.beVisible()
|
||||
items_fastscroller.beVisible()
|
||||
getRecyclerAdapter()?.updateItems(storedItems)
|
||||
items_placeholder.beGone()
|
||||
items_placeholder_2.beGone()
|
||||
}
|
||||
searchText.length == 1 -> {
|
||||
items_list.beGone()
|
||||
items_fastscroller.beGone()
|
||||
items_placeholder.beVisible()
|
||||
items_placeholder_2.beVisible()
|
||||
}
|
||||
@ -318,14 +321,9 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
|
||||
activity?.runOnUiThread {
|
||||
getRecyclerAdapter()?.updateItems(listItems, text)
|
||||
items_list.beVisibleIf(listItems.isNotEmpty())
|
||||
items_fastscroller.beVisibleIf(listItems.isNotEmpty())
|
||||
items_placeholder.beVisibleIf(listItems.isEmpty())
|
||||
items_placeholder_2.beGone()
|
||||
|
||||
items_list.onGlobalLayout {
|
||||
items_fastscroller.setScrollToY(items_list.computeVerticalScrollOffset())
|
||||
calculateContentHeight(listItems)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -377,13 +375,13 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
isSearchOpen = false
|
||||
if (!skipItemUpdating) {
|
||||
getRecyclerAdapter()?.updateItems(storedItems)
|
||||
calculateContentHeight(storedItems)
|
||||
}
|
||||
|
||||
skipItemUpdating = false
|
||||
lastSearchedText = ""
|
||||
|
||||
items_swipe_refresh.isEnabled = activity?.config?.enablePullToRefresh != false
|
||||
items_list.beVisible()
|
||||
items_fastscroller.beVisible()
|
||||
items_placeholder.beGone()
|
||||
items_placeholder_2.beGone()
|
||||
}
|
||||
@ -458,14 +456,6 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
}
|
||||
}
|
||||
|
||||
private fun calculateContentHeight(items: MutableList<ListItem>) {
|
||||
val layoutManager = items_list.layoutManager as MyGridLayoutManager
|
||||
val thumbnailHeight = layoutManager.getChildAt(0)?.height ?: 0
|
||||
val fullHeight = ((items.size - 1) / layoutManager.spanCount + 1) * thumbnailHeight
|
||||
items_fastscroller.setContentHeight(fullHeight)
|
||||
items_fastscroller.setScrollToY(items_list.computeVerticalScrollOffset())
|
||||
}
|
||||
|
||||
override fun increaseColumnCount() {
|
||||
if (currentViewType == VIEW_TYPE_GRID) {
|
||||
context?.config?.fileColumnCnt = ++(items_list.layoutManager as MyGridLayoutManager).spanCount
|
||||
@ -484,7 +474,6 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
|
||||
activity?.invalidateOptionsMenu()
|
||||
getRecyclerAdapter()?.apply {
|
||||
notifyItemRangeChanged(0, listItems.size)
|
||||
calculateContentHeight(listItems)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,14 +1,14 @@
|
||||
package com.simplemobiletools.filemanager.pro.fragments
|
||||
|
||||
import android.content.ContentResolver
|
||||
import android.content.Context
|
||||
import android.provider.MediaStore.Files
|
||||
import android.provider.MediaStore.Files.FileColumns
|
||||
import android.util.AttributeSet
|
||||
import androidx.core.os.bundleOf
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
|
||||
import com.simplemobiletools.commons.helpers.VIEW_TYPE_LIST
|
||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||
import com.simplemobiletools.commons.helpers.*
|
||||
import com.simplemobiletools.commons.models.FileDirItem
|
||||
import com.simplemobiletools.commons.views.MyGridLayoutManager
|
||||
import com.simplemobiletools.filemanager.pro.R
|
||||
@ -24,6 +24,8 @@ import kotlinx.android.synthetic.main.recents_fragment.view.*
|
||||
import java.util.*
|
||||
|
||||
class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), ItemOperationsListener {
|
||||
private val RECENTS_LIMIT = 50
|
||||
|
||||
override fun setupFragment(activity: SimpleActivity) {
|
||||
if (this.activity == null) {
|
||||
this.activity = activity
|
||||
@ -53,7 +55,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
return
|
||||
}
|
||||
|
||||
ItemsAdapter(activity as SimpleActivity, recents, this, recents_list, isPickMultipleIntent, null, recents_swipe_refresh) {
|
||||
ItemsAdapter(activity as SimpleActivity, recents, this, recents_list, isPickMultipleIntent, recents_swipe_refresh) {
|
||||
clickedPath((it as FileDirItem).path)
|
||||
}.apply {
|
||||
recents_list.adapter = this
|
||||
@ -122,17 +124,33 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
|
||||
FileColumns.SIZE
|
||||
)
|
||||
|
||||
val sortOrder = "${FileColumns.DATE_MODIFIED} DESC LIMIT 50"
|
||||
|
||||
context?.queryCursor(uri, projection, sortOrder = sortOrder, showErrors = true) { cursor ->
|
||||
val path = cursor.getStringValue(FileColumns.DATA)
|
||||
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
|
||||
val size = cursor.getLongValue(FileColumns.SIZE)
|
||||
val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000
|
||||
val fileDirItem = ListItem(path, name, false, 0, size, modified, false)
|
||||
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) {
|
||||
listItems.add(fileDirItem)
|
||||
try {
|
||||
if (isOreoPlus()) {
|
||||
val queryArgs = bundleOf(
|
||||
ContentResolver.QUERY_ARG_LIMIT to RECENTS_LIMIT,
|
||||
ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(FileColumns.DATE_MODIFIED),
|
||||
ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
|
||||
)
|
||||
context?.contentResolver?.query(uri, projection, queryArgs, null)
|
||||
} else {
|
||||
val sortOrder = "${FileColumns.DATE_MODIFIED} DESC LIMIT $RECENTS_LIMIT"
|
||||
context?.contentResolver?.query(uri, projection, null, null, sortOrder)
|
||||
}?.use { cursor ->
|
||||
if (cursor.moveToFirst()) {
|
||||
do {
|
||||
val path = cursor.getStringValue(FileColumns.DATA)
|
||||
val name = cursor.getStringValue(FileColumns.DISPLAY_NAME) ?: path.getFilenameFromPath()
|
||||
val size = cursor.getLongValue(FileColumns.SIZE)
|
||||
val modified = cursor.getLongValue(FileColumns.DATE_MODIFIED) * 1000
|
||||
val fileDirItem = ListItem(path, name, false, 0, size, modified, false)
|
||||
if ((showHidden || !name.startsWith(".")) && activity?.getDoesFilePathExist(path) == true) {
|
||||
listItems.add(fileDirItem)
|
||||
}
|
||||
} while (cursor.moveToNext())
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
activity?.showErrorToast(e)
|
||||
}
|
||||
|
||||
activity?.runOnUiThread {
|
||||
|
@ -1,9 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M19,12v7L5,19v-7L3,12v7c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2zM13,12.67l2.59,-2.58L17,11.5l-5,5 -5,-5 1.41,-1.41L11,12.67L11,3h2z" />
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M16.3 10.3c-0.39-0.39-1.01-0.39-1.4 0L13 12.2V3c0-0.55-0.45-1-1-1s-1 0.45-1 1v9.2l-1.9-1.9c-0.39-0.39-1.01-0.39-1.4 0-0.39 0.39-0.39 1.01 0 1.4l3.59 3.59c0.39 0.39 1.02 0.39 1.41 0l3.6-3.59c0.39-0.39 0.39-1.01 0-1.4zM5 20v-7c0-0.55-0.45-1-1-1s-1 0.45-1 1v7c0 1.1 0.9 2 2 2h14c1.1 0 2-0.9 2-2v-7c0-0.55-0.45-1-1-1s-1 0.45-1 1v7z" android:fillColor="#FFFFFFFF"/>
|
||||
</vector>
|
||||
|
@ -1,9 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" />
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M10 19v-5h4v5c0 0.55 0.45 1 1 1h3c0.55 0 1-0.45 1-1v-7h1.7c0.46 0 0.68-0.57 0.33-0.87L12.67 3.6c-0.38-0.34-0.96-0.34-1.34 0l-8.36 7.53C2.63 11.43 2.84 12 3.3 12H5v7c0 0.55 0.45 1 1 1h3c0.55 0 1-0.45 1-1z" android:fillColor="#FFFFFFFF"/>
|
||||
</vector>
|
||||
|
@ -1,9 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M2,20h20v-4L2,16v4zM4,17h2v2L4,19v-2zM2,4v4h20L22,4L2,4zM6,7L4,7L4,5h2v2zM2,14h20v-4L2,10v4zM4,11h2v2L4,13v-2z" />
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M4 20h16c1.1 0 2-0.9 2-2s-0.9-2-2-2H4c-1.1 0-2 0.9-2 2s0.9 2 2 2zm0-3h2v2H4v-2zM2 6c0 1.1 0.9 2 2 2h16c1.1 0 2-0.9 2-2s-0.9-2-2-2H4C2.9 4 2 4.9 2 6zm4 1H4V5h2v2zm-2 7h16c1.1 0 2-0.9 2-2s-0.9-2-2-2H4c-1.1 0-2 0.9-2 2s0.9 2 2 2zm0-3h2v2H4v-2z" android:fillColor="#FFFFFFFF"/>
|
||||
</vector>
|
||||
|
@ -35,24 +35,20 @@
|
||||
android:textStyle="italic"
|
||||
android:visibility="gone" />
|
||||
|
||||
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||
android:id="@+id/mimetypes_list"
|
||||
<com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
||||
android:id="@+id/mimetypes_fastscroller"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:layoutAnimation="@anim/layout_animation"
|
||||
android:paddingTop="@dimen/small_margin"
|
||||
android:scrollbars="none"
|
||||
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager" />
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.simplemobiletools.commons.views.FastScroller
|
||||
android:id="@+id/items_fastscroller"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:paddingStart="@dimen/normal_margin">
|
||||
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||
android:id="@+id/mimetypes_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:layoutAnimation="@anim/layout_animation"
|
||||
android:paddingTop="@dimen/small_margin"
|
||||
android:scrollbars="none"
|
||||
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager" />
|
||||
|
||||
<include layout="@layout/fastscroller_handle_vertical" />
|
||||
|
||||
</com.simplemobiletools.commons.views.FastScroller>
|
||||
</com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
|
||||
</RelativeLayout>
|
||||
|
@ -60,27 +60,22 @@
|
||||
android:textStyle="italic"
|
||||
android:visibility="gone" />
|
||||
|
||||
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||
android:id="@+id/items_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_below="@+id/breadcrumbs"
|
||||
android:clipToPadding="false"
|
||||
android:layoutAnimation="@anim/layout_animation"
|
||||
android:scrollbars="none"
|
||||
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager" />
|
||||
|
||||
<com.simplemobiletools.commons.views.FastScroller
|
||||
<com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
||||
android:id="@+id/items_fastscroller"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_below="@+id/breadcrumbs"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:paddingStart="@dimen/normal_margin">
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/breadcrumbs">
|
||||
|
||||
<include layout="@layout/fastscroller_handle_vertical" />
|
||||
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||
android:id="@+id/items_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:layoutAnimation="@anim/layout_animation"
|
||||
android:scrollbars="none"
|
||||
app:layoutManager="com.simplemobiletools.commons.views.MyGridLayoutManager" />
|
||||
|
||||
</com.simplemobiletools.commons.views.FastScroller>
|
||||
</com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
|
||||
</RelativeLayout>
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
|
||||
|
@ -13,12 +13,12 @@
|
||||
app:showAsAction="always"/>
|
||||
<item
|
||||
android:id="@+id/cab_properties"
|
||||
android:icon="@drawable/ic_info"
|
||||
android:icon="@drawable/ic_info_vector"
|
||||
android:title="@string/properties"
|
||||
app:showAsAction="always"/>
|
||||
<item
|
||||
android:id="@+id/cab_rename"
|
||||
android:icon="@drawable/ic_rename_new"
|
||||
android:icon="@drawable/ic_rename_vector"
|
||||
android:title="@string/rename"
|
||||
app:showAsAction="always"/>
|
||||
<item
|
||||
@ -28,7 +28,7 @@
|
||||
app:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/cab_hide"
|
||||
android:icon="@drawable/ic_hide"
|
||||
android:icon="@drawable/ic_hide_vector"
|
||||
android:title="@string/hide"
|
||||
app:showAsAction="ifRoom"/>
|
||||
<item
|
||||
|
@ -24,12 +24,12 @@
|
||||
app:showAsAction="ifRoom" />
|
||||
<item
|
||||
android:id="@+id/add_favorite"
|
||||
android:icon="@drawable/ic_star_off_vector"
|
||||
android:icon="@drawable/ic_star_outline_vector"
|
||||
android:title="@string/add_to_favorites"
|
||||
app:showAsAction="ifRoom" />
|
||||
<item
|
||||
android:id="@+id/remove_favorite"
|
||||
android:icon="@drawable/ic_star_on_vector"
|
||||
android:icon="@drawable/ic_star_vector"
|
||||
android:title="@string/remove_from_favorites"
|
||||
app:showAsAction="ifRoom" />
|
||||
<item
|
||||
@ -64,10 +64,12 @@
|
||||
app:showAsAction="never" />
|
||||
<item
|
||||
android:id="@+id/settings"
|
||||
android:icon="@drawable/ic_settings_cog_vector"
|
||||
android:title="@string/settings"
|
||||
app:showAsAction="never" />
|
||||
app:showAsAction="ifRoom" />
|
||||
<item
|
||||
android:id="@+id/about"
|
||||
android:icon="@drawable/ic_info_vector"
|
||||
android:title="@string/about"
|
||||
app:showAsAction="never" />
|
||||
app:showAsAction="ifRoom" />
|
||||
</menu>
|
||||
|
@ -9,11 +9,11 @@
|
||||
<string name="copy_path">نسخ المسار الى الحافظة</string>
|
||||
<string name="path_copied">تم نسخ المسار</string>
|
||||
<string name="select_audio_file">الرجاء تحديد ملف صوتي</string>
|
||||
<string name="search_folder">Search folder</string>
|
||||
<string name="rooted_device_only">This operation works only on rooted devices</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
|
||||
<string name="search_folder">مجلد البحث</string>
|
||||
<string name="rooted_device_only">تعمل هذه العملية فقط على الأجهزة المتجذرة</string>
|
||||
<string name="recents">الأحدث</string>
|
||||
<string name="show_recents">إظهار الأحدث</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Open as</string>
|
||||
<string name="text_file">Text file</string>
|
||||
@ -21,7 +21,6 @@
|
||||
<string name="audio_file">Audio file</string>
|
||||
<string name="video_file">Video file</string>
|
||||
<string name="other_file">Other file</string>
|
||||
|
||||
<!-- Compression -->
|
||||
<string name="compress">ضغط</string>
|
||||
<string name="decompress">فك الضغط</string>
|
||||
@ -32,74 +31,34 @@
|
||||
<string name="decompression_successful">نجح التفكيك</string>
|
||||
<string name="compressing_failed">أخفق الضغط</string>
|
||||
<string name="decompressing_failed">أخفق إلغاء الضغط</string>
|
||||
|
||||
<!-- Favorites -->
|
||||
<string name="manage_favorites">إدارة المفضلة</string>
|
||||
<string name="go_to_favorite">الذهاب الى المفضلة</string>
|
||||
<string name="favorites_activity_placeholder">يمكنك إضافة المجلدات المستخدمة بشكل متكرر إلى المفضلة لسهولة الوصول إليها من أي مكان.</string>
|
||||
|
||||
<!-- File Editor -->
|
||||
<string name="file_editor">محرر الملفات</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="storage_analysis">تحليل التخزين</string>
|
||||
<string name="images">الصور</string>
|
||||
<string name="videos">الفيديوات</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="archives">Archives</string>
|
||||
<string name="others">Others</string>
|
||||
<string name="archives">الأرشيف</string>
|
||||
<string name="others">الاخرين</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
|
||||
<string name="total_storage">إجمالي مساحة التخزين: %s</string>
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">تفعيل الدخول الى مسار الروت</string>
|
||||
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
|
||||
|
||||
<string name="press_back_twice">تتطلب الضغط على رجوع مرتين لمغادرة التطبيق</string>
|
||||
<!-- Strings displayed only on Google Play Store. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
<string name="app_title">Simple File Manager Pro - Manage files easy & fast</string>
|
||||
<string name="app_title">مدير الملفات البسيط برو -- إدارة الملفات سهلة وسريعة</string>
|
||||
<!-- Short description has to have less than 80 chars -->
|
||||
<string name="app_short_description">Easy app for managing your files without ads, respecting your privacy & security</string>
|
||||
<string name="app_long_description">
|
||||
A lightweight quick file manager for everyday use. It offers a userful search functionality, you can also customize the home folder and select favorite folders for quick access.
|
||||
|
||||
The app contains multiple powerful security related functions, like password protecting hidden items, deleting files, or the whole app. You can choose between using a pattern, pin, or a fingerprint to keep your data private.
|
||||
|
||||
This modern file organizer supports fast browsing of root files, SD cards and USB devices.
|
||||
|
||||
To keep your productive, it obviously has all the standard file operations like rename, copy, move, delete, share etc. It can also be used for saving up some storage, since it allows compressing and decompressing too. You can easily create new files or folders if you wish so.
|
||||
|
||||
You can obviously select sorting by multiple different values, toggle between ascending and descending, or use a folder specific sorting.
|
||||
|
||||
By just a few clicks you can also check file or folder properties, which shows various fields like the file size, date of the last modification, or EXIF values like the creation date, camera model at photos etc.
|
||||
|
||||
To get a file or folders path quickly, you can easily select it by long pressing and copying it in the clipboard.
|
||||
|
||||
You can create handy desktop shortcuts for accessing your favorite items quickly.
|
||||
|
||||
It contains a light file editor that you can use either for printing documents, editing them, or read easily with using zoom gestures, whenever needed.
|
||||
|
||||
It comes with material design and dark theme by default, provides great user experience for easy usage. The lack of internet access gives you more privacy, security and stability than other apps.
|
||||
|
||||
Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
|
||||
|
||||
<b>Check out the full suite of Simple Tools here:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Standalone website of Simple File Manager Pro:</b>
|
||||
https://www.simplemobiletools.com/filemanager
|
||||
|
||||
<b>Facebook:</b>
|
||||
https://www.facebook.com/simplemobiletools
|
||||
|
||||
<b>Reddit:</b>
|
||||
https://www.reddit.com/r/SimpleMobileTools
|
||||
</string>
|
||||
|
||||
<string name="app_short_description">التطبيق السهل لإدارة الملفات الخاصة بك دون إعلانات، واحترام خصوصيتك والأمن</string>
|
||||
<string name="app_long_description"> مدير ملفات سريع خفيف الوزن للاستخدام اليومي. وهو يوفر وظيفة بحث المستخدم، يمكنك أيضا تخصيص المجلد الرئيسي وتحديد المجلدات المفضلة للوصول السريع. يحتوي التطبيق على العديد من الوظائف الأمنية القوية ذات الصلة، مثل كلمة المرور لحماية العناصر المخفية، وحذف الملفات، أو التطبيق بأكمله. يمكنك الاختيار بين استخدام نمط أو دبوس أو بصمة إصبع للحفاظ على خصوصية بياناتك. يدعم منظم الملفات الحديث هذا التصفح السريع للملفات الجذرية وبطاقات SD وأجهزة USB. للحفاظ على الإنتاجية الخاصة بك، فمن الواضح أن لديها كل عمليات الملفات القياسية مثل إعادة تسمية، نسخ، نقل، حذف، مشاركة الخ. ويمكن أيضا أن تستخدم لتوفير بعض التخزين، لأنه يسمح ضغط وفك الضغط أيضا. يمكنك بسهولة إنشاء ملفات أو مجلدات جديدة إذا كنت ترغب في ذلك. من الواضح أنه يمكنك تحديد الفرز حسب قيم مختلفة متعددة أو التبديل بين تصاعدي و تنازلي أو استخدام فرز مجلد معين. من خلال عدد قليل من النقرات يمكنك أيضا التحقق من خصائص الملف أو المجلد ، والتي تظهر حقولا مختلفة مثل حجم الملف ، وتاريخ التعديل الأخير ، أو قيم EXIF مثل تاريخ الإنشاء ، طراز الكاميرا في الصور وما إلى ذلك. للحصول على مسار ملف أو مجلدات بسرعة، يمكنك تحديده بسهولة عن طريق الضغط عليه ونسخه لفترة طويلة في الحافظة. يمكنك إنشاء اختصارات سطح المكتب مفيد للوصول إلى العناصر المفضلة لديك بسرعة. وهو يحتوي على محرر ملفات خفيف يمكنك استخدامه إما لطباعة المستندات أو تحريرها أو قراءتها بسهولة باستخدام إيماءات التكبير/ التصغير، كلما دعت الحاجة. لأنه يأتي مع تصميم المواد وموضوع الظلام افتراضيا، ويوفر تجربة مستخدم كبيرة لسهولة الاستخدام. عدم الوصول إلى الإنترنت يمنحك المزيد من الخصوصية والأمان والاستقرار أكثر من التطبيقات الأخرى. لا يحتوي على إعلانات أو أذونات غير ضرورية. فمن مفتوحة المصدر تماما، ويوفر ألوان قابلة للتخصيص. <b> تحقق من مجموعة كاملة من أدوات بسيطة هنا:</b> https://www.simplemobiletools.com <b>موقع مستقل من مدير الملفات البسيطة برو:</b> https://www.simplemobiletools.com/filemanager <b>Facebook:</b> https://www.facebook.com/simplemobiletools <b>Reddit:</b> https://www.reddit.com/r/SimpleMobileTools </string>
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
||||
</resources>
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Bu əməliyyat yalnız root\'lu cihazlarda işləyir</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Open as</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Tato operace funguje pouze u rootnutých zařízení</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Otevřít jako</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Dyw\'r weithred hon ond yn gweithio ar ddyfeisiau wedi\'u gwreddio</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Agor fel</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Denne funkton virker kun på rootede enheder</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Åbn som</string>
|
||||
|
@ -8,12 +8,12 @@
|
||||
<string name="home_folder_updated">Start-Verzeichnis aktualisiert</string>
|
||||
<string name="copy_path">Kopiere Pfad in die Zwischenablage</string>
|
||||
<string name="path_copied">Pfad kopiert</string>
|
||||
<string name="select_audio_file">Bitte wähle eine Audiodatei aus.</string>
|
||||
<string name="select_audio_file">Bitte wähle eine Audiodatei aus</string>
|
||||
<string name="search_folder">Ordner suchen</string>
|
||||
<string name="rooted_device_only">Dies kann nur auf gerooteten Geräten durchgeführt werden.</string>
|
||||
<string name="rooted_device_only">Dies kann nur auf gerooteten Geräten durchgeführt werden</string>
|
||||
<string name="recents">Neueste</string>
|
||||
<string name="show_recents">Zeige die Neuesten</string>
|
||||
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Öffnen als</string>
|
||||
<string name="text_file">Text-Datei</string>
|
||||
@ -21,47 +21,41 @@
|
||||
<string name="audio_file">Audio-Datei</string>
|
||||
<string name="video_file">Video-Datei</string>
|
||||
<string name="other_file">Anderer Dateityp</string>
|
||||
|
||||
<!-- Compression -->
|
||||
<string name="compress">Komprimieren</string>
|
||||
<string name="decompress">Entpacken</string>
|
||||
<string name="compress_as">Komprimieren als</string>
|
||||
<string name="compressing">Komprimiere…</string>
|
||||
<string name="decompressing">Entpacke…</string>
|
||||
<string name="compression_successful">Komprimieren erfolgreich.</string>
|
||||
<string name="decompression_successful">Entpacken erfolgreich.</string>
|
||||
<string name="compressing_failed">Komprimieren fehlgeschlagen.</string>
|
||||
<string name="decompressing_failed">Entpacken fehlgeschlagen.</string>
|
||||
|
||||
<string name="compression_successful">Komprimieren erfolgreich</string>
|
||||
<string name="decompression_successful">Entpacken erfolgreich</string>
|
||||
<string name="compressing_failed">Komprimieren fehlgeschlagen</string>
|
||||
<string name="decompressing_failed">Entpacken fehlgeschlagen</string>
|
||||
<!-- Favorites -->
|
||||
<string name="manage_favorites">Verwalte Favoriten</string>
|
||||
<string name="go_to_favorite">Gehe zu Favoriten</string>
|
||||
<string name="favorites_activity_placeholder">Du kannst häufig benutzte Ordner für einen einfacheren Zugriff zu den Favoriten hinzufügen</string>
|
||||
|
||||
<string name="favorites_activity_placeholder">Du kannst häufig benutzte Ordner für einen einfacheren Zugriff zu den Favoriten hinzufügen.</string>
|
||||
<!-- File Editor -->
|
||||
<string name="file_editor">Dateieditor</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="storage_analysis">Speicheranalyse</string>
|
||||
<string name="images">Bilder</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="archives">Archives</string>
|
||||
<string name="others">Others</string>
|
||||
<string name="archives">Archiv</string>
|
||||
<string name="others">Andere</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
|
||||
<string name="total_storage">Gesamter Speicherplatz: %s</string>
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">Root-Zugriff erlauben</string>
|
||||
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
|
||||
|
||||
<string name="press_back_twice">Zweimaliges Drücken von Zurück ist erforderlich, um die Anwendung zu verlassen</string>
|
||||
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
<string name="app_title">Simple File Manager Pro - Manage files easy & fast</string>
|
||||
<string name="app_title">Simple File Manager Pro - Dateien einfach und schnell verwalten</string>
|
||||
<!-- Short description has to have less than 80 chars -->
|
||||
<string name="app_short_description">Easy app for managing your files without ads, respecting your privacy & security</string>
|
||||
<string name="app_short_description">Einfache Anwendung zur Verwaltung Ihrer Dateien ohne Werbung, unter Wahrung Ihrer Privatsphäre und Sicherheit</string>
|
||||
<string name="app_long_description">
|
||||
Ein leichter, schneller Dateimanager für den täglichen Gebrauch. Es bietet eine nützliche Suchfunktion; zudem kannst du den Home-Ordner anpassen und Lieblingsordner für den schnellen Zugriff konfigurieren.
|
||||
|
||||
@ -97,9 +91,8 @@
|
||||
<b>Reddit:</b>
|
||||
https://www.reddit.com/r/SimpleMobileTools
|
||||
</string>
|
||||
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
||||
</resources>
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Αυτό το χαρακτηριστικό λειτουργεί μόνο σε συσκευές με πρόσβαση στον ριζικό κατάλογο.</string>
|
||||
<string name="recents">Πρόσφατα</string>
|
||||
<string name="show_recents">Εμφάνιση προσφάτων</string>
|
||||
<string name="access_storage_prompt">Παρακαλώ παραχωρήστε την πρόσβαση σε όλα τα αρχεία σας, γιατί χωρίς αυτή μπορεί να μην λειτουργεί καλά.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Άνοιγμα ως</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Esta operación solo funciona en dispositivos rooteados</string>
|
||||
<string name="recents">Recientes</string>
|
||||
<string name="show_recents">Mostrar recientes</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Abrir como</string>
|
||||
@ -50,7 +51,7 @@
|
||||
<string name="downloads">Descargas</string>
|
||||
<string name="archives">Archivos</string>
|
||||
<string name="others">Otros</string>
|
||||
<string name="storage_free">gratis</string>
|
||||
<string name="storage_free">libre</string>
|
||||
<string name="total_storage">Almacenamiento total: %s</string>
|
||||
|
||||
<!-- Settings -->
|
||||
|
@ -13,7 +13,7 @@
|
||||
<string name="rooted_device_only">Tämä toiminto vaatii rootatun laitteen</string>
|
||||
<string name="recents">Viimeaikaiset</string>
|
||||
<string name="show_recents">Näytä viimeaikaiset</string>
|
||||
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Avaa...</string>
|
||||
<string name="text_file">Tekstitiedostona</string>
|
||||
@ -21,7 +21,6 @@
|
||||
<string name="audio_file">Äänitiedostona</string>
|
||||
<string name="video_file">Videotiedostona</string>
|
||||
<string name="other_file">Jonakin muuna tiedostona</string>
|
||||
|
||||
<!-- Compression -->
|
||||
<string name="compress">Pakkaa</string>
|
||||
<string name="decompress">Pura</string>
|
||||
@ -32,34 +31,29 @@
|
||||
<string name="decompression_successful">Purkaminen valmis</string>
|
||||
<string name="compressing_failed">Pakkaaminen epäonnistui</string>
|
||||
<string name="decompressing_failed">Purkaminen epäonnistui</string>
|
||||
|
||||
<!-- Favorites -->
|
||||
<string name="manage_favorites">Hallitse suosikkeja</string>
|
||||
<string name="go_to_favorite">Mene suosikkiin</string>
|
||||
<string name="favorites_activity_placeholder">Voit lisätä usein käyttämiäsi kansiota suosikeiksi, jolloin niiden käyttö on helppoa mistä vain.</string>
|
||||
|
||||
<!-- File Editor -->
|
||||
<string name="file_editor">Tiedostoeditori</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="storage_analysis">Tallennustilan analyysi</string>
|
||||
<string name="images">Kuvat</string>
|
||||
<string name="videos">Videot</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="archives">Archives</string>
|
||||
<string name="others">Others</string>
|
||||
<string name="archives">Arkistot</string>
|
||||
<string name="others">Muut</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">Ota käyttöön root-ominaisuudet</string>
|
||||
<string name="press_back_twice">Ota käyttöön sovelluksesta poistuminen kahdella takaisin-painikkeen painalluksella</string>
|
||||
|
||||
<!-- Strings displayed only on Google Play Store. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
<string name="app_title">Simple File Manager Pro - Manage files easy & fast</string>
|
||||
<string name="app_title">Simple File Manager Pro - Tehokas tiedostohallinta</string>
|
||||
<!-- Short description has to have less than 80 chars -->
|
||||
<string name="app_short_description">Helppo tiedostonhallinta turvallisesti yksityisyyttä kunnioittaen, ei mainoksia.</string>
|
||||
<string name="app_long_description">
|
||||
@ -97,9 +91,8 @@
|
||||
<b>Reddit:</b>
|
||||
https://www.reddit.com/r/SimpleMobileTools
|
||||
</string>
|
||||
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
||||
</resources>
|
@ -11,9 +11,9 @@
|
||||
<string name="select_audio_file">Veuillez sélectionner un fichier audio</string>
|
||||
<string name="search_folder">Chercher dans le dossier</string>
|
||||
<string name="rooted_device_only">Cette opération ne fonctionne que sur les périphériques rooté</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
|
||||
<string name="recents">Récents</string>
|
||||
<string name="show_recents">Afficher les récents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Ouvert comme</string>
|
||||
<string name="text_file">Fichier texte</string>
|
||||
@ -21,7 +21,6 @@
|
||||
<string name="audio_file">Fichier audio</string>
|
||||
<string name="video_file">Fichier vidéo</string>
|
||||
<string name="other_file">Autre fichier</string>
|
||||
|
||||
<!-- Compression -->
|
||||
<string name="compress">Compresser</string>
|
||||
<string name="decompress">Décompresser</string>
|
||||
@ -32,36 +31,31 @@
|
||||
<string name="decompression_successful">Décompression réussie</string>
|
||||
<string name="compressing_failed">Compression ratée</string>
|
||||
<string name="decompressing_failed">Décompression ratée</string>
|
||||
|
||||
<!-- Favorites -->
|
||||
<string name="manage_favorites">Gérer les favoris</string>
|
||||
<string name="go_to_favorite">Aller au favori</string>
|
||||
<string name="favorites_activity_placeholder">Vous pouvez ajouter des dossiers souvent utilisés comme favoris pour y avoir accès rapidement depuis n\'importe où.</string>
|
||||
|
||||
<!-- File Editor -->
|
||||
<string name="file_editor">Éditeur de fichier</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="storage_analysis">Analyse du stockage</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="videos">Vidéos</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="downloads">Téléchargements</string>
|
||||
<string name="archives">Archives</string>
|
||||
<string name="others">Others</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
|
||||
<string name="others">Autres</string>
|
||||
<string name="storage_free">libre</string>
|
||||
<string name="total_storage">Stockage total : %s</string>
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">Activer les droits root</string>
|
||||
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
|
||||
|
||||
<string name="press_back_twice">Obligation d\'appuyer deux fois sur la touche Retour pour quitter l\'application</string>
|
||||
<!-- Strings displayed only on Google Play Store. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
<string name="app_title">Simple File Manager Pro - Manage files easy & fast</string>
|
||||
<string name="app_title">Simple File Manager Pro – Gérer les fichiers facilement et rapidement</string>
|
||||
<!-- Short description has to have less than 80 chars -->
|
||||
<string name="app_short_description">Easy app for managing your files without ads, respecting your privacy & security</string>
|
||||
<string name="app_short_description">Une application simple pour gérer vos fichiers sans publicité, en respectant votre vie privée et votre sécurité</string>
|
||||
<string name="app_long_description">
|
||||
A lightweight quick file manager for everyday use. It offers a userful search functionality, you can also customize the home folder and select favorite folders for quick access.
|
||||
|
||||
@ -97,9 +91,8 @@
|
||||
<b>Reddit:</b>
|
||||
https://www.reddit.com/r/SimpleMobileTools
|
||||
</string>
|
||||
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
||||
</resources>
|
@ -11,6 +11,9 @@
|
||||
<string name="select_audio_file">Seleccione un ficheiro de audio</string>
|
||||
<string name="search_folder">Buscar cartafol</string>
|
||||
<string name="rooted_device_only">Esta operación só funciona en dispositivos con root</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Abrir como</string>
|
||||
@ -39,14 +42,27 @@
|
||||
<!-- File Editor -->
|
||||
<string name="file_editor">Editor de ficheiros</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="archives">Archives</string>
|
||||
<string name="others">Others</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">Activar acceso root</string>
|
||||
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
|
||||
|
||||
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
<string name="app_title">Simple File Manager Pro - Manage files easily & fast</string>
|
||||
<string name="app_title">Simple File Manager Pro - Manage files easily & fast</string>
|
||||
<!-- Short description has to have less than 80 chars -->
|
||||
<string name="app_short_description">Quick file management with no ads. Browse files easily, securely & fast</string>
|
||||
<string name="app_short_description">Quick file management with no ads. Browse files easily, securely & fast</string>
|
||||
<string name="app_long_description">
|
||||
Un xestor de ficheiros rápido e lixeiro para uso diario. Ofrece unha funcionalidade de busca útil e podes personalizar o cartafol de inicio e seleccionar os cartafoles favoritos para un acceso rápido.
|
||||
|
||||
@ -65,11 +81,11 @@
|
||||
Podes crear accesos directos nas pantallas para acceder rapidamente aos teus elementos favoritos.
|
||||
|
||||
Contén un editor de ficheiros lixeiro que pode empregar para imprimir documentos, editalos ou lelos facilmente usando xestos de zoom, sempre que sexa necesario.
|
||||
|
||||
|
||||
E, por último, vén cun deseño material e un tema escuro de xeito predeterminado, fornece unha excelente experiencia de usuario cun uso sinxelo. Ao non requirir acceso a Internet, tes máis privacidade, seguridade e estabilidade
|
||||
|
||||
Non contén anuncios nin permisos innecesarios. Dispón dun tema escuro e é totalmente de código aberto.
|
||||
|
||||
|
||||
<b>Visita a páxina nesta ligazón:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">यह ऑपरेशन केवल रूटेड डिवाइस पर काम करता है</string>
|
||||
<string name="recents">हाल के</string>
|
||||
<string name="show_recents">हाल ही में दिखाएं</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
<!-- Open as -->
|
||||
<string name="open_as">इस रूप में खोलें</string>
|
||||
<string name="text_file">टेकस्ट फ़ाइलें</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Ova radnja funkcionira samo na uređajima s root pristupom</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Otvori kao</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">This operation works only on rooted devices</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Open as</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Tindakan ini hanya bekerja pada perangkat dengan akses root</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Buka sebagai</string>
|
||||
|
@ -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 & 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 & 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>
|
@ -13,7 +13,7 @@
|
||||
<string name="rooted_device_only">Questa operazione funziona solo nei dispositivi con permessi di root</string>
|
||||
<string name="recents">Recenti</string>
|
||||
<string name="show_recents">Mostra i recenti</string>
|
||||
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Apri come</string>
|
||||
<string name="text_file">File di testo</string>
|
||||
@ -21,7 +21,6 @@
|
||||
<string name="audio_file">File audio</string>
|
||||
<string name="video_file">File video</string>
|
||||
<string name="other_file">Altro</string>
|
||||
|
||||
<!-- Compression -->
|
||||
<string name="compress">Comprimi</string>
|
||||
<string name="decompress">Decomprimi</string>
|
||||
@ -32,31 +31,26 @@
|
||||
<string name="decompression_successful">Decompressione completata</string>
|
||||
<string name="compressing_failed">Impossibile comprimere</string>
|
||||
<string name="decompressing_failed">Impossibile decomprimere</string>
|
||||
|
||||
<!-- Favorites -->
|
||||
<string name="manage_favorites">Gestisci i preferiti</string>
|
||||
<string name="go_to_favorite">Vai al preferito</string>
|
||||
<string name="favorites_activity_placeholder">Si possono aggiungere le cartelle usate frequentemente ai preferiti, per un rapido accesso da qualsiasi posizione.</string>
|
||||
|
||||
<!-- File Editor -->
|
||||
<string name="file_editor">Editor dei file</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="storage_analysis">Analisi dello stoccaggio</string>
|
||||
<string name="images">Immagini</string>
|
||||
<string name="videos">Video</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="archives">Archives</string>
|
||||
<string name="others">Others</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
|
||||
<string name="documents">Documenti</string>
|
||||
<string name="downloads">Scaricamenti</string>
|
||||
<string name="archives">Archivi</string>
|
||||
<string name="others">Altri</string>
|
||||
<string name="storage_free">libero</string>
|
||||
<string name="total_storage">Memoria totale: %s</string>
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">Abilita accesso root</string>
|
||||
<string name="press_back_twice">Richiedi di premere Indietro due volte per uscire dall\'app</string>
|
||||
|
||||
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
<string name="app_title">Semplice Gestore di file Pro - Facile e veloce</string>
|
||||
@ -97,9 +91,8 @@
|
||||
<b>Reddit:</b>
|
||||
https://www.reddit.com/r/SimpleMobileTools
|
||||
</string>
|
||||
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
||||
</resources>
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">この操作はルート化された端末でのみ機能します</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">ファイル形式を指定して開く</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">This operation works only on rooted devices</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Open as</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">This operation works only on rooted devices</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Open as</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Denne handlingen fungerer bare på rootede enheter.</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Open as</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Deze bewerking is alleen mogelijk op een geroot apparaat</string>
|
||||
<string name="recents">Recent geopend</string>
|
||||
<string name="show_recents">Recente items tonen</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Openen als</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Ta operacja działa tylko na zrootowanych urządzeniach</string>
|
||||
<string name="recents">Ostatnie</string>
|
||||
<string name="show_recents">Pokaż ostatnie</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Otwórz jako</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Esta operação só funciona em dispositivos rooteados</string>
|
||||
<string name="recents">Recentes</string>
|
||||
<string name="show_recents">Mostrar recentes</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Abrir como</string>
|
||||
|
@ -11,8 +11,9 @@
|
||||
<string name="select_audio_file">Selecione um ficheiro de áudio</string>
|
||||
<string name="search_folder">Pesquisar pasta</string>
|
||||
<string name="rooted_device_only">Esta operação apenas funciona em dispositivos com root</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="recents">Recentes</string>
|
||||
<string name="show_recents">Mostrar recentes</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Abrir como</string>
|
||||
@ -23,15 +24,15 @@
|
||||
<string name="other_file">Outro tipo</string>
|
||||
|
||||
<!-- Compression -->
|
||||
<string name="compress">Comprimir</string>
|
||||
<string name="decompress">Descomprimir</string>
|
||||
<string name="compress_as">Comprimir como</string>
|
||||
<string name="compressing">A comprimir…</string>
|
||||
<string name="decompressing">A descomprimir…</string>
|
||||
<string name="compression_successful">Compressão terminada</string>
|
||||
<string name="decompression_successful">Descompressão terminada</string>
|
||||
<string name="compressing_failed">Falha ao comprimir</string>
|
||||
<string name="decompressing_failed">Falha ao descomprimir</string>
|
||||
<string name="compress">Compactar</string>
|
||||
<string name="decompress">Descompactar</string>
|
||||
<string name="compress_as">Compactar como</string>
|
||||
<string name="compressing">A compactar…</string>
|
||||
<string name="decompressing">A descompactar…</string>
|
||||
<string name="compression_successful">Compactação terminada</string>
|
||||
<string name="decompression_successful">Descompactação terminada</string>
|
||||
<string name="compressing_failed">Falha ao compactar</string>
|
||||
<string name="decompressing_failed">Falha ao descompactar</string>
|
||||
|
||||
<!-- Favorites -->
|
||||
<string name="manage_favorites">Gerir favoritos</string>
|
||||
@ -42,20 +43,20 @@
|
||||
<string name="file_editor">Editor de ficheiros</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="archives">Archives</string>
|
||||
<string name="others">Others</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
<string name="storage_analysis">Análise ao armazenamento</string>
|
||||
<string name="images">Imagens</string>
|
||||
<string name="videos">Vídeos</string>
|
||||
<string name="audio">Áudio</string>
|
||||
<string name="documents">Documentos</string>
|
||||
<string name="downloads">Descargas</string>
|
||||
<string name="archives">Arquivos</string>
|
||||
<string name="others">Outros</string>
|
||||
<string name="storage_free">livre</string>
|
||||
<string name="total_storage">Armazenamento total: %s</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">Ativar acesso root</string>
|
||||
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
|
||||
<string name="press_back_twice">Premir duas vezes a tecla Back para sair da aplicação</string>
|
||||
|
||||
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
@ -85,10 +86,10 @@
|
||||
|
||||
Não contém anúncios nem permissões desnecessárias. Disponibiliza um tema escuro e é totalmente \'open source\'.
|
||||
|
||||
<b>Consulte o conjunto completo das aplicações Simple Tools aqui:</b>
|
||||
<b>Consulte o conjunto completo de aplicações Simple Tools aqui:</b>
|
||||
https://www.simplemobiletools.com
|
||||
|
||||
<b>Site específico da aplicação Simple File Manager Pro:</b>
|
||||
<b>Site da aplicação Simple File Manager Pro:</b>
|
||||
https://www.simplemobiletools.com/filemanager
|
||||
|
||||
<b>Facebook:</b>
|
||||
|
@ -13,7 +13,7 @@
|
||||
<string name="rooted_device_only">Это работает только на устройствах с root-доступом</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Открыть как</string>
|
||||
<string name="text_file">Текст</string>
|
||||
@ -21,7 +21,6 @@
|
||||
<string name="audio_file">Аудио</string>
|
||||
<string name="video_file">Видео</string>
|
||||
<string name="other_file">Другое</string>
|
||||
|
||||
<!-- Compression -->
|
||||
<string name="compress">Сжать</string>
|
||||
<string name="decompress">Распаковать</string>
|
||||
@ -32,18 +31,15 @@
|
||||
<string name="decompression_successful">Распаковка успешна</string>
|
||||
<string name="compressing_failed">Не удалось сжать</string>
|
||||
<string name="decompressing_failed">Не удалось распаковать</string>
|
||||
|
||||
<!-- Favorites -->
|
||||
<string name="manage_favorites">Настроить избранное</string>
|
||||
<string name="go_to_favorite">Открыть избранное</string>
|
||||
<string name="favorites_activity_placeholder">Вы можете добавить часто используемые папки в избранное для быстрого доступа к ним.</string>
|
||||
|
||||
<!-- File Editor -->
|
||||
<string name="file_editor">Редактор файлов</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="images">Изображения</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
@ -52,11 +48,9 @@
|
||||
<string name="others">Others</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">Включить root-доступ</string>
|
||||
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
|
||||
|
||||
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
<string name="app_title">Simple File Manager Pro - Manage files easy & fast</string>
|
||||
@ -97,9 +91,8 @@
|
||||
<b>Reddit:</b>
|
||||
https://www.reddit.com/r/SimpleMobileTools
|
||||
</string>
|
||||
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
||||
</resources>
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Táto operácia funguje iba na rootnutých zariadeniach</string>
|
||||
<string name="recents">Nedávne</string>
|
||||
<string name="show_recents">Zobraziť nedávne</string>
|
||||
<string name="access_storage_prompt">Prosím povoľte našej apke prístup ku všetkým vašim súborom. Bez neho nebude fungovať správne.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Otvoriť ako</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Åtgärden fungerar bara på rotade enheter</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Öppna som</string>
|
||||
|
@ -11,8 +11,9 @@
|
||||
<string name="select_audio_file">Lütfen bir ses dosyası seçin</string>
|
||||
<string name="search_folder">Klasör ara</string>
|
||||
<string name="rooted_device_only">Bu işlem sadece rootlu cihazlarda çalışır</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="recents">Son dosyalar</string>
|
||||
<string name="show_recents">Son dosyaları göster</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Farklı aç</string>
|
||||
@ -42,20 +43,20 @@
|
||||
<string name="file_editor">Dosya Düzenleyici</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="archives">Archives</string>
|
||||
<string name="others">Others</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
<string name="storage_analysis">Depolama analizi</string>
|
||||
<string name="images">Resimler</string>
|
||||
<string name="videos">Videolar</string>
|
||||
<string name="audio">Sesler</string>
|
||||
<string name="documents">Belgeler</string>
|
||||
<string name="downloads">İndirilenler</string>
|
||||
<string name="archives">Arşivler</string>
|
||||
<string name="others">Diğerleri</string>
|
||||
<string name="storage_free">boş</string>
|
||||
<string name="total_storage">Toplam depolama: %s</string>
|
||||
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">Root erişimini etkinleştir</string>
|
||||
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
|
||||
<string name="press_back_twice">Uygulamadan çıkmak için Geri tuşuna iki kez basmayı gerektir</string>
|
||||
|
||||
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
@ -65,7 +66,7 @@
|
||||
<string name="app_long_description">
|
||||
Günlük kullanım için hafif ve hızlı bir dosya yöneticisi. Kullanıcı dostu bir arama işlevi sunar, ayrıca ana klasörü özelleştirebilir ve hızlı erişim için favori klasörleri seçebilirsiniz.
|
||||
|
||||
Uygulama, gizli öğeleri parolayla koruma, dosyaları silme veya tüm uygulama gibi güvenlikle ilgili çok sayıda güçlü işlev içerir. Verilerinizi gizli tutmak için desen, pin veya parmak izi kullanmayı seçebilirsiniz.
|
||||
Uygulama, gizli ögeleri parolayla koruma, dosyaları silme veya tüm uygulama gibi güvenlikle ilgili çok sayıda güçlü işlev içerir. Verilerinizi gizli tutmak için desen, pin veya parmak izi kullanmayı seçebilirsiniz.
|
||||
|
||||
Bu modern dosya düzenleyici, root dosyalarının, SD kartların ve USB cihazlarının hızlı taranmasını destekler.
|
||||
|
||||
@ -77,11 +78,11 @@
|
||||
|
||||
Bir dosya veya klasör yolunu hızlı bir şekilde almak için, uzun basıp panoya kopyalayarak onu kolayca seçebilirsiniz.
|
||||
|
||||
Favori öğelerinize hızlı bir şekilde erişmek için kullanışlı masaüstü kısayolları oluşturabilirsiniz.
|
||||
Favori ögelerinize hızlı bir şekilde erişmek için kullanışlı masaüstü kısayolları oluşturabilirsiniz.
|
||||
|
||||
Belgeleri yazdırmak, düzenlemek veya gerektiğinde yakınlaştırma hareketlerini kullanarak kolayca okumak için kullanabileceğiniz hafif bir dosya düzenleyici içerir.
|
||||
Belgeleri yazdırmak, düzenlemek veya gerektiğinde yakınlaştırma hareketlerini kullanarak kolayca okumak için kullanabileceğiniz hafif bir dosya düzenleyici içerir.
|
||||
|
||||
Varsayılan olarak materyal tasarım ve koyu tema ile birlikte gelir, kolay kullanım için harika bir kullanıcı deneyimi sağlar. İnternet erişiminin olmaması size diğer uygulamalardan daha fazla gizlilik, güvenlik ve istikrar sağlar.
|
||||
Varsayılan olarak materyal tasarım ve koyu tema ile birlikte gelir, kolay kullanım için harika bir kullanıcı deneyimi sağlar. İnternet erişiminin olmaması size diğer uygulamalardan daha fazla gizlilik, güvenlik ve istikrar sağlar.
|
||||
|
||||
Reklam veya gereksiz izinler içermez. Tamamen açık kaynaktır, özelleştirilebilir renkler sunar.
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">Ця команда працює лише на пристроях з root-доступом</string>
|
||||
<string name="recents">Останні</string>
|
||||
<string name="show_recents">Показати останні</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Відкрити як файл</string>
|
||||
|
@ -11,9 +11,9 @@
|
||||
<string name="select_audio_file">请选择一个音频文件</string>
|
||||
<string name="search_folder">搜索文件夹</string>
|
||||
<string name="rooted_device_only">该选项仅在 root 后的设备上工作</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
|
||||
<string name="recents">最近</string>
|
||||
<string name="show_recents">显示最近</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
<!-- Open as -->
|
||||
<string name="open_as">打开为</string>
|
||||
<string name="text_file">文本文件</string>
|
||||
@ -21,7 +21,6 @@
|
||||
<string name="audio_file">音频文件</string>
|
||||
<string name="video_file">视频文件</string>
|
||||
<string name="other_file">其他文件</string>
|
||||
|
||||
<!-- Compression -->
|
||||
<string name="compress">压缩</string>
|
||||
<string name="decompress">解压缩</string>
|
||||
@ -32,31 +31,26 @@
|
||||
<string name="decompression_successful">解压缩成功</string>
|
||||
<string name="compressing_failed">压缩失败</string>
|
||||
<string name="decompressing_failed">解压缩失败</string>
|
||||
|
||||
<!-- Favorites -->
|
||||
<string name="manage_favorites">管理收藏</string>
|
||||
<string name="go_to_favorite">前往收藏</string>
|
||||
<string name="favorites_activity_placeholder">您可以将经常访问的文件夹添加至收藏便于从任意位置快速访问。</string>
|
||||
|
||||
<!-- File Editor -->
|
||||
<string name="file_editor">文件编辑器</string>
|
||||
|
||||
<!-- Storage analysis -->
|
||||
<string name="storage_analysis">Storage analysis</string>
|
||||
<string name="images">Images</string>
|
||||
<string name="videos">Videos</string>
|
||||
<string name="storage_analysis">存储分析</string>
|
||||
<string name="images">图片</string>
|
||||
<string name="videos">视频</string>
|
||||
<string name="audio">Audio</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="downloads">Downloads</string>
|
||||
<string name="archives">Archives</string>
|
||||
<string name="others">Others</string>
|
||||
<string name="archives">存档</string>
|
||||
<string name="others">其他</string>
|
||||
<string name="storage_free">free</string>
|
||||
<string name="total_storage">Total storage: %s</string>
|
||||
|
||||
<string name="total_storage">总存储: %s</string>
|
||||
<!-- Settings -->
|
||||
<string name="enable_root_access">启用 root 访问</string>
|
||||
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
|
||||
|
||||
<string name="press_back_twice">需要按两次返回键才能离开应用程序</string>
|
||||
<!-- Strings displayed only on Google Play Store. Optional, but good to have -->
|
||||
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
|
||||
<string name="app_title">简易文件管理 Pro - 轻松管理文件 & 快速体验</string>
|
||||
@ -97,9 +91,8 @@
|
||||
<b>Reddit:</b>
|
||||
https://www.reddit.com/r/SimpleMobileTools
|
||||
</string>
|
||||
|
||||
<!--
|
||||
Haven't found some strings? There's more at
|
||||
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
|
||||
-->
|
||||
</resources>
|
||||
</resources>
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">這操作只對已root的裝置有用</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">開啟成</string>
|
||||
|
@ -13,6 +13,7 @@
|
||||
<string name="rooted_device_only">This operation works only on rooted devices</string>
|
||||
<string name="recents">Recents</string>
|
||||
<string name="show_recents">Show recents</string>
|
||||
<string name="access_storage_prompt">Please grant our app access to all your files, it might not work well without it.</string>
|
||||
|
||||
<!-- Open as -->
|
||||
<string name="open_as">Open as</string>
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.5.31'
|
||||
ext.kotlin_version = '1.6.0'
|
||||
|
||||
repositories {
|
||||
google()
|
||||
@ -9,7 +9,7 @@ buildscript {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.0.2'
|
||||
classpath 'com.android.tools.build:gradle:7.0.3'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
|
Loading…
x
Reference in New Issue
Block a user