Merge branch 'master' into fix/android-data-dir-access

# Conflicts:
#	app/build.gradle
#	app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MainActivity.kt
#	app/src/main/kotlin/com/simplemobiletools/filemanager/pro/adapters/ItemsAdapter.kt
This commit is contained in:
darthpaul 2021-11-13 12:15:52 +00:00
commit ed2bf87dc9
62 changed files with 1764 additions and 162 deletions

View File

@ -1,7 +1,20 @@
Changelog
==========
Version 6.10.0 *(2021-08-27)*
Version 6.10.1 *(2021-10-16)*
----------------------------
* Added some stability and translation improvements
Version 6.10.0 *(2021-10-14)*
----------------------------
* Added a Storage Analyzer tab on Android 8+
* Allow saving any file type with the Save as action
* Some Android 11 related file operation improvements
* Couple stability, translation and UX improvements
Version 6.9.4 *(2021-08-27)*
----------------------------
* Rewrote the current folder path into a 1 liner

View File

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

View File

@ -16,8 +16,8 @@ android {
applicationId "com.simplemobiletools.filemanager.pro"
minSdkVersion 21
targetSdkVersion 30
versionCode 108
versionName "6.9.4"
versionCode 110
versionName "6.10.1"
multiDexEnabled true
setProperty("archivesBaseName", "file-manager")
vectorDrawables.useSupportLibrary = true

View File

@ -55,6 +55,10 @@
</intent-filter>
</activity>
<activity
android:name=".activities.MimeTypesActivity"
android:parentActivityName=".activities.MainActivity" />
<activity
android:name=".activities.ReadTextActivity"
android:label="@string/file_editor">
@ -91,9 +95,7 @@
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
<data android:mimeType="image/*" />
<data android:mimeType="video/*" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>

View File

@ -34,14 +34,17 @@ import com.simplemobiletools.filemanager.pro.extensions.config
import com.simplemobiletools.filemanager.pro.extensions.tryOpenPathIntent
import com.simplemobiletools.filemanager.pro.fragments.ItemsFragment
import com.simplemobiletools.filemanager.pro.fragments.MyViewPagerFragment
import com.simplemobiletools.filemanager.pro.fragments.StorageFragment
import com.simplemobiletools.filemanager.pro.helpers.MAX_COLUMN_COUNT
import com.simplemobiletools.filemanager.pro.helpers.RootHelpers
import com.simplemobiletools.filemanager.pro.helpers.tabsList
import com.simplemobiletools.filemanager.pro.interfaces.ItemOperationsListener
import com.stericson.RootTools.RootTools
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.items_fragment.*
import kotlinx.android.synthetic.main.items_fragment.view.*
import kotlinx.android.synthetic.main.recents_fragment.*
import kotlinx.android.synthetic.main.storage_fragment.*
import java.io.File
import java.lang.Exception
import java.util.*
@ -65,6 +68,14 @@ class MainActivity : SimpleActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
appLaunched(BuildConfig.APPLICATION_ID)
if (!config.wasStorageAnalysisTabAdded && isOreoPlus()) {
config.wasStorageAnalysisTabAdded = true
if (config.showTabs and TAB_STORAGE_ANALYSIS == 0) {
config.showTabs += TAB_STORAGE_ANALYSIS
}
}
setupTabColors(config.lastUsedViewPagerPage)
storeStateVariables()
mIsPasswordProtectionPending = config.isAppPasswordProtectionOn
@ -95,18 +106,18 @@ class MainActivity : SimpleActivity() {
}
getAllFragments().forEach {
it?.setupColors(config.textColor, config.primaryColor)
it?.onResume(config.textColor, config.primaryColor)
}
if (storedFontSize != config.fontSize) {
getAllFragments().forEach {
it?.setupFontSize()
(it as? ItemOperationsListener)?.setupFontSize()
}
}
if (storedDateFormat != config.dateFormat || storedTimeFormat != getTimeFormat()) {
getAllFragments().forEach {
it?.setupDateTimeFormat()
(it as? ItemOperationsListener)?.setupDateTimeFormat()
}
}
@ -144,26 +155,28 @@ class MainActivity : SimpleActivity() {
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
val currentFragment = getCurrentFragment() ?: return true
val currentViewType = config.getFolderViewType(currentFragment.currentPath)
val favorites = config.favorites
menu!!.apply {
findItem(R.id.search).isVisible = currentFragment is ItemsFragment
findItem(R.id.sort).isVisible = currentFragment is ItemsFragment
findItem(R.id.change_view_type).isVisible = currentFragment !is StorageFragment
findItem(R.id.add_favorite).isVisible = currentFragment is ItemsFragment && !favorites.contains(currentFragment.currentPath)
findItem(R.id.remove_favorite).isVisible = currentFragment is ItemsFragment && favorites.contains(currentFragment.currentPath)
findItem(R.id.go_to_favorite).isVisible = currentFragment is ItemsFragment && favorites.isNotEmpty()
findItem(R.id.toggle_filename).isVisible = config.getFolderViewType(currentFragment.currentPath) == VIEW_TYPE_GRID
findItem(R.id.toggle_filename).isVisible = currentViewType == VIEW_TYPE_GRID
findItem(R.id.go_home).isVisible = currentFragment is ItemsFragment && currentFragment.currentPath != config.homeFolder
findItem(R.id.set_as_home).isVisible = currentFragment is ItemsFragment && currentFragment.currentPath != config.homeFolder
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
findItem(R.id.stop_showing_hidden).isVisible = config.temporarilyShowHidden
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden && currentFragment !is StorageFragment
findItem(R.id.stop_showing_hidden).isVisible = config.temporarilyShowHidden && currentFragment !is StorageFragment
findItem(R.id.increase_column_count).isVisible =
config.getFolderViewType(currentFragment.currentPath) == VIEW_TYPE_GRID && config.fileColumnCnt < MAX_COLUMN_COUNT
findItem(R.id.reduce_column_count).isVisible = config.getFolderViewType(currentFragment.currentPath) == VIEW_TYPE_GRID && config.fileColumnCnt > 1
currentViewType == VIEW_TYPE_GRID && config.fileColumnCnt < MAX_COLUMN_COUNT && currentFragment !is StorageFragment
findItem(R.id.reduce_column_count).isVisible = currentViewType == VIEW_TYPE_GRID && config.fileColumnCnt > 1 && currentFragment !is StorageFragment
}
return true
@ -243,7 +256,7 @@ class MainActivity : SimpleActivity() {
override fun onQueryTextChange(newText: String): Boolean {
if (isSearchOpen) {
getCurrentFragment()?.searchQueryChanged(newText)
(getCurrentFragment() as? ItemOperationsListener)?.searchQueryChanged(newText)
}
return true
}
@ -358,12 +371,13 @@ class MainActivity : SimpleActivity() {
}
if (refreshRecents) {
recents_fragment?.refreshItems()
recents_fragment?.refreshFragment()
}
}
private fun initFragments() {
main_view_pager.adapter = ViewPagerAdapter(this)
main_view_pager.offscreenPageLimit = 2
main_view_pager.currentItem = config.lastUsedViewPagerPage
main_view_pager.onPageChangeListener {
main_tabs_holder.getTabAt(it)?.select()
@ -385,7 +399,7 @@ class MainActivity : SimpleActivity() {
main_view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
if (isSearchOpen) {
getCurrentFragment()?.searchQueryChanged("")
(getCurrentFragment() as? ItemOperationsListener)?.searchQueryChanged("")
searchMenuItem?.collapseActionView()
}
}
@ -395,7 +409,7 @@ class MainActivity : SimpleActivity() {
override fun onPageSelected(position: Int) {
main_tabs_holder.getTabAt(position)?.select()
getAllFragments().forEach {
it?.finishActMode()
(it as? ItemOperationsListener)?.finishActMode()
}
invalidateOptionsMenu()
}
@ -448,7 +462,8 @@ class MainActivity : SimpleActivity() {
private fun getTabIcon(position: Int): Drawable {
val drawableId = when (position) {
0 -> R.drawable.ic_folder_vector
else -> R.drawable.ic_clock_vector
1 -> R.drawable.ic_clock_vector
else -> R.drawable.ic_storage_vector
}
return resources.getColoredDrawableWithColor(drawableId, config.textColor)
@ -491,7 +506,7 @@ class MainActivity : SimpleActivity() {
private fun showSortingDialog() {
ChangeSortingDialog(this, getCurrentFragment()!!.currentPath) {
(getCurrentFragment() as? ItemsFragment)?.refreshItems()
(getCurrentFragment() as? ItemsFragment)?.refreshFragment()
}
}
@ -506,19 +521,19 @@ class MainActivity : SimpleActivity() {
private fun toggleFilenameVisibility() {
config.displayFilenames = !config.displayFilenames
getAllFragments().forEach {
it?.toggleFilenameVisibility()
(it as? ItemOperationsListener)?.toggleFilenameVisibility()
}
}
private fun increaseColumnCount() {
getAllFragments().forEach {
it?.increaseColumnCount()
(it as? ItemOperationsListener)?.increaseColumnCount()
}
}
private fun reduceColumnCount() {
getAllFragments().forEach {
it?.reduceColumnCount()
(it as? ItemOperationsListener)?.reduceColumnCount()
}
}
@ -548,7 +563,7 @@ class MainActivity : SimpleActivity() {
private fun changeViewType() {
ChangeViewTypeDialog(this, getCurrentFragment()!!.currentPath, getCurrentFragment() is ItemsFragment) {
getAllFragments().forEach {
it?.refreshItems()
it?.refreshFragment()
}
}
}
@ -566,7 +581,7 @@ class MainActivity : SimpleActivity() {
private fun toggleTemporarilyShowHidden(show: Boolean) {
config.temporarilyShowHidden = show
getAllFragments().forEach {
it?.refreshItems()
it?.refreshFragment()
}
}
@ -674,7 +689,7 @@ class MainActivity : SimpleActivity() {
private fun getInactiveTabIndexes(activeIndex: Int) = (0 until tabsList.size).filter { it != activeIndex }
private fun getAllFragments(): ArrayList<MyViewPagerFragment?> = arrayListOf(items_fragment, recents_fragment)
private fun getAllFragments(): ArrayList<MyViewPagerFragment?> = arrayListOf(items_fragment, recents_fragment, storage_fragment)
private fun getCurrentFragment(): MyViewPagerFragment? {
val showTabs = config.showTabs
@ -687,6 +702,10 @@ class MainActivity : SimpleActivity() {
fragments.add(recents_fragment)
}
if (showTabs and TAB_STORAGE_ANALYSIS != 0) {
fragments.add(storage_fragment)
}
return fragments.getOrNull(main_view_pager.currentItem)
}

View File

@ -0,0 +1,479 @@
package com.simplemobiletools.filemanager.pro.activities
import android.app.SearchManager
import android.content.Context
import android.os.Bundle
import android.provider.MediaStore
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
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.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.filemanager.pro.R
import com.simplemobiletools.filemanager.pro.adapters.ItemsAdapter
import com.simplemobiletools.filemanager.pro.dialogs.ChangeSortingDialog
import com.simplemobiletools.filemanager.pro.dialogs.ChangeViewTypeDialog
import com.simplemobiletools.filemanager.pro.extensions.config
import com.simplemobiletools.filemanager.pro.extensions.tryOpenPathIntent
import com.simplemobiletools.filemanager.pro.helpers.*
import com.simplemobiletools.filemanager.pro.interfaces.ItemOperationsListener
import com.simplemobiletools.filemanager.pro.models.ListItem
import kotlinx.android.synthetic.main.activity_mimetypes.*
import kotlinx.android.synthetic.main.items_fragment.view.*
import java.util.*
class MimeTypesActivity : SimpleActivity(), ItemOperationsListener {
private var isSearchOpen = false
private var currentMimeType = ""
private var lastSearchedText = ""
private var searchMenuItem: MenuItem? = null
private var zoomListener: MyRecyclerView.MyZoomListener? = null
private var storedItems = ArrayList<ListItem>()
private var currentViewType = VIEW_TYPE_LIST
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_mimetypes)
currentMimeType = intent.getStringExtra(SHOW_MIMETYPE) ?: return
title = getString(
when (currentMimeType) {
IMAGES -> R.string.images
VIDEOS -> R.string.videos
AUDIO -> R.string.audio
DOCUMENTS -> R.string.documents
ARCHIVES -> R.string.archives
OTHERS -> R.string.others
else -> {
toast(R.string.unknown_error_occurred)
finish()
return
}
}
)
ensureBackgroundThread {
reFetchItems()
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu, menu)
setupSearch(menu)
updateMenuItemColors(menu)
return true
}
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
val currentViewType = config.getFolderViewType(currentMimeType)
menu!!.apply {
findItem(R.id.add_favorite).isVisible = false
findItem(R.id.remove_favorite).isVisible = false
findItem(R.id.go_to_favorite).isVisible = false
findItem(R.id.toggle_filename).isVisible = currentViewType == VIEW_TYPE_GRID
findItem(R.id.go_home).isVisible = false
findItem(R.id.set_as_home).isVisible = false
findItem(R.id.settings).isVisible = false
findItem(R.id.about).isVisible = false
findItem(R.id.temporarily_show_hidden).isVisible = !config.shouldShowHidden
findItem(R.id.stop_showing_hidden).isVisible = config.temporarilyShowHidden
findItem(R.id.increase_column_count).isVisible = currentViewType == VIEW_TYPE_GRID && config.fileColumnCnt < MAX_COLUMN_COUNT
findItem(R.id.reduce_column_count).isVisible = currentViewType == VIEW_TYPE_GRID && config.fileColumnCnt > 1
}
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.sort -> showSortingDialog()
R.id.toggle_filename -> toggleFilenameVisibility()
R.id.change_view_type -> changeViewType()
R.id.temporarily_show_hidden -> tryToggleTemporarilyShowHidden()
R.id.stop_showing_hidden -> tryToggleTemporarilyShowHidden()
R.id.increase_column_count -> increaseColumnCount()
R.id.reduce_column_count -> reduceColumnCount()
else -> return super.onOptionsItemSelected(item)
}
return true
}
override fun refreshFragment() {
reFetchItems()
}
override fun deleteFiles(files: ArrayList<FileDirItem>) {
deleteFiles(files, false) {
if (!it) {
runOnUiThread {
toast(R.string.unknown_error_occurred)
}
}
}
}
override fun selectedPaths(paths: ArrayList<String>) {}
override fun searchQueryChanged(text: String) {
val searchText = text.trim()
lastSearchedText = searchText
when {
searchText.isEmpty() -> {
mimetypes_list.beVisible()
getRecyclerAdapter()?.updateItems(storedItems)
mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty())
mimetypes_placeholder_2.beGone()
}
searchText.length == 1 -> {
mimetypes_list.beGone()
mimetypes_placeholder.beVisible()
mimetypes_placeholder_2.beVisible()
}
else -> {
ensureBackgroundThread {
if (lastSearchedText != searchText) {
return@ensureBackgroundThread
}
val listItems = storedItems.filter { it.name.contains(searchText, true) } as ArrayList<ListItem>
runOnUiThread {
getRecyclerAdapter()?.updateItems(listItems, text)
mimetypes_list.beVisibleIf(listItems.isNotEmpty())
mimetypes_placeholder.beVisibleIf(listItems.isEmpty())
mimetypes_placeholder_2.beGone()
mimetypes_list.onGlobalLayout {
items_fastscroller.setScrollToY(mimetypes_list.computeVerticalScrollOffset())
calculateContentHeight(listItems)
}
}
}
}
}
}
override fun setupDateTimeFormat() {}
override fun setupFontSize() {}
override fun toggleFilenameVisibility() {
config.displayFilenames = !config.displayFilenames
getRecyclerAdapter()?.updateDisplayFilenamesInGrid()
}
override fun increaseColumnCount() {
if (currentViewType == VIEW_TYPE_GRID) {
config.fileColumnCnt = ++(mimetypes_list.layoutManager as MyGridLayoutManager).spanCount
columnCountChanged()
}
}
override fun reduceColumnCount() {
if (currentViewType == VIEW_TYPE_GRID) {
config.fileColumnCnt = --(mimetypes_list.layoutManager as MyGridLayoutManager).spanCount
columnCountChanged()
}
}
override fun finishActMode() {}
private fun setupSearch(menu: Menu) {
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
searchMenuItem = menu.findItem(R.id.search)
(searchMenuItem!!.actionView as SearchView).apply {
setSearchableInfo(searchManager.getSearchableInfo(componentName))
isSubmitButtonEnabled = false
queryHint = getString(R.string.search)
setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String) = false
override fun onQueryTextChange(newText: String): Boolean {
if (isSearchOpen) {
searchQueryChanged(newText)
}
return true
}
})
}
MenuItemCompat.setOnActionExpandListener(searchMenuItem, object : MenuItemCompat.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem?): Boolean {
isSearchOpen = true
searchOpened()
return true
}
override fun onMenuItemActionCollapse(item: MenuItem?): Boolean {
isSearchOpen = false
searchClosed()
return true
}
})
}
fun searchOpened() {
isSearchOpen = true
lastSearchedText = ""
}
fun searchClosed() {
isSearchOpen = false
lastSearchedText = ""
mimetypes_list.beVisible()
mimetypes_placeholder.beGoneIf(storedItems.isNotEmpty())
mimetypes_placeholder_2.beGone()
}
private fun getProperFileDirItems(callback: (ArrayList<FileDirItem>) -> Unit) {
val fileDirItems = ArrayList<FileDirItem>()
val showHidden = config.shouldShowHidden
val uri = MediaStore.Files.getContentUri("external")
val projection = arrayOf(
MediaStore.Files.FileColumns.MIME_TYPE,
MediaStore.Files.FileColumns.DATA,
MediaStore.Files.FileColumns.DISPLAY_NAME,
MediaStore.Files.FileColumns.SIZE,
MediaStore.Files.FileColumns.DATE_MODIFIED
)
try {
queryCursor(uri, projection) { cursor ->
try {
val fullMimetype = cursor.getStringValue(MediaStore.Files.FileColumns.MIME_TYPE)?.lowercase(Locale.getDefault()) ?: return@queryCursor
val name = cursor.getStringValue(MediaStore.Files.FileColumns.DISPLAY_NAME)
if (!showHidden && name.startsWith(".")) {
return@queryCursor
}
val size = cursor.getLongValue(MediaStore.Files.FileColumns.SIZE)
if (size == 0L) {
return@queryCursor
}
val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA)
val lastModified = cursor.getLongValue(MediaStore.Files.FileColumns.DATE_MODIFIED) * 1000
val mimetype = fullMimetype.substringBefore("/")
when (currentMimeType) {
IMAGES -> {
if (mimetype == "image") {
fileDirItems.add(FileDirItem(path, name, false, 0, size, lastModified))
}
}
VIDEOS -> {
if (mimetype == "video") {
fileDirItems.add(FileDirItem(path, name, false, 0, size, lastModified))
}
}
AUDIO -> {
if (mimetype == "audio" || extraAudioMimeTypes.contains(fullMimetype)) {
fileDirItems.add(FileDirItem(path, name, false, 0, size, lastModified))
}
}
DOCUMENTS -> {
if (mimetype == "text" || extraDocumentMimeTypes.contains(fullMimetype)) {
fileDirItems.add(FileDirItem(path, name, false, 0, size, lastModified))
}
}
ARCHIVES -> {
if (archiveMimeTypes.contains(fullMimetype)) {
fileDirItems.add(FileDirItem(path, name, false, 0, size, lastModified))
}
}
OTHERS -> {
if (mimetype != "image" && mimetype != "video" && mimetype != "audio" && mimetype != "text" &&
!extraAudioMimeTypes.contains(fullMimetype) && !extraDocumentMimeTypes.contains(fullMimetype) &&
!archiveMimeTypes.contains(fullMimetype)
) {
fileDirItems.add(FileDirItem(path, name, false, 0, size, lastModified))
}
}
}
} catch (e: Exception) {
}
}
} catch (e: Exception) {
showErrorToast(e)
}
callback(fileDirItems)
}
private fun addItems(items: ArrayList<ListItem>) {
FileDirItem.sorting = config.getFolderSorting(currentMimeType)
items.sort()
if (isDestroyed || isFinishing) {
return
}
storedItems = items
ItemsAdapter(this as SimpleActivity, storedItems, this, mimetypes_list, false, items_fastscroller, null) {
tryOpenPathIntent((it as ListItem).path, false)
}.apply {
setupZoomListener(zoomListener)
mimetypes_list.adapter = this
}
if (areSystemAnimationsEnabled) {
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())
}
private fun getListItemsFromFileDirItems(fileDirItems: ArrayList<FileDirItem>): ArrayList<ListItem> {
val listItems = ArrayList<ListItem>()
fileDirItems.forEach {
val listItem = ListItem(it.path, it.name, false, 0, it.size, it.modified, false)
listItems.add(listItem)
}
return listItems
}
private fun getRecyclerAdapter() = mimetypes_list.adapter as? ItemsAdapter
private fun showSortingDialog() {
ChangeSortingDialog(this, currentMimeType) {
recreateList()
}
}
private fun changeViewType() {
ChangeViewTypeDialog(this, currentMimeType, true) {
recreateList()
setupLayoutManager()
}
}
private fun reFetchItems() {
getProperFileDirItems { fileDirItems ->
val listItems = getListItemsFromFileDirItems(fileDirItems)
runOnUiThread {
addItems(listItems)
if (currentViewType != config.getFolderViewType(currentMimeType)) {
setupLayoutManager()
}
}
}
}
private fun recreateList() {
val listItems = getRecyclerAdapter()?.listItems
if (listItems != null) {
addItems(listItems as ArrayList<ListItem>)
}
}
private fun columnCountChanged() {
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
setupGridLayoutManager()
} else {
currentViewType = VIEW_TYPE_LIST
setupListLayoutManager()
}
mimetypes_list.adapter = null
initZoomListener()
addItems(storedItems)
}
private fun setupGridLayoutManager() {
val layoutManager = mimetypes_list.layoutManager as MyGridLayoutManager
layoutManager.spanCount = config.fileColumnCnt ?: 3
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if (getRecyclerAdapter()?.isASectionTitle(position) == true) {
layoutManager.spanCount
} else {
1
}
}
}
}
private fun setupListLayoutManager() {
val layoutManager = mimetypes_list.layoutManager as MyGridLayoutManager
layoutManager.spanCount = 1
zoomListener = null
}
private fun initZoomListener() {
if (config.getFolderViewType(currentMimeType) == VIEW_TYPE_GRID) {
val layoutManager = mimetypes_list.layoutManager as MyGridLayoutManager
zoomListener = object : MyRecyclerView.MyZoomListener {
override fun zoomIn() {
if (layoutManager.spanCount > 1) {
reduceColumnCount()
getRecyclerAdapter()?.finishActMode()
}
}
override fun zoomOut() {
if (layoutManager.spanCount < MAX_COLUMN_COUNT) {
increaseColumnCount()
getRecyclerAdapter()?.finishActMode()
}
}
}
} else {
zoomListener = null
}
}
private fun tryToggleTemporarilyShowHidden() {
if (config.temporarilyShowHidden) {
toggleTemporarilyShowHidden(false)
} else {
handleHiddenFolderPasswordProtection {
toggleTemporarilyShowHidden(true)
}
}
}
private fun toggleTemporarilyShowHidden(show: Boolean) {
config.temporarilyShowHidden = show
ensureBackgroundThread {
reFetchItems()
}
}
}

View File

@ -231,7 +231,12 @@ class ReadTextActivity : SimpleActivity() {
filePath = uri.path!!
val file = File(filePath)
if (file.exists()) {
file.readText()
try {
file.readText()
} catch (e: Exception) {
showErrorToast(e)
""
}
} else {
toast(R.string.unknown_error_occurred)
""

View File

@ -57,7 +57,7 @@ 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, fastScroller: FastScroller?, val swipeRefreshLayout: SwipeRefreshLayout?, itemClick: (Any) -> Unit
) :
MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
@ -138,12 +138,12 @@ class ItemsAdapter(
override fun getItemKeyPosition(key: Int) = listItems.indexOfFirst { it.path.hashCode() == key }
override fun onActionModeCreated() {
swipeRefreshLayout.isRefreshing = false
swipeRefreshLayout.isEnabled = false
swipeRefreshLayout?.isRefreshing = false
swipeRefreshLayout?.isEnabled = false
}
override fun onActionModeDestroyed() {
swipeRefreshLayout.isEnabled = true
swipeRefreshLayout?.isEnabled = true
}
override fun getItemViewType(position: Int): Int {
@ -216,20 +216,20 @@ class ItemsAdapter(
RenameItemDialog(activity, oldPath) {
activity.config.moveFavorite(oldPath, it)
activity.runOnUiThread {
listener?.refreshItems()
listener?.refreshFragment()
finishActMode()
}
}
}
fileDirItems.any { it.isDirectory } -> RenameItemsDialog(activity, paths) {
activity.runOnUiThread {
listener?.refreshItems()
listener?.refreshFragment()
finishActMode()
}
}
else -> RenameDialog(activity, paths, false) {
activity.runOnUiThread {
listener?.refreshItems()
listener?.refreshFragment()
finishActMode()
}
}
@ -260,7 +260,7 @@ class ItemsAdapter(
activity.toggleItemVisibility(it.path, hide)
}
activity.runOnUiThread {
listener?.refreshItems()
listener?.refreshFragment()
finishActMode()
}
}
@ -405,7 +405,7 @@ class ItemsAdapter(
val sourcePath = sourceFileDir.path
if (activity.isRestrictedAndroidDir(sourcePath) && activity.getDoesFilePathExist(sourcePath)) {
activity.deleteFile(sourceFileDir, true) {
listener?.refreshItems()
listener?.refreshFragment()
activity.runOnUiThread {
finishActMode()
}
@ -417,19 +417,19 @@ class ItemsAdapter(
) {
val sourceFolder = sourceFile.toFileDirItem(activity)
activity.deleteFile(sourceFolder, true) {
listener?.refreshItems()
listener?.refreshFragment()
activity.runOnUiThread {
finishActMode()
}
}
} else {
listener?.refreshItems()
listener?.refreshFragment()
finishActMode()
}
}
}
} else {
listener?.refreshItems()
listener?.refreshFragment()
finishActMode()
}
}
@ -449,7 +449,7 @@ class ItemsAdapter(
}
activity.runOnUiThread {
listener?.refreshItems()
listener?.refreshFragment()
finishActMode()
}
}
@ -480,7 +480,7 @@ class ItemsAdapter(
if (compressPaths(paths, destination)) {
activity.runOnUiThread {
activity.toast(R.string.compression_successful)
listener?.refreshItems()
listener?.refreshFragment()
finishActMode()
}
} else {
@ -509,7 +509,7 @@ class ItemsAdapter(
if (it) {
activity.toast(R.string.decompression_successful)
activity.runOnUiThread {
listener?.refreshItems()
listener?.refreshFragment()
finishActMode()
}
} else {
@ -541,7 +541,6 @@ class ItemsAdapter(
}
}
} catch (exception: Exception) {
exception.printStackTrace()
activity.showErrorToast(exception)
}
}
@ -684,7 +683,6 @@ class ItemsAdapter(
}
}
} catch (exception: Exception) {
exception.printStackTrace()
activity.showErrorToast(exception)
return false
} finally {
@ -892,7 +890,6 @@ class ItemsAdapter(
itemToLoad = getOTGPublicPath(itemToLoad)
}
return itemToLoad
}

