diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1d017dc06..38dadd51b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,114 @@
Changelog
==========
+Version 6.17.1 *(2020-11-03)*
+----------------------------
+
+ * Reverting to the previous UI of the main screen, but keep rounded corners at list view
+ * Some UI and stability improvements
+
+Version 6.17.0 *(2020-11-02)*
+----------------------------
+
+ * Redesigning the main folders screen, try making it moderner (!)
+ * Fix some glitches with deep zoomable fullscreen images not loading in well
+ * Couple other UX, stability and translation improvements
+
+Version 6.16.5 *(2020-10-28)*
+----------------------------
+
+ * Added some hidden folder handling related improvements
+ * Fixed saving files on the SD card after editing
+ * Couple other UX, translation and performance improvements
+
+Version 6.16.4 *(2020-10-24)*
+----------------------------
+
+ * Fixed an editor glitch occurring if the file path contained spaces
+ * Added some stability improvements
+
+Version 6.16.3 *(2020-10-16)*
+----------------------------
+
+ * Updated the photo editor to fix some issues, mostly related to Android 11
+ * Make sure file moving doesn't block the UI in any case
+
+Version 6.16.2 *(2020-10-10)*
+----------------------------
+
+ * Fix sorting by Date Taken
+ * Properly display some wrongly named WebP files
+
+Version 6.16.1 *(2020-09-27)*
+----------------------------
+
+ * Fixed a bug with some folders not being recognized
+ * Improved thumbnail loading performance in some cases
+
+Version 6.16.0 *(2020-09-25)*
+----------------------------
+
+ * Adding support for animated WebP files
+ * Fixed a permissions glitch after upgrading to Android 11
+ * Added many performance related improvements
+
+Version 6.15.6 *(2020-09-22)*
+----------------------------
+
+ * Fixed the file loading performance in some cases
+ * Fixed some photo editor related glitches
+ * Fixed the Use English language settings toggle
+
+Version 6.15.5 *(2020-09-16)*
+----------------------------
+
+ * Properly fetch the latest available Last Modified of files
+
+Version 6.15.4 *(2020-09-16)*
+----------------------------
+
+ * Improved file loading performance
+
+Version 6.15.3 *(2020-09-09)*
+----------------------------
+
+ * Improved file loading performance in some cases
+ * Some UX, translation and stability improvements
+
+Version 6.15.2 *(2020-06-17)*
+----------------------------
+
+ * Fixed a glitch at caching fullscreen images
+ * Properly recognize a new type of panoramic images
+
+Version 6.15.1 *(2020-06-12)*
+----------------------------
+
+ * Fixed a glitch at caching fullscreen images
+ * Improved batch renaming with patterns
+
+Version 6.15.0 *(2020-06-07)*
+----------------------------
+
+ * Rescan the internal storage from time to time, look for new folders containing media
+ * Improve the Search user experience, do not reset it at opening an item
+ * Fixed some editor glitches
+ * Speed up fullscreen image loading
+
+Version 6.14.10 *(2020-05-29)*
+----------------------------
+
+ * Updated the image editor, fix a glitch with black preview
+ * Show Portrait images by default on Android 10
+ * Use a nicer icon on older devices
+ * Some translation and stability improvements
+
+Version 6.14.9 *(2020-05-18)*
+----------------------------
+
+ * Fixing some glitches with hidden folders not being shown when appropriate
+ * Added some stability and translation improvements
+
Version 6.14.8 *(2020-05-05)*
----------------------------
diff --git a/app/build.gradle b/app/build.gradle
index f76bd1d69..f8424da7e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -17,9 +17,8 @@ android {
applicationId "com.simplemobiletools.gallery.pro"
minSdkVersion 21
targetSdkVersion 29
- versionCode 309
- versionName "6.14.8"
- multiDexEnabled true
+ versionCode 326
+ versionName "6.17.1"
setProperty("archivesBaseName", "gallery-$versionCode")
vectorDrawables.useSupportLibrary = true
}
@@ -78,12 +77,11 @@ android {
}
dependencies {
- implementation 'com.simplemobiletools:commons:5.28.4'
+ implementation 'com.simplemobiletools:commons:5.31.19'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
- implementation 'androidx.multidex:multidex:2.0.1'
implementation 'it.sephiroth.android.exif:library:1.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19'
- implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6'
implementation 'com.google.vr:sdk-panowidget:1.180.0'
implementation 'com.google.vr:sdk-videowidget:1.180.0'
@@ -92,7 +90,9 @@ dependencies {
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.caverock:androidsvg-aar:1.3'
implementation 'com.github.tibbi:gestureviews:512f929d82'
- implementation 'com.github.tibbi:subsampling-scale-image-view:381878c078'
+ implementation 'com.github.tibbi:subsampling-scale-image-view:81c021514c'
+ implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
+ implementation 'com.github.penfeizhou.android.animation:awebp:2.5.1'
kapt 'com.github.bumptech.glide:compiler:4.10.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de8fca45c..2cbbf2613 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,7 +5,12 @@
package="com.simplemobiletools.gallery.pro"
android:installLocation="auto">
-
+
+
+
{
- override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
- if (uri != originalUri) {
- uri = originalUri
- Handler().post {
- loadDefaultImageView()
- }
+ .asBitmap()
+ .load(uri)
+ .apply(options)
+ .listener(object : RequestListener {
+ override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
+ if (uri != originalUri) {
+ uri = originalUri
+ Handler().post {
+ loadDefaultImageView()
}
- return false
+ }
+ return false
+ }
+
+ override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
+ val currentFilter = getFiltersAdapter()?.getCurrentFilter()
+ if (filterInitialBitmap == null) {
+ loadCropImageView()
+ bottomCropRotateClicked()
}
- override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
- val currentFilter = getFiltersAdapter()?.getCurrentFilter()
- if (filterInitialBitmap == null) {
- loadCropImageView()
- bottomCropRotateClicked()
+ if (filterInitialBitmap != null && currentFilter != null && currentFilter.filter.name != getString(R.string.none)) {
+ default_image_view.onGlobalLayout {
+ applyFilter(currentFilter)
}
-
- if (filterInitialBitmap != null && currentFilter != null && currentFilter.filter.name != getString(R.string.none)) {
- default_image_view.onGlobalLayout {
- applyFilter(currentFilter)
- }
- } else {
- filterInitialBitmap = bitmap
- }
-
- if (isCropIntent) {
- bottom_primary_filter.beGone()
- bottom_primary_draw.beGone()
- }
-
- return false
+ } else {
+ filterInitialBitmap = bitmap
}
- }).into(default_image_view)
+
+ if (isCropIntent) {
+ bottom_primary_filter.beGone()
+ bottom_primary_draw.beGone()
+ }
+
+ return false
+ }
+ }).into(default_image_view)
}
private fun loadCropImageView() {
@@ -275,17 +276,17 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
val size = Point()
windowManager.defaultDisplay.getSize(size)
val options = RequestOptions()
- .format(DecodeFormat.PREFER_ARGB_8888)
- .skipMemoryCache(true)
- .diskCacheStrategy(DiskCacheStrategy.NONE)
- .fitCenter()
+ .format(DecodeFormat.PREFER_ARGB_8888)
+ .skipMemoryCache(true)
+ .diskCacheStrategy(DiskCacheStrategy.NONE)
+ .fitCenter()
try {
val builder = Glide.with(applicationContext)
- .asBitmap()
- .load(uri)
- .apply(options)
- .into(editor_draw_canvas.width, editor_draw_canvas.height)
+ .asBitmap()
+ .load(uri)
+ .apply(options)
+ .into(editor_draw_canvas.width, editor_draw_canvas.height)
val bitmap = builder.get()
runOnUiThread {
@@ -304,16 +305,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
@TargetApi(Build.VERSION_CODES.N)
private fun saveImage() {
- var inputStream: InputStream? = null
- try {
- if (isNougatPlus()) {
- inputStream = contentResolver.openInputStream(uri!!)
- oldExif = ExifInterface(inputStream!!)
- }
- } catch (e: Exception) {
- } finally {
- inputStream?.close()
- }
+ setOldExif()
if (crop_image_view.isVisible()) {
crop_image_view.getCroppedImageAsync()
@@ -354,6 +346,20 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
}
+ @TargetApi(Build.VERSION_CODES.N)
+ private fun setOldExif() {
+ var inputStream: InputStream? = null
+ try {
+ if (isNougatPlus()) {
+ inputStream = contentResolver.openInputStream(uri!!)
+ oldExif = ExifInterface(inputStream!!)
+ }
+ } catch (e: Exception) {
+ } finally {
+ inputStream?.close()
+ }
+ }
+
private fun shareImage() {
ensureBackgroundThread {
when {
@@ -591,17 +597,17 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
val bitmap = try {
Glide.with(this)
- .asBitmap()
- .load(uri).listener(object : RequestListener {
- override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
- showErrorToast(e.toString())
- return false
- }
+ .asBitmap()
+ .load(uri).listener(object : RequestListener {
+ override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
+ showErrorToast(e.toString())
+ return false
+ }
- override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean) = false
- })
- .submit(thumbnailSize, thumbnailSize)
- .get()
+ override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean) = false
+ })
+ .submit(thumbnailSize, thumbnailSize)
+ .get()
} catch (e: GlideException) {
showErrorToast(e)
finish()
@@ -742,6 +748,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult) {
if (result.error == null) {
+ setOldExif()
+
val bitmap = result.bitmap
if (isSharingBitmap) {
isSharingBitmap = false
@@ -862,7 +870,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
try {
if (isNougatPlus()) {
val newExif = ExifInterface(file.absolutePath)
- oldExif?.copyTo(newExif, false)
+ oldExif?.copyNonDimensionAttributesTo(newExif)
}
} catch (e: Exception) {
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt
index 161e89604..42ef17836 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt
@@ -23,7 +23,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog
import com.simplemobiletools.commons.dialogs.FilePickerDialog
-import com.simplemobiletools.commons.dialogs.NewAppsIconsDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem
@@ -84,7 +83,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private var mStoredCropThumbnails = true
private var mStoredScrollHorizontally = true
private var mStoredShowMediaCount = true
- private var mStoredShowInfoBubble = true
private var mStoredTextColor = 0
private var mStoredPrimaryColor = 0
@@ -155,12 +153,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
finish()
}
}
-
- // notify some users about the Dialer, SMS Messenger and Voice Recorder apps
- if (!config.wasMessengerRecorderShown && config.appRunCount > 35) {
- NewAppsIconsDialog(this)
- config.wasMessengerRecorderShown = true
- }
}
override fun onStart() {
@@ -204,28 +196,28 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
directories_horizontal_fastscroller.updateBubbleColors()
directories_vertical_fastscroller.updateBubbleColors()
- directories_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
- directories_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
directories_refresh_layout.isEnabled = config.enablePullToRefresh
- invalidateOptionsMenu()
directories_empty_placeholder.setTextColor(config.textColor)
directories_empty_placeholder_2.setTextColor(getAdjustedPrimaryColor())
directories_switch_searching.setTextColor(getAdjustedPrimaryColor())
directories_switch_searching.underlineText()
- if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
- handleAppPasswordProtection {
- mWasProtectionHandled = it
- if (it) {
- mIsPasswordProtectionPending = false
- tryLoadGallery()
- } else {
- finish()
+ if (!mIsSearchOpen) {
+ invalidateOptionsMenu()
+ if (mIsPasswordProtectionPending && !mWasProtectionHandled) {
+ handleAppPasswordProtection {
+ mWasProtectionHandled = it
+ if (it) {
+ mIsPasswordProtectionPending = false
+ tryLoadGallery()
+ } else {
+ finish()
+ }
}
+ } else {
+ tryLoadGallery()
}
- } else {
- tryLoadGallery()
}
}
@@ -239,7 +231,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
override fun onStop() {
super.onStop()
- mSearchMenuItem?.collapseActionView()
if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) {
mTempShowHiddenHandler.postDelayed({
@@ -342,7 +333,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
mStoredCropThumbnails = cropThumbnails
mStoredScrollHorizontally = scrollHorizontally
mStoredShowMediaCount = showMediaCount
- mStoredShowInfoBubble = showInfoBubble
mStoredTextColor = textColor
mStoredPrimaryColor = primaryColor
}
@@ -439,22 +429,27 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
private fun tryLoadGallery() {
- if (hasPermission(PERMISSION_WRITE_STORAGE)) {
- if (!config.wasUpgradedFromFreeShown && isPackageInstalled("com.simplemobiletools.gallery")) {
- ConfirmationDialog(this, "", R.string.upgraded_from_free, R.string.ok, 0) {}
- config.wasUpgradedFromFreeShown = true
- }
+ handlePermission(PERMISSION_WRITE_STORAGE) {
+ if (it) {
+ if (!config.wasUpgradedFromFreeShown && isPackageInstalled("com.simplemobiletools.gallery")) {
+ ConfirmationDialog(this, "", R.string.upgraded_from_free, R.string.ok, 0) {}
+ config.wasUpgradedFromFreeShown = true
+ }
- checkOTGPath()
- checkDefaultSpamFolders()
+ checkOTGPath()
+ checkDefaultSpamFolders()
- if (config.showAll) {
- showAllMedia()
+ if (config.showAll) {
+ showAllMedia()
+ } else {
+ getDirectories()
+ }
+
+ setupLayoutManager()
} else {
- getDirectories()
+ toast(R.string.no_storage_permissions)
+ finish()
}
-
- setupLayoutManager()
}
}
@@ -638,6 +633,21 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
layoutManager.spanCount = config.dirColumnCnt
}
+ private fun setupListLayoutManager() {
+ val layoutManager = directories_grid.layoutManager as MyGridLayoutManager
+ layoutManager.spanCount = 1
+ layoutManager.orientation = RecyclerView.VERTICAL
+ directories_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+
+ val smallMargin = resources.getDimension(R.dimen.small_margin).toInt()
+ (directories_grid.layoutParams as RelativeLayout.LayoutParams).apply {
+ topMargin = smallMargin
+ bottomMargin = smallMargin
+ }
+
+ mZoomListener = null
+ }
+
private fun measureRecyclerViewContent(directories: ArrayList) {
directories_grid.onGlobalLayout {
if (config.scrollHorizontally) {
@@ -687,21 +697,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
- private fun setupListLayoutManager() {
- val layoutManager = directories_grid.layoutManager as MyGridLayoutManager
- layoutManager.spanCount = 1
- layoutManager.orientation = RecyclerView.VERTICAL
- directories_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
-
- val smallMargin = resources.getDimension(R.dimen.small_margin).toInt()
- (directories_grid.layoutParams as RelativeLayout.LayoutParams).apply {
- topMargin = smallMargin
- bottomMargin = smallMargin
- }
-
- mZoomListener = null
- }
-
private fun toggleRecycleBin(show: Boolean) {
config.showRecycleBinAtFolders = show
invalidateOptionsMenu()
@@ -907,10 +902,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val hiddenString = getString(R.string.hidden)
val albumCovers = config.parseAlbumCovers()
val includedFolders = config.includedFolders
+ val noMediaFolders = getNoMediaFoldersSync()
val tempFolderPath = config.tempFolderPath
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
val favoritePaths = getFavoritePaths()
val dirPathsToRemove = ArrayList()
+ val lastModifieds = if (isRPlus()) mLastMediaFetcher!!.getLastModifieds() else HashMap()
+ val dateTakens = mLastMediaFetcher!!.getDateTakens()
try {
for (directory in dirs) {
@@ -930,14 +928,16 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
- val curMedia = mLastMediaFetcher!!.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false)
+ val curMedia = mLastMediaFetcher!!.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified,
+ getProperFileSize, favoritePaths, false, lastModifieds, dateTakens)
+
val newDir = if (curMedia.isEmpty()) {
if (directory.path != tempFolderPath) {
dirPathsToRemove.add(directory.path)
}
directory
} else {
- createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize)
+ createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
}
// we are looping through the already displayed folders looking for changes, do not do anything if nothing changed
@@ -969,14 +969,19 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}.start()
}
- getCachedMedia(directory.path, getVideosOnly, getImagesOnly) {
- it.forEach {
- if (!curMedia.contains(it)) {
- val path = (it as? Medium)?.path
- if (path != null) {
- deleteDBPath(path)
+ if (!directory.isRecycleBin()) {
+ getCachedMedia(directory.path, getVideosOnly, getImagesOnly) {
+ val mediaToDelete = ArrayList()
+ it.forEach {
+ if (!curMedia.contains(it)) {
+ val medium = it as? Medium
+ val path = medium?.path
+ if (path != null) {
+ mediaToDelete.add(medium)
+ }
}
}
+ mediaDB.deleteMedia(*mediaToDelete.toTypedArray())
}
}
}
@@ -1022,7 +1027,9 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
grouping and GROUP_BY_LAST_MODIFIED_DAILY != 0 ||
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
- val newMedia = mLastMediaFetcher!!.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false)
+ val newMedia = mLastMediaFetcher!!.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified,
+ getProperFileSize, favoritePaths, false, lastModifieds, dateTakens)
+
if (newMedia.isEmpty()) {
continue
}
@@ -1036,7 +1043,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
- val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize)
+ val newDir = createDirectoryFromMedia(folder, newMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
dirs.add(newDir)
setupAdapter(dirs)
@@ -1077,6 +1084,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}.mapTo(everShownFolders) { it.path }
try {
+ // scan the internal storage from time to time for new folders
+ if (config.appRunCount == 1 || config.appRunCount % 30 == 0) {
+ everShownFolders.addAll(getFoldersWithMedia(config.internalStoragePath))
+ }
+
// catch some extreme exceptions like too many everShownFolders for storing, shouldnt really happen
config.everShownFolders = everShownFolders
} catch (e: Exception) {
@@ -1171,12 +1183,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
directories_horizontal_fastscroller.beVisibleIf(allowHorizontalScroll)
if (allowHorizontalScroll) {
- directories_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
directories_horizontal_fastscroller.setViews(directories_grid, directories_refresh_layout) {
directories_horizontal_fastscroller.updateBubbleText(getBubbleTextItem(it))
}
} else {
- directories_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
directories_vertical_fastscroller.setViews(directories_grid, directories_refresh_layout) {
directories_vertical_fastscroller.updateBubbleText(getBubbleTextItem(it))
}
@@ -1326,6 +1336,27 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
}
}
+ private fun getFoldersWithMedia(path: String): HashSet {
+ val folders = HashSet()
+ try {
+ val files = File(path).listFiles()
+ if (files != null) {
+ files.sortBy { !it.isDirectory }
+ for (file in files) {
+ if (file.isDirectory && !file.startsWith("${config.internalStoragePath}/Android")) {
+ folders.addAll(getFoldersWithMedia(file.absolutePath))
+ } else if (file.isFile && file.isMediaFile()) {
+ folders.add(file.parent ?: "")
+ break
+ }
+ }
+ }
+ } catch (ignored: Exception) {
+ }
+
+ return folders
+ }
+
override fun refreshItems() {
getDirectories()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt
index 5ac44db95..532af9486 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt
@@ -24,10 +24,7 @@ import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
-import com.simplemobiletools.commons.helpers.REQUEST_EDIT_IMAGE
-import com.simplemobiletools.commons.helpers.SORT_BY_RANDOM
-import com.simplemobiletools.commons.helpers.ensureBackgroundThread
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.commons.views.MyRecyclerView
@@ -76,7 +73,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
private var mStoredAnimateGifs = true
private var mStoredCropThumbnails = true
private var mStoredScrollHorizontally = true
- private var mStoredShowInfoBubble = true
private var mStoredShowFileTypes = true
private var mStoredTextColor = 0
private var mStoredPrimaryColor = 0
@@ -159,13 +155,14 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
media_horizontal_fastscroller.updateBubbleColors()
media_vertical_fastscroller.updateBubbleColors()
- media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
- media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_refresh_layout.isEnabled = config.enablePullToRefresh
- invalidateOptionsMenu()
media_empty_text_placeholder.setTextColor(config.textColor)
media_empty_text_placeholder_2.setTextColor(getAdjustedPrimaryColor())
+ if (!mIsSearchOpen) {
+ invalidateOptionsMenu()
+ }
+
if (mMedia.isEmpty() || config.getFolderSorting(mPath) and SORT_BY_RANDOM == 0) {
if (shouldSkipAuthentication()) {
tryLoadGallery()
@@ -195,7 +192,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
override fun onStop() {
super.onStop()
- mSearchMenuItem?.collapseActionView()
if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) {
mTempShowHiddenHandler.postDelayed({
@@ -292,7 +288,6 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mStoredAnimateGifs = animateGifs
mStoredCropThumbnails = cropThumbnails
mStoredScrollHorizontally = scrollHorizontally
- mStoredShowInfoBubble = showInfoBubble
mStoredShowFileTypes = showThumbnailFileTypes
mStoredTextColor = textColor
mStoredPrimaryColor = primaryColor
@@ -393,7 +388,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
initZoomListener()
val fastscroller = if (config.scrollHorizontally) media_horizontal_fastscroller else media_vertical_fastscroller
MediaAdapter(this, mMedia.clone() as ArrayList, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent,
- mAllowPickingMultiple, mPath, media_grid, fastscroller) {
+ mAllowPickingMultiple, mPath, media_grid, fastscroller) {
if (it is Medium && !isFinishing) {
itemClicked(it.path)
}
@@ -424,12 +419,10 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val sorting = config.getFolderSorting(if (mShowAll) SHOW_ALL else mPath)
if (allowHorizontalScroll) {
- media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid, media_refresh_layout) {
media_horizontal_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
} else {
- media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid, media_refresh_layout) {
media_vertical_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
@@ -799,24 +792,24 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
val ratio = wantedWidth.toFloat() / wantedHeight
val options = RequestOptions()
- .override((wantedWidth * ratio).toInt(), wantedHeight)
- .fitCenter()
+ .override((wantedWidth * ratio).toInt(), wantedHeight)
+ .fitCenter()
Glide.with(this)
- .asBitmap()
- .load(File(path))
- .apply(options)
- .into(object : SimpleTarget() {
- override fun onResourceReady(resource: Bitmap, transition: Transition?) {
- try {
- WallpaperManager.getInstance(applicationContext).setBitmap(resource)
- setResult(Activity.RESULT_OK)
- } catch (ignored: IOException) {
- }
-
- finish()
+ .asBitmap()
+ .load(File(path))
+ .apply(options)
+ .into(object : SimpleTarget() {
+ override fun onResourceReady(resource: Bitmap, transition: Transition?) {
+ try {
+ WallpaperManager.getInstance(applicationContext).setBitmap(resource)
+ setResult(Activity.RESULT_OK)
+ } catch (ignored: IOException) {
}
- })
+
+ finish()
+ }
+ })
} else if (mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent) {
Intent().apply {
data = Uri.parse(path)
@@ -872,12 +865,12 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
mLatestMediaDateId = getLatestMediaByDateId()
if (!isFromCache) {
val mediaToInsert = (mMedia).filter { it is Medium && it.deletedTS == 0L }.map { it as Medium }
- try {
- Thread {
+ Thread {
+ try {
mediaDB.insertAll(mediaToInsert)
- }.start()
- } catch (e: Exception) {
- }
+ } catch (e: Exception) {
+ }
+ }.start()
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt
index 4eea261ac..d79790cb3 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SearchActivity.kt
@@ -13,6 +13,7 @@ import androidx.core.view.MenuItemCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.MyGridLayoutManager
@@ -218,12 +219,10 @@ class SearchActivity : SimpleActivity(), MediaOperationsListener {
val sorting = config.getFolderSorting(SHOW_ALL)
if (allowHorizontalScroll) {
- media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid) {
media_horizontal_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
} else {
- media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid) {
media_vertical_fastscroller.updateBubbleText(getBubbleTextItem(it, sorting))
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt
index 8d43b89a8..b53113727 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt
@@ -70,7 +70,6 @@ class SettingsActivity : SimpleActivity() {
setupThumbnailFileTypes()
setupShowMediaCount()
setupKeepLastModified()
- setupShowInfoBubble()
setupEnablePullToRefresh()
setupAllowZoomingImages()
setupShowHighestQuality()
@@ -428,14 +427,6 @@ class SettingsActivity : SimpleActivity() {
}
}
- private fun setupShowInfoBubble() {
- settings_show_info_bubble.isChecked = config.showInfoBubble
- settings_show_info_bubble_holder.setOnClickListener {
- settings_show_info_bubble.toggle()
- config.showInfoBubble = settings_show_info_bubble.isChecked
- }
- }
-
private fun setupEnablePullToRefresh() {
settings_enable_pull_to_refresh.isChecked = config.enablePullToRefresh
settings_enable_pull_to_refresh_holder.setOnClickListener {
@@ -650,7 +641,6 @@ class SettingsActivity : SimpleActivity() {
put(CROP_THUMBNAILS, config.cropThumbnails)
put(SHOW_THUMBNAIL_VIDEO_DURATION, config.showThumbnailVideoDuration)
put(SHOW_MEDIA_COUNT, config.showMediaCount)
- put(SHOW_INFO_BUBBLE, config.showInfoBubble)
put(SCROLL_HORIZONTALLY, config.scrollHorizontally)
put(ENABLE_PULL_TO_REFRESH, config.enablePullToRefresh)
put(MAX_BRIGHTNESS, config.maxBrightness)
@@ -786,7 +776,6 @@ class SettingsActivity : SimpleActivity() {
CROP_THUMBNAILS -> config.cropThumbnails = value.toBoolean()
SHOW_THUMBNAIL_VIDEO_DURATION -> config.showThumbnailVideoDuration = value.toBoolean()
SHOW_MEDIA_COUNT -> config.showMediaCount = value.toBoolean()
- SHOW_INFO_BUBBLE -> config.showInfoBubble = value.toBoolean()
SCROLL_HORIZONTALLY -> config.scrollHorizontally = value.toBoolean()
ENABLE_PULL_TO_REFRESH -> config.enablePullToRefresh = value.toBoolean()
MAX_BRIGHTNESS -> config.maxBrightness = value.toBoolean()
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt
index a29be1226..232c07f5b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt
@@ -187,11 +187,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
findItem(R.id.menu_change_orientation).isVisible = rotationDegrees == 0 && visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION == 0
findItem(R.id.menu_change_orientation).icon = resources.getDrawable(getChangeOrientationIcon())
findItem(R.id.menu_rotate).setShowAsAction(
- if (rotationDegrees != 0) {
- MenuItem.SHOW_AS_ACTION_ALWAYS
- } else {
- MenuItem.SHOW_AS_ACTION_IF_ROOM
- })
+ if (rotationDegrees != 0) {
+ MenuItem.SHOW_AS_ACTION_ALWAYS
+ } else {
+ MenuItem.SHOW_AS_ACTION_IF_ROOM
+ })
}
if (visibleBottomActions != 0) {
@@ -718,10 +718,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
val shortcut = ShortcutInfo.Builder(this, path)
- .setShortLabel(medium.name)
- .setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
- .setIntent(intent)
- .build()
+ .setShortLabel(medium.name)
+ .setIcon(Icon.createWithBitmap(drawable.convertToBitmap()))
+ .setIntent(intent)
+ .build()
manager.requestPinShortcut(shortcut, null)
}
@@ -915,27 +915,27 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
}
val options = RequestOptions()
- .skipMemoryCache(true)
- .diskCacheStrategy(DiskCacheStrategy.NONE)
+ .skipMemoryCache(true)
+ .diskCacheStrategy(DiskCacheStrategy.NONE)
Glide.with(this)
- .asBitmap()
- .load(path)
- .apply(options)
- .listener(object : RequestListener {
- override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
- showErrorToast(e?.localizedMessage ?: "")
- return false
+ .asBitmap()
+ .load(path)
+ .apply(options)
+ .listener(object : RequestListener {
+ override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
+ showErrorToast(e?.localizedMessage ?: "")
+ return false
+ }
+
+ override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
+ if (bitmap != null) {
+ printHelper.printBitmap(path.getFilenameFromPath(), bitmap)
}
- override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
- if (bitmap != null) {
- printHelper.printBitmap(path.getFilenameFromPath(), bitmap)
- }
-
- return false
- }
- }).submit(requestedWidth, requestedHeight)
+ return false
+ }
+ }).submit(requestedWidth, requestedHeight)
} catch (e: Exception) {
}
}
@@ -986,7 +986,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (isNougatPlus()) {
val newExif = ExifInterface(file.absolutePath)
- oldExif?.copyTo(newExif, false)
+ oldExif?.copyNonDimensionAttributesTo(newExif)
}
} catch (e: Exception) {
}
@@ -1261,8 +1261,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (bottom_actions.isVisible()) {
bottom_actions.animate().alpha(newAlpha).start()
arrayOf(bottom_favorite, bottom_edit, bottom_share, bottom_delete, bottom_rotate, bottom_properties, bottom_change_orientation,
- bottom_slideshow, bottom_show_on_map, bottom_toggle_file_visibility, bottom_rename, bottom_set_as, bottom_copy, bottom_move,
- bottom_resize).forEach {
+ bottom_slideshow, bottom_show_on_map, bottom_toggle_file_visibility, bottom_rename, bottom_set_as, bottom_copy, bottom_move,
+ bottom_resize).forEach {
it.isClickable = !mIsFullScreen
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/WidgetConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/WidgetConfigureActivity.kt
index 3f0c66912..34d427655 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/WidgetConfigureActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/WidgetConfigureActivity.kt
@@ -15,6 +15,7 @@ import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.dialogs.PickDirectoryDialog
import com.simplemobiletools.gallery.pro.extensions.*
import com.simplemobiletools.gallery.pro.helpers.MyWidgetProvider
+import com.simplemobiletools.gallery.pro.helpers.ROUNDED_CORNERS_NONE
import com.simplemobiletools.gallery.pro.models.Directory
import com.simplemobiletools.gallery.pro.models.Widget
import kotlinx.android.synthetic.main.activity_widget_config.*
@@ -166,7 +167,7 @@ class WidgetConfigureActivity : SimpleActivity() {
val path = directoryDao.getDirectoryThumbnail(folderPath)
if (path != null) {
runOnUiThread {
- loadJpg(path, config_image, config.cropThumbnails)
+ loadJpg(path, config_image, config.cropThumbnails, ROUNDED_CORNERS_NONE)
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt
index 224c6556c..c85b0927c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt
@@ -15,9 +15,7 @@ import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.*
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.SHOW_ALL_TABS
-import com.simplemobiletools.commons.helpers.ensureBackgroundThread
-import com.simplemobiletools.commons.helpers.isOreoPlus
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
@@ -37,7 +35,6 @@ import kotlinx.android.synthetic.main.directory_item_grid.view.dir_lock
import kotlinx.android.synthetic.main.directory_item_grid.view.dir_name
import kotlinx.android.synthetic.main.directory_item_grid.view.dir_pin
import kotlinx.android.synthetic.main.directory_item_grid.view.dir_thumbnail
-import kotlinx.android.synthetic.main.directory_item_grid.view.photo_cnt
import kotlinx.android.synthetic.main.directory_item_list.view.*
import java.io.File
@@ -304,7 +301,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList()
foldersToScan.forEach {
- val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
+ val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize,
+ favoritePaths, getVideoDurations, lastModifieds, dateTakens)
media.addAll(newMedia)
}
mediaFetcher.sortMedia(media, context.config.getFolderSorting(SHOW_ALL))
media
} else {
- mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
+ mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths,
+ getVideoDurations, lastModifieds, dateTakens)
}
+
return mediaFetcher.groupMedia(media, pathToUse)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/databases/GalleryDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/databases/GalleryDatabase.kt
index 6e2be4788..0b41a17d6 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/databases/GalleryDatabase.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/databases/GalleryDatabase.kt
@@ -9,7 +9,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase
import com.simplemobiletools.gallery.pro.interfaces.*
import com.simplemobiletools.gallery.pro.models.*
-@Database(entities = [Directory::class, Medium::class, Widget::class, DateTaken::class, Favorite::class], version = 8)
+@Database(entities = [Directory::class, Medium::class, Widget::class, DateTaken::class, Favorite::class], version = 9)
abstract class GalleryDatabase : RoomDatabase() {
abstract fun DirectoryDao(): DirectoryDao
@@ -30,12 +30,13 @@ abstract class GalleryDatabase : RoomDatabase() {
synchronized(GalleryDatabase::class) {
if (db == null) {
db = Room.databaseBuilder(context.applicationContext, GalleryDatabase::class.java, "gallery.db")
- .fallbackToDestructiveMigration()
- .addMigrations(MIGRATION_4_5)
- .addMigrations(MIGRATION_5_6)
- .addMigrations(MIGRATION_6_7)
- .addMigrations(MIGRATION_7_8)
- .build()
+ .fallbackToDestructiveMigration()
+ .addMigrations(MIGRATION_4_5)
+ .addMigrations(MIGRATION_5_6)
+ .addMigrations(MIGRATION_6_7)
+ .addMigrations(MIGRATION_7_8)
+ .addMigrations(MIGRATION_8_9)
+ .build()
}
}
}
@@ -74,5 +75,11 @@ abstract class GalleryDatabase : RoomDatabase() {
database.execSQL("ALTER TABLE directories ADD COLUMN sort_value TEXT default '' NOT NULL")
}
}
+
+ private val MIGRATION_8_9 = object : Migration(8, 9) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("ALTER TABLE date_takens ADD COLUMN last_modified INTEGER default 0 NOT NULL")
+ }
+ }
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt
index 78537069a..c64fbde04 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ChangeViewTypeDialog.kt
@@ -5,11 +5,11 @@ import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
+import com.simplemobiletools.commons.helpers.VIEW_TYPE_LIST
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL
-import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_GRID
-import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_LIST
import kotlinx.android.synthetic.main.dialog_change_view_type.view.*
class ChangeViewTypeDialog(val activity: BaseSimpleActivity, val fromFoldersView: Boolean, val path: String = "", val callback: () -> Unit) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickDirectoryDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickDirectoryDialog.kt
index 4cad9e85c..53ee995c2 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickDirectoryDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickDirectoryDialog.kt
@@ -6,11 +6,11 @@ import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.DirectoryAdapter
import com.simplemobiletools.gallery.pro.extensions.*
-import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.gallery.pro.models.Directory
import kotlinx.android.synthetic.main.dialog_directory_picker.view.*
@@ -134,12 +134,10 @@ class PickDirectoryDialog(val activity: BaseSimpleActivity, val sourcePath: Stri
directories_horizontal_fastscroller.beVisibleIf(scrollHorizontally)
if (scrollHorizontally) {
- directories_horizontal_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
directories_horizontal_fastscroller.setViews(directories_grid) {
directories_horizontal_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting, activity, dateFormat, timeFormat))
}
} else {
- directories_vertical_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
directories_vertical_fastscroller.setViews(directories_grid) {
directories_vertical_fastscroller.updateBubbleText(dirs[it].getBubbleText(sorting, activity, dateFormat, timeFormat))
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickMediumDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickMediumDialog.kt
index 4107a9e7b..1e3b2465e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickMediumDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/PickMediumDialog.kt
@@ -7,6 +7,7 @@ import com.simplemobiletools.commons.extensions.beGoneIf
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getTimeFormat
import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.commons.views.MyGridLayoutManager
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.adapters.MediaAdapter
@@ -14,7 +15,6 @@ import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.getCachedMedia
import com.simplemobiletools.gallery.pro.helpers.SHOW_ALL
-import com.simplemobiletools.gallery.pro.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
import kotlinx.android.synthetic.main.dialog_medium_picker.view.*
@@ -33,12 +33,12 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
}
dialog = AlertDialog.Builder(activity)
- .setPositiveButton(R.string.ok, null)
- .setNegativeButton(R.string.cancel, null)
- .setNeutralButton(R.string.other_folder) { dialogInterface, i -> showOtherFolder() }
- .create().apply {
- activity.setupDialogStuff(view, this, R.string.select_photo)
- }
+ .setPositiveButton(R.string.ok, null)
+ .setNegativeButton(R.string.cancel, null)
+ .setNeutralButton(R.string.other_folder) { dialogInterface, i -> showOtherFolder() }
+ .create().apply {
+ activity.setupDialogStuff(view, this, R.string.select_photo)
+ }
activity.getCachedMedia(path) {
val media = it.filter { it is Medium } as ArrayList
@@ -87,13 +87,11 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c
media_horizontal_fastscroller.beVisibleIf(scrollHorizontally)
if (scrollHorizontally) {
- media_horizontal_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
media_horizontal_fastscroller.setViews(media_grid) {
val medium = (media[it] as? Medium)
media_horizontal_fastscroller.updateBubbleText(medium?.getBubbleText(sorting, activity, dateFormat, timeFormat) ?: "")
}
} else {
- media_vertical_fastscroller.allowBubbleDisplay = activity.config.showInfoBubble
media_vertical_fastscroller.setViews(media_grid) {
val medium = (media[it] as? Medium)
media_vertical_fastscroller.updateBubbleText(medium?.getBubbleText(sorting, activity, dateFormat, timeFormat) ?: "")
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt
index 14d9a2e0c..6f3155ab7 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt
@@ -3,6 +3,7 @@ package com.simplemobiletools.gallery.pro.extensions
import android.annotation.TargetApi
import android.app.Activity
import android.content.ContentProviderOperation
+import android.content.ContentValues
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
@@ -13,6 +14,7 @@ import android.media.ExifInterface
import android.net.Uri
import android.os.Build
import android.provider.MediaStore
+import android.provider.MediaStore.Files
import android.provider.MediaStore.Images
import android.util.DisplayMetrics
import android.view.View
@@ -81,7 +83,8 @@ fun Activity.launchCamera() {
fun SimpleActivity.launchAbout() {
val licenses = LICENSE_GLIDE or LICENSE_CROPPER or LICENSE_RTL or LICENSE_SUBSAMPLING or LICENSE_PATTERN or LICENSE_REPRINT or LICENSE_GIF_DRAWABLE or
- LICENSE_PICASSO or LICENSE_EXOPLAYER or LICENSE_PANORAMA_VIEW or LICENSE_SANSELAN or LICENSE_FILTERS or LICENSE_GESTURE_VIEWS
+ LICENSE_PICASSO or LICENSE_EXOPLAYER or LICENSE_PANORAMA_VIEW or LICENSE_SANSELAN or LICENSE_FILTERS or LICENSE_GESTURE_VIEWS or
+ LICENSE_APNG
val faqItems = arrayListOf(
FAQItem(R.string.faq_5_title_commons, R.string.faq_5_text_commons),
@@ -101,7 +104,8 @@ fun SimpleActivity.launchAbout() {
FAQItem(R.string.faq_15_title, R.string.faq_15_text),
FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons),
FAQItem(R.string.faq_6_title_commons, R.string.faq_6_text_commons),
- FAQItem(R.string.faq_7_title_commons, R.string.faq_7_text_commons))
+ FAQItem(R.string.faq_7_title_commons, R.string.faq_7_text_commons),
+ FAQItem(R.string.faq_9_title_commons, R.string.faq_9_text_commons))
startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true)
}
@@ -146,9 +150,8 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
val fileDocument = getDocumentFile(path)
if (fileDocument?.exists() == true && fileDocument.isDirectory) {
fileDocument.createFile("", NOMEDIA)
- applicationContext.scanPathRecursively(file.absolutePath) {
- callback()
- }
+ addNoMediaIntoMediaStore(file.absolutePath)
+ callback()
} else {
toast(R.string.unknown_error_occurred)
callback()
@@ -157,7 +160,7 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
} else {
try {
if (file.createNewFile()) {
- rescanFolderMedia(file.absolutePath)
+ addNoMediaIntoMediaStore(file.absolutePath)
} else {
toast(R.string.unknown_error_occurred)
}
@@ -168,6 +171,19 @@ fun BaseSimpleActivity.addNoMedia(path: String, callback: () -> Unit) {
}
}
+fun BaseSimpleActivity.addNoMediaIntoMediaStore(path: String) {
+ try {
+ val content = ContentValues().apply {
+ put(Files.FileColumns.TITLE, NOMEDIA)
+ put(Files.FileColumns.DATA, path)
+ put(Files.FileColumns.MEDIA_TYPE, Files.FileColumns.MEDIA_TYPE_NONE)
+ }
+ contentResolver.insert(Files.getContentUri("external"), content)
+ } catch (e: Exception) {
+ showErrorToast(e)
+ }
+}
+
fun BaseSimpleActivity.removeNoMedia(path: String, callback: (() -> Unit)? = null) {
val file = File(path, NOMEDIA)
if (!getDoesFilePathExist(file.absolutePath)) {
@@ -450,7 +466,7 @@ fun Activity.fixDateTaken(paths: ArrayList, showToasts: Boolean, hasResc
mediaDB.updateFavoriteDateTaken(path, timestamp)
didUpdateFile = true
- val dateTaken = DateTaken(null, path, path.getFilenameFromPath(), path.getParentPath(), timestamp, (System.currentTimeMillis() / 1000).toInt())
+ val dateTaken = DateTaken(null, path, path.getFilenameFromPath(), path.getParentPath(), timestamp, (System.currentTimeMillis() / 1000).toInt(), File(path).lastModified())
dateTakens.add(dateTaken)
if (!hasRescanned && getFileDateTaken(path) == 0L) {
pathsToRescan.add(path)
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt
index f5fb3572d..03b5ad783 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt
@@ -14,6 +14,8 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.Priority
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.extensions.*
@@ -36,6 +38,8 @@ import java.util.HashSet
import java.util.LinkedHashSet
import kotlin.Comparator
import kotlin.collections.ArrayList
+import kotlin.collections.HashMap
+import kotlin.collections.set
val Context.audioManager get() = getSystemService(Context.AUDIO_SERVICE) as AudioManager
@@ -302,35 +306,40 @@ fun Context.updateSubfolderCounts(children: ArrayList, parentDirs: Ar
fun Context.getNoMediaFolders(callback: (folders: ArrayList) -> Unit) {
ensureBackgroundThread {
- val folders = ArrayList()
-
- val uri = Files.getContentUri("external")
- val projection = arrayOf(Files.FileColumns.DATA)
- val selection = "${Files.FileColumns.MEDIA_TYPE} = ? AND ${Files.FileColumns.TITLE} LIKE ?"
- val selectionArgs = arrayOf(Files.FileColumns.MEDIA_TYPE_NONE.toString(), "%$NOMEDIA%")
- val sortOrder = "${Files.FileColumns.DATE_MODIFIED} DESC"
- val OTGPath = config.OTGPath
-
- var cursor: Cursor? = null
- try {
- cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
- if (cursor?.moveToFirst() == true) {
- do {
- val path = cursor.getStringValue(Files.FileColumns.DATA) ?: continue
- val noMediaFile = File(path)
- if (getDoesFilePathExist(noMediaFile.absolutePath, OTGPath) && noMediaFile.name == NOMEDIA) {
- folders.add("${noMediaFile.parent}/")
- }
- } while (cursor.moveToNext())
- }
- } finally {
- cursor?.close()
- }
-
- callback(folders)
+ callback(getNoMediaFoldersSync())
}
}
+fun Context.getNoMediaFoldersSync(): ArrayList {
+ val folders = ArrayList()
+
+ val uri = Files.getContentUri("external")
+ val projection = arrayOf(Files.FileColumns.DATA)
+ val selection = "${Files.FileColumns.MEDIA_TYPE} = ? AND ${Files.FileColumns.TITLE} LIKE ?"
+ val selectionArgs = arrayOf(Files.FileColumns.MEDIA_TYPE_NONE.toString(), "%$NOMEDIA%")
+ val sortOrder = "${Files.FileColumns.DATE_MODIFIED} DESC"
+ val OTGPath = config.OTGPath
+
+ var cursor: Cursor? = null
+ try {
+ cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
+ if (cursor?.moveToFirst() == true) {
+ do {
+ val path = cursor.getStringValue(Files.FileColumns.DATA) ?: continue
+ val noMediaFile = File(path)
+ if (getDoesFilePathExist(noMediaFile.absolutePath, OTGPath) && noMediaFile.name == NOMEDIA) {
+ folders.add(noMediaFile.parent)
+ }
+ } while (cursor.moveToNext())
+ }
+ } catch (ignored: Exception) {
+ } finally {
+ cursor?.close()
+ }
+
+ return folders
+}
+
fun Context.rescanFolderMedia(path: String) {
ensureBackgroundThread {
rescanFolderMediaSync(path)
@@ -368,9 +377,9 @@ fun Context.storeDirectoryItems(items: ArrayList) {
}
}
-fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders: MutableSet): String {
+fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders: MutableSet, noMediaFolders: ArrayList): String {
val dirName = getFolderNameFromPath(path)
- return if (path.doesThisOrParentHaveNoMedia() && !path.isThisOrParentIncluded(includedFolders)) {
+ return if (path.doesThisOrParentHaveNoMedia(noMediaFolders) && !path.isThisOrParentIncluded(includedFolders)) {
"$dirName $hidden"
} else {
dirName
@@ -389,17 +398,17 @@ fun Context.getFolderNameFromPath(path: String): String {
}
fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean,
- skipMemoryCacheAtPaths: ArrayList? = null) {
+ roundCorners: Int, skipMemoryCacheAtPaths: ArrayList? = null) {
target.isHorizontalScrolling = horizontalScroll
if (type == TYPE_IMAGES || type == TYPE_VIDEOS || type == TYPE_RAWS || type == TYPE_PORTRAITS) {
if (type == TYPE_IMAGES && path.isPng()) {
- loadPng(path, target, cropThumbnails, skipMemoryCacheAtPaths)
+ loadPng(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
} else {
- loadJpg(path, target, cropThumbnails, skipMemoryCacheAtPaths)
+ loadJpg(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
}
} else if (type == TYPE_GIFS) {
if (!animateGifs) {
- loadStaticGIF(path, target, cropThumbnails, skipMemoryCacheAtPaths)
+ loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
return
}
@@ -410,12 +419,12 @@ fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizo
target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER
} catch (e: Exception) {
- loadStaticGIF(path, target, cropThumbnails, skipMemoryCacheAtPaths)
+ loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
} catch (e: OutOfMemoryError) {
- loadStaticGIF(path, target, cropThumbnails, skipMemoryCacheAtPaths)
+ loadStaticGIF(path, target, cropThumbnails, roundCorners, skipMemoryCacheAtPaths)
}
} else if (type == TYPE_SVGS) {
- loadSVG(path, target, cropThumbnails)
+ loadSVG(path, target, cropThumbnails, roundCorners)
}
}
@@ -440,7 +449,7 @@ fun Context.getPathLocation(path: String): Int {
}
}
-fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList? = null) {
+fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, skipMemoryCacheAtPaths: ArrayList? = null) {
val options = RequestOptions()
.signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
@@ -448,57 +457,83 @@ fun Context.loadPng(path: String, target: MySquareImageView, cropThumbnails: Boo
.priority(Priority.LOW)
.format(DecodeFormat.PREFER_ARGB_8888)
- val builder = Glide.with(applicationContext)
+ if (cropThumbnails) options.centerCrop() else options.fitCenter()
+ var builder = Glide.with(applicationContext)
.asBitmap()
.load(path)
+ .apply(options)
- if (cropThumbnails) options.centerCrop() else options.fitCenter()
- builder.apply(options).into(target)
+ if (roundCorners != ROUNDED_CORNERS_NONE) {
+ val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
+ val cornerRadius = resources.getDimension(cornerSize).toInt()
+ builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
+ }
+
+ builder.into(target)
}
-fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList? = null) {
+fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, skipMemoryCacheAtPaths: ArrayList? = null) {
val options = RequestOptions()
.signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
.priority(Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
- val builder = Glide.with(applicationContext)
+ if (cropThumbnails) options.centerCrop() else options.fitCenter()
+ var builder = Glide.with(applicationContext)
.load(path)
-
- if (cropThumbnails) options.centerCrop() else options.fitCenter()
- builder.apply(options)
+ .apply(options)
.transition(DrawableTransitionOptions.withCrossFade())
- .into(target)
+
+ if (roundCorners != ROUNDED_CORNERS_NONE) {
+ val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
+ val cornerRadius = resources.getDimension(cornerSize).toInt()
+ builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
+ }
+
+ builder.into(target)
}
-fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnails: Boolean, skipMemoryCacheAtPaths: ArrayList? = null) {
+fun Context.loadStaticGIF(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int, skipMemoryCacheAtPaths: ArrayList? = null) {
val options = RequestOptions()
.signature(path.getFileSignature())
.skipMemoryCache(skipMemoryCacheAtPaths?.contains(path) == true)
.priority(Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
- val builder = Glide.with(applicationContext)
+ if (cropThumbnails) options.centerCrop() else options.fitCenter()
+ var builder = Glide.with(applicationContext)
.asBitmap() // make sure the GIF wont animate
.load(path)
+ .apply(options)
- if (cropThumbnails) options.centerCrop() else options.fitCenter()
- builder.apply(options)
- .into(target)
+ if (roundCorners != ROUNDED_CORNERS_NONE) {
+ val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
+ val cornerRadius = resources.getDimension(cornerSize).toInt()
+ builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
+ }
+
+ builder.into(target)
}
-fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean) {
+fun Context.loadSVG(path: String, target: MySquareImageView, cropThumbnails: Boolean, roundCorners: Int) {
target.scaleType = if (cropThumbnails) ImageView.ScaleType.CENTER_CROP else ImageView.ScaleType.FIT_CENTER
val options = RequestOptions().signature(path.getFileSignature())
- Glide.with(applicationContext)
+ var builder = Glide.with(applicationContext)
.`as`(PictureDrawable::class.java)
.listener(SvgSoftwareLayerSetter())
.load(path)
.apply(options)
.transition(DrawableTransitionOptions.withCrossFade())
- .into(target)
+
+ if (roundCorners != ROUNDED_CORNERS_NONE) {
+ val cornerSize = if (roundCorners == ROUNDED_CORNERS_SMALL) R.dimen.rounded_corner_radius_small else R.dimen.rounded_corner_radius_big
+ val cornerRadius = resources.getDimension(cornerSize).toInt()
+ builder = builder.transform(CenterCrop(), RoundedCorners(cornerRadius))
+ }
+
+ builder.into(target)
}
fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, forceShowHidden: Boolean = false, callback: (ArrayList) -> Unit) {
@@ -516,7 +551,14 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
val shouldShowHidden = config.shouldShowHidden || forceShowHidden
val excludedPaths = config.excludedFolders
val includedPaths = config.includedFolders
- var filteredDirectories = directories.filter { it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, this) } as ArrayList
+
+ val noMediaFolders = getNoMediaFoldersSync()
+ val folderNoMediaStatuses = HashMap()
+ var filteredDirectories = directories.filter {
+ it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNoMediaStatuses, noMediaFolders) { path, hasNoMedia ->
+ folderNoMediaStatuses[path] = hasNoMedia
+ }
+ } as ArrayList
val filterMedia = config.filterMedia
filteredDirectories = (when {
@@ -534,7 +576,7 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
val hiddenString = resources.getString(R.string.hidden)
filteredDirectories.forEach {
- it.name = if (it.path.doesThisOrParentHaveNoMedia() && !it.path.isThisOrParentIncluded(includedPaths)) {
+ it.name = if (it.path.doesThisOrParentHaveNoMedia(noMediaFolders) && !it.path.isThisOrParentIncluded(includedPaths)) {
"${it.name.removeSuffix(hiddenString).trim()} $hiddenString"
} else {
it.name.removeSuffix(hiddenString).trim()
@@ -800,7 +842,7 @@ fun Context.addPathToDB(path: String) {
}
fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList, albumCovers: ArrayList, hiddenString: String,
- includedFolders: MutableSet, getProperFileSize: Boolean): Directory {
+ includedFolders: MutableSet, getProperFileSize: Boolean, noMediaFolders: ArrayList): Directory {
val OTGPath = config.OTGPath
val grouped = MediaFetcher(this).groupMedia(curMedia, path)
var thumbnail: String? = null
@@ -824,7 +866,7 @@ fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList,
val defaultMedium = Medium(0, "", "", "", 0L, 0L, 0L, 0, 0, false, 0L)
val firstItem = curMedia.firstOrNull() ?: defaultMedium
val lastItem = curMedia.lastOrNull() ?: defaultMedium
- val dirName = checkAppendingHidden(path, hiddenString, includedFolders)
+ val dirName = checkAppendingHidden(path, hiddenString, includedFolders, noMediaFolders)
val lastModified = if (isSortingAscending) Math.min(firstItem.modified, lastItem.modified) else Math.max(firstItem.modified, lastItem.modified)
val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken)
val size = if (getProperFileSize) curMedia.sumByLong { it.size } else 0L
@@ -866,6 +908,7 @@ fun Context.updateDirectoryPath(path: String) {
val hiddenString = getString(R.string.hidden)
val albumCovers = config.parseAlbumCovers()
val includedFolders = config.includedFolders
+ val noMediaFolders = getNoMediaFoldersSync()
val sorting = config.getFolderSorting(path)
val grouping = config.getFolderGrouping(path)
@@ -880,9 +923,13 @@ fun Context.updateDirectoryPath(path: String) {
grouping and GROUP_BY_LAST_MODIFIED_MONTHLY != 0
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
+
+ val lastModifieds = if (isRPlus() && getProperLastModified) mediaFetcher.getFolderLastModifieds(path) else HashMap()
+ val dateTakens = mediaFetcher.getFolderDateTakens(path)
val favoritePaths = getFavoritePaths()
- val curMedia = mediaFetcher.getFilesFrom(path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false)
- val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize)
+ val curMedia = mediaFetcher.getFilesFrom(path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize,
+ favoritePaths, false, lastModifieds, dateTakens)
+ val directory = createDirectoryFromMedia(path, curMedia, albumCovers, hiddenString, includedFolders, getProperFileSize, noMediaFolders)
updateDBDirectory(directory)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ExifInterface.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ExifInterface.kt
new file mode 100644
index 000000000..6c1ba0b0b
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/ExifInterface.kt
@@ -0,0 +1,57 @@
+package com.simplemobiletools.gallery.pro.extensions
+
+import android.media.ExifInterface
+import java.lang.reflect.Field
+import java.lang.reflect.Modifier
+
+fun ExifInterface.copyNonDimensionAttributesTo(destination: ExifInterface) {
+ val attributes = ExifInterfaceAttributes.AllNonDimensionAttributes
+
+ attributes.forEach {
+ val value = getAttribute(it)
+ if (value != null) {
+ destination.setAttribute(it, value)
+ }
+ }
+
+ try {
+ destination.saveAttributes()
+ } catch (ignored: Exception) {
+ }
+}
+
+private class ExifInterfaceAttributes {
+ companion object {
+ val AllNonDimensionAttributes = getAllNonDimensionExifAttributes()
+
+ private fun getAllNonDimensionExifAttributes(): List {
+ val tagFields = ExifInterface::class.java.fields.filter { field -> isExif(field) }
+
+ val excludeAttributes = arrayListOf(
+ ExifInterface.TAG_IMAGE_LENGTH,
+ ExifInterface.TAG_IMAGE_WIDTH,
+ ExifInterface.TAG_PIXEL_X_DIMENSION,
+ ExifInterface.TAG_PIXEL_Y_DIMENSION,
+ ExifInterface.TAG_THUMBNAIL_IMAGE_LENGTH,
+ ExifInterface.TAG_THUMBNAIL_IMAGE_WIDTH,
+ ExifInterface.TAG_ORIENTATION)
+
+ return tagFields
+ .map { tagField -> tagField.get(null) as String }
+ .filter { x -> !excludeAttributes.contains(x) }
+ .distinct()
+ }
+
+ private fun isExif(field: Field): Boolean {
+ return field.type == String::class.java &&
+ isPublicStaticFinal(field.modifiers) &&
+ field.name.startsWith("TAG_")
+ }
+
+ private const val publicStaticFinal = Modifier.PUBLIC or Modifier.STATIC or Modifier.FINAL
+
+ private fun isPublicStaticFinal(modifiers: Int): Boolean {
+ return modifiers and publicStaticFinal > 0
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt
index 3f36fa99e..1c18f2ef0 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/String.kt
@@ -1,9 +1,7 @@
package com.simplemobiletools.gallery.pro.extensions
-import android.content.Context
import android.os.Environment
-import com.simplemobiletools.commons.extensions.containsNoMedia
-import com.simplemobiletools.commons.extensions.doesParentHaveNoMedia
+import com.simplemobiletools.commons.helpers.NOMEDIA
import java.io.File
import java.io.IOException
@@ -11,13 +9,17 @@ fun String.isThisOrParentIncluded(includedPaths: MutableSet) = includedP
fun String.isThisOrParentExcluded(excludedPaths: MutableSet) = excludedPaths.any { equals(it, true) } || excludedPaths.any { "$this/".startsWith("$it/", true) }
-fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPaths: MutableSet, showHidden: Boolean, context: Context): Boolean {
+// cache which folders contain .nomedia files to avoid checking them over and over again
+fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPaths: MutableSet, showHidden: Boolean,
+ folderNoMediaStatuses: HashMap, noMediaFolders: ArrayList = ArrayList(),
+ callback: (path: String, hasNoMedia: Boolean) -> Unit): Boolean {
if (isEmpty()) {
return false
}
val file = File(this)
- if (file.name.startsWith("img_", true)) {
+ val filename = file.name
+ if (filename.startsWith("img_", true) && file.isDirectory) {
val files = file.list()
if (files != null) {
if (files.any { it.contains("burst", true) }) {
@@ -26,7 +28,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath
}
}
- if (!showHidden && file.isHidden) {
+ if (!showHidden && filename.startsWith('.')) {
return false
} else if (includedPaths.contains(this)) {
return true
@@ -35,7 +37,7 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath
val containsNoMedia = if (showHidden) {
false
} else {
- file.containsNoMedia()
+ noMediaFolders.contains(this) || File(this, NOMEDIA).exists()
}
return if (!showHidden && containsNoMedia) {
@@ -46,10 +48,27 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath
true
} else if (isThisOrParentExcluded(excludedPaths)) {
false
- } else if (!showHidden && file.isDirectory && file.canonicalFile == file.absoluteFile) {
+ } else if (!showHidden) {
var containsNoMediaOrDot = containsNoMedia || contains("/.")
if (!containsNoMediaOrDot) {
- containsNoMediaOrDot = file.doesParentHaveNoMedia()
+ var curPath = this
+ for (i in 0 until count { it == '/' } - 1) {
+ curPath = curPath.substringBeforeLast('/')
+ val pathToCheck = "$curPath/${NOMEDIA}"
+ if (folderNoMediaStatuses.contains(pathToCheck)) {
+ if (folderNoMediaStatuses[pathToCheck] == true) {
+ containsNoMediaOrDot = true
+ break
+ }
+ } else {
+ val noMediaExists = noMediaFolders.contains(pathToCheck) || File(pathToCheck).exists()
+ callback(pathToCheck, noMediaExists)
+ if (noMediaExists) {
+ containsNoMediaOrDot = true
+ break
+ }
+ }
+ }
}
!containsNoMediaOrDot
} else {
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt
index 3495e80a9..8a2da324e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt
@@ -36,6 +36,7 @@ import com.davemorrissey.labs.subscaleview.DecoderFactory
import com.davemorrissey.labs.subscaleview.ImageDecoder
import com.davemorrissey.labs.subscaleview.ImageRegionDecoder
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
+import com.github.penfeizhou.animation.webp.WebPDrawable
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
@@ -43,7 +44,9 @@ import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.activities.PanoramaPhotoActivity
import com.simplemobiletools.gallery.pro.activities.PhotoActivity
import com.simplemobiletools.gallery.pro.adapters.PortraitPhotosAdapter
-import com.simplemobiletools.gallery.pro.extensions.*
+import com.simplemobiletools.gallery.pro.extensions.config
+import com.simplemobiletools.gallery.pro.extensions.saveRotatedImageToFile
+import com.simplemobiletools.gallery.pro.extensions.sendFakeClick
import com.simplemobiletools.gallery.pro.helpers.*
import com.simplemobiletools.gallery.pro.models.Medium
import com.simplemobiletools.gallery.pro.svg.SvgSoftwareLayerSetter
@@ -66,8 +69,8 @@ class PhotoFragment : ViewPagerFragment() {
// devices with good displays, but the rest of the hardware not good enough for them
private val WEIRD_DEVICES = arrayListOf(
- "motorola xt1685",
- "google nexus 5x"
+ "motorola xt1685",
+ "google nexus 5x"
)
var mCurrentRotationDegrees = 0
@@ -286,7 +289,7 @@ class PhotoFragment : ViewPagerFragment() {
super.setMenuVisibility(menuVisible)
mIsFragmentVisible = menuVisible
if (mWasInit) {
- if (!mMedium.isGIF()) {
+ if (!mMedium.isGIF() && !mMedium.isWebP()) {
photoFragmentVisibilityChanged(menuVisible)
}
}
@@ -379,49 +382,64 @@ class PhotoFragment : ViewPagerFragment() {
private fun loadSVG() {
Glide.with(context!!)
- .`as`(PictureDrawable::class.java)
- .listener(SvgSoftwareLayerSetter())
- .load(mMedium.path)
- .into(mView.gestures_view)
+ .`as`(PictureDrawable::class.java)
+ .listener(SvgSoftwareLayerSetter())
+ .load(mMedium.path)
+ .into(mView.gestures_view)
}
private fun loadBitmap(addZoomableView: Boolean = true) {
+ if (context == null) {
+ return
+ }
+
+ val path = getFilePathToShow()
+ if (path.isWebP()) {
+ val drawable = WebPDrawable.fromFile(path)
+ if (drawable.intrinsicWidth == 0) {
+ loadWithGlide(path, addZoomableView)
+ } else {
+ drawable.setLoopLimit(0)
+ mView.gestures_view.setImageDrawable(drawable)
+ }
+ } else {
+ loadWithGlide(path, addZoomableView)
+ }
+ }
+
+ private fun loadWithGlide(path: String, addZoomableView: Boolean) {
val priority = if (mIsFragmentVisible) Priority.IMMEDIATE else Priority.NORMAL
val options = RequestOptions()
- .signature(getFilePathToShow().getFileSignature())
- .format(DecodeFormat.PREFER_ARGB_8888)
- .priority(priority)
- .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
- .fitCenter()
+ .signature(getFilePathToShow().getFileSignature())
+ .format(DecodeFormat.PREFER_ARGB_8888)
+ .priority(priority)
+ .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
+ .fitCenter()
if (mCurrentRotationDegrees != 0) {
options.transform(Rotate(mCurrentRotationDegrees))
options.diskCacheStrategy(DiskCacheStrategy.NONE)
}
- if (context == null) {
- return
- }
-
Glide.with(context!!)
- .load(getFilePathToShow())
- .apply(options)
- .listener(object : RequestListener {
- override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
- if (activity != null && !activity!!.isDestroyed && !activity!!.isFinishing) {
- tryLoadingWithPicasso(addZoomableView)
- }
- return false
+ .load(path)
+ .apply(options)
+ .listener(object : RequestListener {
+ override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
+ if (activity != null && !activity!!.isDestroyed && !activity!!.isFinishing) {
+ tryLoadingWithPicasso(addZoomableView)
}
+ return false
+ }
- override fun onResourceReady(resource: Drawable?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
- mView.gestures_view.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || context?.config?.allowZoomingImages == false
- if (mIsFragmentVisible && addZoomableView) {
- scheduleZoomableView()
- }
- return false
+ override fun onResourceReady(resource: Drawable?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
+ mView.gestures_view.controller.settings.isZoomEnabled = mMedium.isRaw() || mCurrentRotationDegrees != 0 || context?.config?.allowZoomingImages == false
+ if (mIsFragmentVisible && addZoomableView) {
+ scheduleZoomableView()
}
- }).into(mView.gestures_view)
+ return false
+ }
+ }).into(mView.gestures_view)
}
private fun tryLoadingWithPicasso(addZoomableView: Boolean) {
@@ -430,10 +448,10 @@ class PhotoFragment : ViewPagerFragment() {
try {
val picasso = Picasso.get()
- .load(pathToLoad)
- .centerInside()
- .stableKey(mMedium.path.getFileKey())
- .resize(mScreenWidth, mScreenHeight)
+ .load(pathToLoad)
+ .centerInside()
+ .stableKey(mMedium.path.getFileKey())
+ .resize(mScreenWidth, mScreenHeight)
if (mCurrentRotationDegrees != 0) {
picasso.rotate(mCurrentRotationDegrees.toFloat())
@@ -599,7 +617,7 @@ class PhotoFragment : ViewPagerFragment() {
val minTileDpi = if (showHighestQuality) -1 else getMinTileDpi()
val bitmapDecoder = object : DecoderFactory {
- override fun make() = MyGlideImageDecoder(rotation)
+ override fun make() = MyGlideImageDecoder(rotation, mMedium.getSignature())
}
val regionDecoder = object : DecoderFactory {
@@ -670,7 +688,8 @@ class PhotoFragment : ViewPagerFragment() {
val imageParser = JpegImageParser().getXmpXml(ByteSourceInputStream(inputStream, mMedium.name), HashMap())
imageParser.contains("GPano:UsePanoramaViewer=\"True\"", true) ||
imageParser.contains("True", true) ||
- imageParser.contains("GPano:FullPanoWidthPixels=")
+ imageParser.contains("GPano:FullPanoWidthPixels=") ||
+ imageParser.contains("GPano:ProjectionType>Equirectangular")
} catch (e: Exception) {
false
} catch (e: OutOfMemoryError) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt
index 9d70eb98c..2ef341feb 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt
@@ -8,6 +8,7 @@ import com.google.gson.reflect.TypeToken
import com.simplemobiletools.commons.helpers.BaseConfig
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
+import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.models.AlbumCover
import java.util.*
@@ -405,8 +406,10 @@ class Config(context: Context) : BaseConfig(context) {
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath,
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePath,
"${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).absolutePath}/Screenshots",
- "internalStoragePath/WhatsApp/Media/WhatsApp Images",
- "internalStoragePath/WhatsApp/Media/WhatsApp Video"
+ "$internalStoragePath/WhatsApp/Media/WhatsApp Images",
+ "$internalStoragePath/WhatsApp/Media/WhatsApp Images/Sent",
+ "$internalStoragePath/WhatsApp/Media/WhatsApp Video",
+ "$internalStoragePath/WhatsApp/Media/WhatsApp Video/Sent",
)
var showRecycleBinAtFolders: Boolean
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt
index 35933b7df..956df3884 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt
@@ -1,7 +1,7 @@
package com.simplemobiletools.gallery.pro.helpers
import com.simplemobiletools.commons.helpers.MONTH_SECONDS
-import com.simplemobiletools.commons.helpers.isPiePlus
+import com.simplemobiletools.commons.helpers.isQPlus
// shared preferences
const val DIRECTORY_SORT_ORDER = "directory_sort_order"
@@ -102,7 +102,6 @@ const val SLIDESHOW_ANIMATION_NONE = 0
const val SLIDESHOW_ANIMATION_SLIDE = 1
const val SLIDESHOW_ANIMATION_FADE = 2
-const val FAVORITES = "favorites"
const val RECYCLE_BIN = "recycle_bin"
const val SHOW_FAVORITES = "show_favorites"
const val SHOW_RECYCLE_BIN = "show_recycle_bin"
@@ -145,10 +144,6 @@ const val PRIORITY_SPEED = 0
const val PRIORITY_COMPROMISE = 1
const val PRIORITY_VALIDITY = 2
-// view types
-const val VIEW_TYPE_GRID = 1
-const val VIEW_TYPE_LIST = 2
-
// extended details values
const val EXT_NAME = 1
const val EXT_PATH = 2
@@ -225,3 +220,7 @@ const val LOW_TILE_DPI = 160
const val NORMAL_TILE_DPI = 220
const val WEIRD_TILE_DPI = 240
const val HIGH_TILE_DPI = 280
+
+const val ROUNDED_CORNERS_NONE = 1
+const val ROUNDED_CORNERS_SMALL = 2
+const val ROUNDED_CORNERS_BIG = 3
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt
index 9e66b62b8..bd229721d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt
@@ -22,7 +22,8 @@ class MediaFetcher(val context: Context) {
var shouldStop = false
fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean,
- getProperFileSize: Boolean, favoritePaths: ArrayList, getVideoDurations: Boolean): ArrayList {
+ getProperFileSize: Boolean, favoritePaths: ArrayList, getVideoDurations: Boolean,
+ lastModifieds: HashMap, dateTakens: HashMap): ArrayList {
val filterMedia = context.config.filterMedia
if (filterMedia == 0) {
return ArrayList()
@@ -35,7 +36,8 @@ class MediaFetcher(val context: Context) {
curMedia.addAll(newMedia)
}
} else {
- val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
+ val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, getProperLastModified, getProperFileSize,
+ favoritePaths, getVideoDurations, lastModifieds, dateTakens)
curMedia.addAll(newMedia)
}
@@ -66,7 +68,26 @@ class MediaFetcher(val context: Context) {
val shouldShowHidden = config.shouldShowHidden
val excludedPaths = config.excludedFolders
val includedPaths = config.includedFolders
- folders.filter { it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, context) }.toMutableList() as ArrayList
+
+ val folderNomediaStatuses = HashMap()
+ val distinctPathsMap = HashMap()
+ val distinctPaths = folders.distinctBy {
+ when {
+ distinctPathsMap.containsKey(it) -> distinctPathsMap[it]
+ else -> {
+ val distinct = it.getDistinctPath()
+ distinctPathsMap[it.getParentPath()] = distinct.getParentPath()
+ distinct
+ }
+ }
+ }
+
+ val noMediaFolders = context.getNoMediaFoldersSync()
+ distinctPaths.filter {
+ it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNomediaStatuses, noMediaFolders) { path, hasNoMedia ->
+ folderNomediaStatuses[path] = hasNoMedia
+ }
+ }.toMutableList() as ArrayList
} catch (e: Exception) {
ArrayList()
}
@@ -190,10 +211,7 @@ class MediaFetcher(val context: Context) {
addFolder(foldersToScan, it)
}
- val showHidden = config.shouldShowHidden
- val excludedFolders = config.excludedFolders
- return foldersToScan.distinctBy { it.getDistinctPath() }
- .filter { it.shouldFolderBeVisible(excludedFolders, includedFolders, showHidden, context) }.toMutableSet() as LinkedHashSet
+ return foldersToScan.toMutableSet() as LinkedHashSet
}
private fun addFolder(curFolders: HashSet, folder: String) {
@@ -207,7 +225,8 @@ class MediaFetcher(val context: Context) {
}
private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean,
- getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList, getVideoDurations: Boolean): ArrayList {
+ getProperLastModified: Boolean, getProperFileSize: Boolean, favoritePaths: ArrayList,
+ getVideoDurations: Boolean, lastModifieds: HashMap, dateTakens: HashMap): ArrayList {
val media = ArrayList()
val isRecycleBin = folder == RECYCLE_BIN
val deletedMedia = if (isRecycleBin) {
@@ -221,7 +240,7 @@ class MediaFetcher(val context: Context) {
val checkFileExistence = config.fileLoadingPriority == PRIORITY_VALIDITY
val showHidden = config.shouldShowHidden
val showPortraits = filterMedia and TYPE_PORTRAITS != 0
- val dateTakens = if (getProperDateTaken && !isRecycleBin) getFolderDateTakens(folder) else HashMap()
+ val fileSizes = if (checkProperFileSize || checkFileExistence) getFolderSizes(folder) else HashMap()
val files = when (folder) {
FAVORITES -> favoritePaths.filter { showHidden || !it.contains("/.") }.map { File(it) }.toMutableList() as ArrayList
@@ -278,7 +297,15 @@ class MediaFetcher(val context: Context) {
if (!showHidden && filename.startsWith('.'))
continue
- val size = if (checkProperFileSize || checkFileExistence) file.length() else 1L
+ var size = 0L
+ if (checkProperFileSize || checkFileExistence) {
+ var newSize = fileSizes.remove(path)
+ if (newSize == null) {
+ newSize = file.length()
+ }
+ size = newSize
+ }
+
if ((checkProperFileSize || checkFileExistence) && size <= 0L) {
continue
}
@@ -292,7 +319,19 @@ class MediaFetcher(val context: Context) {
media.add(this)
}
} else {
- val lastModified = if (getProperLastModified) file.lastModified() else 0L
+ var lastModified = 0L
+ if (getProperLastModified) {
+ if (isRPlus()) {
+ var newLastModified = lastModifieds.remove(path)
+ if (newLastModified == null) {
+ newLastModified = file.lastModified()
+ }
+ lastModified = newLastModified
+ } else {
+ lastModified = file.lastModified()
+ }
+ }
+
var dateTaken = lastModified
val videoDuration = if (getVideoDurations && isVideo) context.getDuration(path) ?: 0 else 0
@@ -392,7 +431,7 @@ class MediaFetcher(val context: Context) {
return media
}
- private fun getFolderDateTakens(folder: String): HashMap {
+ fun getFolderDateTakens(folder: String): HashMap {
val dateTakens = HashMap()
if (folder != FAVORITES) {
val projection = arrayOf(
@@ -404,19 +443,14 @@ class MediaFetcher(val context: Context) {
val selection = "${Images.Media.DATA} LIKE ? AND ${Images.Media.DATA} NOT LIKE ?"
val selectionArgs = arrayOf("$folder/%", "$folder/%/%")
- val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
- cursor?.use {
- if (cursor.moveToFirst()) {
- do {
- try {
- val dateTaken = cursor.getLongValue(Images.Media.DATE_TAKEN)
- if (dateTaken != 0L) {
- val name = cursor.getStringValue(Images.Media.DISPLAY_NAME)
- dateTakens["$folder/$name"] = dateTaken
- }
- } catch (e: Exception) {
- }
- } while (cursor.moveToNext())
+ context.queryCursor(uri, projection, selection, selectionArgs) { cursor ->
+ try {
+ val dateTaken = cursor.getLongValue(Images.Media.DATE_TAKEN)
+ if (dateTaken != 0L) {
+ val name = cursor.getStringValue(Images.Media.DISPLAY_NAME)
+ dateTakens["$folder/$name"] = dateTaken
+ }
+ } catch (e: Exception) {
}
}
}
@@ -434,6 +468,118 @@ class MediaFetcher(val context: Context) {
return dateTakens
}
+ fun getDateTakens(): HashMap {
+ val dateTakens = HashMap()
+ val projection = arrayOf(
+ Images.Media.DATA,
+ Images.Media.DATE_TAKEN
+ )
+
+ val uri = Files.getContentUri("external")
+
+ try {
+ context.queryCursor(uri, projection) { cursor ->
+ try {
+ val dateTaken = cursor.getLongValue(Images.Media.DATE_TAKEN)
+ if (dateTaken != 0L) {
+ val path = cursor.getStringValue(Images.Media.DATA)
+ dateTakens[path] = dateTaken
+ }
+ } catch (e: Exception) {
+ }
+ }
+
+ val dateTakenValues = context.dateTakensDB.getAllDateTakens()
+
+ dateTakenValues.forEach {
+ dateTakens[it.fullPath] = it.taken
+ }
+ } catch (e: Exception) {
+ }
+
+ return dateTakens
+ }
+
+ fun getFolderLastModifieds(folder: String): HashMap {
+ val lastModifieds = HashMap()
+ if (folder != FAVORITES) {
+ val projection = arrayOf(
+ Images.Media.DISPLAY_NAME,
+ Images.Media.DATE_MODIFIED
+ )
+
+ val uri = Files.getContentUri("external")
+ val selection = "${Images.Media.DATA} LIKE ? AND ${Images.Media.DATA} NOT LIKE ?"
+ val selectionArgs = arrayOf("$folder/%", "$folder/%/%")
+
+ context.queryCursor(uri, projection, selection, selectionArgs) { cursor ->
+ try {
+ val lastModified = cursor.getLongValue(Images.Media.DATE_MODIFIED) * 1000
+ if (lastModified != 0L) {
+ val name = cursor.getStringValue(Images.Media.DISPLAY_NAME)
+ lastModifieds["$folder/$name"] = lastModified
+ }
+ } catch (e: Exception) {
+ }
+ }
+ }
+
+ return lastModifieds
+ }
+
+ fun getLastModifieds(): HashMap {
+ val lastModifieds = HashMap()
+ val projection = arrayOf(
+ Images.Media.DATA,
+ Images.Media.DATE_MODIFIED
+ )
+
+ val uri = Files.getContentUri("external")
+
+ try {
+ context.queryCursor(uri, projection) { cursor ->
+ try {
+ val lastModified = cursor.getLongValue(Images.Media.DATE_MODIFIED) * 1000
+ if (lastModified != 0L) {
+ val path = cursor.getStringValue(Images.Media.DATA)
+ lastModifieds[path] = lastModified
+ }
+ } catch (e: Exception) {
+ }
+ }
+ } catch (e: Exception) {
+ }
+
+ return lastModifieds
+ }
+
+ private fun getFolderSizes(folder: String): HashMap {
+ val sizes = HashMap()
+ if (folder != FAVORITES) {
+ val projection = arrayOf(
+ Images.Media.DISPLAY_NAME,
+ Images.Media.SIZE
+ )
+
+ val uri = Files.getContentUri("external")
+ val selection = "${Images.Media.DATA} LIKE ? AND ${Images.Media.DATA} NOT LIKE ?"
+ val selectionArgs = arrayOf("$folder/%", "$folder/%/%")
+
+ context.queryCursor(uri, projection, selection, selectionArgs) { cursor ->
+ try {
+ val size = cursor.getLongValue(Images.Media.SIZE)
+ if (size != 0L) {
+ val name = cursor.getStringValue(Images.Media.DISPLAY_NAME)
+ sizes["$folder/$name"] = size
+ }
+ } catch (e: Exception) {
+ }
+ }
+ }
+
+ return sizes
+ }
+
fun sortMedia(media: ArrayList, sorting: Int) {
if (sorting and SORT_BY_RANDOM != 0) {
media.shuffle()
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MyGlideImageDecoder.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MyGlideImageDecoder.kt
index b1a3461eb..0287a3b39 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MyGlideImageDecoder.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MyGlideImageDecoder.kt
@@ -5,25 +5,25 @@ import android.graphics.Bitmap
import android.net.Uri
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DecodeFormat
-import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
+import com.bumptech.glide.signature.ObjectKey
import com.davemorrissey.labs.subscaleview.ImageDecoder
-class MyGlideImageDecoder(val degrees: Int) : ImageDecoder {
+class MyGlideImageDecoder(val degrees: Int, val signature: ObjectKey) : ImageDecoder {
override fun decode(context: Context, uri: Uri): Bitmap {
val options = RequestOptions()
- .format(DecodeFormat.PREFER_ARGB_8888)
- .diskCacheStrategy(DiskCacheStrategy.NONE)
- .fitCenter()
+ .format(DecodeFormat.PREFER_ARGB_8888)
+ .signature(signature)
+ .fitCenter()
val builder = Glide.with(context)
- .asBitmap()
- .load(uri)
- .apply(options)
- .transform(RotateTransformation(-degrees))
- .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
+ .asBitmap()
+ .load(uri.toString().substringAfter("file://"))
+ .apply(options)
+ .transform(RotateTransformation(-degrees))
+ .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
return builder.get()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DateTakensDao.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DateTakensDao.kt
index 6f8b609a8..5041727e9 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DateTakensDao.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/interfaces/DateTakensDao.kt
@@ -11,9 +11,9 @@ interface DateTakensDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(dateTakens: List)
- @Query("SELECT full_path, filename, parent_path, date_taken, last_fixed FROM date_takens WHERE parent_path = :path COLLATE NOCASE")
+ @Query("SELECT full_path, filename, parent_path, date_taken, last_fixed, last_modified FROM date_takens WHERE parent_path = :path COLLATE NOCASE")
fun getDateTakensFromPath(path: String): List
- @Query("SELECT full_path, filename, parent_path, date_taken, last_fixed FROM date_takens")
+ @Query("SELECT full_path, filename, parent_path, date_taken, last_fixed, last_modified FROM date_takens")
fun getAllDateTakens(): List
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/DateTaken.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/DateTaken.kt
index 293e2a619..98171df7b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/DateTaken.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/DateTaken.kt
@@ -9,9 +9,10 @@ import androidx.room.PrimaryKey
// It is used at sorting files by date taken, checking EXIF file by file would be way too slow
@Entity(tableName = "date_takens", indices = [Index(value = ["full_path"], unique = true)])
data class DateTaken(
- @PrimaryKey(autoGenerate = true) var id: Int?,
- @ColumnInfo(name = "full_path") var fullPath: String,
- @ColumnInfo(name = "filename") var filename: String,
- @ColumnInfo(name = "parent_path") var parentPath: String,
- @ColumnInfo(name = "date_taken") var taken: Long,
- @ColumnInfo(name = "last_fixed") var lastFixed: Int)
+ @PrimaryKey(autoGenerate = true) var id: Int?,
+ @ColumnInfo(name = "full_path") var fullPath: String,
+ @ColumnInfo(name = "filename") var filename: String,
+ @ColumnInfo(name = "parent_path") var parentPath: String,
+ @ColumnInfo(name = "date_taken") var taken: Long,
+ @ColumnInfo(name = "last_fixed") var lastFixed: Int,
+ @ColumnInfo(name = "last_modified") var lastModified: Long)
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt
index 4f37ea010..1be81a8bf 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Directory.kt
@@ -4,11 +4,7 @@ import android.content.Context
import androidx.room.*
import com.simplemobiletools.commons.extensions.formatDate
import com.simplemobiletools.commons.extensions.formatSize
-import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
-import com.simplemobiletools.commons.helpers.SORT_BY_NAME
-import com.simplemobiletools.commons.helpers.SORT_BY_PATH
-import com.simplemobiletools.commons.helpers.SORT_BY_SIZE
-import com.simplemobiletools.gallery.pro.helpers.FAVORITES
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.gallery.pro.helpers.RECYCLE_BIN
@Entity(tableName = "directories", indices = [Index(value = ["path"], unique = true)])
diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt
index 894feae17..d392bc1a1 100644
--- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/models/Medium.kt
@@ -5,9 +5,11 @@ import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.Index
import androidx.room.PrimaryKey
+import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.extensions.formatDate
import com.simplemobiletools.commons.extensions.formatSize
import com.simplemobiletools.commons.extensions.getFilenameExtension
+import com.simplemobiletools.commons.extensions.isWebP
import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED
import com.simplemobiletools.commons.helpers.SORT_BY_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_PATH
@@ -18,22 +20,24 @@ import java.util.*
@Entity(tableName = "media", indices = [(Index(value = ["full_path"], unique = true))])
data class Medium(
- @PrimaryKey(autoGenerate = true) var id: Long?,
- @ColumnInfo(name = "filename") var name: String,
- @ColumnInfo(name = "full_path") var path: String,
- @ColumnInfo(name = "parent_path") var parentPath: String,
- @ColumnInfo(name = "last_modified") val modified: Long,
- @ColumnInfo(name = "date_taken") var taken: Long,
- @ColumnInfo(name = "size") val size: Long,
- @ColumnInfo(name = "type") val type: Int,
- @ColumnInfo(name = "video_duration") val videoDuration: Int,
- @ColumnInfo(name = "is_favorite") var isFavorite: Boolean,
- @ColumnInfo(name = "deleted_ts") var deletedTS: Long) : Serializable, ThumbnailItem() {
+ @PrimaryKey(autoGenerate = true) var id: Long?,
+ @ColumnInfo(name = "filename") var name: String,
+ @ColumnInfo(name = "full_path") var path: String,
+ @ColumnInfo(name = "parent_path") var parentPath: String,
+ @ColumnInfo(name = "last_modified") val modified: Long,
+ @ColumnInfo(name = "date_taken") var taken: Long,
+ @ColumnInfo(name = "size") val size: Long,
+ @ColumnInfo(name = "type") val type: Int,
+ @ColumnInfo(name = "video_duration") val videoDuration: Int,
+ @ColumnInfo(name = "is_favorite") var isFavorite: Boolean,
+ @ColumnInfo(name = "deleted_ts") var deletedTS: Long) : Serializable, ThumbnailItem() {
companion object {
private const val serialVersionUID = -6553149366975655L
}
+ fun isWebP() = name.isWebP()
+
fun isGIF() = type == TYPE_GIFS
fun isImage() = type == TYPE_IMAGES
@@ -86,4 +90,6 @@ data class Medium(
return calendar.timeInMillis.toString()
}
+
+ fun getSignature() = ObjectKey("$path-$modified-$size")
}
diff --git a/app/src/main/res/drawable/extended_details_background.xml b/app/src/main/res/drawable/extended_details_background.xml
new file mode 100644
index 000000000..a2a09c0c3
--- /dev/null
+++ b/app/src/main/res/drawable/extended_details_background.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 6e2f06d16..3756cbb82 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,6 +1,5 @@
-
+ android:visibility="gone" />
+ android:textStyle="italic"
+ android:visibility="gone" />
+ android:visibility="gone" />
+ app:spanCount="@integer/directory_columns_vertical_scroll" />
-
+
@@ -79,7 +78,7 @@
android:paddingTop="@dimen/normal_margin"
android:visibility="gone">
-
+
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index 75ea7b056..71b45e925 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -468,29 +468,6 @@
android:textAllCaps="true"
android:textSize="@dimen/smaller_text_size" />
-
-
-
-
-
-
-
+ android:layout_height="match_parent" />
+ android:visibility="gone" />
+ android:visibility="gone" />
+ android:visibility="gone" />
+ android:contentDescription="@null" />
+ android:textSize="@dimen/normal_text_size" />
+ android:textSize="@dimen/normal_text_size" />
@@ -111,6 +110,6 @@
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_sd_card_vector"
- android:visibility="gone"/>
+ android:visibility="gone" />
diff --git a/app/src/main/res/layout/pager_photo_item.xml b/app/src/main/res/layout/pager_photo_item.xml
index 2b90a6bb3..2238ea26d 100644
--- a/app/src/main/res/layout/pager_photo_item.xml
+++ b/app/src/main/res/layout/pager_photo_item.xml
@@ -1,7 +1,7 @@
@@ -9,7 +9,7 @@
+ android:layout_height="match_parent" />
+ android:scaleType="fitCenter" />
@@ -30,17 +30,17 @@
android:id="@+id/subsampling_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:visibility="gone"/>
+ android:visibility="gone" />
+ android:visibility="gone" />
+ tools:text="My image\nAnother line" />
+ android:layout_alignParentStart="true" />
+ android:textSize="@dimen/extra_big_text_size" />
+ android:layout_height="match_parent" />
+ android:layout_alignParentEnd="true" />
diff --git a/app/src/main/res/layout/pager_video_item.xml b/app/src/main/res/layout/pager_video_item.xml
index 144e53972..6e46132d8 100644
--- a/app/src/main/res/layout/pager_video_item.xml
+++ b/app/src/main/res/layout/pager_video_item.xml
@@ -1,6 +1,5 @@
-
+ android:layout_height="match_parent" />
+ android:layout_centerInParent="true" />
@@ -28,12 +27,12 @@
android:id="@+id/video_volume_controller"
android:layout_width="@dimen/media_side_slider_width"
android:layout_height="match_parent"
- android:layout_alignParentEnd="true"/>
+ android:layout_alignParentEnd="true" />
+ android:layout_height="match_parent" />
+ android:src="@drawable/ic_play_outline_vector" />
+ android:visibility="gone" />
+ tools:text="My video\nAnother line" />
-
+
+ android:textSize="@dimen/extra_big_text_size" />
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index b284d1c4d..88e7928d9 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 3135a1846..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png
deleted file mode 100644
index f1dd2566b..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png
deleted file mode 100644
index ca5342cfa..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png
deleted file mode 100644
index 629938a75..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png
deleted file mode 100644
index 70b20a547..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png
deleted file mode 100644
index b4f0c9a44..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png
deleted file mode 100644
index fc7d6f31d..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png
deleted file mode 100644
index a5b19ee3b..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
deleted file mode 100644
index b281f7196..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_green.png b/app/src/main/res/mipmap-mdpi/ic_launcher_green.png
deleted file mode 100644
index 72109060c..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_green.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png
deleted file mode 100644
index bf90ade75..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png
deleted file mode 100644
index 8192b480b..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png
deleted file mode 100644
index b70f88f36..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png
deleted file mode 100644
index 2119deb97..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png
deleted file mode 100644
index 6ad1bad8d..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png
deleted file mode 100644
index 1c447244a..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png
deleted file mode 100644
index 4ec77155f..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_red.png b/app/src/main/res/mipmap-mdpi/ic_launcher_red.png
deleted file mode 100644
index 0161c4f10..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_red.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png
deleted file mode 100644
index e271b1993..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png
deleted file mode 100644
index 67c6be12f..000000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 99017670f..f645b6dae 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 98c18b66d..3151de093 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index a1e18106d..516d12f56 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index f26a144e6..f65ab2bc9 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -15,10 +15,6 @@
مجلد آخر
عرض علي الخريطة
موقع غير معروف
- زيادة عدد الأعمدة
- تقليل عدد الأعمدة
- تغيير صورة الغلاف
- تحديد صورة
الصوت
السطوع
قفل الاتجاه
@@ -125,9 +121,6 @@
لم يتم العثور علي أي وسائط لعرض الشرائح
- تغيير نوع العرض
- الشبكة
- القائمة
تجميع المجلدات الفرعية مباشرة
@@ -190,6 +183,13 @@
تجنب إظهار الملفات غير الصالحة
إظهار أنواع ملفات الصور
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
الصور المصغرة
@@ -315,7 +315,7 @@
- المعرض البسيط الـ Pro - محرر ومدير الصور
+ المعرض البسيط (Pro) - محرر ومدير الصور
أستعرض ذكرياتك دون أي انقطاع مع معرض الصور والفيديو هذا
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 0345c3ee3..2788dacbd 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -15,10 +15,6 @@
Other folder
Show on map
Unknown location
- Increase column count
- Reduce column count
- Change cover image
- Select photo
Volume
Brightness
Lock orientation
@@ -125,9 +121,6 @@
No media for the slideshow have been found
- Change view type
- Grid
- List
Group direct subfolders
@@ -190,6 +183,13 @@
Avoid showing invalid files
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Thumbnails
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index e76b84883..80898f313 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -15,10 +15,6 @@
Un altre carpeta
Mostrar al mapa
Ubicació desconeguda
- Augmentar el número de columnes
- Reduir el número de columnes
- Canviar imatge de portada
- Sel·leccionar imatge
Volum
Brillantor
Bloquejar orientació
@@ -125,9 +121,6 @@
No s’han trobat mitjans per a la presentació de diapositives
- Canviar el tipus de vista
- Reixeta
- Llista
Agrupar carpetes directes
@@ -189,7 +182,14 @@
Compromès
Eviteu mostrar fitxers no vàlids
Mostra els tipus de fitxers d\’imatges
- Allow zooming videos with double tapping them
+ Permet fer zoom als vídeos amb dos cops
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniatures
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index abfab3d00..0f7066c0c 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -15,10 +15,6 @@
Jiná složka
Zobrazit na mapě
Neznámá poloha
- Zvýšit počet sloupců
- Snížit počet sloupců
- Změnit obal alba
- Vybrat fotografii
Hlasitost
Jas
Uzamknout orientaci
@@ -125,9 +121,6 @@
Nebyla nalezena žádná média pro prezentaci
- Změnit typ zobrazení
- Mřížka
- Seznam
Sloučit přímé podsložky
@@ -190,6 +183,13 @@
Nezobrazovat neplatné soubory
Zobrazit typ obrázkových souborů
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Náhledy
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index e36395aaa..b846125a3 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -15,10 +15,6 @@
Anden mappe
Vis på kort
Ukendt placering
- Flere kolonner
- Færre kolonner
- Skift cover-billede
- Vælg billede
Lydstyrke
Lysstyrke
Lås orientering
@@ -125,9 +121,6 @@
Der blev ikke funket nogen mediefiler til slideshowet
- Skift visning
- Gitter
- Liste
Gruppér direkte undermapper
@@ -190,6 +183,13 @@
Undgå at vise ugyldige filer
Vis billeders filtyper
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniaturer
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 83e28096f..91e479727 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -15,10 +15,6 @@
Ordner wählen
Auf Karte zeigen
Unbekannter Pfad
- Kacheln verkleinern
- Kacheln vergrößern
- Coverbild ändern
- Auswählen
Lautstärke
Helligkeit
Bildausrichtung sperren
@@ -125,9 +121,6 @@
Keine Medien für Diashow gefunden
- Darstellung ändern
- Gitternetz
- Liste
Direkte Unterordner gruppieren
@@ -190,6 +183,13 @@
Das Anzeigen von ungültigen Dateien vermeiden
Bilddateitypen anzeigen
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Thumbnails
@@ -318,7 +318,7 @@
Schlichte Galerie Pro - Foto Manager & Editor
- Bewahre deine Andenken ohne Unterbrechungen mit dieser Foto- und Videogalerie
+ Einfache und übersichtliche Galerie zur Verwaltung von Alben, Fotos, Videos
Schlichte Galerie Pro ist eine stark individualisierbare Offline Galerie. Ordne & bearbeite deine Fotos, stelle gelöschte Fotos mit Hilfe des Papierkorbs wieder her, schütze & verstecke Dateien und zeige eine Vielzahl von Bilder- & Videoformaten an, unter anderem RAW, SVG und viele mehr.
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index c0e6b3725..36f4f369d 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -15,10 +15,6 @@
Άλλος φάκελος
Εμφάνιση στο χάρτη
Άγνωστη τοποθεσία
- Αύξηση αριθμού στηλών
- Μείωση αριθμού στηλών
- Αλλαγή εξώφυλλου φακέλου
- Επιλογή φωτογραφίας
Ένταση
Φωτεινότητα
Κλείδωμα προσανατολισμού
@@ -125,9 +121,6 @@
Δεν βρέθηκαν πολυμέσα για την εμφάνιση διαφανειών
- Αλλαγή τύπου εμφάνισης
- Πλέγμα
- Λίστα
Ομαδοποίηση υποφακέλων
@@ -189,7 +182,14 @@
Συμβιβασμός
Αποφυγή εμφάνισης μη έγκυρων αρχείων
Εμφάνιση τύπου αρχείου εικόνας
- Allow zooming videos with double tapping them
+ Επιτρέπει την μεγέθυνση βίντεο με διπλό πάτημα
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Εικονίδια
@@ -318,9 +318,9 @@
- ΑΠΛΗ ΣΥΛΛΟΓΗ Pro - Διαχείριση & Επεξεργασία
+ Απλή Συλλογή Pro - Διαχείριση & Επεξεργασία
- Περιηγηθείτε στις αναμνήσεις σας χωρίς διακοπές με αυτήν τη συλλογή φωτό & βίντεο
+ Μια premium εφαρμογή διαχείρισης/επεξεργασίας φωτο βίντεο GIF χωρίς διαφημήσεις
Η Απλή Συλλογή Pro είναι χωρίς σύνδεση και εξαιρετικά προσαρμόσιμη. Οργανώστε και επεξεργαστείτε τις φωτογραφίες σας, ανακτήσετε διαγραμμένα αρχεία απο τον κάδο ανακύκλωσης, προστατεύσετε και αποκρύψτε αρχεία, προβάλετε πλήθος διαφορετικών φωτογραφιών και μορφών βίντεο, συμπεριλαμβανομένων των RAW, SVG και πολλών άλλων.
@@ -356,7 +356,7 @@
ΥΠΟΣΤΗΡΙΞΗ ΠΟΛΛΩΝ ΤΥΠΩΝ ΑΡΧΕΙΩΝ
Σε αντίθεση με κάποιες άλλες εφαρμογές η Απλή Συλλογή Pro υποστηρίζει ένα τεράστιο φάσμα διαφορετικών τύπων αρχείων, όπως JPEG, PNG, MP4, MKV, RAW, SVG, Πανοραμικές φωτογραφίες, βίντεο πανοραμικών και πολλά άλλα.
- ΠΟΛΥ ΠΡΟΣΑΡΜΟΣΙΜΟΣ ΔΙΑΧΕΙΡΙΣΤΗΣ ΣΥΛΛΟΓΗΣ
+ ΠΟΛΥ ΠΡΟΣΑΡΜΟΣΙΜΟΣ ΔΙΑΧΕΙΡΙΣΤΗΣ
Από το UI στα κουμπιά λειτουργιών στην κάτω γραμμή εργαλείων, η Απλή Συλλογή Pro είναι ιδιαίτερα προσαρμόσιμη και λειτουργεί όπως εσείς θέλετε. Καμιά άλλη εφαρμογή δεν έχει τέτοια ευελιξία! Χάρη στον ανοιχτό κώδικα, είναι επίσης διαθέσιμη σε 32 γλώσσες!
ΕΠΑΝΑΦΟΡΑ ΔΙΑΓΡΑΜΜΕΝΩΝ ΦΩΤΟ ΚΑΙ ΒΙΝΤΕΟ
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index edcbc545c..f4b7a19d6 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -15,10 +15,6 @@
Otra carpeta
Mostrar en el mapa
Ubicación desconocida
- Aumentar el número de columnas
- Reducir el número de columnas
- Cambiar imagen de portada
- Seleccionar imagen
Volumen
Brillo
Bloquear orientación
@@ -125,9 +121,6 @@
No se han encontrado medios para la presentación de diapositivas
- Cambiar tipo de vista
- Cuadrícula
- Lista
Agrupar subcarpetas directas
@@ -189,7 +182,14 @@
Compromiso
Evita mostrar archivos inválidos
Mostrar tipos de archivo de imagen
- Allow zooming videos with double tapping them
+ Permitir hacer zoom en videos con doble toque
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniaturas
@@ -319,7 +319,7 @@
Simple Gallery Pro - Gestor y editor de fotos
- Explore sus recuerdos sin interrupciones con esta galeria de foto y vídeo
+ Galería rápida y segura para gestión profesional de fotos, vídeos y los GIFs
Simple Gallery Pro es una galería altamente personalizable disponible sin conexión. Organiza y edita tus fotos, recupera archivos eliminados con la papelera de reciclaje, protege y oculta archivos y mira una gran variedad de diferentes formatos de fotos y videos incluyendo RAW, SVG y muchos más.
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index a534d0937..fed06d1f6 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -15,10 +15,6 @@
Muu kansio
Näytä kartalla
Tuntematon sijainti
- Lisää sarakkeita
- Vähennä sarakkeita
- Vaihda kansikuva
- Valitse kuva
Äänenvoimakkuus
Kirkkaus
Lukitse näytönkierto
@@ -125,9 +121,6 @@
Mediaa diaesitykseen ei löytynyt
- Vaihda näkymää
- Ruudukko
- Lista
Group direct subfolders
@@ -190,6 +183,13 @@
Avoid showing invalid files
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Esikatselukuvat
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index abfc0a3cd..5d3a7a4a1 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -15,10 +15,6 @@
Autre dossier
Afficher sur la carte
Position inconnue
- Ajouter une colonne
- Supprimer une colonne
- Changer l\'image du dossier
- Choisir une image
Volume
Luminosité
Verrouiller la rotation
@@ -125,9 +121,6 @@
Aucun média trouvé pour le diaporama
- Changer de mode d\'affichage
- Grille
- Liste
Mode sous-dossiers
@@ -189,7 +182,14 @@
Compromis
Éviter l\'affichage de fichiers invalides
Afficher les types d\'image
- Allow zooming videos with double tapping them
+ Zoomer les vidéos par un double appui
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniatures
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 2e29b592e..7c00ddd43 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -11,18 +11,14 @@
Fixar arriba
Mostrar o contido de todos os cartafoles
Todos os cartafoles
- Mudar a vista por cartafol
+ Mudar á vista por cartafol
Outro cartafol
Mostrar no mapa
Localización descoñecida
- Aumente o número de columnas
- Reduza o número de columnas
- Cambiar a imaxe de portada
- Escolla foto
Volume
Brillo
Fixar orientación
- Desbloquear orientación
+ Non fixar orientación
Cambiar orientación
Forzar retrato
Forzar paisaxe
@@ -31,9 +27,9 @@
Arranxando…
Datas arranxadas con éxito
Non se atoparon valores de Datas de Captura
- Comparta unha versión reducida
- Ola,\n\nsemella que actualizou desde a vella aplicación gratuita. Pode desinstalar a versión vella, que ten un botón \'Upgrade to Pro\' enriba da pantalla de configuración.\n\nSo terá os elementos borrados da Papeleira de reciclaxe, os elementos favoritos sen marcar e tamén terá que reiniciar os Axustes.\n\nGrazas!
- Cambiar á procura de ficheiros en todolos cartafoles visibles.
+ Comparte unha versión reducida
+ Ola,\n\nsemella que actualizaches desde o vello aplicativo gratuito. Podes desinstalar a versión vella, que ten un botón \'Mellorar a Pro\' enriba da pantalla de configuración.\n\nSo terás os elementos borrados da Papeleira de reciclaxe, os elementos favoritos sen marcar e tamén terás que reiniciar os Axustes.\n\nGrazas!
+ Cambiar á procura de ficheiros en todos os cartafoles visibles.
Filtrar medios
@@ -43,29 +39,29 @@
Imaxes RAW
SVGs
Retratos
- Non se atoparon medios dos indicados polo filtro.
+ Non se atopou multimedia do tipo indicado polo filtro.
Cambiar filtro
- Esta función oculta o cartafol engadindolle ficheiro \'.nomedia\', tamén ocultará os subcartafoles. Pode velos pulsando a opción \'Mostrar elementos ocultos\' nos Axustes. Continuar?
+ Esta función oculta o cartafol engadíndolle ficheiro \'.nomedia\', tamén ocultará os subcartafoles. Podes velos pulsando a opción \'Mostrar elementos ocultos\' nos Axustes. Continuar?
Excluír
Cartafoles excluídos
Xestionar cartafoles excluídos
- Esto ocultará a selección xunto cos seus subcartafoles son en Simple Gallery. Pode xestionar os cartafoles ocultos en Axustes.
+ Isto ocultará a selección xunto cos seus subcartafoles só en Simple Gallery. Podes xestionar os cartafoles ocultos en Axustes.
Excluír o cartafol pai no seu lugar?
- Excluír un cartafol xunto cos subcartafoles só terá efecto en Simple Gallery, seguirán sendo visibles en outros aplicativos.\n\nSi tamén quere excluílos en outros aplicativos, utilice a opción Agochar.
+ Excluír un cartafol xunto cos subcartafoles só terá efecto en Simple Gallery, seguirán sendo visibles noutros aplicativos.\n\nSe tamén queres excluílos noutros aplicativos, utiliza a opción Agochar.
Eliminar todos
- Eliminar todos os cartafoles da lista de excluídos? Esto non borrará os cartafoles.
+ Eliminar todos os cartafoles da lista de excluídos? Isto non borrará os cartafoles.
Cartafoles ocultos
Xestionar cartafoles ocultos
- Semella que non ten ningún cartafol oculto con un ficheiro \".nomedia\".
+ Semella que non tes ningún cartafol oculto cun ficheiro \".nomedia\".
Cartafoles incluídos
Xestionar cartafoles incluídos
Engadir cartafol
- Si ten algún cartafol con medios, mais non foi recoñecido polo aplicativo, pódeo engadir manualmente.\n\nEngadindo aquí elementos non eliminará outros.
- Non se atopou ningún ficheiro audiovisual. Pode solucionalo engadindo manualmente algúns cartafoles con eses ficheiros.
+ Se tes algún cartafol con medios, mais non foi recoñecido polo aplicativo, pódelo engadir manualmente.\n\nEngadindo aquí elementos non eliminarás outros.
+ Non se atopou ningún ficheiro multimedia. Podes solucionalo engadindo manualmente algúns cartafoles con eses ficheiros.
Redimensionar
@@ -73,19 +69,19 @@
Ancho
Alto
Manter proporcións
- Por favor introduza unha resolución válida
+ Por favor escribe unha resolución válida
Editor
Rotar
- Ruta a imaxe non válida
+ Ruta á imaxe non válida
Fallo na edición da imaxe
Cancelouse a edición da imaxe
- Ficheiro editado con éxito
+ Ficheiro editado correctamente
Editar imaxe con:
Non se atopou ningún editor
Localización do ficheiro descoñecida
- Non se puido sobreescribir o ficheiro
+ Non se puido sobrescribir o ficheiro
Rotar a esquerda
Rotar a dereita
Rotar 180º
@@ -118,16 +114,13 @@
Mover atrás
Reproducir en bucle
Animación
- Nengún
+ Ningún
Esvaecemento
Deslizamento
Rematou a presentación
- Non se atoparon medios para a presentación
+ Non se atopou multimedia para a presentación
- Cambiar o tipo de vista
- Grella
- Lista
Agrupar subcartafoles directos
@@ -142,60 +135,67 @@
Data de captura (mensual)
Tipo de ficheiro
Extensión
- Por favor, teña en conta que agrupar e ordenar son dous campos diferentes
+ Por favor, ten en conta que agrupar e ordenar son dous campos diferentes
Cartafol a mostrar no widget:
- Amosar nome de cartafol
+ Mostrar nome de cartafol
- Reproducir vídeos automticamente
+ Reproducir vídeos automáticamente
Lembrar a posición do vídeo na última vez
Mudar a visibilidade do ficheiro
- videos en bucle
+ Víeos en bucle
Animar os GIFs na icona
Brillo ao máximo cando mire medios
Recortar iconas a cadrados
- Amosar a duración dos vídeos
+ Mostrar a duración dos vídeos
Rotar medios a pantalla completa a
- Axuste do sistema
+ Axuste ao sistema
Rotación do dispositivo
Relación de aspecto
Fondo negro e barra de estado en reprodución a pantalla completa
- Desplazar iconas horizontalmente
+ Desprazar iconas horizontalmente
Agochar controis do sistema cando visualice a pantalla completa
- Borrar cartafoles baldeiros cando elmine o seu contido
+ Borrar cartafoles baleiros cando elmine oseu contido
Permitir controlar o brillo da foto con xestos verticais
- Permitir controlar o volume do vídeo e o brillo con xestos verticáis
+ Permitir controlar o volume do vídeo e o brillo con xestos verticais
Mostrar a conta de medios do cartafol na vista principal
Mostrar información pormenorizada sobre medios a pantalla completa
Xestionar información polo miúdo
- Permitir zoom con un dedo a pantalla completa
- Permitir o cambio instantáneo de medios pulsando nos lados da pantalla
+ Permitir zoom cun dedo a pantalla completa
+ Permitir o cambio instantáneo de medios premendo os lados da pantalla
Permitir ampliar moito as imaxes
Agochar detalles extendidos cando a barra de estado está oculta
Mostrar botóns para accións na parte baixa da pantalla
- Mostrar a Papeleira de Reciclaxe na pantalla de cartafoles
+ Mostrar a Papeleira na pantalla de cartafoles
Imaxes con moita ampliación
Mostrar imaxes na súa máxima calidade
- Mostrar a Papeleira de Reciclaxe como no derradeiro posto da pantalla principal
+ Mostrar a Papeleira no derradeiro posto da pantalla principal
Permitir pechar a visualización en pantalla completa deslizando cara abaixo
Permitir ampliar a 1:1 con dous toques
Abrir sempre os vídeos nunha pantalla diferente con novos xestos horizontais
- Mostrar unha marca se a houbera
+ Mostrar unha marca se a houbese
Permitir rotar unha imaxe con xestos
Prioridade de carga de ficheiro
Velocidade
Compromiso
- Non mostrar ficheiros inválidos
+ Non mostrar ficheiros non válidos
Mostrar tipos de ficheiros de imaxe
- Allow zooming videos with double tapping them
+ Permitir zoom nos vídeos co dobre-toque sobre eles
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Iconas
Medios a pantalla completa
Detalles ampliados
- Actions do fondo
+ Accións do fondo
Xestionar accións visibles do fondo
@@ -208,7 +208,7 @@
Cadrado
Transformar
Filtrar
- Nengún
+ Ningún
Axustar
Sombras
Exposición
@@ -223,8 +223,8 @@
Temperatura
Nitidez
Reiniciar
- Foco
- Nengún
+ Enfoque
+ Ningún
Radial
Lineal
Reflectir
@@ -238,21 +238,21 @@
Endereitar
Fonte
Cor
- Color Fondo
- Aliñamento
- Á Front
+ Cor Fondo
+ Alineamento
+ Á Fronte
Borrar
- Seu texto
+ O teu texto
Pincel
Cor
Tamaño
Dureza
- Á Front
+ Á Fronte
Borrar
Cor do Pincel
Editor
Pechar o Editor?
- Ten a certeza de desbotar a imaxe?
+ Tes a certeza de desbotar a imaxe?
Si
Non
Cancelar
@@ -280,94 +280,93 @@
Amarelo
Verde oliva
Verde
- Aquamarin
- Pipettable color
+ Augamariña
+ Escoller coa pipeta
- Cómo podo facer que Simple Gallery sexa a galería por omisión no dispositivo?
- Primeiro debe atopar a galería por omsión actual na sección de App nos axustes do dispositivo, buscar un botón que diga algo como \"Abrir por omisión\", pulsalo e despois seleccionar \"Limpar por omisión\".
- A próxima vez que intente abrir unha imaxe ou vídeo aparecerá un selector de aplicativos onde pode escoller Simple Gallery e facela o aplicativo por omisión.
- Asegurei o aplicativo con un contrasinal, pero esquecino. Qué podo facer?
- Pode solucionado de dous xeitos. Ou ben reinstalar o aplicativo ou buscar o aplicativo nos axustes do dispositivo e escoller \"Limpar datos\". Restablecerá todos os seus axustes, mais non eliminará ficheiros de medios.
- Cómo podo facer que un álbume apareza sempre arriba de todo?
- Pode manter premido o álbume e escoller a icona de Fixar no menú de accións, esto fixarao arriba. Pode fixar varios cartafoles tambén, os elementos fixados estarán ordenados polo criterio por omisión.
- Cómo podo aumentar a velocidade de reprodución de vídeo?
+ Como podo facer que Simple Gallery sexa a galería por defecto no meu dispositivo?
+ Primeiro debes atopar a galería por omisión actual na sección de App nos axustes do dispositivo, buscar un botón que diga algo como \"Abrir por omisión\", pulsalo e despois seleccionar \"Limpar por omisión\".
+ A próxima vez que intentes abrir unha imaxe ou vídeo aparecerá un selector de aplicativos onde podes escoller Simple Gallery e facela a aplicativo por defecto/n.
+ Asegurei o aplicativo cun contrasinal, pero esquecino. Que podo facer?
+ Pode solucionado de dous xeitos. Ou ben reinstalar o aplicativo ou buscar o aplicativo os axustes do dispositivo e escoller \"Limpar datos\". Restablecerá todos os seus axustes, mais non eliminará ficheiros de medios.
+ Como podo facer que un álbum apareza sempre arriba de todo?
+ Pode manter premido o álbum e escoller a icona de Fixar no menú de accións, isto fixarao arriba. Pode fixar varios cartafoles tamén, os elementos fixados estarán ordenados polo criterio por omisión.
+ Como podo aumentar a velocidade de reprodución do vídeo?
Pode facelo tocando dúas veces o lateral da pantalla, ou tocando os textos de duración máxima ou actual preto da barra de avance. Se activa abrir os vídeos nunha pantalla separada, tamén pode usar xestos horizontais.
Cal é a diferenza entre agochar e excluír un cartafol?
- A Exclusión prevén que se mostre o cartafol só en Simple Gallery, mentras Agochar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Esto funciona creando un ficheiro baldeiro de nome \".nomedia\" no cartafol, que tamén pode quitar con calquer xestor de ficheiros. Note that some devices do not allow hiding folders like Camera, Screenshots and Downloads.
- Por qué aparecen cartafoles de música con portadas ou pegatinas?
+ A exclusión prevén que se mostre o cartafol só en Simple Gallery, mentras Agochar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Esto funciona creando un ficheiro baldeiro de nome \".nomedia\" no cartafol, que tamén pode quitar con calquera xestor de ficheiros.Teña en conta que algúns dispositivos non permiten cartafoles agochados como Cámara, Capturas de pantalla e Descargas.
+ Por que aparecen cartafoles de música con portadas ou pegatinas?
Pode acontecer que vexa que aparecen álbumes raros. Pode excluílos con facilidade mantendo premidos e escollendo Excluír. No seguinte diálogo pode escoller o cartafol pai, esto probablemente agoche outros álbumes relacionados.
- Un cartafol con imaxes non aparece, qué podo facer?
- Esto pode acontecer por varias razóns, pero é doado resolvelo. Vaia a Axustes -> xestionar cartafoles incluídos, escolle o Máis e navegar ate o cartafol requerido.
- E qué pasa si só quero que sexan visibles certos cartafoles
- Engadir un cartafol a Cartafoles incluídos non exclúe nada de xeito automático. O que pode facer é ir a Axustes -> Xestionar cartafoles incluídos, excluír o cartafol root \"/\", e despóis engadir os cartafoles desexados con Axustes -> Xestionar Cartafoles Incluídos.
- Esto fará visibles só aos cartafoles escollidos, como tanto excluír e incluír son recursivos e si está excluído e logo incluído, será mostrado.
- Podo recortar imaxes con esta aplicación?
+ Un cartafol con imaxes non aparece, que podo facer?
+ Isto pode acontecer por varias razóns, pero é doado resolvelo. Vaia a Axustes -> xestionar cartafoles incluídos, escolle o Máis e navegar ate o cartafol requerido.
+ E que pasa se só quero que sexan visibles certos cartafoles
+ Engadir un cartafol a Cartafoles incluídos non exclúe nada de xeito automático. O que pode facer é ir a Axustes -> Xestionar cartafoles incluídos, excluír o cartafol root \"/\", e despois engadir os cartafoles desexados con Axustes -> Xestionar Cartafoles Incluídos.
+ Isto fará visibles só aos cartafoles escollidos, como tanto excluír e incluír son recursivos e si está excluído e logo incluído, será mostrado.
+ Podo recortar imaxes con este aplciativo?
Si, pode recortar imaxes no editor, arrastrando as esquinas das imaxes. Pode chegar ao editor tanto presionando na imaxe durante un anaco e seleccionando Editar, ou seleccionando Editar dende a vista de pantalla completa.
- Podo agrupar as iconas de algún xeito?
+ Podo agrupar as iconas dalgún xeito?
Claro, use no menu \"Agrupar por\" na vista de iconas. Pode facelo por múltiples criterios, incluindo a data de captura. Se usa a función \"Mostrar o contido dos cartafoles\", tamén pode agruparlos por cartafoles.
Semella que Ordenar por Data non está a funcionar, como o amaño?
- Seguramente foi causa de copiar os ficheiros de algures. Pode amañalo seleccionando as iconas e \"Arranxar o valor da Data de Captura\".
+ Seguramente foi causa de copiar os ficheiros de algures. Podes amañalo seleccionando as iconas e \"Arranxar o valor da Data de Captura\".
Vexo bandas de cor nas imaxes. Como podo mellorar a súa calidade?
A solución actual de mostra das imaxes funciona ben na maioría dos casos, pero se desexa unha calidade maior, active \"Mostrar imaxes na máxima calidade posible\" na configuración, na sección \"Imaxes con moita ampliación\".
- Teño un ficheiro ou cartafol oculto. Como o amoso?
+ Teño un ficheiro ou cartafol oculto. Como o amoso?
Pode ou ben activar \"Mostrar temporalmente ficheiros agochados\" no menu principal, ou activar \"Amosar obxectos ocultos\" na configuración. Se quere amosalo sempre, pode presionar uns intres e seleccionar \"Amosar\". Os cartafoles agóchanse engadindo un ficheiro oculto \".nomedia\" no seu interior; tamén pode borrar ese ficheiro con calquera xestor de ficheiros.
- Por que consume tanto espacio esta aplicación?
- Os ficheiros temporais poden chegar aos 250MB e server para cargar máis rápido. Se a aplicación está a consumir máis espazo, o máis probable é que teña ficheiros nam Papeleira de Reciclaxe. Estes ficheiros contan no tamaño da aplicación. Pode baleirala abríndoa e borrando os ficheiros, ou dende a configuración. Cada ficheiro da Papeleira bórrase automáticamente tras 30 días.
-
+ Por que consume tanto espacio este aplicativo?
+ Os ficheiros temporais poden chegar aos 250MB e server para cargar máis rápido. Se o aplicativo está a a consumir máis espazo, o máis probable é que teña ficheiros na Papeleira de Reciclaxe.Estes ficheiros contan no tamaño da aplicación.Podes baleirala abríndoa e borrando os ficheiros, ou desde a configuración.Cada ficheiro da Papeleira bórrase automáticamente tras 30 días.
- Simple Gallery Pro - Photo Manager & Editor
+ Simple Gallery Pro - Xestor e Editor de fotos
- Browse your memories without any interruptions with this photo and video gallery
+ Busca nos recordos sen interrupcións na galería de fotos e vídeo
- Simple Gallery Pro is a highly customizable offline gallery. Organize & edit your photos, recover deleted files with the recycle bin, protect & hide files and view a huge variety of different photo & video formats including RAW, SVG and much more.
+ Simple Gallery Pro unha galería altamente personalizable. Organiza & edita as túas fotos, recupera ficheiros borrados desde a papeleira, protexe & oculta ficheiros e visualiza gran número de formatos de fotos & vídeo incluíndo RAW, SVG e moitos máis.
- The app contains no ads and unnecessary permissions. As the app doesn’t require internet access either, your privacy is protected.
+ O app non ten publicidade nin permisos innesarios. Como tampouco require acceso a internet, a túa privacidade está protexida.
-------------------------------------------------
- SIMPLE GALLERY PRO – FEATURES
+ SIMPLE GALLERY PRO – Características
-------------------------------------------------
- • Offline gallery with no ads or popups
- • Simple gallery photo editor – crop, rotate, resize, draw, filters & more
- • No internet access needed, giving you more privacy and security
- • No unnecessary permissions required
- • Quickly search images, videos & files
- • Open & view many different photo and video types (RAW, SVG, panoramic etc)
- • A variety of intuitive gestures to easily edit & organize files
- • Lots of ways to filter, group & sort files
- • Customize the appearance of Simple Gallery Pro
- • Available in 32 languages
- • Mark files as favorites for quick access
- • Protect your photos & videos with a pattern, pin or fingerprint
- • Use pin, pattern & fingerprint to protect the app launch or specific functions too
- • Recover deleted photos & videos from the recycle bin
- • Toggle visibility of files to hide photos & videos
- • Create a customizable slideshow of your files
- • View detailed information of your files (resolution, EXIF values etc)
- • Simple Gallery Pro is open source
- … and much much more!
+ • Galería sen conexión a internet, publicidade nin ventás emerxentes
+ • Editor de fotos Simple gallery – recorta, rota, cambia tamaño, debuxa, fitros, e máis
+ • Non precisa acceso a internet, dándoche máis seguridade e privacidade
+ • Non pide permisos innecesarios
+ • Busca rápida de ficheiros de foto e vídeo
+ • Abre e visualiza gran cantidade de formatos (RAW, SVG, panoramic etc)
+ • Xestos intuitivos para editar e organizar os ficheiros
+ • Múltiples filtros, agrupamento e orde dos ficheiros
+ • Personaliza o aspecto de Simple Gallery Pro
+ • Dispoñible en 32 idiomas
+ • Marca ficheiros como favoritos para acceso rápido
+ • Protexe fotos e vídeos cun patrón, PIN ou impresión dixital
+ • Usa PIN, patrón e impresión dixital para protexer a apertura do app ou indicar funcións específicas
+ • Recupera fotos e vídeos borrados desde a papeleira
+ • Cambia a visibilidade dos ficheiros para ocultar fotos e vídeos
+ • Crea presentacións personalizadas cos teus ficheiros
+ • Mira a información detalladas dos ficheiros (resolución, valores EXIF etc)
+ • Simple Gallery Pro é código aberto
+ … e moito máis!
PHOTO GALLERY EDITOR
- Simple Gallery Pro makes it easy to edit your pictures on the fly. Crop, flip, rotate and resize your pictures. If you’re feeling a little more creative you can add filters and draw on your pictures!
+ Simple Gallery Pro permite editar as fotos no momento. Recorta, voltea, rota e redimensiona as túas fotos. Se te sintes inspirado tamén pode engadir filtros e debuxar nas imaxes!
- SUPPORT FOR MANY FILE TYPES
- Unlike some other gallery viewers & photo organizers, Simple Gallery Pro supports a huge range of different file types including JPEG, PNG, MP4, MKV, RAW, SVG, Panoramic photos, Panoramic videos and many more.
+ SOPORTA MOITOS TIPOS DE FICHEIROS
+ Simple Gallery Pro soporta gran variedade de formatos como JPEG, PNG, MP4, MKV, RAW, SVG, Panoramicas, Vídeos panorámicos e moito máis. Non como outros.
- HIGHLY CUSTOMIZABLE GALLERY MANAGER
- From the UI to the function buttons on the bottom toolbar, Simple Gallery Pro is highly customizable and works the way you want it to. No other gallery manager has this kind of flexibility! Thanks to being open source, we’re also available in 32 languages!
+ XESTOR DE FOTOS MOI PERSONALIZABLE
+ Desde a interface ata a función dos botóns da barra de ferramentas, Simply Gallery Pro é moi personalizable e funciona do xeito que ti queres. Ningún outro xestor de galerías ten esta flexibilidade! Ao ser código aberto, está dipoñible en 32 idiomas!
- RECOVER DELETED PHOTOS & VIDEOS
- Accidentally deleted a precious photo or video? Don’t worry! Simple Gallery Pro features a handy recycle bin where you can recover deleted photos & videos easily.
+ RECUPERA FOTOS & VIDEOS ELIMINADOS
+ Borraches sen querer unha foto ou vídeo? Non te apenes! Simple Gallery Pro ten unha función para recuperar facilmente vídeos e fotos borrados.
- PROTECT & HIDE PHOTOS, VIDEOS & FILES
- Using pin, pattern or your device’s fingerprint scanner you can protect and hide photos, videos & entire albums. You can protect the app itself or place locks on specific functions of the app. For example, you can’t delete a file without a fingerprint scan, helping to protect your files from accidental deletion.
+ PROTEXE & OCULTA FOTOS, VIDEOS & FICHEIROS
+ Usando un prendedor, patrón ou a impresión dixital no escáner do dispositivo podes protexer e agochar fotos, vídeos e álbumes enteiros. Podes protexer a app ou establecer funcións específicas no app. Por exemplo, que non poidas eliminar un ficheiro sen o escáner da impresión dixital, axudándoche a protexer o borrado accidental.
- Check out the full suite of Simple Tools here:
+ Aquí tes todas as Simple Tools:
https://www.simplemobiletools.com
- Standalone website of Simple Gallery Pro:
+ Sitio web de Simple Gallery Pro:
https://www.simplemobiletools.com/gallery
Facebook:
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 791ccca05..b6f820ac1 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -15,10 +15,6 @@
Ostale mape
Prikaži na karti
Nepoznata lokacija
- Povećaj broj stupaca
- Smanji broj stupaca
- Promjeni naslovnu sliku
- Odaberi sliku
Glasnoća
Svjetlina
Zaključaj orijentaciju slike
@@ -125,9 +121,6 @@
Nema datoteka za dijaprojekciju
- Promijeni vrstu prikaza
- Mreža
- Lista
Group direct subfolders
@@ -190,6 +183,13 @@
Avoid showing invalid files
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Sličice
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 6f58b1bbf..8aa1753a9 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -15,10 +15,6 @@
Egyéb mappa
Mutassa a térképen
Ismeretlen helyszín
- Növelje az oszlopok számát
- Csökkentse az oszlopok számát
- Borítókép változtatása
- Válasszon fotót
Hangerő
Fényesség
Tájolás zárolása
@@ -30,7 +26,7 @@
Dátum javítása
Javítás...
Sikeres dátum javítás
- No Date Taken values have been found
+ Nem találhatók Dátum értékek
Átméretezett verzió megosztása
Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks!
Váltás a fájlkeresésre az összes látható mappában
@@ -42,7 +38,7 @@
GIF
RAW kép
SVG
- Portraits
+ Portrék
A kiválasztott szűrők nem találtak médiafájlokat.
Szűrők változtatása
@@ -125,9 +121,6 @@
A diavetítéshez nem található média
- Nézet típus változtatása
- Rács
- Lista
Közvetlen almappa csoport
@@ -189,7 +182,14 @@
Kiegyensúlyozott
Kerülje az érvénytelen fájlok mutatását
Mutassa a kép fájl típusokat
- Allow zooming videos with double tapping them
+ A videók nagyításának engedélyezése dupla koppintással
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniatűrök
@@ -206,27 +206,27 @@
Egyéni
Alaphelyzetbe
Négyzet
- Transform
+ Átalakítás
Szűrő
Nincs
Beállít
Árnyékok
- Exposure
- Highlights
+ Kitettség
+ Kiemelések
Fényerő
Kontraszt
Színtelítettség
Világosság
Gamma
- Blacks
- Whites
+ Feketék
+ Fehérek
Színhőmérséklet
Élesség
Alaphelyzetbe
Fókusz
Nincs
- Radial
- Linear
+ Sugárirányú
+ Lineáris
Tükrözött
Gaussian
Szöveg
@@ -235,7 +235,7 @@
Betűtípus
Hozzáadás
Szerkesztés
- Straighten
+ Egyenesített
Betűtípus
Szín
Háttérszín
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 632bb08dc..948645ae9 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -15,10 +15,6 @@
Folder lainnya
Tampilkan di peta
Lokasi tidak diketahui
- Tambah jumlah kolom
- Kurangi jumlah kolom
- Ubah gambar kover
- Pilih foto
Volume
Kecerahan
Kunci orientasi
@@ -125,9 +121,6 @@
Tidak ditemukan media untuk slideshow
- Ubah tampilan
- Kotak
- Daftar
Kelompokkan subfolder langsung
@@ -190,6 +183,13 @@
Hindari menampilkan berkas yang tidak valid
Tampilkan tipe berkas gambar
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Thumbnail
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 78a0371b9..dc9b09881 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -15,10 +15,6 @@
Folder lainnya
Tampilkan di peta
Lokasi tidak diketahui
- Tambah jumlah kolom
- Kurangi jumlah kolom
- Ubah gambar kover
- Pilih foto
Volume
Kecerahan
Kunci orientasi
@@ -125,9 +121,6 @@
Tidak ditemukan media untuk slideshow
- Ubah tampilan
- Kotak
- Daftar
Kelompokkan subfolder langsung
@@ -190,6 +183,13 @@
Hindari menampilkan berkas yang tidak valid
Tampilkan tipe berkas gambar
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Thumbnail
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 4ff38eea8..fad2b6c18 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -15,10 +15,6 @@
Altra cartella
Mostra sulla mappa
Posizione sconosciuta
- Aumenta numero colonne
- Riduci numero colonne
- Cambia immagine copertina
- Seleziona foto
Volume
Luminosità
Blocca orientamento
@@ -125,9 +121,6 @@
Nessun file trovato per la presentazione
- Cambia modalità visualizzazione
- Griglia
- Elenco
Raggruppa sottocartelle dirette
@@ -189,7 +182,14 @@
Compromesso
Evita di mostrare file non validi
Mostra i tipi di file immagine
- Allow zooming videos with double tapping them
+ Permetti l\'ingrandimento dei video con un doppio tocco
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Anteprime
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 3e23a8359..1b0f81137 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -15,10 +15,6 @@
その他のフォルダ
地図上で表示
位置情報がありません
- 列数を増やす
- 列数を減らす
- カバー画像を変更
- 写真を選択
音量
明るさ
画面の向きを固定する
@@ -125,9 +121,6 @@
スライドショーに表示するメディアがありません
- 表示形式の変更
- グリッド
- リスト
サブフォルダでグループ化
@@ -190,6 +183,13 @@
Avoid showing invalid files
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
サムネイル設定
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index e5d6b2bcc..2a5038e69 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -15,10 +15,6 @@
다른 폴더
지도에서 보기
위치정보 없음
- 섬네일크기 축소
- 섬네일크기 확대
- 커버 사진 변경
- 사진 선택
볼륨
밝기
화면 회전 잠금
@@ -125,9 +121,6 @@
슬라이드 쇼를 표시할 사진이 없습니다.
- 보기 방식 변경
- 타일
- 목록
상위 폴더 표시
@@ -190,6 +183,13 @@
잘못된 파일 보이지 않기
사진 파일 종류 표시
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
섬네일
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 3af9c6ee8..5fa2e4661 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -15,10 +15,6 @@
Kitas aplankas
Rodyti žemėlapyje
Nežinoma vieta
- Padidinti stulpelių skaičių
- Sumažinti stulpelių skaičių
- Pakeisti viršelio atvaizdą
- Pasirinkti nuotrauką
Garsas
Ryškumas
Užrakinti orientaciją
@@ -125,9 +121,6 @@
Nerasta medijos skaidrių demonstracijai
- Keisti peržiūros tipą
- Tinklelis
- Sąrašas
Group direct subfolders
@@ -190,6 +183,13 @@
Avoid showing invalid files
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniatiūros
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index fc2b8a968..199c0f9b2 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -15,10 +15,6 @@
Annen mappe
Vis på kart
Ukjent plassering
- Øk antall kolonner
- Reduser antall kolonner
- Endre omslagsbilde
- Velg foto
Volum
Lysstyrke
Lås skjermorientering
@@ -30,7 +26,7 @@
Korriger Dato tatt-verdi
Korrigerer…
Datoer er korrigerte
- No Date Taken values have been found
+ Ingen verdier for Dato tatt er funnet
Del versjon med endret størrelse
Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks!
Skift til filsøk i alle synlige mapper
@@ -80,7 +76,7 @@
Roter
Ugyldig bildebane
Bilderedigering feilet
- Image editing cancelled
+ Bilderedigering avbrutt
Fil vellykket redigert
Rediger bilde med:
Ingen bilderedigeringsapp funnet
@@ -125,9 +121,6 @@
Ingen media for lysbildeshowet er funnet
- Endre visningstype
- Rutenett
- Liste
Grupper direkte undermapper
@@ -189,7 +182,14 @@
Kompromiss
Unngå visning av ugyldige filer
Vis bildefiltyper
- Allow zooming videos with double tapping them
+ Tillat zooming av videoer ved å dobbelttrykke dem
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Minibilder
diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml
index bbe309c2c..e3ba19aab 100644
--- a/app/src/main/res/values-ne/strings.xml
+++ b/app/src/main/res/values-ne/strings.xml
@@ -15,10 +15,6 @@
अन्य फोल्डर
नक्सामा देखाउनुहोस
थाहानभएको ठाउ
- कोलम सङ्खा बढाउनुहोस
- कोलम सङ्खा घटाउनुहोस
- कभर तस्बिर परिवर्तन गर्नुहोस
- फोटो चयन गर्नुहोस
भोलुम
उज्यालोपन
Lock orientation
@@ -125,9 +121,6 @@
No media for the slideshow have been found
- भ्यू प्रकार परिवर्तन गर्नुहोस
- कोठे
- सुची
Group direct subfolders
@@ -190,6 +183,13 @@
Avoid showing invalid files
तस्बिरको फाईल किसिम देखाउनुहोस
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Thumbnails
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 212416f44..87b9638f0 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -15,10 +15,6 @@
Andere map
Op kaart tonen
Locatie onbekend
- Meer kolommen
- Minder kolommen
- Afbeelding omslag wijzigen
- Foto selecteren
Volume
Helderheid
Schermoriëntatie vergrendelen
@@ -125,9 +121,6 @@
Geen media gevonden voor diavoorstelling
- Weergave
- Raster
- Lijst
Directe submappen groeperen
@@ -189,7 +182,14 @@
Compromis
Ongeldige bestanden verbergen
Bestandstypen tonen
- Allow zooming videos with double tapping them
+ Bij video\'s inzoomen met dubbelklikken
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniatuurvoorbeelden
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 53cf557e2..7c23bb807 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -15,10 +15,6 @@
Inny folder
Pokaż na mapie
Nieznana lokalizacja
- Zwiększ liczbę kolumn
- Zmniejsz liczbę kolumn
- Zmień okładkę
- Wybierz obraz
Głośność
Jasność
Zablokuj orientację ekranu
@@ -125,9 +121,6 @@
Nie znalazłem multimediów do pokazu slajdów
- Zmień typ widoku
- Siatka
- Lista
Grupuj bezpośrednie podfoldery
@@ -190,6 +183,13 @@
Unikaj pokazywania niewłaściwych plików
Pokazuj rozszerzenia zdjęć
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniatury
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 06c052feb..8f95f95a2 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -15,10 +15,6 @@
Outra pasta
Exibir no mapa
Localização desconhecida
- Aumentar número de colunas
- Reduzir número de colunas
- Trocar imagem de capa
- Selecionar foto
Volume
Brilho
Travar orientação
@@ -125,9 +121,6 @@
Nenhuma mídia encontrada para a apresentação
- Alterar modo de visualização
- Grade
- Lista
Agrupar subpastas diretas
@@ -189,7 +182,14 @@
Meio termo
Evitar a exibição de arquivos inválidos
Exibir tipos de arquivo de imagem
- Allow zooming videos with double tapping them
+ Permitir zoom de vídeos com um toque duplo neles
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniaturas
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 33f0306fd..58f2b8be9 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -15,10 +15,6 @@
Outra pasta
Mostrar no mapa
Localização desconhecida
- Aumentar número de colunas
- Diminuir número de colunas
- Alterar imagem de capa
- Selecionar foto
Volume
Brilho
Bloquear orientação
@@ -125,9 +121,6 @@
Não foram encontrados ficheiros para a apresentação
- Tipo de exibição
- Grelha
- Lista
Agrupar sub-pastas
@@ -189,7 +182,14 @@
Qualidade
Não mostrar ficheiros inválidos
Mostrar o tipo de imagem
- Allow zooming videos with double tapping them
+ Permitir ampliação de vídeos com dois toques
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniaturas
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 2993523a7..6cd4e0b32 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -15,10 +15,6 @@
Выбор папки
Показать место съёмки
Место съёмки не указано
- Добавить столбец
- Убрать столбец
- Изменить обложку
- Выбрать изображение
Громкость
Яркость
Заблокировать ориентацию
@@ -125,9 +121,6 @@
Не найдено медиафайлов для слайдшоу
- Вид
- Сетка
- Список
Объединять вложенные папки
@@ -190,6 +183,13 @@
Пропускать файлы с ошибками
Показывать типы файлов изображений
Масштабировать видео двойным нажатием по нему
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Миниатюры
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index f27104046..a58487c92 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -15,10 +15,6 @@
Iný priečinok
Zobraziť na mape
Neznáma poloha
- Zvýšiť počet stĺpcov
- Znížiť počet stĺpcov
- Zmeniť obal albumu
- Zvoliť foto
Hlasitosť
Jas
Uzamknúť otočenie obrazovky
@@ -125,9 +121,6 @@
Pre prezentáciu sa nenašli žiadne vhodné súbory
- Zmeniť typ zobrazenia
- Mriežka
- Zoznam
Zlúčiť priame podpriečinky
@@ -190,6 +183,13 @@
Nezobrazovať neplatné súbory
Zobraziť typ obrázkových súborov
Povoliť približovanie videí dvojitým ťuknutím
+ Štýl miniatúr priečinkov
+ Zobraziť počet súborov na samostatnom riadku
+ Zobraziť počet súborov v zátvorkách
+ Nezobrazovať počet súborov
+ Obmedziť názov priečinka na 1 riadok
+ Štvorec
+ Zaoblené rohy
Náhľady
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index e8ce195da..108b0a8a8 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -15,10 +15,6 @@
Druga mapa
Prikaži na zemljevidu
Neznana lokacija
- Povečaj število stolpcev
- Zmanjšaj število stolpcev
- Spremeni naslovno fotografijo
- Izberi fotografijo
Glasnost
Svetlost
Zakleni usmerjenost
@@ -125,9 +121,6 @@
Ne najdem datotek za diaprojekcijo
- Spremeni tip pogleda
- Mreža
- Seznam
Združi neposredne podmape
@@ -190,6 +183,13 @@
Izogni se prikazovanju napačnih datotek
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Sličice
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 83d4cbffd..57e2c1849 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -15,10 +15,6 @@
Друга фасцикла
Прикажи на мапи
Непозната локација
- Повећај број колона
- Смањи број колона
- Промени насловну слику
- Изабери фотографију
Јачина звука
Осветљење
Закључај оријентацију
@@ -125,9 +121,6 @@
Нису пронађени медији за слајдшоу
- Промени тип прегледа
- Мрежа
- Листа
Групирај директне подфасцикле
@@ -190,6 +183,13 @@
Не приказуј оштећене датотеке
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Сличице
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 885d15451..ef33d76d2 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -15,10 +15,6 @@
Annan mapp
Visa på karta
Okänd plats
- Öka antalet kolumner
- Minska antalet kolumner
- Byt omslagsbild
- Välj foto
Volym
Ljusstyrka
Aktivera rotationslås
@@ -125,9 +121,6 @@
Ingen media hittades för bildspelet
- Ändra vy
- Rutnät
- Lista
Gruppera direkta undermappar
@@ -190,6 +183,13 @@
Avoid showing invalid files
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Miniatyrer
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 4ec982e38..44d6a9c5a 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -15,10 +15,6 @@
Diğer klasör
Haritada göster
Bilinmeyen konum
- Sütun sayısını artır
- Sütun sayısını azalt
- Kapak resmini değiştir
- Fotoğraf seç
Ses
Parlaklık
Yönü kilitle
@@ -125,9 +121,6 @@
Slayt gösterisi için medya bulunamadı
- Görünüm türünü değiştir
- Izgara
- Liste
Doğrudan alt klasörleri gruplandır
@@ -189,7 +182,14 @@
Ödünsüz
Geçersiz dosyaları göstermekten kaçın
Resim dosyası türlerini göster
- Allow zooming videos with double tapping them
+ Videoları iki kez dokunarak yakınlaştırmaya izin ver
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Küçük resimler
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 4bddcc824..06a009c59 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -15,10 +15,6 @@
Інша тека
Показати на мапі
Невідоме розташування
- Збільшити кількість колонок
- Зменшити кількість колонок
- Змінити обкладинку
- Вибрати фото
Об\'єм
Яскравість
Закріпити орієнтацію
@@ -125,9 +121,6 @@
Не знайдено медіафайлів для показу у слайдшоу
- Змінити тип перегляду
- Сітка
- Список
Групувати безпосередні підтеки
@@ -190,6 +183,13 @@
Запобігати показу пошкоджених файлів
Показувати типи файлів зображень
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Ескізи
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index a5355a365..b4b360154 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -15,10 +15,6 @@
Thư mục khác
Hiển thị trên bản đồ
Vị trí không xác định
- Tăng số lượng cột
- Giảm số lượng cột
- Thay đổi ảnh bìa
- Chọn ảnh
Âm lượng
Độ sáng
Khóa xoay màn hình
@@ -125,9 +121,6 @@
Không có tập tin phương tiện cho trình chiếu được tìm thấy
- Thay đổi kiểu xem
- Lưới
- Danh sách
Nhóm thư mục con trực tiếp
@@ -190,6 +183,13 @@
Tránh hiển thị các tệp không hợp lệ
Hiển thị các loại tệp hình ảnh
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Hình thu nhỏ
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 2a995dc06..28edc12be 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -1,6 +1,6 @@
- 简约图库
+ 简易图库
图库
编辑
打开相机
@@ -15,10 +15,6 @@
其他文件夹
在地图上显示
未知位置
- 显示更多项目
- 显示更少项目
- 更换封面图片
- 选择图片
音量
亮度
锁定屏幕方向
@@ -32,7 +28,7 @@
日期修复成功
没有找到拍摄日期
调整尺寸并分享
- 嘿,\n\n你似乎已经从旧的免费版应用升级。你现在可以卸载旧版本,在该版本的应用设置顶部有一个“升级到专业版”按钮。\n\n此操作会删除回收站项目,取消标记收藏项目,并重置应用设置。\n\n谢谢!
+ 嘿,\n\n您似乎已经从旧的免费版应用升级。您现在可以卸载旧版本,在该版本的应用设置顶部有一个“升级到专业版”按钮。\n\n此操作会删除回收站项目,取消标记收藏项目,并重置应用设置。\n\n谢谢!
切换文件搜索范围为所有可见的文件夹
@@ -51,14 +47,14 @@
排除
排除的文件夹
管理排除的文件夹
- 该操作仅会在“简约图库”中排除显示选定的文件夹及其子文件夹。您可以在设置中管理排除的文件夹。
+ 该操作仅会在“简易图库”中排除显示选定的文件夹及其子文件夹。您可以在设置中管理排除的文件夹。
是否排除父文件夹?
- 此目录及其子目录中的媒体将不会在“简约图库”中显示,但是其它应用可以访问。如果您想对其它应用隐藏,请使用隐藏功能。
+ 此目录及其子目录中的媒体将不会在“简易图库”中显示,但是其它应用可以访问。如果您想对其它应用隐藏,请使用隐藏功能。
全部移除
是否移除排除列表中的所有项目?此操作不会删除文件夹本身。
隐藏的文件夹
管理隐藏的文件夹
- 看起来你没有任何使用“.nomedia”文件隐藏的目录。
+ 看起来您没有任何使用“.nomedia”文件隐藏的目录。
包含的文件夹
@@ -96,7 +92,7 @@
其他
- 简约壁纸
+ 简易壁纸
设置为壁纸
设置壁纸失败
设置壁纸方式:
@@ -125,9 +121,6 @@
没有找到可播放幻灯片媒体文件
- 更改视图类型
- 网格
- 列表
直接分组文件夹
@@ -189,7 +182,14 @@
折中
避免显示无效的文件
显示图片文件类型
- Allow zooming videos with double tapping them
+ 允许双击来放大视频
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
缩略图
@@ -242,7 +242,7 @@
对齐
移到最上层
删除
- 你的文字
+ 您的文字
笔刷
颜色
尺寸
@@ -284,24 +284,24 @@
取色器
- 如何把简约图库设置为设备的默认图库?
- 首先,你需要在设备设置的“应用”菜单中找到你当前的默认图库,找到并点击“默认打开”按钮,然后点击“清除默认值”。下次当你再次打开图片或视频时,你应该会看到一个应用程序选择器,请在这里选择“简约图库”并将其设为默认应用程序。
+ 如何把简易图库设置为设备的默认图库?
+ 首先,您需要在设备设置的“应用”菜单中找到您当前的默认图库,找到并点击“默认打开”按钮,然后点击“清除默认值”。下次当您再次打开图片或视频时,您应该会看到一个应用程序选择器,请在这里选择“简易图库”并将其设为默认应用程序。
我用密码锁定了本应用,但我忘记了密码。该怎么办?
- 有两种方法。你可以重新安装本应用,也可以在设置中清除此应用的数据,这将会会重置你的所有设置,但不会删除任何媒体文件。
+ 有两种方法。您可以重新安装本应用,也可以在设置中清除此应用的数据,这将会会重置您的所有设置,但不会删除任何媒体文件。
如何让某个相册始终显示在最上面?
- 你可以长按该相册并在操作栏中点击图钉图标,这样 就可以将其固定在顶部了。你也可以固定多个文件夹,固定项目将按照默认排序方法排序。
+ 您可以长按该相册并在操作栏中点击图钉图标,这样 就可以将其固定在顶部了。您也可以固定多个文件夹,固定项目将按照默认排序方法排序。
如何快进/快退视频?
您可以双击屏幕边缘或点击搜索栏附近的当前或总时长的文字。 如果您在应用设置中启用了在独立页面播放视频,则也可以使用水平手势。
文件夹的隐藏和排除有什么区别?
- 排除功能只是防止其在简约图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件,你可以使用任何文件管理器删除它。请注意,某些设备不允许隐藏\"Camera\",\"Screenshots\"和\"Downloads\"等文件夹。
+ 排除功能只是防止其在简易图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件,您可以使用任何文件管理器删除它。请注意,某些设备不允许隐藏\"Camera\",\"Screenshots\"和\"Downloads\"等文件夹。
为什么会出现音乐艺术家封面或贴纸文件夹?
- 你可能会看到一些不寻常的相册出现。你可以通过长按它们并选择“排除”来排除它们。在之后的对话框中,你可以选择父文件夹,这样也许就会阻止其他相关的相册出现。
+ 您可能会看到一些不寻常的相册出现。您可以通过长按它们并选择“排除”来排除它们。在之后的对话框中,您可以选择父文件夹,这样也许就会阻止其他相关的相册出现。
有的图片文件夹没有显示,怎么回事?
原因可能有很多,但解决方法很简单。只需进入设置 -> 管理包含目录,点击+号并选择到所需的文件夹。
如果我只想显示几个特定的文件夹,该如何操作?
- 在包含目录中添加文件夹不会自动排除其他的内容。你可以做的:进入设置 -> 管理排除目录,排除根目录\"/\",然后在设置 -> 管理包含目录中添加所需的文件夹。这样就只显示选定的文件夹了,由于排除和包含都是递归的,所以排除并包含的文件夹是会显示的。
+ 在包含目录中添加文件夹不会自动排除其他的内容。您可以做的:进入设置 -> 管理排除目录,排除根目录\"/\",然后在设置 -> 管理包含目录中添加所需的文件夹。这样就只显示选定的文件夹了,由于排除和包含都是递归的,所以排除并包含的文件夹是会显示的。
可以裁剪图片吗?
- 当然,通过长按图片缩略图并选择编辑,或在全屏视图中选择编辑来打开编辑器。你可以通过拖动图片边角来剪裁图像。
+ 当然,通过长按图片缩略图并选择编辑,或在全屏视图中选择编辑来打开编辑器。您可以通过拖动图片边角来剪裁图像。
我能将媒体文件缩略图分组吗?
当然,只需在缩略图视图中使用\"分组依据\"菜单项即可。您可以依据多个条件对文件进行分组,包括拍摄日期。如果您使用了\"显示所有文件夹内容\"功能,则可以按文件夹对它们进行分组。
按拍摄日期排序似乎有异常,我该如何解决?
@@ -309,26 +309,26 @@
我看到图像上有一些色带。如何提高提高质量?
目前显示图像的方案在绝大多数情况下都能正常工作,如果您想要更好的图像质量,您可以在设置中启用\"以最高质量显示图像\"。
我隐藏了某个文件/文件夹。如何取消隐藏?
- 您可以点击主界面上的\"暂时显示隐藏的项目\"选项,或在设置中开启\"显示隐藏的项目\"。 如果你想取消隐藏它,长按它并选择\"取消隐藏\"即可。 我们是通过向文件夹中添加\".nomedia\"文件来隐藏文件夹的,使用文件管理器删除该文件也可以取消隐藏。
+ 您可以点击主界面上的\"暂时显示隐藏的项目\"选项,或在设置中开启\"显示隐藏的项目\"。 如果您想取消隐藏它,长按它并选择\"取消隐藏\"即可。 我们是通过向文件夹中添加\".nomedia\"文件来隐藏文件夹的,使用文件管理器删除该文件也可以取消隐藏。
为什么应用占用了这么多的空间?
应用缓存最多可达250MB,这样可以使图像加载更快。如果应用占用了更多空间,则很可能是因为回收站中有项目。这些文件被计入应用程序大小。您可以打开回收站并删除所有文件,或从应用设置中清除回收站。回收站中的内容会在30天后自动删除。
- 简约图库 Pro - 图片管理 & 编辑
+ 简易图库 Pro - 图片管理 & 编辑
使用此照片和视频库来毫无阻碍地浏览您的回忆
- 简约图库 Pro 是一个高度可定制的图库。管理并编辑你的照片,从回收站中恢复已删除的照片,保护并隐藏文件,查看RAW,SVG等等多种照片和视频格式。
+ 简易图库 Pro 是一个高度可定制的图库。管理并编辑您的照片,从回收站中恢复已删除的照片,保护并隐藏文件,查看RAW,SVG等等多种照片和视频格式。
该应用不包含广告和不必要的权限。我们保护您的隐私,因为该应用不需要联网权限。
-------------------------------------------------
- 简约图库 Pro – 特性
+ 简易图库 Pro – 特性
-------------------------------------------------
• 完全离线,没有广告或弹出窗口
- • 简约图库图片编辑器 – 裁剪,旋转,调整大小,绘制,滤镜等等
+ • 简易图库图片编辑器 – 裁剪,旋转,调整大小,绘制,滤镜等等
• 无需联网权限,为您提供更多的隐私和安全
• 没有不必要的权限
• 快速搜索图像,视频和文件
@@ -343,29 +343,29 @@
• 从回收站中恢复已删除的照片和视频
• 支持隐藏照片和视频
• 为您的文件创建一个可自定义的幻灯片
- • 查看文件的详细信息(分辨率,EXIF值等等)
+ • 查看文件的详细信息(分辨率,EXIF 值等等)
• 该应用是开源的
… 还有很多很多!
图库照片编辑
- 简约图库 Pro 可以轻松地动态编辑图片。支持裁剪、翻转、旋转、或是调整图片大小。如果您希望更有创意的话,可以添加滤镜,或是直接在图片上绘制!
+ 简易图库 Pro 可以轻松地动态编辑图片。支持裁剪、翻转、旋转、或是调整图片大小。如果您希望更有创意的话,可以添加滤镜,或是直接在图片上绘制!
支持多种文件类型
- 与其他一些图库应用不同,简约图库 Pro 支持多种文件类型,包括JPEG,PNG,MP4,MKV,RAW,SVG,全景照片,全景视频等等。
+ 与其他一些图库应用不同,简易图库 Pro 支持多种文件类型,包括JPEG,PNG,MP4,MKV,RAW,SVG,全景照片,全景视频等等。
高度可定制的图库
- 从UI到底部工具栏上的功能按钮,简约图库 Pro 可高度自定义并按您的要求工作。其他图库应用可没有这种灵活性!由于该应用是开源的,所以我们还提供 32 种语言!
+ 从UI到底部工具栏上的功能按钮,简易图库 Pro 可高度自定义并按您的要求工作。其他图库应用可没有这种灵活性!由于该应用是开源的,所以我们还提供 32 种语言!
恢复已删除的照片和视频
- 意外删除了珍贵的照片或视频?别担心!简约图库 Pro 具有方便的回收站,您可以方便地恢复已删除的照片和视频。
+ 意外删除了珍贵的照片或视频?别担心!简易图库 Pro 具有方便的回收站,您可以方便地恢复已删除的照片和视频。
保护并隐藏照片、视频和文件
使用密码、图案或指纹保护和隐藏照片、视频、或是整个相册。您也可以保护应用自身或禁用一些特定功能。 例如,只有指纹验证通过才可以删除文件,从而有效地防止您的文件被意外删除。
- 查看简约系列的所有应用:
+ 于此查看简易工具系列全套:
https://www.simplemobiletools.com
- 简约图库 Pro 的独立网站:
+ 简易图库 Pro 的独立网站:
https://www.simplemobiletools.com/gallery
Facebook:
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 0e322d4d2..1686f2a2e 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -190,6 +190,13 @@
避免顯示無效的檔案
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
縮圖
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index c3d2593a0..833320b29 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -15,10 +15,6 @@
其他資料夾
在地圖上顯示
未知的位置
- 增加欄數
- 減少欄數
- 更換封面圖片
- 選擇相片
音量
亮度
鎖定方向
@@ -125,9 +121,6 @@
找不到投影片的媒體檔案
- 改變瀏覽類型
- 格狀
- 列表
歸類子資料夾
@@ -190,6 +183,13 @@
避免顯示無效的檔案
顯示圖片檔案類型
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
縮圖
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index eb0f6cdf6..78b30b24b 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -22,5 +22,5 @@
86dp
110dp
40dp
- 40dp
+ 30dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6b9af0098..c596d6f9c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -15,10 +15,6 @@
Other folder
Show on map
Unknown location
- Increase column count
- Reduce column count
- Change cover image
- Select photo
Volume
Brightness
Lock orientation
@@ -125,9 +121,6 @@
No media for the slideshow have been found
- Change view type
- Grid
- List
Group direct subfolders
@@ -190,6 +183,13 @@
Avoid showing invalid files
Show image file types
Allow zooming videos with double tapping them
+ Folder thumbnail style
+ Show file count on a separate line
+ Show file count in brackets
+ Do not show file count
+ Limit folder title to 1 line
+ Square
+ Rounded corners
Thumbnails
@@ -319,7 +319,7 @@
Simple Gallery Pro - Photo Manager & Editor
- Browse your memories without any interruptions with this photo and video gallery
+ A premium app for managing and editing your photos, videos, GIFs without ads
Simple Gallery Pro is a highly customizable offline gallery. Organize & edit your photos, recover deleted files with the recycle bin, protect & hide files and view a huge variety of different photo & video formats including RAW, SVG and much more.
diff --git a/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt b/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt
index 285cf0022..97a0bc72d 100644
--- a/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt
+++ b/app/src/proprietary/kotlin/com/simplemobiletools/gallery/pro/activities/NewEditActivity.kt
@@ -8,27 +8,26 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
-import androidx.core.util.Pair
-import com.simplemobiletools.commons.asynctasks.CopyMoveTask
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.CONFLICT_OVERWRITE
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE
import com.simplemobiletools.commons.helpers.REAL_FILE_PATH
+import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isNougatPlus
-import com.simplemobiletools.commons.interfaces.CopyMoveListener
import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.gallery.pro.R
import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog
import com.simplemobiletools.gallery.pro.extensions.config
import com.simplemobiletools.gallery.pro.extensions.fixDateTaken
+import com.simplemobiletools.gallery.pro.extensions.tryDeleteFileDirItem
import ly.img.android.pesdk.PhotoEditorSettingsList
import ly.img.android.pesdk.assets.filter.basic.FilterPackBasic
import ly.img.android.pesdk.assets.font.basic.FontPackBasic
import ly.img.android.pesdk.backend.model.config.CropAspectAsset
+import ly.img.android.pesdk.backend.model.constant.ImageExportFormat
+import ly.img.android.pesdk.backend.model.constant.OutputMode
import ly.img.android.pesdk.backend.model.state.BrushSettings
import ly.img.android.pesdk.backend.model.state.LoadSettings
import ly.img.android.pesdk.backend.model.state.PhotoEditorSaveSettings
-import ly.img.android.pesdk.backend.model.state.SaveSettings
import ly.img.android.pesdk.backend.model.state.manager.SettingsList
import ly.img.android.pesdk.ui.activity.PhotoEditorBuilder
import ly.img.android.pesdk.ui.model.state.*
@@ -37,16 +36,14 @@ import ly.img.android.pesdk.ui.panels.item.ToggleAspectItem
import ly.img.android.pesdk.ui.panels.item.ToolItem
import java.io.File
import java.io.InputStream
-import kotlin.collections.set
+import java.io.OutputStream
class NewEditActivity : SimpleActivity() {
private val PESDK_EDIT_IMAGE = 1
private val SETTINGS_LIST = "SETTINGS_LIST"
- private val RESULT_IMAGE_PATH = "RESULT_IMAGE_PATH"
+ private val SOURCE_URI = "SOURCE_URI"
+ private val RESULT_URI = "RESULT_URI"
private var sourceFileLastModified = 0L
- private var destinationFilePath = ""
- private var cacheImagePathFromEditor = "" // delete the file stored at the internal app cache storage (the editor saves it there) in case moving to the selected location fails
- private var sourceImageUri: Uri? = null
private var oldExif: ExifInterface? = null
private lateinit var uri: Uri
@@ -108,8 +105,8 @@ class NewEditActivity : SimpleActivity() {
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (requestCode == PESDK_EDIT_IMAGE) {
val extras = resultData?.extras
- cacheImagePathFromEditor = extras?.getString(RESULT_IMAGE_PATH, "") ?: ""
-
+ val resultPath = extras?.get(RESULT_URI)?.toString() ?: ""
+ val sourcePath = Uri.decode(extras?.get(SOURCE_URI)?.toString() ?: "")
val settings = extras?.getParcelable(SETTINGS_LIST)
if (settings != null) {
val brush = settings.getSettingsModel(BrushSettings::class.java)
@@ -118,45 +115,69 @@ class NewEditActivity : SimpleActivity() {
config.editorBrushSize = brush.brushSize
}
- if (resultCode != Activity.RESULT_OK || sourceImageUri == null || sourceImageUri.toString().isEmpty() || cacheImagePathFromEditor.isEmpty() || sourceImageUri.toString() == cacheImagePathFromEditor) {
+ if (resultCode != Activity.RESULT_OK || resultPath.isEmpty()) {
toast(R.string.image_editing_cancelled)
finish()
} else {
- // the image is stored at the internal app storage first, for example /data/user/0/com.simplemobiletools.gallery.pro/cache/editor/IMG_20191207_183023.jpg
- // first we rename it to the desired name, then move
- val sourceString = Uri.decode(sourceImageUri.toString())?.toString() ?: ""
- val source = if (sourceString.isEmpty() || sourceString.startsWith("content")) {
+ val source = if (sourcePath.isEmpty() || sourcePath.startsWith("content")) {
internalStoragePath
} else {
- sourceString.substringAfter("file://")
- }
-
- if (source == cacheImagePathFromEditor) {
- finish()
- return
+ sourcePath.substringAfter("file://")
}
SaveAsDialog(this, source, true, cancelCallback = {
toast(R.string.image_editing_failed)
finish()
}, callback = {
- destinationFilePath = it
+ val destinationFilePath = it
handleSAFDialog(destinationFilePath) {
if (it) {
- storeOldExif(source)
- sourceFileLastModified = File(source).lastModified()
- val newFile = File("${cacheImagePathFromEditor.getParentPath()}/${destinationFilePath.getFilenameFromPath()}")
- File(cacheImagePathFromEditor).renameTo(newFile)
- val sourceFile = FileDirItem(newFile.absolutePath, newFile.name)
+ ensureBackgroundThread {
+ storeOldExif(source)
+ sourceFileLastModified = File(source).lastModified()
- val conflictResolutions = LinkedHashMap()
- conflictResolutions[destinationFilePath] = CONFLICT_OVERWRITE
+ handleFileOverwriting(destinationFilePath) {
+ var inputStream: InputStream? = null
+ var outputStream: OutputStream? = null
+ try {
+ inputStream = contentResolver.openInputStream(Uri.parse(resultPath))
+ outputStream = getFileOutputStreamSync(destinationFilePath, destinationFilePath.getMimeType())
+ inputStream!!.copyTo(outputStream!!)
+ outputStream.flush()
+ inputStream.close()
+ outputStream.close()
- val pair = Pair(arrayListOf(sourceFile), destinationFilePath.getParentPath())
- CopyMoveTask(this, false, true, conflictResolutions, editCopyMoveListener, true).execute(pair)
+ try {
+ if (isNougatPlus()) {
+ val newExif = ExifInterface(destinationFilePath)
+ oldExif?.copyTo(newExif, false)
+ }
+ } catch (ignored: Exception) {
+ }
+
+ if (config.keepLastModified) {
+ // add 1 s to the last modified time to properly update the thumbnail
+ updateLastModified(destinationFilePath, sourceFileLastModified + 1000)
+ }
+
+ val paths = arrayListOf(destinationFilePath)
+ rescanPaths(arrayListOf(destinationFilePath)) {
+ fixDateTaken(paths, false)
+ }
+
+ setResult(Activity.RESULT_OK, intent)
+ toast(R.string.file_edited_successfully)
+ finish()
+ } catch (e: Exception) {
+ showErrorToast(e)
+ } finally {
+ inputStream?.close()
+ outputStream?.close()
+ }
+ }
+ }
} else {
toast(R.string.image_editing_failed)
- File(cacheImagePathFromEditor).delete()
finish()
}
}
@@ -180,43 +201,25 @@ class NewEditActivity : SimpleActivity() {
}
}
- private val editCopyMoveListener = object : CopyMoveListener {
- override fun copySucceeded(copyOnly: Boolean, copiedAll: Boolean, destinationPath: String) {
- try {
- if (isNougatPlus()) {
- val newExif = ExifInterface(destinationFilePath)
- oldExif?.copyTo(newExif, false)
+ // in case the user wants to overwrite the original file and it is on an SD card, delete it manually. Else the system just appends (1)
+ private fun handleFileOverwriting(path: String, callback: () -> Unit) {
+ if (getDoesFilePathExist(path) && isPathOnSD(path)) {
+ val fileDirItem = FileDirItem(path, path.getFilenameFromPath())
+ tryDeleteFileDirItem(fileDirItem, false, true) { success ->
+ if (success) {
+ callback()
+ } else {
+ toast(R.string.unknown_error_occurred)
+ finish()
}
- } catch (ignored: Exception) {
}
-
- if (config.keepLastModified) {
- // add 1 s to the last modified time to properly update the thumbnail
- updateLastModified(destinationFilePath, sourceFileLastModified + 1000)
- }
-
- val paths = arrayListOf(destinationFilePath)
- rescanPaths(paths) {
- fixDateTaken(paths, false)
- }
-
- setResult(Activity.RESULT_OK, intent)
- toast(R.string.file_edited_successfully)
- finish()
- }
-
- override fun copyFailed() {
- toast(R.string.unknown_error_occurred)
- File(cacheImagePathFromEditor).delete()
- finish()
+ } else {
+ callback()
}
}
private fun openEditor(inputImage: Uri) {
- sourceImageUri = inputImage
- val filename = inputImage.toString().getFilenameFromPath()
-
- val settingsList = createPesdkSettingsList(filename)
+ val settingsList = createPesdkSettingsList()
settingsList.configure {
it.source = inputImage
@@ -225,11 +228,11 @@ class NewEditActivity : SimpleActivity() {
settingsList[LoadSettings::class].source = inputImage
PhotoEditorBuilder(this)
- .setSettingsList(settingsList)
- .startActivityForResult(this, PESDK_EDIT_IMAGE)
+ .setSettingsList(settingsList)
+ .startActivityForResult(this, PESDK_EDIT_IMAGE)
}
- private fun createPesdkSettingsList(filename: String): PhotoEditorSettingsList {
+ private fun createPesdkSettingsList(): PhotoEditorSettingsList {
val settingsList = PhotoEditorSettingsList().apply {
configure {
it.setFilterList(FilterPackBasic.getFilterPack())
@@ -285,9 +288,9 @@ class NewEditActivity : SimpleActivity() {
getSettingsModel(UiConfigTheme::class.java).theme = R.style.Imgly_Theme_NoFullscreen
configure {
- it.exportFormat = SaveSettings.FORMAT.AUTO
- it.setOutputFilePath("$cacheDir/editor/$filename")
- it.savePolicy = SaveSettings.SavePolicy.RETURN_SOURCE_OR_CREATE_OUTPUT_IF_NECESSARY
+ it.setExportFormat(ImageExportFormat.AUTO)
+ it.setOutputToTemp()
+ it.outputMode = OutputMode.EXPORT_IF_NECESSARY
}
}
diff --git a/build.gradle b/build.gradle
index bdcacf2cc..8791cd7a1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.3.72'
+ ext.kotlin_version = '1.4.10'
ext.is_proprietary = gradle.startParameter.taskNames.any { task -> task.contains("Proprietary") }
repositories {
@@ -13,10 +13,10 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.6.3'
+ classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
if (is_proprietary) {
- classpath 'ly.img.android.pesdk:plugin:7.2.2'
+ classpath 'ly.img.android.pesdk:plugin:8.0.2'
}
// NOTE: Do not place your application dependencies here; they belong
diff --git a/fastlane/metadata/android/ar/title.txt b/fastlane/metadata/android/ar/title.txt
index 9143c5c30..ea3dc32a5 100644
--- a/fastlane/metadata/android/ar/title.txt
+++ b/fastlane/metadata/android/ar/title.txt
@@ -1 +1 @@
-المعرض البسيط الـ Pro - محرر ومدير الصور
+المعرض البسيط (Pro) - محرر ومدير الصور
diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt
index d9bd6cf0b..c80c3943f 100644
--- a/fastlane/metadata/android/de/short_description.txt
+++ b/fastlane/metadata/android/de/short_description.txt
@@ -1 +1 @@
-Bewahre deine Andenken ohne Unterbrechungen mit dieser Foto- und Videogalerie
+Einfache und übersichtliche Galerie zur Verwaltung von Alben, Fotos, Videos
diff --git a/fastlane/metadata/android/el/short_description.txt b/fastlane/metadata/android/el/short_description.txt
index 400c185f3..dce7f4cd4 100644
--- a/fastlane/metadata/android/el/short_description.txt
+++ b/fastlane/metadata/android/el/short_description.txt
@@ -1 +1 @@
-Περιηγηθείτε στις αναμνήσεις σας χωρίς διακοπές με αυτήν τη συλλογή φωτό &βίντεο
+Μια premium εφαρμογή διαχείρισης/επεξεργασίας φωτο βίντεο GIF χωρίς διαφημήσεις
diff --git a/fastlane/metadata/android/en-US/changelogs/310.txt b/fastlane/metadata/android/en-US/changelogs/310.txt
new file mode 100644
index 000000000..bc04bca19
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/310.txt
@@ -0,0 +1,2 @@
+ * Fixing some glitches with hidden folders not being shown when appropriate
+ * Added some stability and translation improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/311.txt b/fastlane/metadata/android/en-US/changelogs/311.txt
new file mode 100644
index 000000000..5f142b341
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/311.txt
@@ -0,0 +1,4 @@
+ * Updated the image editor, fix a glitch with black preview
+ * Show Portrait images by default on Android 10
+ * Use a nicer icon on older devices
+ * Some translation and stability improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/312.txt b/fastlane/metadata/android/en-US/changelogs/312.txt
new file mode 100644
index 000000000..b784b583e
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/312.txt
@@ -0,0 +1,4 @@
+ * Rescan the internal storage from time to time, look for new folders containing media
+ * Improve the Search user experience, do not reset it at opening an item
+ * Fixed some editor glitches
+ * Speed up fullscreen image loading
diff --git a/fastlane/metadata/android/en-US/changelogs/313.txt b/fastlane/metadata/android/en-US/changelogs/313.txt
new file mode 100644
index 000000000..d015f9d99
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/313.txt
@@ -0,0 +1,2 @@
+ * Fixed a glitch at caching fullscreen images
+ * Improved batch renaming with patterns
diff --git a/fastlane/metadata/android/en-US/changelogs/314.txt b/fastlane/metadata/android/en-US/changelogs/314.txt
new file mode 100644
index 000000000..b13735f6c
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/314.txt
@@ -0,0 +1,2 @@
+ * Fixed a glitch at caching fullscreen images
+ * Properly recognize a new type of panoramic images
diff --git a/fastlane/metadata/android/en-US/changelogs/315.txt b/fastlane/metadata/android/en-US/changelogs/315.txt
new file mode 100644
index 000000000..e17749308
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/315.txt
@@ -0,0 +1,2 @@
+ * Improved file loading performance in some cases
+ * Some UX, translation and stability improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/316.txt b/fastlane/metadata/android/en-US/changelogs/316.txt
new file mode 100644
index 000000000..e3082b25e
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/316.txt
@@ -0,0 +1 @@
+ * Improved file loading performance
diff --git a/fastlane/metadata/android/en-US/changelogs/317.txt b/fastlane/metadata/android/en-US/changelogs/317.txt
new file mode 100644
index 000000000..cfd2808eb
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/317.txt
@@ -0,0 +1 @@
+ * Properly fetch the latest available Last Modified of files
diff --git a/fastlane/metadata/android/en-US/changelogs/318.txt b/fastlane/metadata/android/en-US/changelogs/318.txt
new file mode 100644
index 000000000..d41f09075
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/318.txt
@@ -0,0 +1,3 @@
+ * Fixed the file loading performance in some cases
+ * Fixed some photo editor related glitches
+ * Fixed the Use English language settings toggle
diff --git a/fastlane/metadata/android/en-US/changelogs/319.txt b/fastlane/metadata/android/en-US/changelogs/319.txt
new file mode 100644
index 000000000..05935dbf8
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/319.txt
@@ -0,0 +1,3 @@
+ * Adding support for animated WebP files
+ * Fixed a permissions glitch after upgrading to Android 11
+ * Added many performance related improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/320.txt b/fastlane/metadata/android/en-US/changelogs/320.txt
new file mode 100644
index 000000000..44e5a63cd
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/320.txt
@@ -0,0 +1,2 @@
+ * Fixed a bug with some folders not being recognized
+ * Improved thumbnail loading performance in some cases
diff --git a/fastlane/metadata/android/en-US/changelogs/321.txt b/fastlane/metadata/android/en-US/changelogs/321.txt
new file mode 100644
index 000000000..9992d2c00
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/321.txt
@@ -0,0 +1,2 @@
+ * Fix sorting by Date Taken
+ * Properly display some wrongly named WebP files
diff --git a/fastlane/metadata/android/en-US/changelogs/322.txt b/fastlane/metadata/android/en-US/changelogs/322.txt
new file mode 100644
index 000000000..fad5fa8bd
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/322.txt
@@ -0,0 +1,2 @@
+ * Updated the photo editor to fix some issues, mostly related to Android 11
+ * Make sure file moving doesn't block the UI in any case
diff --git a/fastlane/metadata/android/en-US/changelogs/323.txt b/fastlane/metadata/android/en-US/changelogs/323.txt
new file mode 100644
index 000000000..4eea348a6
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/323.txt
@@ -0,0 +1,2 @@
+ * Fixed an editor glitch occurring if the file path contained spaces
+ * Added some stability improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/324.txt b/fastlane/metadata/android/en-US/changelogs/324.txt
new file mode 100644
index 000000000..0af58fd18
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/324.txt
@@ -0,0 +1,3 @@
+ * Added some hidden folder handling related improvements
+ * Fixed saving files on the SD card after editing
+ * Couple other UX, translation and performance improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/325.txt b/fastlane/metadata/android/en-US/changelogs/325.txt
new file mode 100644
index 000000000..de298fdb7
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/325.txt
@@ -0,0 +1,3 @@
+ * Redesigning the main folders screen, try making it moderner (!)
+ * Fix some glitches with deep zoomable fullscreen images not loading in well
+ * Couple other UX, stability and translation improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/326.txt b/fastlane/metadata/android/en-US/changelogs/326.txt
new file mode 100644
index 000000000..6f7d8fa9c
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/326.txt
@@ -0,0 +1,2 @@
+ * Reverting to the previous UI of the main screen, but keep rounded corners at list view
+ * Some UI and stability improvements
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg
index 8b06b4e2f..eee620fc8 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg
index 2a18edcf3..30a8025ca 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg
index aa356d76b..a8efa2e37 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg
index cfb80ee08..8b954fcab 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg
index c1e026c9c..46422eb87 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.jpg
deleted file mode 100644
index 9461d7364..000000000
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.jpg and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/images/raw_screenshots/gallery.xcf b/fastlane/metadata/android/en-US/images/raw_screenshots/gallery.xcf
index fa8fe2605..73d0d11f0 100644
Binary files a/fastlane/metadata/android/en-US/images/raw_screenshots/gallery.xcf and b/fastlane/metadata/android/en-US/images/raw_screenshots/gallery.xcf differ
diff --git a/fastlane/metadata/android/en-US/images/sevenInchScreenshots/tablet-7.jpg b/fastlane/metadata/android/en-US/images/sevenInchScreenshots/tablet-7.jpg
index e5700f943..acc4a9516 100644
Binary files a/fastlane/metadata/android/en-US/images/sevenInchScreenshots/tablet-7.jpg and b/fastlane/metadata/android/en-US/images/sevenInchScreenshots/tablet-7.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/tablet-10.jpg b/fastlane/metadata/android/en-US/images/tenInchScreenshots/tablet-10.jpg
index 0743a5f27..7c02f5cf3 100644
Binary files a/fastlane/metadata/android/en-US/images/tenInchScreenshots/tablet-10.jpg and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/tablet-10.jpg differ
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
index 37ee0d0b5..407b851ad 100644
--- a/fastlane/metadata/android/en-US/short_description.txt
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -1 +1 @@
-Browse your memories without any interruptions.
+A premium app for managing and editing your photos, videos, GIFs without ads
diff --git a/fastlane/metadata/android/es/short_description.txt b/fastlane/metadata/android/es/short_description.txt
index 19cbec0ad..6c4713ea0 100644
--- a/fastlane/metadata/android/es/short_description.txt
+++ b/fastlane/metadata/android/es/short_description.txt
@@ -1 +1 @@
-Explore sus recuerdos sin interrupciones con esta galeria de foto y vídeo
+Galería rápida y segura para gestión profesional de fotos, vídeos y los GIFs
diff --git a/fastlane/metadata/android/gl-es/full_description.txt b/fastlane/metadata/android/gl-es/full_description.txt
new file mode 100644
index 000000000..faa05b281
--- /dev/null
+++ b/fastlane/metadata/android/gl-es/full_description.txt
@@ -0,0 +1,54 @@
+Simple Gallery Pro unha galería altamente personalizable. Organiza & edita as túas fotos, recupera ficheiros borrados desde a papeleira, protexe & oculta ficheiros e visualiza gran número de formatos de fotos & vídeo incluíndo RAW, SVG e moitos máis.
+
+A app non ten publicidade nin permisos innesarios. Como tampouco require acceso a internet, a túa privacidade está protexida.
+
+-------------------------------------------------
+SIMPLE GALLERY PRO – Características
+-------------------------------------------------
+
+• Galería sen conexión a internet, publicidade nin ventás emerxentes
+• Editor de fotos Simple gallery – recorta, rota, cambia tamaño, debuxa, fitros, e máis
+• Non precisa acceso a internet, dándoche máis seguridade e privacidade
+• Non pide permisos innecesarios
+• Busca rápida de ficheiros de foto e vídeo
+• Abre e visualiza gran cantidade de formatos (RAW, SVG, panoramic etc)
+• Xestos intuitivos para editar e organizar os ficheiros
+• Múltiples filtros, agrupamento e orde dos ficheiros
+• Personaliza o aspecto de Simple Gallery Pro
+• Dispoñible en 32 idiomas
+• Marca ficheiros como favoritos para acceso rápido
+• Protexe fotos e vídeos cun patrón, PIN ou impresión dixital
+• Usa PIN, patrón e impresión dixital para protexer a apertura da app ou indicar funcións específicas
+• Recupera fotos e vídeos borrados desde a papeleira
+• Cambia a visibilidade dos ficheiros para ocultar fotos e vídeos
+• Crea presentacións personalizadas cos teus ficheiros
+• Mira a información detalladas dos ficheiros (resolución, valores EXIF etc)
+• Simple Gallery Pro é código aberto
+… e moito máis!
+
+PHOTO GALLERY EDITOR
+Simple Gallery Pro permite editar as fotos no momento. Recorta, voltea, rota e redimensiona as túas fotos. Se te sintes inspirado tamén pode engadir filtros e debuxar nas imaxes!
+
+SOPORTA MOITOS TIPOS DE FICHEIROS
+Simple Gallery Pro soporta gran variedade de formatos como JPEG, PNG, MP4, MKV, RAW, SVG, Panoramicas, Vídeos panorámicos e moito máis. Non como outros.
+
+XESTOR DE FOTOS MOI PERSONALIZABLE
+Desde a interface ata a función dos botóns da barra de ferraentas, Simply Gallery Pro é moi personalizable e funciona do xeito que ti queres. Ningún outro xestor de galerías ten esta flexibilidade! Ao ser código aberto, está dipoñible en 32 idiomas!
+
+RECUPERA FOTOS & VIDEOS ELIMINADOS
+¿Borraches sen querer unha foto ou vídeo? Non te apenes! Simple Gallery Pro ten unha función para recuperar facilmente vídeos e fotos borrados.
+
+PROTEXE & OCULTA FOTOS, VIDEOS & FICHEIROS
+Usando un prendedor, patrón ou a impresión dixital no escáner do dispositivo podes protexer e agochar fotos, vídeos e álbumes enteiros. Podes protexer a app ou establecer funcións específicas na app. Por exemplo, que non poidas eliminar un ficheiro sen o escáner da impresión dixital, axudandoche a protexer o borrado accidental.
+
+Aquí tes todas as Simple Tools:
+https://www.simplemobiletools.com
+
+Sitio web de Simple Gallery Pro:
+https://www.simplemobiletools.com/gallery
+
+Facebook:
+https://www.facebook.com/simplemobiletools
+
+Reddit:
+https://www.reddit.com/r/SimpleMobileTools
diff --git a/fastlane/metadata/android/gl-es/short_description.txt b/fastlane/metadata/android/gl-es/short_description.txt
new file mode 100644
index 000000000..cba13bbb1
--- /dev/null
+++ b/fastlane/metadata/android/gl-es/short_description.txt
@@ -0,0 +1 @@
+Busca nos recordos sen interrupcións na galería de fotos e vídeo
diff --git a/fastlane/metadata/android/gl-es/title.txt b/fastlane/metadata/android/gl-es/title.txt
new file mode 100644
index 000000000..98752cb11
--- /dev/null
+++ b/fastlane/metadata/android/gl-es/title.txt
@@ -0,0 +1 @@
+Simple Gallery Pro - Xestor e Editor de fotos
diff --git a/fastlane/metadata/android/zh-rCN/full_description.txt b/fastlane/metadata/android/zh-rCN/full_description.txt
index f9e7a725c..a0e662589 100644
--- a/fastlane/metadata/android/zh-rCN/full_description.txt
+++ b/fastlane/metadata/android/zh-rCN/full_description.txt
@@ -1,13 +1,13 @@
-简约图库 Pro 是一个高度可定制的图库。管理并编辑你的照片,从回收站中恢复已删除的照片,保护并隐藏文件,查看RAW,SVG等等多种照片和视频格式。
+简易图库 Pro 是一个高度可定制的图库。管理并编辑您的照片,从回收站中恢复已删除的照片,保护并隐藏文件,查看RAW,SVG等等多种照片和视频格式。
该应用不包含广告和不必要的权限。我们保护您的隐私,因为该应用不需要联网权限。
-------------------------------------------------
- 简约图库 Pro – 特性
+ 简易图库 Pro – 特性
-------------------------------------------------
• 完全离线,没有广告或弹出窗口
-• 简约图库图片编辑器 – 裁剪,旋转,调整大小,绘制,滤镜等等
+• 简易图库图片编辑器 – 裁剪,旋转,调整大小,绘制,滤镜等等
• 无需联网权限,为您提供更多的隐私和安全
• 没有不必要的权限
• 快速搜索图像,视频和文件
@@ -22,28 +22,31 @@
• 从回收站中恢复已删除的照片和视频
• 支持隐藏照片和视频
• 为您的文件创建一个可自定义的幻灯片
-• 查看文件的详细信息(分辨率,EXIF值等等)
+• 查看文件的详细信息(分辨率,EXIF 值等等)
• 该应用是开源的
… 还有很多很多!
图库照片编辑
-简约图库 Pro 可以轻松地动态编辑图片。支持裁剪、翻转、旋转、或是调整图片大小。如果您希望更有创意的话,可以添加滤镜,或是直接在图片上绘制!
+简易图库 Pro 可以轻松地动态编辑图片。支持裁剪、翻转、旋转、或是调整图片大小。如果您希望更有创意的话,可以添加滤镜,或是直接在图片上绘制!
支持多种文件类型
-与其他一些图库应用不同,简约图库 Pro 支持多种文件类型,包括JPEG,PNG,MP4,MKV,RAW,SVG,全景照片,全景视频等等。
+与其他一些图库应用不同,简易图库 Pro 支持多种文件类型,包括JPEG,PNG,MP4,MKV,RAW,SVG,全景照片,全景视频等等。
高度可定制的图库
-从UI到底部工具栏上的功能按钮,简约图库 Pro 可高度自定义并按您的要求工作。其他图库应用可没有这种灵活性!由于该应用是开源的,所以我们还提供 32 种语言!
+从UI到底部工具栏上的功能按钮,简易图库 Pro 可高度自定义并按您的要求工作。其他图库应用可没有这种灵活性!由于该应用是开源的,所以我们还提供 32 种语言!
恢复已删除的照片和视频
-意外删除了珍贵的照片或视频?别担心!简约图库 Pro 具有方便的回收站,您可以方便地恢复已删除的照片和视频。
+意外删除了珍贵的照片或视频?别担心!简易图库 Pro 具有方便的回收站,您可以方便地恢复已删除的照片和视频。
保护并隐藏照片、视频和文件
使用密码、图案或指纹保护和隐藏照片、视频、或是整个相册。您也可以保护应用自身或禁用一些特定功能。 例如,只有指纹验证通过才可以删除文件,从而有效地防止您的文件被意外删除。
-查看简约系列的所有应用:
+于此查看简易工具系列全套:
https://www.simplemobiletools.com
+简易图库 Pro 的独立网站:
+https://www.simplemobiletools.com/gallery
+
Facebook:
https://www.facebook.com/simplemobiletools
diff --git a/fastlane/metadata/android/zh-rCN/title.txt b/fastlane/metadata/android/zh-rCN/title.txt
index 2a36913ac..39ebd4047 100644
--- a/fastlane/metadata/android/zh-rCN/title.txt
+++ b/fastlane/metadata/android/zh-rCN/title.txt
@@ -1 +1 @@
-简约图库 Pro - 图片管理 & 编辑
+简易图库 Pro - 图片管理 & 编辑
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index aa6500f74..a9ff48fcd 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Thu Mar 19 12:33:01 CET 2020
+#Tue Nov 03 10:00:17 CET 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip