diff --git a/CHANGELOG.md b/CHANGELOG.md
index e636b643..b80d6ec0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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
diff --git a/README.md b/README.md
index e9c3061e..bda7e7bb 100644
--- a/README.md
+++ b/README.md
@@ -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
-
-
+
+
diff --git a/app/build.gradle b/app/build.gradle
index 898fcb10..80dfb569 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e9f14943..f187cef6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -55,6 +55,10 @@
+
+
@@ -91,9 +95,7 @@
-
-
-
+
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MainActivity.kt
index d3e29a79..b21a76f7 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MainActivity.kt
@@ -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
= arrayListOf(items_fragment, recents_fragment)
+ private fun getAllFragments(): ArrayList = 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)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MimeTypesActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MimeTypesActivity.kt
new file mode 100644
index 00000000..6d89e220
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MimeTypesActivity.kt
@@ -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()
+ 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) {
+ deleteFiles(files, false) {
+ if (!it) {
+ runOnUiThread {
+ toast(R.string.unknown_error_occurred)
+ }
+ }
+ }
+ }
+
+ override fun selectedPaths(paths: ArrayList) {}
+
+ 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
+
+ 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) -> Unit) {
+ val fileDirItems = ArrayList()
+ 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) {
+ 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): ArrayList {
+ val listItems = ArrayList()
+ 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)
+ }
+ }
+
+ private fun columnCountChanged() {
+ invalidateOptionsMenu()
+ getRecyclerAdapter()?.apply {
+ notifyItemRangeChanged(0, listItems.size)
+ calculateContentHeight(listItems)
+ }
+ }
+
+ private fun calculateContentHeight(items: MutableList) {
+ 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()
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/ReadTextActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/ReadTextActivity.kt
index 7b2eb97d..408aa936 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/ReadTextActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/ReadTextActivity.kt
@@ -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)
""
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/adapters/ItemsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/adapters/ItemsAdapter.kt
index ab97cdfb..4308519c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/adapters/ItemsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/adapters/ItemsAdapter.kt
@@ -57,7 +57,7 @@ import java.util.zip.ZipOutputStream
class ItemsAdapter(
activity: SimpleActivity, var listItems: MutableList, 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
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/adapters/ViewPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/adapters/ViewPagerAdapter.kt
index e0158b82..95fa3e75 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/adapters/ViewPagerAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/adapters/ViewPagerAdapter.kt
@@ -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]
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/dialogs/ManageVisibleTabsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/dialogs/ManageVisibleTabsDialog.kt
index 0af6b3ab..b1642c62 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/dialogs/ManageVisibleTabsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/dialogs/ManageVisibleTabsDialog.kt
@@ -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
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Long.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Long.kt
new file mode 100644
index 00000000..61cee2fe
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Long.kt
@@ -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]}"
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt
index 13e6da3a..784841d3 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt
@@ -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)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/MyViewPagerFragment.kt
index 831efe0a..28d501a7 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/MyViewPagerFragment.kt
@@ -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()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/RecentsFragment.kt
index 2deea1b6..39541e45 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/RecentsFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/RecentsFragment.kt
@@ -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 {
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/StorageFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/StorageFragment.kt
new file mode 100644
index 00000000..e6b0f785
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/StorageFragment.kt
@@ -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 {
+ 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().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
+ }
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Config.kt
index 7c73b2bc..57f67961 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Config.kt
@@ -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()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt
index 9a0c221f..8c6b99df 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt
@@ -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"
+)
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/interfaces/ItemOperationsListener.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/interfaces/ItemOperationsListener.kt
index 5f248f41..1542aa40 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/interfaces/ItemOperationsListener.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/interfaces/ItemOperationsListener.kt
@@ -4,9 +4,23 @@ import com.simplemobiletools.commons.models.FileDirItem
import java.util.*
interface ItemOperationsListener {
- fun refreshItems()
+ fun refreshFragment()
fun deleteFiles(files: ArrayList)
fun selectedPaths(paths: ArrayList)
+
+ fun searchQueryChanged(text: String)
+
+ fun setupDateTimeFormat()
+
+ fun setupFontSize()
+
+ fun toggleFilenameVisibility()
+
+ fun increaseColumnCount()
+
+ fun reduceColumnCount()
+
+ fun finishActMode()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/models/ListItem.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/models/ListItem.kt
index 00ab9431..6250d79b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/models/ListItem.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/models/ListItem.kt
@@ -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)
diff --git a/app/src/main/res/drawable/ic_storage_vector.xml b/app/src/main/res/drawable/ic_storage_vector.xml
new file mode 100644
index 00000000..80565aae
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage_vector.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_mimetypes.xml b/app/src/main/res/layout/activity_mimetypes.xml
new file mode 100644
index 00000000..3b377baf
--- /dev/null
+++ b/app/src/main/res/layout/activity_mimetypes.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/dialog_manage_visible_tabs.xml b/app/src/main/res/layout/dialog_manage_visible_tabs.xml
index f6b28f7d..799ae011 100644
--- a/app/src/main/res/layout/dialog_manage_visible_tabs.xml
+++ b/app/src/main/res/layout/dialog_manage_visible_tabs.xml
@@ -29,5 +29,13 @@
android:paddingBottom="@dimen/activity_margin"
android:text="@string/recent_files_tab" />
+
+
diff --git a/app/src/main/res/layout/storage_fragment.xml b/app/src/main/res/layout/storage_fragment.xml
new file mode 100644
index 00000000..cf9ce9b3
--- /dev/null
+++ b/app/src/main/res/layout/storage_fragment.xml
@@ -0,0 +1,305 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index e6793476..69168260 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -41,6 +41,18 @@
محرر الملفات
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
تفعيل الدخول الى مسار الروت
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index f7e5c44c..e62163df 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -41,6 +41,18 @@
Fayl Redaktəsi
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Root icazəsini aktivləşdir
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index ab458b37..8b7c7677 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -41,6 +41,18 @@
Editor souborů
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Povolit přístup ke kořenovým souborům
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index 6d0455a2..a8b96a55 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -41,6 +41,18 @@
Golygydd Ffeiliau
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Galluogi mynediad craidd
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index b7c632f5..ba6f4c87 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -41,6 +41,18 @@
Fileditor
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Aktiver root-adgang
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 50918b12..0ea975b8 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -41,6 +41,18 @@
Dateieditor
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Root-Zugriff erlauben
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 7c3fced8..ee1ef195 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -41,6 +41,18 @@
Επεξεργαστής αρχείων
+
+ Ανάλυση Αποθήκευσης
+ Εικόνες
+ Βίντεο
+ Ήχοι
+ Έγγραφα
+ Λήψεις
+ Αρχεία
+ Άλλα
+ ελεύθερα
+ Σύνολο: %s
+
Ενεργοποιήστε την πρόσβαση ριζικού καταλόγου
Απαιτείται διπλό πάτημα του πλήκτρου \"Πίσω\" για κλείσιμο εφαρμογής
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 7d70f0de..d1593f10 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -11,8 +11,8 @@
Por favor, seleccione un archivo de audio
Buscar carpeta
Esta operación solo funciona en dispositivos rooteados
- Recents
- Show recents
+ Recientes
+ Mostrar recientes
Abrir como
@@ -41,9 +41,21 @@
Editor de archivos
+
+ Análisis de almacenamiento
+ Imágenes
+ Videos
+ Audio
+ Documentos
+ Descargas
+ Archivos
+ Otros
+ libre
+ Almacenamiento total: %s
+
Activar acceso root
- Require pressing Back twice to leave the app
+ Se requiere presionar el botón atras dos veces para salir de la app
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 95f1bcbc..93640037 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -41,6 +41,18 @@
Tiedostoeditori
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Ota käyttöön root-ominaisuudet
Ota käyttöön sovelluksesta poistuminen kahdella takaisin-painikkeen painalluksella
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 24bbe478..8aa938f9 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -41,6 +41,18 @@
Éditeur de fichier
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Activer les droits root
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-gl b/app/src/main/res/values-gl/strings.xml
similarity index 99%
rename from app/src/main/res/values-gl
rename to app/src/main/res/values-gl/strings.xml
index c73bb29e..f08e4f66 100644
--- a/app/src/main/res/values-gl
+++ b/app/src/main/res/values-gl/strings.xml
@@ -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.
-
+
Visita a páxina nesta ligazón:
https://www.simplemobiletools.com
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index b93d0e4d..3f35d2b2 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -40,6 +40,18 @@
फ़ाइल संपादक
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
रूट एक्सेस
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index b2cf5f5d..4d2ba8df 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -41,6 +41,18 @@
Uređivač datoteka
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Omogući root pristup
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 0ec5ee90..e6a55178 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -41,6 +41,18 @@
File Editor
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Enable root access
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 27a29229..d66dd18f 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -41,6 +41,18 @@
Penyunting Berkas
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Aktifkan akses root
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 27a29229..d66dd18f 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -41,6 +41,18 @@
Penyunting Berkas
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Aktifkan akses root
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 9e0bb93f..2cb54a09 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -41,6 +41,18 @@
Editor dei file
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Abilita accesso root
Richiedi di premere Indietro due volte per uscire dall\'app
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index bb5edda2..56fc6b74 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -41,6 +41,18 @@
ファイル エディター
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
ルートアクセスを有効にする
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index 73cdc747..a7e5de56 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -41,6 +41,18 @@
텍스트 편집기
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
루트 접근 활성화
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 8bda0b84..159be3cd 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -41,6 +41,18 @@
Bylų redaktorius
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Įgalinti šakninę prieigą
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index ae9eaa45..964dbbc8 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -41,6 +41,18 @@
Filredigerer
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Aktiver root-tilgang
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 586a9957..9931b450 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -41,6 +41,18 @@
Bewerken
+
+ Opslaganalyse
+ Afbeeldingen
+ Video
+ Geluid
+ Documenten
+ Downloads
+ Archieven
+ Overig
+ vrij
+ Totale opslag: %s
+
Root-toegang inschakelen
Twee keer op de terugknop drukken om af te sluiten
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 79e821e9..6c8818b3 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -1,18 +1,18 @@
- Prosty Menedżer Plików
- Menedżer Plików
- Naciśnij jeszcze raz, aby wyjść
- Przejdź do folderu głównego
- Ustaw jako folder główny
- Folder główny zaktualizowany
+ Prosty menedżer plików
+ Menedżer plików
+ Naciśnij ponownie przycisk wstecz, aby wyjść
+ Przejdź do folderu domowego
+ Ustaw jako folder domowy
+ Folder domowy zaktualizowany
Kopiuj ścieżkę do schowka
Ścieżka skopiowana
- Proszę wybrać plik audio
- Przeszukaj folder
+ Wybierz plik audio
+ Przeszukaj folder
Ta operacja działa tylko na zrootowanych urządzeniach
- Recents
- Show recents
+ Ostatnie
+ Pokaż ostatnie
Otwórz jako
@@ -23,14 +23,14 @@
Inny plik
- Skompresuj
+ Spakuj
Rozpakuj
- Skompresuj jako
- Kompresowanie…
+ Spakuj jako
+ Pakowanie…
Rozpakowywanie…
- Kompresja udana
- Rozpakowywanie udane
- Kompresja nie powiodła się
+ Pakowanie powiodło się
+ Rozpakowywanie powiodło się
+ Pakowanie nie powiodło się
Rozpakowywanie nie powiodło się
@@ -39,44 +39,56 @@
Możesz dodać często używane foldery do ulubionych, aby mieć do nich łatwy dostęp z dowolnego miejsca.
- Edytor Plików
+ Edytor plików
+
+
+ Analiza pamięci
+ Obrazy
+ Wideo
+ Audio
+ Dokumenty
+ Pobrane
+ Archiwa
+ Inne
+ wolne
+ Całkowita pamięć: %s
- Zezwól na dostęp do uprawnień roota
- Require pressing Back twice to leave the app
+ Włącz dostęp do roota
+ Wymagaj dwukrotnego naciśnięcia przycisku Wstecz, aby wyjść z aplikacji
- Prosty Menedżer Plików Pro - Zarządzaj plikami
+ Prosty menedżer plików Pro - Zarządzaj plikami
- Easy app for managing your files without ads, respecting your privacy & security
+ Prosta aplikacja do zarządzania plikami bez reklam, szanująca Twoją prywatność
- 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ę.
- Check out the full suite of Simple Tools here:
+ Sprawdź pełen zestaw od Simple Tools tutaj:
https://www.simplemobiletools.com
- Standalone website of Simple File Manager Pro:
+ Strona internetowa Prostego menedżera plików Pro:
https://www.simplemobiletools.com/filemanager
Facebook:
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 250d7145..d2c97711 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -11,8 +11,8 @@
Por favor, selecione um arquivo de áudio
Procurar pasta
Esta operação só funciona em dispositivos rooteados
- Recents
- Show recents
+ Recentes
+ Mostrar recentes
Abrir como
@@ -30,8 +30,8 @@
Descompactando…
Compactado com sucesso
Descompactado com sucesso
- Compactação falhou
- Descompactação falhou
+ A compactação falhou
+ A descompactação falhou
Gerenciar favoritos
@@ -41,9 +41,21 @@
Editor de Arquivos
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Ativar o acesso root
- Require pressing Back twice to leave the app
+ Requira o duplo pressionamento do botão "voltar" para sair do app
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 78d0d477..bc93f98d 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -11,7 +11,7 @@
Selecione um ficheiro de áudio
Pesquisar pasta
Esta operação apenas funciona em dispositivos com root
- Recents
+ Recentes
Mostrar recentes
@@ -23,15 +23,15 @@
Outro tipo
- Comprimir
- Descomprimir
- Comprimir como
- A comprimir…
- A descomprimir…
- Compressão terminada
- Descompressão terminada
- Falha ao comprimir
- Falha ao descomprimir
+ Compactar
+ Descompactar
+ Compactar como
+ A compactar…
+ A descompactar…
+ Compactação terminada
+ Descompactação terminada
+ Falha ao compactar
+ Falha ao descompactar
Gerir favoritos
@@ -41,9 +41,21 @@
Editor de ficheiros
+
+ Análise ao armazenamento
+ Imagens
+ Vídeos
+ Áudio
+ Documentos
+ Descargas
+ Arquivos
+ Outros
+ livre
+ Armazenamento total: %s
+
Ativar acesso root
- Require pressing Back twice to leave the app
+ Premir duas vezes a tecla Back para sair da aplicação
@@ -73,10 +85,10 @@
Não contém anúncios nem permissões desnecessárias. Disponibiliza um tema escuro e é totalmente \'open source\'.
- Consulte o conjunto completo das aplicações Simple Tools aqui:
+ Consulte o conjunto completo de aplicações Simple Tools aqui:
https://www.simplemobiletools.com
- Site específico da aplicação Simple File Manager Pro:
+ Site da aplicação Simple File Manager Pro:
https://www.simplemobiletools.com/filemanager
Facebook:
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index aa7b8ae8..d11cf7c7 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -41,6 +41,18 @@
Редактор файлов
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Включить root-доступ
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 1479f3d3..1d24eb67 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -41,6 +41,18 @@
Editor súborov
+
+ Analýza úložiska
+ Obrázky
+ Videá
+ Audio
+ Dokumenty
+ Stiahnuté
+ Archívy
+ Iné
+ využitých
+ Úložisko celkom: %s
+
Povoliť prístup ku koreňovým súborom
Vyžadovať stlačenie Späť na opustenie apky dvakrát
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 3f70a673..e5fa79ee 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -41,6 +41,18 @@
Filredigerare
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Aktivera rotåtkomst
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 90b168cd..404d852e 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -11,8 +11,8 @@
Lütfen bir ses dosyası seçin
Klasör ara
Bu işlem sadece rootlu cihazlarda çalışır
- Recents
- Show recents
+ Son dosyalar
+ Son dosyaları göster
Farklı aç
@@ -41,9 +41,21 @@
Dosya Düzenleyici
+
+ Depolama analizi
+ Resimler
+ Videolar
+ Sesler
+ Belgeler
+ İndirilenler
+ Arşivler
+ Diğerleri
+ boş
+ Toplam depolama: %s
+
Root erişimini etkinleştir
- Require pressing Back twice to leave the app
+ Uygulamadan çıkmak için Geri tuşuna iki kez basmayı gerektir
@@ -53,7 +65,7 @@
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.
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index f7579027..0c4245c9 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -41,6 +41,18 @@
Редактор файлів
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Активувати root-доступ
Натисніть Назад двічі, щоб вийти з додатка
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index af88fd20..ffde2c32 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -41,6 +41,18 @@
文件编辑器
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
启用 root 访问
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 6f59b334..02c1b313 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -41,6 +41,18 @@
檔案編輯器
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
啟用root權限
Require pressing Back twice to leave the app
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index d2443b57..bfda7798 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,3 +1,4 @@
60dp
+ 46sp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index af92bdb8..c7d2c25e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -41,6 +41,18 @@
File Editor
+
+ Storage analysis
+ Images
+ Videos
+ Audio
+ Documents
+ Downloads
+ Archives
+ Others
+ free
+ Total storage: %s
+
Enable root access
Require pressing Back twice to leave the app
diff --git a/fastlane/metadata/android/en-US/changelogs/109.txt b/fastlane/metadata/android/en-US/changelogs/109.txt
new file mode 100644
index 00000000..219250d3
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/109.txt
@@ -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
diff --git a/fastlane/metadata/android/en-US/changelogs/110.txt b/fastlane/metadata/android/en-US/changelogs/110.txt
new file mode 100644
index 00000000..049bce3d
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/110.txt
@@ -0,0 +1 @@
+ * Added some stability and translation improvements
diff --git a/fastlane/metadata/android/pl/full_description.txt b/fastlane/metadata/android/pl/full_description.txt
index f841258a..1983ac89 100644
--- a/fastlane/metadata/android/pl/full_description.txt
+++ b/fastlane/metadata/android/pl/full_description.txt
@@ -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ę.
+
+Sprawdź pełen zestaw od Simple Tools tutaj:
+https://www.simplemobiletools.com
+
+Strona internetowa Prostego menedżera plików Pro:
+https://www.simplemobiletools.com/filemanager
+
+Facebook:
+https://www.facebook.com/simplemobiletools
+
+Reddit:
+https://www.reddit.com/r/SimpleMobileTools
\ No newline at end of file
diff --git a/fastlane/metadata/android/pl/short_description.txt b/fastlane/metadata/android/pl/short_description.txt
index c74f717d..b7e56ab3 100644
--- a/fastlane/metadata/android/pl/short_description.txt
+++ b/fastlane/metadata/android/pl/short_description.txt
@@ -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ść
diff --git a/fastlane/metadata/android/pl/title.txt b/fastlane/metadata/android/pl/title.txt
index ac7f0fef..cf475903 100644
--- a/fastlane/metadata/android/pl/title.txt
+++ b/fastlane/metadata/android/pl/title.txt
@@ -1 +1 @@
-Prosty menedżer plików
+Prosty menedżer plików Pro - Zarządzaj plikami