View File

@ -5,6 +5,7 @@ import android.view.ViewGroup
import androidx.viewpager.widget.PagerAdapter
import com.simplemobiletools.commons.helpers.TAB_FILES
import com.simplemobiletools.commons.helpers.TAB_RECENT_FILES
import com.simplemobiletools.commons.helpers.TAB_STORAGE_ANALYSIS
import com.simplemobiletools.filemanager.pro.R
import com.simplemobiletools.filemanager.pro.activities.SimpleActivity
import com.simplemobiletools.filemanager.pro.extensions.config
@ -19,7 +20,7 @@ class ViewPagerAdapter(val activity: SimpleActivity) : PagerAdapter() {
(view as MyViewPagerFragment).apply {
setupFragment(activity)
setupColors(activity.config.textColor, activity.config.primaryColor)
onResume(activity.config.textColor, activity.config.primaryColor)
}
return view
@ -44,6 +45,10 @@ class ViewPagerAdapter(val activity: SimpleActivity) : PagerAdapter() {
fragments.add(R.layout.recents_fragment)
}
if (showTabs and TAB_STORAGE_ANALYSIS != 0) {
fragments.add(R.layout.storage_fragment)
}
return fragments[position]
}
}

View File

@ -2,13 +2,17 @@ package com.simplemobiletools.filemanager.pro.dialogs
import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.beGone
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.TAB_FILES
import com.simplemobiletools.commons.helpers.TAB_RECENT_FILES
import com.simplemobiletools.commons.helpers.TAB_STORAGE_ANALYSIS
import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.commons.views.MyAppCompatCheckbox
import com.simplemobiletools.filemanager.pro.R
import com.simplemobiletools.filemanager.pro.extensions.config
import com.simplemobiletools.filemanager.pro.helpers.ALL_TABS_MASK
import kotlinx.android.synthetic.main.dialog_manage_visible_tabs.view.*
class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
private var view = activity.layoutInflater.inflate(R.layout.dialog_manage_visible_tabs, null)
@ -18,6 +22,11 @@ class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
tabs.apply {
put(TAB_FILES, R.id.manage_visible_tabs_files)
put(TAB_RECENT_FILES, R.id.manage_visible_tabs_recent_files)
put(TAB_STORAGE_ANALYSIS, R.id.manage_visible_tabs_storage_analysis)
}
if (!isOreoPlus()) {
view.manage_visible_tabs_storage_analysis.beGone()
}
val showTabs = activity.config.showTabs

View File

@ -0,0 +1,14 @@
package com.simplemobiletools.filemanager.pro.extensions
import java.text.DecimalFormat
// use 1000 instead of 1024 at dividing
fun Long.formatSizeThousand(): String {
if (this <= 0) {
return "0 B"
}
val units = arrayOf("B", "kB", "MB", "GB", "TB")
val digitGroups = (Math.log10(toDouble()) / Math.log10(1000.0)).toInt()
return "${DecimalFormat("#,##0.#").format(this / Math.pow(1000.0, digitGroups.toDouble()))} ${units[digitGroups]}"
}

View File

@ -42,13 +42,13 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
override fun setupFragment(activity: SimpleActivity) {
if (this.activity == null) {
this.activity = activity
items_swipe_refresh.setOnRefreshListener { refreshItems() }
items_swipe_refresh.setOnRefreshListener { refreshFragment() }
items_fab.setOnClickListener { createNewItem() }
breadcrumbs.listener = this@ItemsFragment
}
}
override fun setupColors(textColor: Int, primaryColor: Int) {
override fun onResume(textColor: Int, primaryColor: Int) {
context!!.updateTextColors(this)
items_fastscroller.updatePrimaryColor()
storedItems = ArrayList()
@ -286,24 +286,24 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
override fun searchQueryChanged(text: String) {
val searchText = text.trim()
lastSearchedText = searchText
ensureBackgroundThread {
if (context == null) {
return@ensureBackgroundThread
}
if (context == null) {
return
}
when {
searchText.isEmpty() -> activity?.runOnUiThread {
items_list.beVisible()
getRecyclerAdapter()?.updateItems(storedItems)
items_placeholder.beGone()
items_placeholder_2.beGone()
}
searchText.length == 1 -> activity?.runOnUiThread {
items_list.beGone()
items_placeholder.beVisible()
items_placeholder_2.beVisible()
}
else -> {
when {
searchText.isEmpty() -> {
items_list.beVisible()
getRecyclerAdapter()?.updateItems(storedItems)
items_placeholder.beGone()
items_placeholder_2.beGone()
}
searchText.length == 1 -> {
items_list.beGone()
items_placeholder.beVisible()
items_placeholder_2.beVisible()
}
else -> {
ensureBackgroundThread {
val files = searchFiles(searchText, currentPath)
files.sortBy { it.getParentPath() }
@ -408,7 +408,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
private fun createNewItem() {
CreateNewItemDialog(activity as SimpleActivity, currentPath) {
if (it) {
refreshItems()
refreshFragment()
} else {
activity?.toast(R.string.unknown_error_occurred)
}
@ -521,7 +521,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF
}
}
override fun refreshItems() {
override fun refreshFragment() {
openPath(currentPath)
}

View File

@ -36,21 +36,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
abstract fun setupFragment(activity: SimpleActivity)
abstract fun setupColors(textColor: Int, primaryColor: Int)
abstract fun onResume(textColor: Int, primaryColor: Int)
abstract fun setupFontSize()
abstract fun setupDateTimeFormat()
abstract fun searchQueryChanged(text: String)
abstract fun finishActMode()
abstract fun toggleFilenameVisibility()
abstract fun increaseColumnCount()
abstract fun reduceColumnCount()
abstract fun refreshItems()
abstract fun refreshFragment()
}

View File

@ -29,13 +29,13 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
override fun setupFragment(activity: SimpleActivity) {
if (this.activity == null) {
this.activity = activity
recents_swipe_refresh.setOnRefreshListener { refreshItems() }
recents_swipe_refresh.setOnRefreshListener { refreshFragment() }
}
refreshItems()
refreshFragment()
}
override fun refreshItems() {
override fun refreshFragment() {
ensureBackgroundThread {
getRecents { recents ->
recents_swipe_refresh?.isRefreshing = false
@ -66,7 +66,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
}
}
override fun setupColors(textColor: Int, primaryColor: Int) {
override fun onResume(textColor: Int, primaryColor: Int) {
recents_placeholder.setTextColor(textColor)
getRecyclerAdapter()?.apply {

View File

@ -0,0 +1,224 @@
package com.simplemobiletools.filemanager.pro.fragments
import android.annotation.SuppressLint
import android.app.usage.StorageStatsManager
import android.content.Context
import android.content.Intent
import android.os.storage.StorageManager
import android.provider.MediaStore
import android.provider.Settings
import android.util.AttributeSet
import androidx.appcompat.app.AppCompatActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.filemanager.pro.R
import com.simplemobiletools.filemanager.pro.activities.MimeTypesActivity
import com.simplemobiletools.filemanager.pro.activities.SimpleActivity
import com.simplemobiletools.filemanager.pro.extensions.formatSizeThousand
import com.simplemobiletools.filemanager.pro.helpers.*
import kotlinx.android.synthetic.main.storage_fragment.view.*
import java.util.*
import kotlin.collections.HashMap
class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) {
private val SIZE_DIVIDER = 100000
override fun setupFragment(activity: SimpleActivity) {
total_space.text = String.format(context.getString(R.string.total_storage), "")
getSizes()
free_space_holder.setOnClickListener {
try {
val storageSettingsIntent = Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS)
activity.startActivity(storageSettingsIntent)
} catch (e: Exception) {
activity.showErrorToast(e)
}
}
images_holder.setOnClickListener { launchMimetypeActivity(IMAGES) }
videos_holder.setOnClickListener { launchMimetypeActivity(VIDEOS) }
audio_holder.setOnClickListener { launchMimetypeActivity(AUDIO) }
documents_holder.setOnClickListener { launchMimetypeActivity(DOCUMENTS) }
archives_holder.setOnClickListener { launchMimetypeActivity(ARCHIVES) }
others_holder.setOnClickListener { launchMimetypeActivity(OTHERS) }
}
override fun refreshFragment() {}
override fun onResume(textColor: Int, primaryColor: Int) {
getSizes()
context.updateTextColors(storage_fragment)
main_storage_usage_progressbar.setIndicatorColor(primaryColor)
main_storage_usage_progressbar.trackColor = primaryColor.adjustAlpha(0.3f)
val redColor = context.resources.getColor(R.color.md_red_700)
images_progressbar.setIndicatorColor(redColor)
images_progressbar.trackColor = redColor.adjustAlpha(0.3f)
val greenColor = context.resources.getColor(R.color.md_green_700)
videos_progressbar.setIndicatorColor(greenColor)
videos_progressbar.trackColor = greenColor.adjustAlpha(0.3f)
val lightBlueColor = context.resources.getColor(R.color.md_light_blue_700)
audio_progressbar.setIndicatorColor(lightBlueColor)
audio_progressbar.trackColor = lightBlueColor.adjustAlpha(0.3f)
val yellowColor = context.resources.getColor(R.color.md_yellow_700)
documents_progressbar.setIndicatorColor(yellowColor)
documents_progressbar.trackColor = yellowColor.adjustAlpha(0.3f)
val tealColor = context.resources.getColor(R.color.md_teal_700)
archives_progressbar.setIndicatorColor(tealColor)
archives_progressbar.trackColor = tealColor.adjustAlpha(0.3f)
val pinkColor = context.resources.getColor(R.color.md_pink_700)
others_progressbar.setIndicatorColor(pinkColor)
others_progressbar.trackColor = pinkColor.adjustAlpha(0.3f)
}
private fun launchMimetypeActivity(mimetype: String) {
Intent(context, MimeTypesActivity::class.java).apply {
putExtra(SHOW_MIMETYPE, mimetype)
context.startActivity(this)
}
}
private fun getSizes() {
if (!isOreoPlus()) {
return
}
ensureBackgroundThread {
getMainStorageStats(context)
val filesSize = getSizesByMimeType()
val imagesSize = filesSize[IMAGES]!!
val videosSize = filesSize[VIDEOS]!!
val audioSize = filesSize[AUDIO]!!
val documentsSize = filesSize[DOCUMENTS]!!
val archivesSize = filesSize[ARCHIVES]!!
val othersSize = filesSize[OTHERS]!!
post {
images_size.text = imagesSize.formatSize()
images_progressbar.progress = (imagesSize / SIZE_DIVIDER).toInt()
videos_size.text = videosSize.formatSize()
videos_progressbar.progress = (videosSize / SIZE_DIVIDER).toInt()
audio_size.text = audioSize.formatSize()
audio_progressbar.progress = (audioSize / SIZE_DIVIDER).toInt()
documents_size.text = documentsSize.formatSize()
documents_progressbar.progress = (documentsSize / SIZE_DIVIDER).toInt()
archives_size.text = archivesSize.formatSize()
archives_progressbar.progress = (archivesSize / SIZE_DIVIDER).toInt()
others_size.text = othersSize.formatSize()
others_progressbar.progress = (othersSize / SIZE_DIVIDER).toInt()
}
}
}
private fun getSizesByMimeType(): HashMap<String, Long> {
val uri = MediaStore.Files.getContentUri("external")
val projection = arrayOf(
MediaStore.Files.FileColumns.SIZE,
MediaStore.Files.FileColumns.MIME_TYPE,
MediaStore.Files.FileColumns.DATA
)
var imagesSize = 0L
var videosSize = 0L
var audioSize = 0L
var documentsSize = 0L
var archivesSize = 0L
var othersSize = 0L
try {
context.queryCursor(uri, projection) { cursor ->
try {
val mimeType = cursor.getStringValue(MediaStore.Files.FileColumns.MIME_TYPE)?.lowercase(Locale.getDefault())
val size = cursor.getLongValue(MediaStore.Files.FileColumns.SIZE)
if (mimeType == null) {
if (size > 0 && size != 4096L) {
val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA)
if (!context.getIsPathDirectory(path)) {
othersSize += size
}
}
return@queryCursor
}
when (mimeType.substringBefore("/")) {
"image" -> imagesSize += size
"video" -> videosSize += size
"audio" -> audioSize += size
"text" -> documentsSize += size
else -> {
when {
extraDocumentMimeTypes.contains(mimeType) -> documentsSize += size
extraAudioMimeTypes.contains(mimeType) -> audioSize += size
archiveMimeTypes.contains(mimeType) -> archivesSize += size
else -> othersSize += size
}
}
}
} catch (e: Exception) {
}
}
} catch (e: Exception) {
}
val mimeTypeSizes = HashMap<String, Long>().apply {
put(IMAGES, imagesSize)
put(VIDEOS, videosSize)
put(AUDIO, audioSize)
put(DOCUMENTS, documentsSize)
put(ARCHIVES, archivesSize)
put(OTHERS, othersSize)
}
return mimeTypeSizes
}
@SuppressLint("NewApi")
private fun getMainStorageStats(context: Context) {
val externalDirs = context.getExternalFilesDirs(null)
val storageManager = context.getSystemService(AppCompatActivity.STORAGE_SERVICE) as StorageManager
externalDirs.forEach { file ->
val storageVolume = storageManager.getStorageVolume(file) ?: return
if (storageVolume.isPrimary) {
// internal storage
val storageStatsManager = context.getSystemService(AppCompatActivity.STORAGE_STATS_SERVICE) as StorageStatsManager
val uuid = StorageManager.UUID_DEFAULT
val totalSpace = storageStatsManager.getTotalBytes(uuid)
val freeSpace = storageStatsManager.getFreeBytes(uuid)
post {
arrayOf(
main_storage_usage_progressbar, images_progressbar, videos_progressbar, audio_progressbar, documents_progressbar,
archives_progressbar, others_progressbar
).forEach {
it.max = (totalSpace / SIZE_DIVIDER).toInt()
}
main_storage_usage_progressbar.progress = ((totalSpace - freeSpace) / SIZE_DIVIDER).toInt()
main_storage_usage_progressbar.beVisible()
free_space_value.text = freeSpace.formatSizeThousand()
total_space.text = String.format(context.getString(R.string.total_storage), totalSpace.formatSizeThousand())
free_space_label.beVisible()
}
} else {
// sd card
val totalSpace = file.totalSpace
val freeSpace = file.freeSpace
}
}
}
}

View File

@ -121,4 +121,8 @@ class Config(context: Context) : BaseConfig(context) {
var showTabs: Int
get() = prefs.getInt(SHOW_TABS, ALL_TABS_MASK)
set(showTabs) = prefs.edit().putInt(SHOW_TABS, showTabs).apply()
var wasStorageAnalysisTabAdded: Boolean
get() = prefs.getBoolean(WAS_STORAGE_ANALYSIS_TAB_ADDED, false)
set(wasStorageAnalysisTabAdded) = prefs.edit().putBoolean(WAS_STORAGE_ANALYSIS_TAB_ADDED, wasStorageAnalysisTabAdded).apply()
}

View File

@ -2,6 +2,7 @@ package com.simplemobiletools.filemanager.pro.helpers
import com.simplemobiletools.commons.helpers.TAB_FILES
import com.simplemobiletools.commons.helpers.TAB_RECENT_FILES
import com.simplemobiletools.commons.helpers.TAB_STORAGE_ANALYSIS
const val PATH = "path"
const val MAX_COLUMN_COUNT = 20
@ -20,6 +21,7 @@ const val FILE_COLUMN_CNT = "file_column_cnt"
const val FILE_LANDSCAPE_COLUMN_CNT = "file_landscape_column_cnt"
const val DISPLAY_FILE_NAMES = "display_file_names"
const val SHOW_TABS = "show_tabs"
const val WAS_STORAGE_ANALYSIS_TAB_ADDED = "was_storage_analysis_tab_added"
// open as
const val OPEN_AS_DEFAULT = 0
@ -29,5 +31,37 @@ const val OPEN_AS_AUDIO = 3
const val OPEN_AS_VIDEO = 4
const val OPEN_AS_OTHER = 5
const val ALL_TABS_MASK = TAB_FILES or TAB_RECENT_FILES
val tabsList = arrayListOf(TAB_FILES, TAB_RECENT_FILES)
const val ALL_TABS_MASK = TAB_FILES or TAB_RECENT_FILES or TAB_STORAGE_ANALYSIS
val tabsList = arrayListOf(TAB_FILES, TAB_RECENT_FILES, TAB_STORAGE_ANALYSIS)
const val IMAGES = "images"
const val VIDEOS = "videos"
const val AUDIO = "audio"
const val DOCUMENTS = "documents"
const val ARCHIVES = "archives"
const val OTHERS = "others"
const val SHOW_MIMETYPE = "show_mimetype"
// what else should we count as an audio except "audio/*" mimetype
val extraAudioMimeTypes = arrayListOf("application/ogg")
val extraDocumentMimeTypes = arrayListOf(
"application/pdf",
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"application/javascript"
)
val archiveMimeTypes = arrayListOf(
"application/zip",
"application/octet-stream",
"application/json",
"application/x-tar",
"application/x-rar-compressed",
"application/x-zip-compressed",
"application/x-7z-compressed",
"application/x-compressed",
"application/x-gzip",
"application/java-archive",
"multipart/x-zip"
)

View File

@ -4,9 +4,23 @@ import com.simplemobiletools.commons.models.FileDirItem
import java.util.*
interface ItemOperationsListener {
fun refreshItems()
fun refreshFragment()
fun deleteFiles(files: ArrayList<FileDirItem>)
fun selectedPaths(paths: ArrayList<String>)
fun searchQueryChanged(text: String)
fun setupDateTimeFormat()
fun setupFontSize()
fun toggleFilenameVisibility()
fun increaseColumnCount()
fun reduceColumnCount()
fun finishActMode()
}

View File

@ -2,5 +2,6 @@ package com.simplemobiletools.filemanager.pro.models
import com.simplemobiletools.commons.models.FileDirItem
// isSectionTitle is used only at search results for showing the current folders path
data class ListItem(val mPath: String, val mName: String = "", var mIsDirectory: Boolean = false, var mChildren: Int = 0, var mSize: Long = 0L, var mModified: Long = 0L,
var isSectionTitle: Boolean) : FileDirItem(mPath, mName, mIsDirectory, mChildren, mSize, mModified)

View File

@ -0,0 +1,9 @@
<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>

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/mimetypes_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/mimetypes_placeholder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:alpha="0.8"
android:gravity="center"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin"
android:text="@string/no_items_found"
android:textSize="@dimen/bigger_text_size"
android:textStyle="italic"
android:visibility="gone" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/mimetypes_placeholder_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/mimetypes_placeholder"
android:layout_centerHorizontal="true"
android:alpha="0.8"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:padding="@dimen/activity_margin"
android:text="@string/type_2_characters"
android:textSize="@dimen/bigger_text_size"
android:textStyle="italic"
android:visibility="gone" />
<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" />
<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">
<include layout="@layout/fastscroller_handle_vertical" />
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>

View File

@ -29,5 +29,13 @@
android:paddingBottom="@dimen/activity_margin"
android:text="@string/recent_files_tab" />
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/manage_visible_tabs_storage_analysis"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_margin"
android:paddingBottom="@dimen/activity_margin"
android:text="@string/storage_analysis" />
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,305 @@
<?xml version="1.0" encoding="utf-8"?>
<com.simplemobiletools.filemanager.pro.fragments.StorageFragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/storage_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:id="@+id/storage_scrollview"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/storage_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText,RelativeOverlap">
<RelativeLayout
android:id="@+id/free_space_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/free_space_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="…"
android:textSize="@dimen/storage_free_space_text_size"
tools:text="23 GB" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/free_space_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/total_space"
android:layout_alignBaseline="@+id/free_space_value"
android:layout_alignBottom="@+id/free_space_value"
android:layout_marginStart="@dimen/medium_margin"
android:layout_toEndOf="@+id/free_space_value"
android:text="@string/storage_free"
android:textSize="@dimen/big_text_size"
android:visibility="invisible" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/main_storage_usage_progressbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/free_space_value"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:max="100"
app:trackThickness="4dp" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/total_space"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/main_storage_usage_progressbar"
android:layout_marginBottom="@dimen/big_margin"
android:textSize="@dimen/big_text_size"
tools:text="Total storage: 64 GB" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/images_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/free_space_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/images_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/images"
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/images_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:alpha="0.7"
android:text="…"
android:textSize="@dimen/normal_text_size"
tools:text="20 GB" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/images_progressbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/images_label"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:max="100"
app:trackThickness="2dp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/videos_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/images_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/videos_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/videos"
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/videos_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:alpha="0.7"
android:text="…"
android:textSize="@dimen/normal_text_size"
tools:text="20 GB" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/videos_progressbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/videos_label"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:max="100"
app:trackThickness="2dp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/audio_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/videos_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/audio_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/audio"
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/audio_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:alpha="0.7"
android:text="…"
android:textSize="@dimen/normal_text_size"
tools:text="20 GB" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/audio_progressbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/audio_label"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:max="100"
app:trackThickness="2dp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/documents_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/audio_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/documents_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/documents"
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/documents_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:alpha="0.7"
android:text="…"
android:textSize="@dimen/normal_text_size"
tools:text="20 GB" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/documents_progressbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/documents_label"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:max="100"
app:trackThickness="2dp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/archives_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/documents_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/archives_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/archives"
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/archives_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:alpha="0.7"
android:text="…"
android:textSize="@dimen/normal_text_size"
tools:text="20 GB" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/archives_progressbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/archives_label"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:max="100"
app:trackThickness="2dp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/others_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/archives_holder"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/activity_margin"
android:paddingTop="@dimen/normal_margin"
android:paddingEnd="@dimen/activity_margin"
android:paddingBottom="@dimen/normal_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/others_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/others"
android:textSize="@dimen/bigger_text_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/others_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:alpha="0.7"
android:text="…"
android:textSize="@dimen/normal_text_size"
tools:text="20 GB" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/others_progressbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/others_label"
android:layout_marginTop="@dimen/medium_margin"
android:layout_marginBottom="@dimen/medium_margin"
android:max="100"
app:trackThickness="2dp" />
</RelativeLayout>
</RelativeLayout>
</ScrollView>
</com.simplemobiletools.filemanager.pro.fragments.StorageFragment>

View File

@ -41,6 +41,18 @@
<!-- 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="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">تفعيل الدخول الى مسار الروت</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Fayl Redaktəsi</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">Root icazəsini aktivləşdir</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Editor souborů</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">Povolit přístup ke kořenovým souborům</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Golygydd Ffeiliau</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">Galluogi mynediad craidd</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Fileditor</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">Aktiver root-adgang</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Dateieditor</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">Root-Zugriff erlauben</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Επεξεργαστής αρχείων</string>
<!-- Storage analysis -->
<string name="storage_analysis">Ανάλυση Αποθήκευσης</string>
<string name="images">Εικόνες</string>
<string name="videos">Βίντεο</string>
<string name="audio">Ήχοι</string>
<string name="documents">Έγγραφα</string>
<string name="downloads">Λήψεις</string>
<string name="archives">Αρχεία</string>
<string name="others">Άλλα</string>
<string name="storage_free">ελεύθερα</string>
<string name="total_storage">Σύνολο: %s</string>
<!-- Settings -->
<string name="enable_root_access">Ενεργοποιήστε την πρόσβαση ριζικού καταλόγου</string>
<string name="press_back_twice">Απαιτείται διπλό πάτημα του πλήκτρου \"Πίσω\" για κλείσιμο εφαρμογής</string>

View File

@ -11,8 +11,8 @@
<string name="select_audio_file">Por favor, seleccione un archivo de audio</string>
<string name="search_folder">Buscar carpeta</string>
<string name="rooted_device_only">Esta operación solo funciona en dispositivos rooteados</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="recents">Recientes</string>
<string name="show_recents">Mostrar recientes</string>
<!-- Open as -->
<string name="open_as">Abrir como</string>
@ -41,9 +41,21 @@
<!-- File Editor -->
<string name="file_editor">Editor de archivos</string>
<!-- Storage analysis -->
<string name="storage_analysis">Análisis de almacenamiento</string>
<string name="images">Imágenes</string>
<string name="videos">Videos</string>
<string name="audio">Audio</string>
<string name="documents">Documentos</string>
<string name="downloads">Descargas</string>
<string name="archives">Archivos</string>
<string name="others">Otros</string>
<string name="storage_free">libre</string>
<string name="total_storage">Almacenamiento total: %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>
<string name="press_back_twice">Se requiere presionar el botón atras dos veces para salir de la 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 -->

View File

@ -41,6 +41,18 @@
<!-- 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="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">Ota käyttöön root-ominaisuudet</string>
<string name="press_back_twice">Ota käyttöön sovelluksesta poistuminen kahdella takaisin-painikkeen painalluksella</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Éditeur de fichier</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">Activer les droits root</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -65,11 +65,11 @@
Podes crear accesos directos nas pantallas para acceder rapidamente aos teus elementos favoritos.
Contén un editor de ficheiros lixeiro que pode empregar para imprimir documentos, editalos ou lelos facilmente usando xestos de zoom, sempre que sexa necesario.
E, por último, vén cun deseño material e un tema escuro de xeito predeterminado, fornece unha excelente experiencia de usuario cun uso sinxelo. Ao non requirir acceso a Internet, tes máis privacidade, seguridade e estabilidade
Non contén anuncios nin permisos innecesarios. Dispón dun tema escuro e é totalmente de código aberto.
<b>Visita a páxina nesta ligazón:</b>
https://www.simplemobiletools.com

View File

@ -40,6 +40,18 @@
<!-- 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="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">रूट एक्सेस</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Uređivač datoteka</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">Omogući root pristup</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">File Editor</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">Enable root access</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- 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>

View File

@ -41,6 +41,18 @@
<!-- 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>

View File

@ -41,6 +41,18 @@
<!-- 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="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">Abilita accesso root</string>
<string name="press_back_twice">Richiedi di premere Indietro due volte per uscire dall\'app</string>

View File

@ -41,6 +41,18 @@
<!-- 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="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">ルートアクセスを有効にする</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- 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="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">루트 접근 활성화</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Bylų redaktorius</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">Įgalinti šakninę prieigą</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Filredigerer</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">Aktiver root-tilgang</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Bewerken</string>
<!-- Storage analysis -->
<string name="storage_analysis">Opslaganalyse</string>
<string name="images">Afbeeldingen</string>
<string name="videos">Video</string>
<string name="audio">Geluid</string>
<string name="documents">Documenten</string>
<string name="downloads">Downloads</string>
<string name="archives">Archieven</string>
<string name="others">Overig</string>
<string name="storage_free">vrij</string>
<string name="total_storage">Totale opslag: %s</string>
<!-- Settings -->
<string name="enable_root_access">Root-toegang inschakelen</string>
<string name="press_back_twice">Twee keer op de terugknop drukken om af te sluiten</string>

View File

@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Prosty Menedżer Plików</string>
<string name="app_launcher_name">Menedżer Plików</string>
<string name="press_back_again">Naciśnij jeszcze raz, aby wyjść</string>
<string name="go_to_home_folder">Przejdź do folderu głównego</string>
<string name="set_as_home_folder">Ustaw jako folder główny</string>
<string name="home_folder_updated">Folder główny zaktualizowany</string>
<string name="app_name">Prosty menedżer plików</string>
<string name="app_launcher_name">Menedżer plików</string>
<string name="press_back_again">Naciśnij ponownie przycisk wstecz, aby wyjść</string>
<string name="go_to_home_folder">Przejdź do folderu domowego</string>
<string name="set_as_home_folder">Ustaw jako folder domowy</string>
<string name="home_folder_updated">Folder domowy zaktualizowany</string>
<string name="copy_path">Kopiuj ścieżkę do schowka</string>
<string name="path_copied">Ścieżka skopiowana</string>
   <string name="select_audio_file">Proszę wybrać plik audio</string>
   <string name="search_folder">Przeszukaj folder</string>
<string name="select_audio_file">Wybierz plik audio</string>
<string name="search_folder">Przeszukaj folder</string>
<string name="rooted_device_only">Ta operacja działa tylko na zrootowanych urządzeniach</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="recents">Ostatnie</string>
<string name="show_recents">Pokaż ostatnie</string>
<!-- Open as -->
<string name="open_as">Otwórz jako</string>
@ -23,14 +23,14 @@
<string name="other_file">Inny plik</string>
<!-- Compression -->
   <string name="compress">Skompresuj</string>
<string name="compress">Spakuj</string>
<string name="decompress">Rozpakuj</string>
   <string name="compress_as">Skompresuj jako</string>
<string name="compressing">Kompresowanie…</string>
<string name="compress_as">Spakuj jako</string>
<string name="compressing">Pakowanie…</string>
<string name="decompressing">Rozpakowywanie…</string>
   <string name="compression_successful">Kompresja udana</string>
   <string name="decompression_successful">Rozpakowywanie udane</string>
<string name="compressing_failed">Kompresja nie powiodła się</string>
<string name="compression_successful">Pakowanie powiodło się</string>
<string name="decompression_successful">Rozpakowywanie powiodło się</string>
<string name="compressing_failed">Pakowanie nie powiodło się</string>
<string name="decompressing_failed">Rozpakowywanie nie powiodło się</string>
<!-- Favorites -->
@ -39,44 +39,56 @@
<string name="favorites_activity_placeholder">Możesz dodać często używane foldery do ulubionych, aby mieć do nich łatwy dostęp z dowolnego miejsca.</string>
<!-- File Editor -->
   <string name="file_editor">Edytor Plików</string>
<string name="file_editor">Edytor plików</string>
<!-- Storage analysis -->
<string name="storage_analysis">Analiza pamięci</string>
<string name="images">Obrazy</string>
<string name="videos">Wideo</string>
<string name="audio">Audio</string>
<string name="documents">Dokumenty</string>
<string name="downloads">Pobrane</string>
<string name="archives">Archiwa</string>
<string name="others">Inne</string>
<string name="storage_free">wolne</string>
<string name="total_storage">Całkowita pamięć: %s</string>
<!-- Settings -->
<string name="enable_root_access">Zezwól na dostęp do uprawnień roota</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<string name="enable_root_access">Włącz dostęp do roota</string>
<string name="press_back_twice">Wymagaj dwukrotnego naciśnięcia przycisku Wstecz, aby wyjść z aplikacji</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">Prosty Menedżer Plików Pro - Zarządzaj plikami</string>
<string name="app_title">Prosty menedżer plików Pro - Zarządzaj plikami</string>
<!-- Short description has to have less than 80 chars -->
   <string name="app_short_description">Easy app for managing your files without ads, respecting your privacy &amp; security</string>
<string name="app_short_description">Prosta aplikacja do zarządzania plikami bez reklam, szanująca Twoją prywatność</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.
Lekki, szybki menedżer plików do codziennego użytku. Oferuje użyteczną funkcję wyszukiwania, możesz także dostosować folder domowy i wybrać ulubione foldery, aby uzyskać szybki dostęp.
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.
Aplikacja zawiera wiele zaawansowanych funkcji związanych z bezpieczeństwem, takich jak ochrona hasłem ukrytych elementów lub całej aplikacji. Aby zachować prywatność danych, możesz wybrać wzór, PIN lub odcisk palca.
This modern file organizer supports fast browsing of root files, SD cards and USB devices.
Ten nowoczesny organizer plików obsługuje szybkie przeglądanie plików w folderze głównym, kart SD i urządzeń USB.
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.
Aby utrzymać Twoją produktywność, oczywiście ma wszystkie standardowe operacje na plikach, takie jak zmiana nazwy, kopiowanie, przenoszenie, usuwanie, udostępnianie itp. Może być też używany do oszczędzania miejsca, ponieważ umożliwia również pakowanie i rozpakowywanie. Jeśli chcesz, możesz łatwo tworzyć nowe pliki lub foldery.
You can obviously select sorting by multiple different values, toggle between ascending and descending, or use a folder specific sorting.
Możesz oczywiście wybrać sortowanie według wielu różnych wartości, przełączać się między rosnącym i malejącym lub użyć sortowania specyficznego dla folderu.
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.
Za pomocą kilku naciśnięć możesz również sprawdzić właściwości pliku lub folderu, które pokazują różne pola, takie jak rozmiar pliku, data ostatniej modyfikacji lub wartości EXIF (data utworzenia, model aparatu itp.).
To get a file or folders path quickly, you can easily select it by long pressing and copying it in the clipboard.
Aby szybko uzyskać ścieżkę do pliku lub folderów, możesz ją łatwo wybrać, naciskając i kopiując ją do schowka.
You can create handy desktop shortcuts for accessing your favorite items quickly.
Możesz tworzyć przydatne skróty na pulpicie, aby szybko uzyskać dostęp do ulubionych elementów.
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.
Zawiera lekki edytor plików, którego można używać do drukowania dokumentów, ich edycji lub łatwego czytania za pomocą gestów powiększania, gdy jest to konieczne.
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.
Domyślnie jest wyposażony w Material Design i ciemny motyw, zapewniając doskonałe doświadczenie użytkownika dla łatwego użytkowania. Brak dostępu do Internetu zapewnia większą prywatność, bezpieczeństwo i stabilność niż inne aplikacje.
      Aplikacja nie zawiera żadnych żadnych reklam, nie potrzebuje masy uprawnień, jest w pełni otwartoźródłowa, posiada ciemny motyw dla osób z wrażliwymi oczami.
Nie zawiera reklam ani niepotrzebnych uprawnień. Jest w pełni otwartoźródłowy, zapewnia konfigurowalną kolorystykę.
<b>Check out the full suite of Simple Tools here:</b>
<b>Sprawdź pełen zestaw od Simple Tools tutaj:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple File Manager Pro:</b>
<b>Strona internetowa Prostego menedżera plików Pro:</b>
https://www.simplemobiletools.com/filemanager
<b>Facebook:</b>

View File

@ -11,8 +11,8 @@
<string name="select_audio_file">Por favor, selecione um arquivo de áudio</string>
<string name="search_folder">Procurar pasta</string>
<string name="rooted_device_only">Esta operação só funciona em dispositivos rooteados</string>
<string name="recents">Recents</string>
<string name="show_recents">Show recents</string>
<string name="recents">Recentes</string>
<string name="show_recents">Mostrar recentes</string>
<!-- Open as -->
<string name="open_as">Abrir como</string>
@ -30,8 +30,8 @@
<string name="decompressing">Descompactando…</string>
<string name="compression_successful">Compactado com sucesso</string>
<string name="decompression_successful">Descompactado com sucesso</string>
<string name="compressing_failed">Compactação falhou</string>
<string name="decompressing_failed">Descompactação falhou</string>
<string name="compressing_failed">A compactação falhou</string>
<string name="decompressing_failed">A descompactação falhou</string>
<!-- Favorites -->
<string name="manage_favorites">Gerenciar favoritos</string>
@ -41,9 +41,21 @@
<!-- File Editor -->
<string name="file_editor">Editor de Arquivos</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">Ativar o acesso root</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>
<string name="press_back_twice">Requira o duplo pressionamento do botão "voltar" para sair do 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 -->

View File

@ -11,7 +11,7 @@
<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>
<!-- Open as -->
@ -23,15 +23,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>
@ -41,9 +41,21 @@
<!-- File Editor -->
<string name="file_editor">Editor de ficheiros</string>
<!-- Storage analysis -->
<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 -->
@ -73,10 +85,10 @@
Não contém anúncios nem permissões desnecessárias. Disponibiliza um tema escuro e é totalmente \'open source\'.
<b>Consulte o conjunto completo das aplicações Simple Tools aqui:</b>
<b>Consulte o conjunto completo de aplicações Simple Tools aqui:</b>
https://www.simplemobiletools.com
<b>Site específico da aplicação Simple File Manager Pro:</b>
<b>Site da aplicação Simple File Manager Pro:</b>
https://www.simplemobiletools.com/filemanager
<b>Facebook:</b>

View File

@ -41,6 +41,18 @@
<!-- 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="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">Включить root-доступ</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Editor súborov</string>
<!-- Storage analysis -->
<string name="storage_analysis">Analýza úložiska</string>
<string name="images">Obrázky</string>
<string name="videos">Videá</string>
<string name="audio">Audio</string>
<string name="documents">Dokumenty</string>
<string name="downloads">Stiahnuté</string>
<string name="archives">Archívy</string>
<string name="others">Iné</string>
<string name="storage_free">využitých</string>
<string name="total_storage">Úložisko celkom: %s</string>
<!-- Settings -->
<string name="enable_root_access">Povoliť prístup ku koreňovým súborom</string>
<string name="press_back_twice">Vyžadovať stlačenie Späť na opustenie apky dvakrát</string>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">Filredigerare</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">Aktivera rotåtkomst</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -11,8 +11,8 @@
<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>
<!-- Open as -->
<string name="open_as">Farklı</string>
@ -41,9 +41,21 @@
<!-- File Editor -->
<string name="file_editor">Dosya Düzenleyici</string>
<!-- Storage analysis -->
<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 -->
@ -53,7 +65,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.
@ -65,11 +77,11 @@
Bir dosya veya klasör yolunu hızlı bir şekilde almak için, uzun basıp panoya kopyalayarak onu kolayca seçebilirsiniz.
Favori öğelerinize hızlı bir şekilde erişmek için kullanışlı masaüstü kısayolları oluşturabilirsiniz.
Favori ögelerinize hızlı bir şekilde erişmek için kullanışlı masaüstü kısayolları oluşturabilirsiniz.
Belgeleri yazdırmak, düzenlemek veya gerektiğinde yakınlaştırma hareketlerini kullanarak kolayca okumak için kullanabileceğiniz hafif bir dosya düzenleyici içerir.
Belgeleri yazdırmak, düzenlemek veya gerektiğinde yakınlaştırma hareketlerini kullanarak kolayca okumak için kullanabileceğiniz hafif bir dosya düzenleyici içerir.
Varsayılan olarak materyal tasarım ve koyu tema ile birlikte gelir, kolay kullanım için harika bir kullanıcı deneyimi sağlar. İnternet erişiminin olmaması size diğer uygulamalardan daha fazla gizlilik, güvenlik ve istikrar sağlar.
Varsayılan olarak materyal tasarım ve koyu tema ile birlikte gelir, kolay kullanım için harika bir kullanıcı deneyimi sağlar. İnternet erişiminin olmaması size diğer uygulamalardan daha fazla gizlilik, güvenlik ve istikrar sağlar.
Reklam veya gereksiz izinler içermez. Tamamen açık kaynaktır, özelleştirilebilir renkler sunar.

View File

@ -41,6 +41,18 @@
<!-- 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="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">Активувати root-доступ</string>
<string name="press_back_twice">Натисніть Назад двічі, щоб вийти з додатка</string>

View File

@ -41,6 +41,18 @@
<!-- 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="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">启用 root 访问</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -41,6 +41,18 @@
<!-- 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="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">啟用root權限</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -1,3 +1,4 @@
<resources>
<dimen name="grid_view_icon_size">60dp</dimen>
<dimen name="storage_free_space_text_size">46sp</dimen>
</resources>

View File

@ -41,6 +41,18 @@
<!-- File Editor -->
<string name="file_editor">File Editor</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">Enable root access</string>
<string name="press_back_twice">Require pressing Back twice to leave the app</string>

View File

@ -0,0 +1,4 @@
* Added a Storage Analyzer tab on Android 8+
* Allow saving any file type with the Save as action
* Some Android 11 related file operation improvements
* Couple stability, translation and UX improvements

View File

@ -0,0 +1 @@
* Added some stability and translation improvements

View File

@ -1,7 +1,33 @@
Może być używany także do przeglądania systemowych zakamarków i zewnętrznych kart pamięci. Z łatwością możesz zmieniać nazwy, przenosić, kopiować, usuwać i udostępniać pliki.
Lekki, szybki menedżer plików do codziennego użytku. Oferuje użyteczną funkcję wyszukiwania, możesz także dostosować folder domowy i wybrać ulubione foldery, aby uzyskać szybki dostęp.
Uprawnienie odnośnie linii papilarnych potrzebne jest do blokowania widoczności plików i folderów lub też dostępu do aplikacji.
Aplikacja zawiera wiele zaawansowanych funkcji związanych z bezpieczeństwem, takich jak ochrona hasłem ukrytych elementów lub całej aplikacji. Aby zachować prywatność danych, możesz wybrać wzór, PIN lub odcisk palca.
Aplikacja nie zawiera żadnych żadnych reklam, nie potrzebuje masy uprawnień, jest w pełni otwartoźródłowa, posiada ciemny motyw dla osób z wrażliwymi oczami.
Ten nowoczesny organizer plików obsługuje szybkie przeglądanie plików w folderze głównym, kart SD i urządzeń USB.
Niniejsza aplikacja jest tylko częścią naszej kolekcji prostych narzędzi. Ta, jak i pozostałe, dostępne są na stronie https://www.simplemobiletools.com
Aby utrzymać Twoją produktywność, oczywiście ma wszystkie standardowe operacje na plikach, takie jak zmiana nazwy, kopiowanie, przenoszenie, usuwanie, udostępnianie itp. Może być też używany do oszczędzania miejsca, ponieważ umożliwia również pakowanie i rozpakowywanie. Jeśli chcesz, możesz łatwo tworzyć nowe pliki lub foldery.
Możesz oczywiście wybrać sortowanie według wielu różnych wartości, przełączać się między rosnącym i malejącym lub użyć sortowania specyficznego dla folderu.
Za pomocą kilku naciśnięć możesz również sprawdzić właściwości pliku lub folderu, które pokazują różne pola, takie jak rozmiar pliku, data ostatniej modyfikacji lub wartości EXIF (data utworzenia, model aparatu itp.).
Aby szybko uzyskać ścieżkę do pliku lub folderów, możesz ją łatwo wybrać, naciskając i kopiując ją do schowka.
Możesz tworzyć przydatne skróty na pulpicie, aby szybko uzyskać dostęp do ulubionych elementów.
Zawiera lekki edytor plików, którego można używać do drukowania dokumentów, ich edycji lub łatwego czytania za pomocą gestów powiększania, gdy jest to konieczne.
Domyślnie jest wyposażony w Material Design i ciemny motyw, zapewniając doskonałe doświadczenie użytkownika dla łatwego użytkowania. Brak dostępu do Internetu zapewnia większą prywatność, bezpieczeństwo i stabilność niż inne aplikacje.
Nie zawiera reklam ani niepotrzebnych uprawnień. Jest w pełni otwartoźródłowy, zapewnia konfigurowalną kolorystykę.
<b>Sprawdź pełen zestaw od Simple Tools tutaj:</b>
https://www.simplemobiletools.com
<b>Strona internetowa Prostego menedżera plików Pro:</b>
https://www.simplemobiletools.com/filemanager
<b>Facebook:</b>
https://www.facebook.com/simplemobiletools
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools

View File

@ -1 +1 @@
A simple file manager for browsing and editing files and directories.
Prosta aplikacja do zarządzania plikami bez reklam, szanująca Twoją prywatność

View File

@ -1 +1 @@
Prosty menedżer plików
Prosty menedżer plików Pro - Zarządzaj plikami